From 453c6a65a20a70260e0b86a16192a65660efcbe1 Mon Sep 17 00:00:00 2001 From: rsc Date: Wed, 8 Aug 2007 09:41:21 +0000 Subject: [PATCH] convert syscall dispatch to table --- defs.h | 3 ++ syscall.c | 92 +++++++++++++++++-------------------------------------- 2 files changed, 31 insertions(+), 64 deletions(-) diff --git a/defs.h b/defs.h index 3c176b5..d6b27f2 100644 --- a/defs.h +++ b/defs.h @@ -139,3 +139,6 @@ struct inode* mknod1(struct inode*, char*, short, short, short); int unlink(char*); void iupdate(struct inode*); int link(char*, char*); + +// number of elements in fixed-size array +#define NELEM(x) (sizeof(x)/sizeof((x)[0])) diff --git a/syscall.c b/syscall.c index 8f7350f..b44a7a9 100644 --- a/syscall.c +++ b/syscall.c @@ -108,75 +108,39 @@ extern int sys_unlink(void); extern int sys_wait(void); extern int sys_write(void); +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_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_pipe] sys_pipe, +[SYS_read] sys_read, +[SYS_sbrk] sys_sbrk, +[SYS_unlink] sys_unlink, +[SYS_wait] sys_wait, +[SYS_write] sys_write, +}; + void syscall(void) { struct proc *cp = curproc[cpu()]; int num = cp->tf->eax; - int ret = -1; - switch(num){ - case SYS_fork: - ret = sys_fork(); - break; - case SYS_exit: - ret = sys_exit(); - break; - case SYS_wait: - ret = sys_wait(); - break; - case SYS_pipe: - ret = sys_pipe(); - break; - case SYS_write: - ret = sys_write(); - break; - case SYS_read: - ret = sys_read(); - break; - case SYS_close: - ret = sys_close(); - break; - case SYS_kill: - ret = sys_kill(); - break; - case SYS_exec: - ret = sys_exec(); - break; - case SYS_open: - ret = sys_open(); - break; - case SYS_mknod: - ret = sys_mknod(); - break; - case SYS_unlink: - ret = sys_unlink(); - break; - case SYS_fstat: - ret = sys_fstat(); - break; - case SYS_link: - ret = sys_link(); - break; - case SYS_mkdir: - ret = sys_mkdir(); - break; - case SYS_chdir: - ret = sys_chdir(); - break; - case SYS_dup: - ret = sys_dup(); - break; - case SYS_getpid: - ret = sys_getpid(); - break; - case SYS_sbrk: - ret = sys_sbrk(); - break; - default: - cprintf("unknown sys call %d\n", num); - // Maybe kill the process? - break; + if(num >= 0 && num < NELEM(syscalls) && syscalls[num]) + cp->tf->eax = syscalls[num](); + else { + cprintf("%d %s: unknown sys call %d\n", + cp->pid, cp->name, num); + cp->tf->eax = -1; } - cp->tf->eax = ret; }