diff options
author | Andrew Waterman <waterman@s144.Millennium.Berkeley.EDU> | 2011-04-15 14:32:18 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@s144.Millennium.Berkeley.EDU> | 2011-04-15 14:33:12 -0700 |
commit | ba0cf0546686acac7e891d9740009bcc4ada73ee (patch) | |
tree | 5a80659c0b61aab37e36290875713d7c2a09cd8f /pk/syscall.c | |
parent | 04c8f1c003bbee2f9b45f5e706103837a6d61a30 (diff) | |
download | pk-ba0cf0546686acac7e891d9740009bcc4ada73ee.zip pk-ba0cf0546686acac7e891d9740009bcc4ada73ee.tar.gz pk-ba0cf0546686acac7e891d9740009bcc4ada73ee.tar.bz2 |
[pk] fixed timer interrupt bug, etc.
Diffstat (limited to 'pk/syscall.c')
-rw-r--r-- | pk/syscall.c | 20 |
1 files changed, 3 insertions, 17 deletions
diff --git a/pk/syscall.c b/pk/syscall.c index d303324..9482378 100644 --- a/pk/syscall.c +++ b/pk/syscall.c @@ -92,7 +92,7 @@ sysret_t sys_unlink(const char* name, size_t len) return frontend_syscall(SYS_unlink,(long)name,len,0,0); } -void handle_syscall(trapframe_t* tf) +sysret_t syscall(long a0, long a1, long a2, long a3, long n) { const static void* syscall_table[] = { [SYS_exit] = sys_exit, @@ -108,22 +108,8 @@ void handle_syscall(trapframe_t* tf) [SYS_unlink] = sys_unlink, }; - syscall_t p; - unsigned long n = tf->gpr[2]; - if(n >= sizeof(syscall_table)/sizeof(void*) || !syscall_table[n]) - { - dump_tf(tf); + if(n >= ARRAY_SIZE(syscall_table) || !syscall_table[n]) panic("bad syscall #%ld!",n); - } - else - p = (syscall_t)syscall_table[n]; - sysret_t ret = p(tf->gpr[4],tf->gpr[5],tf->gpr[6],tf->gpr[7],n); - tf->gpr[2] = ret.result; - tf->gpr[3] = ret.result == -1 ? ret.err : 0; - - //printk("syscall %d (%x,%x,%x,%x) from %x == %d\n",n,tf->gpr[4],tf->gpr[5],tf->gpr[6],tf->gpr[7],tf->gpr[31],tf->gpr[2]); - - advance_pc(tf); - pop_tf(tf); + return ((syscall_t)syscall_table[n])(a0, a1, a2, a3, n); } |