summaryrefslogtreecommitdiff
path: root/kernel/syscall.c
diff options
context:
space:
mode:
authorMole Shang <[email protected]>2024-01-18 17:35:27 +0800
committerMole Shang <[email protected]>2024-01-18 17:35:27 +0800
commit493159b9bb1a764926daa49fb09bff8f29e8e9e5 (patch)
treebcae49e20df0ab9d86dab9bd10226807cc432f88 /kernel/syscall.c
parent33ca12a4653752d179e6296c7ca2f91a626d30f3 (diff)
downloadxv6-labs-493159b9bb1a764926daa49fb09bff8f29e8e9e5.tar.gz
xv6-labs-493159b9bb1a764926daa49fb09bff8f29e8e9e5.tar.bz2
xv6-labs-493159b9bb1a764926daa49fb09bff8f29e8e9e5.zip
lab syscall: finishsyscall
Diffstat (limited to 'kernel/syscall.c')
-rw-r--r--kernel/syscall.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/kernel/syscall.c b/kernel/syscall.c
index ed65409..94ae997 100644
--- a/kernel/syscall.c
+++ b/kernel/syscall.c
@@ -101,6 +101,8 @@ 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);
// An array mapping syscall numbers from syscall.h
// to the function that handles the system call.
@@ -126,6 +128,35 @@ static uint64 (*syscalls[])(void) = {
[SYS_link] sys_link,
[SYS_mkdir] sys_mkdir,
[SYS_close] sys_close,
+[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",
+[SYS_trace] "trace",
+[SYS_sysinfo] "sysinfo",
};
void
@@ -139,6 +170,13 @@ 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);