xref: /xv6-public/sysproc.c (revision dae9b0d4)
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