#include <liballoc.h>
#include <map.h>
#include <page_size.h>
#include <process.h>
#include <status.h>
#include <stddef.h>
#include <stdint.h>
#include <system.h>

void _clone_tramp (void);

struct process_data* process_spawn (process_func_t func, void* argument_ptr) {
  void* stack = malloc (STACK_SIZE);
  if (stack == NULL)
    return NULL;

  struct process_data* pdata = malloc (sizeof (*pdata));

  if (pdata == NULL) {
    free (stack);
    return NULL;
  }

  pdata->arg_ptr = argument_ptr;
  pdata->fn = func;

  uintptr_t top = (uintptr_t)stack + STACK_SIZE;
  int pid = clone (top, &_clone_tramp, (void*)pdata);

  if (pid < 0) {
    free (stack);
    free (pdata);
    return NULL;
  }

  pdata->pid = pid;
  return pdata;
}
