diff options
author | Mole Shang <[email protected]> | 2024-02-14 20:46:23 +0800 |
---|---|---|
committer | Mole Shang <[email protected]> | 2024-02-14 20:46:23 +0800 |
commit | f98eeb30507040dc916b2a337818830954ee1d4a (patch) | |
tree | a741cb0bbd6be96d8084e72b4af895ac093a2b48 /kernel/sysproc.c | |
parent | 0de5ac779602f562a038e5ad27163d85bc71638b (diff) | |
parent | 904885a96efd1dd0221585f67477f5a39bcce7f7 (diff) | |
download | xv6-labs-f98eeb30507040dc916b2a337818830954ee1d4a.tar.gz xv6-labs-f98eeb30507040dc916b2a337818830954ee1d4a.tar.bz2 xv6-labs-f98eeb30507040dc916b2a337818830954ee1d4a.zip |
Merge branch 'net' into lock
Conflicts:
.gitignore
Makefile
conf/lab.mk
kernel/defs.h
user/user.h
Diffstat (limited to 'kernel/sysproc.c')
-rw-r--r-- | kernel/sysproc.c | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/kernel/sysproc.c b/kernel/sysproc.c index 3b4d5bd..715a511 100644 --- a/kernel/sysproc.c +++ b/kernel/sysproc.c @@ -1,7 +1,7 @@ #include "types.h" #include "riscv.h" -#include "defs.h" #include "param.h" +#include "defs.h" #include "memlayout.h" #include "spinlock.h" #include "proc.h" @@ -54,9 +54,8 @@ sys_sleep(void) int n; uint ticks0; + argint(0, &n); - if(n < 0) - n = 0; acquire(&tickslock); ticks0 = ticks; while(ticks - ticks0 < n){ @@ -66,10 +65,29 @@ sys_sleep(void) } sleep(&ticks, &tickslock); } + + // backtrace(); + release(&tickslock); return 0; } + +#ifdef LAB_PGTBL +int +sys_pgaccess(void) +{ + uint64 base, mask; + int len; + + + argaddr(0, &base); + argint(1, &len); + argaddr(2, &mask); + return pgaccess(base, len, mask); +} +#endif + uint64 sys_kill(void) { @@ -91,3 +109,44 @@ sys_uptime(void) release(&tickslock); return xticks; } + +uint64 +sys_trace(void) +{ + argint(0, &myproc()->trace_mask); + + return -(myproc()->trace_mask <= 1); +} + +uint64 +sys_sysinfo(void) +{ + uint64 si; // user pointer to struct sysinfo + + argaddr(0, &si); + return sys_info(si); +} + +uint64 +sys_sigalarm(void) +{ + struct proc *p = myproc(); + uint64 handler; + + argint(0, &p->alarm_interval); + argaddr(1, &handler); + p->alarm_handler = handler; + + return 0; +} + +uint64 sys_sigreturn(void) +{ + struct proc *p = myproc(); + // retore saved trapframe to resume + memmove(p->trapframe, p->atpfm, sizeof(struct trapframe)); + p->alarm_tickspassed = 0; + p->alarm_caninvoke = 1; + // make sure return the original a0 in trapframe to pass test3 + return p->trapframe->a0; +} |