aboutsummaryrefslogtreecommitdiff
path: root/src/kernel/syscall/actions/sys_fork.c
diff options
context:
space:
mode:
authorMarvin Borner2020-05-02 15:44:11 +0200
committerMarvin Borner2020-05-02 15:44:11 +0200
commitaa8a8811818331cf511681327e3ba95e456f0d33 (patch)
tree852c314dae76e756863f94639ff45eff72834d5d /src/kernel/syscall/actions/sys_fork.c
parent2a0e810a473dea57fd1cd53ea424b61269c029ba (diff)
Added many syscalls to get better POSIX compliance
Diffstat (limited to 'src/kernel/syscall/actions/sys_fork.c')
-rw-r--r--src/kernel/syscall/actions/sys_fork.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/kernel/syscall/actions/sys_fork.c b/src/kernel/syscall/actions/sys_fork.c
new file mode 100644
index 0000000..af64ff9
--- /dev/null
+++ b/src/kernel/syscall/actions/sys_fork.c
@@ -0,0 +1,19 @@
+#include <stdint.h>
+#include <kernel/interrupts/interrupts.h>
+#include <kernel/memory/paging.h>
+#include <kernel/tasks/process.h>
+#include <kernel/lib/lib.h>
+
+uint32_t sys_fork(struct regs *r)
+{
+ struct page_directory *dir = paging_copy_user_directory(current_proc->cr3);
+ struct process *proc = process_make_new();
+ proc->cr3 = dir;
+ memcpy(&proc->registers, r, sizeof(struct regs));
+ proc->registers.eax = proc->pid;
+ proc->pid = current_proc->pid;
+
+ process_spawn(proc);
+
+ return 0;
+} \ No newline at end of file