summaryrefslogtreecommitdiff
path: root/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'syscall.c')
-rw-r--r--syscall.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/syscall.c b/syscall.c
new file mode 100644
index 0000000..9cb20dc
--- /dev/null
+++ b/syscall.c
@@ -0,0 +1,50 @@
+#include "types.h"
+#include "param.h"
+#include "mmu.h"
+#include "proc.h"
+#include "defs.h"
+#include "x86.h"
+#include "traps.h"
+#include "syscall.h"
+
+/*
+ * User code makes a system call with INT T_SYSCALL.
+ * System call number in %eax.
+ * Arguments on the stack.
+ *
+ * Return value? Error indication? Errno?
+ */
+
+void
+sys_fork()
+{
+ newproc();
+}
+
+void
+sys_exit()
+{
+ curproc->state = UNUSED;
+ // XXX free resources. notify parent. abandon children.
+ swtch();
+}
+
+void
+syscall()
+{
+ int num = curproc->tf->tf_regs.reg_eax;
+
+ cprintf("%x sys %d\n", curproc, num);
+ switch(num){
+ case SYS_fork:
+ sys_fork();
+ break;
+ case SYS_exit:
+ sys_exit();
+ break;
+ default:
+ cprintf("unknown sys call %d\n", num);
+ // XXX fault
+ break;
+ }
+}