summaryrefslogtreecommitdiff
path: root/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'syscall.c')
-rw-r--r--syscall.c49
1 files changed, 31 insertions, 18 deletions
diff --git a/syscall.c b/syscall.c
index f6550a1..ce50a59 100644
--- a/syscall.c
+++ b/syscall.c
@@ -98,39 +98,52 @@ extern int sys_wait(void);
extern int sys_write(void);
extern int sys_uptime(void);
+int
+sys_init(void)
+{
+ initlog();
+ return 0;
+}
+
static int (*syscalls[])(void) = {
-[SYS_chdir] sys_chdir,
-[SYS_close] sys_close,
-[SYS_dup] sys_dup,
-[SYS_exec] sys_exec,
-[SYS_exit] sys_exit,
+[SYS_init] sys_init,
[SYS_fork] sys_fork,
-[SYS_fstat] sys_fstat,
-[SYS_getpid] sys_getpid,
-[SYS_kill] sys_kill,
-[SYS_link] sys_link,
-[SYS_mkdir] sys_mkdir,
-[SYS_mknod] sys_mknod,
-[SYS_open] sys_open,
+[SYS_exit] sys_exit,
+[SYS_wait] sys_wait,
[SYS_pipe] sys_pipe,
[SYS_read] sys_read,
+[SYS_kill] sys_kill,
+[SYS_exec] sys_exec,
+[SYS_fstat] sys_fstat,
+[SYS_chdir] sys_chdir,
+[SYS_dup] sys_dup,
+[SYS_getpid] sys_getpid,
[SYS_sbrk] sys_sbrk,
[SYS_sleep] sys_sleep,
-[SYS_unlink] sys_unlink,
-[SYS_wait] sys_wait,
-[SYS_write] sys_write,
[SYS_uptime] sys_uptime,
+// File system calls that are run in a transaction:
+[SYS_open] sys_open,
+[SYS_write] sys_write,
+[SYS_mknod] sys_mknod,
+[SYS_unlink] sys_unlink,
+[SYS_link] sys_link,
+[SYS_mkdir] sys_mkdir,
+[SYS_close] sys_close,
};
void
syscall(void)
{
int num;
-
+
num = proc->tf->eax;
- if(num >= 0 && num < NELEM(syscalls) && syscalls[num])
+ if(num >= 0 && num < SYS_open && syscalls[num]) {
+ proc->tf->eax = syscalls[num]();
+ } else if (num >= SYS_open && num < NELEM(syscalls) && syscalls[num]) {
+ begin_trans();
proc->tf->eax = syscalls[num]();
- else {
+ commit_trans();
+ } else {
cprintf("%d %s: unknown sys call %d\n",
proc->pid, proc->name, num);
proc->tf->eax = -1;