#include "types.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); } release(&tickslock); return 0; } #ifdef LAB_PGTBL #define MAX_ABITS (64) int sys_pgaccess(void) { char access_bits[MAX_ABITS / 8] = {0}; uint64 base; int pages; uint64 mask; argaddr(0, &base); // void* argint(1, &pages); // int argaddr(2, &mask); // void* if (pages > MAX_ABITS) return -1; acquire(&myproc()->lock); for (int page = 0; page < pages; ++ page) { pte_t* pte = walk(myproc()->pagetable, base + (page << PGSHIFT), 0); if (*pte & PTE_A) { *pte &= ~PTE_A; access_bits[page / 8] |= 1 << (page & 0x7); } } release(&myproc()->lock); copyout(myproc()->pagetable, mask, access_bits, (pages & 0x7) ? (pages >> 3) + 1 : (pages >> 3)); return 0; } #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; }