diff --git a/Makefile b/Makefile index f0beb51..1c07efd 100644 --- a/Makefile +++ b/Makefile @@ -149,6 +149,7 @@ UPROGS=\ $U/_grind\ $U/_wc\ $U/_zombie\ + $U/_trace\ diff --git a/kernel/proc.c b/kernel/proc.c index 6afafa1..3de92aa 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -274,6 +274,7 @@ fork(void) return -1; } np->sz = p->sz; + np->mask = p->mask; np->parent = p; diff --git a/kernel/proc.h b/kernel/proc.h index 9c16ea7..872eb38 100644 --- a/kernel/proc.h +++ b/kernel/proc.h @@ -93,6 +93,7 @@ struct proc { int killed; // If non-zero, have been killed int xstate; // Exit status to be returned to parent's wait int pid; // Process ID + int mask; // Tracing mask // these are private to the process, so p->lock need not be held. uint64 kstack; // Virtual address of kernel stack diff --git a/kernel/syscall.c b/kernel/syscall.c index c1b3670..d554c45 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -104,6 +104,7 @@ extern uint64 sys_unlink(void); extern uint64 sys_wait(void); extern uint64 sys_write(void); extern uint64 sys_uptime(void); +extern uint64 sys_trace(void); static uint64 (*syscalls[])(void) = { [SYS_fork] sys_fork, @@ -127,6 +128,13 @@ static uint64 (*syscalls[])(void) = { [SYS_link] sys_link, [SYS_mkdir] sys_mkdir, [SYS_close] sys_close, +[SYS_trace] sys_trace, +}; + +static char *syscall_list[23] = { + "none", "fork", "exit", "wait", "pipe", "read", "kill", "exec", + "fstat", "chdir", "dup", "getpid", "sbrk", "sleep", "uptime", "open", + "write", "mknod", "unlink", "link", "mkdir", "close", "trace" }; void @@ -138,6 +146,9 @@ syscall(void) num = p->trapframe->a7; if(num > 0 && num < NELEM(syscalls) && syscalls[num]) { p->trapframe->a0 = syscalls[num](); + if (p->mask & (1 << num)) + printf("%d: syscall %s -> %d\n", p->pid, syscall_list[num], + p->trapframe->a0); } else { printf("%d %s: unknown sys call %d\n", p->pid, p->name, num); diff --git a/kernel/syscall.h b/kernel/syscall.h index bc5f356..cc112b9 100644 --- a/kernel/syscall.h +++ b/kernel/syscall.h @@ -20,3 +20,4 @@ #define SYS_link 19 #define SYS_mkdir 20 #define SYS_close 21 +#define SYS_trace 22 diff --git a/kernel/sysproc.c b/kernel/sysproc.c index e8bcda9..8de6712 100644 --- a/kernel/sysproc.c +++ b/kernel/sysproc.c @@ -95,3 +95,16 @@ sys_uptime(void) release(&tickslock); return xticks; } + +uint64 +sys_trace(void) +{ + int mask; + + if (argint(0, &mask) < 0) + return -1; + + myproc()->mask = mask; + + return 0; +} diff --git a/user/user.h b/user/user.h index b71ecda..fdeeefc 100644 --- a/user/user.h +++ b/user/user.h @@ -23,6 +23,7 @@ int getpid(void); char* sbrk(int); int sleep(int); int uptime(void); +int trace(int); // ulib.c int stat(const char*, struct stat*); diff --git a/user/usys.pl b/user/usys.pl index 01e426e..9c97b05 100755 --- a/user/usys.pl +++ b/user/usys.pl @@ -36,3 +36,4 @@ sub entry { entry("sbrk"); entry("sleep"); entry("uptime"); +entry("trace");