#include "types.h" #include "fcntl.h" #include "riscv.h" #include "param.h" #include "defs.h" #include "memlayout.h" #include "spinlock.h" #include "proc.h" uint64 sys_exit(void) { int n; argint(0, &n); exit(n); return 0; // not reached } uint64 sys_getpid(void) { return myproc()->pid; } uint64 sys_fork(void) { return fork(); } uint64 sys_wait(void) { uint64 p; argaddr(0, &p); return wait(p); } uint64 sys_sbrk(void) { uint64 addr; int n; argint(0, &n); addr = myproc()->sz; if(growproc(n) < 0) return -1; return addr; } uint64 sys_sleep(void) { int n; uint ticks0; argint(0, &n); acquire(&tickslock); ticks0 = ticks; while(ticks - ticks0 < n){ if(killed(myproc())){ release(&tickslock); return -1; } 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) { int pid; argint(0, &pid); return kill(pid); } // return how many clock tick interrupts have occurred // since start. uint64 sys_uptime(void) { uint xticks; acquire(&tickslock); xticks = ticks; 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; } uint64 sys_mmap(void) { uint64 addr, len, offset; int prot, flags, fd; struct file* file; argaddr(0, &addr); argaddr(1, &len); argint(2, &prot); argint(3, &flags); if(argfd(4, &fd, &file) == -1) return 0xffffffffffffffff; argaddr(5, &offset); if(!(fileperm(file) & PROT_WRITE) && (prot & PROT_WRITE) && (flags == MAP_SHARED)) return 0xffffffffffffffff; return mmap(addr, len, prot, flags, fd, file, offset); } uint64 sys_munmap(void) { uint64 addr, len; argaddr(0, &addr); argaddr(1, &len); return munmap(addr, len); }