提交 b79e05bf 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

Tweak syscall code so that sys_* declarations can include arguments.

scale-amd64 passes all "argint" syscall arguments via registers, so it might be more convenient to pass them all to the sys_* functions (instead of reading them via argint).
上级 d1c81aec
...@@ -134,48 +134,53 @@ extern long sys_map(void); ...@@ -134,48 +134,53 @@ extern long sys_map(void);
extern long sys_unmap(void); extern long sys_unmap(void);
extern long sys_halt(void); extern long sys_halt(void);
static long (*syscalls[])(void) = { #define SYSCALL(name) [SYS_##name] = (void*)sys_##name
[SYS_chdir] = sys_chdir,
[SYS_close] = sys_close, static long (*syscalls[])(u64, u64, u64, u64, u64, u64) = {
[SYS_dup] = sys_dup, SYSCALL(chdir),
[SYS_exec] = sys_exec, SYSCALL(close),
[SYS_exit] = sys_exit, SYSCALL(dup),
[SYS_fork] = sys_fork, SYSCALL(exec),
[SYS_fstat] = sys_fstat, SYSCALL(exit),
[SYS_getpid] = sys_getpid, SYSCALL(fork),
[SYS_kill] = sys_kill, SYSCALL(fstat),
[SYS_link] = sys_link, SYSCALL(getpid),
[SYS_mkdir] = sys_mkdir, SYSCALL(kill),
[SYS_mknod] = sys_mknod, SYSCALL(link),
[SYS_open] = sys_open, SYSCALL(mkdir),
[SYS_pipe] = sys_pipe, SYSCALL(mknod),
[SYS_read] = sys_read, SYSCALL(open),
[SYS_sbrk] = sys_sbrk, SYSCALL(pipe),
[SYS_sleep] = sys_sleep, SYSCALL(read),
[SYS_unlink] = sys_unlink, SYSCALL(sbrk),
[SYS_wait] = sys_wait, SYSCALL(sleep),
[SYS_write] = sys_write, SYSCALL(unlink),
[SYS_uptime] = sys_uptime, SYSCALL(wait),
[SYS_map] = sys_map, SYSCALL(write),
[SYS_unmap] = sys_unmap, SYSCALL(uptime),
[SYS_halt] = sys_halt, SYSCALL(map),
SYSCALL(unmap),
SYSCALL(halt),
}; };
void void
syscall(void) syscall(void)
{ {
struct trapframe *tf;
int num; int num;
num = myproc()->tf->rax; tf = myproc()->tf;
num = tf->rax;
if(num >= 0 && num < NELEM(syscalls) && syscalls[num]) { if(num >= 0 && num < NELEM(syscalls) && syscalls[num]) {
mtstart(syscalls[num], myproc()); mtstart(syscalls[num], myproc());
mtrec(); mtrec();
myproc()->tf->rax = syscalls[num](); tf->rax = syscalls[num](tf->rdi, tf->rsi, tf->rdx,
tf->rcx, tf->r8, tf->r9);
mtstop(myproc()); mtstop(myproc());
mtign(); mtign();
} else { } else {
cprintf("%d %s: unknown sys call %d\n", cprintf("%d %s: unknown sys call %d\n",
myproc()->pid, myproc()->name, num); myproc()->pid, myproc()->name, num);
myproc()->tf->rax = -1; tf->rax = -1;
} }
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论