[USER] Fork syscall
This commit is contained in:
@@ -42,3 +42,4 @@ typedef long (*syscall_handler_t)(long num, long, long, long, long, long, long);
|
||||
|
||||
SYSCALL_DECL(write);
|
||||
SYSCALL_DECL(brk);
|
||||
SYSCALL_DECL(fork);
|
||||
|
||||
27
kernel/syscall/sys_proc.c
Normal file
27
kernel/syscall/sys_proc.c
Normal file
@@ -0,0 +1,27 @@
|
||||
#include <syscall.h>
|
||||
#include <process.h>
|
||||
#include <thread.h>
|
||||
#include <scheduler.h>
|
||||
#include <string.h>
|
||||
|
||||
SYSCALL_DEF(fork)
|
||||
{
|
||||
SYSCALL_INIT();
|
||||
|
||||
// Copy process and memory space
|
||||
process_t *p = get_current_process();
|
||||
process_t *new = process_spawn(p);
|
||||
|
||||
// Copy thread
|
||||
thread_t *th = new_thread(0, 1);
|
||||
memcpy(&th->r, &get_current_thread()->r, sizeof(registers_t));
|
||||
|
||||
// Make new thread return 0
|
||||
th->r.rax = 0;
|
||||
process_attach(new, th);
|
||||
scheduler_insert(th);
|
||||
|
||||
// Return new pid
|
||||
return new->pid;
|
||||
|
||||
}
|
||||
@@ -58,6 +58,7 @@ void syscall_init()
|
||||
SYSCALL_REGISTER(debug, SYS_DEBUG);
|
||||
SYSCALL_REGISTER(write, SYS_WRITE);
|
||||
SYSCALL_REGISTER(brk, SYS_BRK);
|
||||
SYSCALL_REGISTER(fork, SYS_FORK);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user