12685309fSrsc #include "types.h" 2*dae9b0d4Srsc #include "x86.h" 3558ab49fSrsc #include "defs.h" 42685309fSrsc #include "param.h" 52685309fSrsc #include "mmu.h" 62685309fSrsc #include "proc.h" 72685309fSrsc 82685309fSrsc int 92685309fSrsc sys_fork(void) 102685309fSrsc { 11c2258bf4Srsc int pid; 122685309fSrsc struct proc *np; 132685309fSrsc 14b6095304Srsc if((np = copyproc(cp)) == 0) 152685309fSrsc return -1; 16c2258bf4Srsc pid = np->pid; 17*dae9b0d4Srsc 18*dae9b0d4Srsc // Clear %eax so that fork returns 0 in the child. 19*dae9b0d4Srsc np->tf->eax = 0; 202685309fSrsc np->state = RUNNABLE; 21c2258bf4Srsc return pid; 222685309fSrsc } 232685309fSrsc 242685309fSrsc int 252685309fSrsc sys_exit(void) 262685309fSrsc { 275573c8f2Srsc exit(); 282685309fSrsc return 0; // not reached 292685309fSrsc } 302685309fSrsc 312685309fSrsc int 322685309fSrsc sys_wait(void) 332685309fSrsc { 345573c8f2Srsc return wait(); 352685309fSrsc } 362685309fSrsc 372685309fSrsc int 382685309fSrsc sys_kill(void) 392685309fSrsc { 402685309fSrsc int pid; 412685309fSrsc 42224f6598Srsc if(argint(0, &pid) < 0) 432685309fSrsc return -1; 445573c8f2Srsc return kill(pid); 452685309fSrsc } 462685309fSrsc 472685309fSrsc int 482685309fSrsc sys_getpid(void) 492685309fSrsc { 50b6095304Srsc return cp->pid; 512685309fSrsc } 522685309fSrsc 532685309fSrsc int 542685309fSrsc sys_sbrk(void) 552685309fSrsc { 56224f6598Srsc int addr; 572685309fSrsc int n; 582685309fSrsc 59224f6598Srsc if(argint(0, &n) < 0) 602685309fSrsc return -1; 61*dae9b0d4Srsc addr = cp->sz; 62*dae9b0d4Srsc if(growproc(n) < 0) 632685309fSrsc return -1; 642685309fSrsc return addr; 652685309fSrsc } 664bcd0f6aSrsc 674bcd0f6aSrsc int 68efc12b8eSrsc sys_sleep(void) 694bcd0f6aSrsc { 70efc12b8eSrsc int n, ticks0; 71efc12b8eSrsc 72efc12b8eSrsc if(argint(0, &n) < 0) 73efc12b8eSrsc return -1; 74efc12b8eSrsc acquire(&tickslock); 75efc12b8eSrsc ticks0 = ticks; 76efc12b8eSrsc while(ticks - ticks0 < n){ 77efc12b8eSrsc if(cp->killed){ 78efc12b8eSrsc release(&tickslock); 79efc12b8eSrsc return -1; 80efc12b8eSrsc } 81efc12b8eSrsc sleep(&ticks, &tickslock); 82efc12b8eSrsc } 83efc12b8eSrsc release(&tickslock); 844bcd0f6aSrsc return 0; 854bcd0f6aSrsc } 86