diff options
author | Mole Shang <[email protected]> | 2024-02-10 13:46:25 +0800 |
---|---|---|
committer | Mole Shang <[email protected]> | 2024-02-10 13:50:34 +0800 |
commit | 3673a2cdfb30e1e3936e695a3fb8adee74488d6b (patch) | |
tree | 282b4677f47bbb15949e24b3bfa455b173a38a29 /kernel/syscall.c | |
parent | f379c1c4c80947365eb6c4046c3ab165629dc8cd (diff) | |
parent | c9284cd93525436cc823258ab309c1b27eeec714 (diff) | |
download | xv6-labs-3673a2cdfb30e1e3936e695a3fb8adee74488d6b.tar.gz xv6-labs-3673a2cdfb30e1e3936e695a3fb8adee74488d6b.tar.bz2 xv6-labs-3673a2cdfb30e1e3936e695a3fb8adee74488d6b.zip |
Merge branch 'pgtbl' into traps
Conflicts:
.gitignore
Makefile
conf/lab.mk
Diffstat (limited to 'kernel/syscall.c')
-rw-r--r-- | kernel/syscall.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/kernel/syscall.c b/kernel/syscall.c index ed65409..394b980 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -101,6 +101,15 @@ extern uint64 sys_unlink(void); extern uint64 sys_link(void); extern uint64 sys_mkdir(void); extern uint64 sys_close(void); +extern uint64 sys_trace(void); +extern uint64 sys_sysinfo(void); + +#ifdef LAB_NET +extern uint64 sys_connect(void); +#endif +#ifdef LAB_PGTBL +extern uint64 sys_pgaccess(void); +#endif // An array mapping syscall numbers from syscall.h // to the function that handles the system call. @@ -126,8 +135,51 @@ static uint64 (*syscalls[])(void) = { [SYS_link] sys_link, [SYS_mkdir] sys_mkdir, [SYS_close] sys_close, +#ifdef LAB_NET +[SYS_connect] sys_connect, +#endif +#ifdef LAB_PGTBL +[SYS_pgaccess] sys_pgaccess, +#endif +[SYS_trace] sys_trace, +[SYS_sysinfo] sys_sysinfo, +}; + +// syscall name maps for SYS_trace: +static char *syscall_names[] = { +[SYS_fork] "fork", +[SYS_exit] "exit", +[SYS_wait] "wait", +[SYS_pipe] "pipe", +[SYS_read] "read", +[SYS_kill] "kill", +[SYS_exec] "exec", +[SYS_fstat] "fstat", +[SYS_chdir] "chdir", +[SYS_dup] "dup", +[SYS_getpid] "getpid", +[SYS_sbrk] "sbrk", +[SYS_sleep] "sleep", +[SYS_uptime] "uptime", +[SYS_open] "open", +[SYS_write] "write", +[SYS_mknod] "mknod", +[SYS_unlink] "unlink", +[SYS_link] "link", +[SYS_mkdir] "mkdir", +[SYS_close] "close", +#ifdef LAB_NET +[SYS_connect] "connect", +#endif +#ifdef LAB_PGTBL +[SYS_pgaccess] "pgaccess", +#endif +[SYS_trace] "trace", +[SYS_sysinfo] "sysinfo", }; + + void syscall(void) { @@ -139,9 +191,17 @@ syscall(void) // Use num to lookup the system call function for num, call it, // and store its return value in p->trapframe->a0 p->trapframe->a0 = syscalls[num](); + + // SYS_trace: match all the syscalls which number < mask asked + // p->trace_mask == 1 << SYS_xxx + if(p->trace_mask >> num) { + printf("%d: syscall %s -> %d\n", p->pid, syscall_names[num], p->trapframe->a0); + } + } else { printf("%d %s: unknown sys call %d\n", p->pid, p->name, num); p->trapframe->a0 = -1; } } + |