summaryrefslogtreecommitdiff
path: root/src/kernel/syscalls.c
diff options
context:
space:
mode:
authordzwdz2021-07-26 18:17:01 +0200
committerdzwdz2021-07-26 18:17:01 +0200
commit2ae4e31b74efa29cc92554647d5c9dce077971c4 (patch)
treecb87d1979ead008b49839ba52245960d81669db5 /src/kernel/syscalls.c
parentbfe381768bf9fde9595a7fdacfb8037458fc0f6a (diff)
fork() pt 1: cloning process memory
Diffstat (limited to 'src/kernel/syscalls.c')
-rw-r--r--src/kernel/syscalls.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/kernel/syscalls.c b/src/kernel/syscalls.c
index a6a2b17..eff670e 100644
--- a/src/kernel/syscalls.c
+++ b/src/kernel/syscalls.c
@@ -9,6 +9,12 @@ _Noreturn void sc_exit(const char *msg, size_t len) {
panic();
}
+int sc_fork() {
+ struct process *orig = process_current;
+ process_current = process_clone(orig);
+ process_switch(process_current);
+}
+
int sc_debuglog(const char *msg, size_t len) {
struct pagedir *pages = process_current->pages;
void *phys = pagedir_virt2phys(pages, msg, true, false);
@@ -27,6 +33,8 @@ int syscall_handler(int num, int a, int b, int c) {
switch (num) {
case SC_EXIT:
sc_exit((void*)a, b);
+ case SC_FORK:
+ return sc_fork();
case SC_DEBUGLOG:
return sc_debuglog((void*)a, b);
default: