xref: /xv6-public/sysproc.c (revision efc12b8e)
12685309fSrsc #include "types.h"
22685309fSrsc #include "stat.h"
32685309fSrsc #include "param.h"
42685309fSrsc #include "mmu.h"
52685309fSrsc #include "proc.h"
62685309fSrsc #include "defs.h"
72685309fSrsc #include "x86.h"
82685309fSrsc #include "traps.h"
92685309fSrsc #include "syscall.h"
102685309fSrsc #include "spinlock.h"
112685309fSrsc #include "buf.h"
122685309fSrsc #include "fs.h"
132685309fSrsc #include "fsvar.h"
142685309fSrsc #include "elf.h"
159936bffaSrsc #include "file.h"
162685309fSrsc #include "fcntl.h"
172685309fSrsc 
182685309fSrsc int
192685309fSrsc sys_fork(void)
202685309fSrsc {
212685309fSrsc   struct proc *np;
222685309fSrsc 
23b6095304Srsc   if((np = copyproc(cp)) == 0)
242685309fSrsc     return -1;
252685309fSrsc   np->state = RUNNABLE;
262685309fSrsc   return np->pid;
272685309fSrsc }
282685309fSrsc 
292685309fSrsc int
302685309fSrsc sys_exit(void)
312685309fSrsc {
322685309fSrsc   proc_exit();
332685309fSrsc   return 0;  // not reached
342685309fSrsc }
352685309fSrsc 
362685309fSrsc int
372685309fSrsc sys_wait(void)
382685309fSrsc {
392685309fSrsc   return proc_wait();
402685309fSrsc }
412685309fSrsc 
422685309fSrsc int
432685309fSrsc sys_kill(void)
442685309fSrsc {
452685309fSrsc   int pid;
462685309fSrsc 
47224f6598Srsc   if(argint(0, &pid) < 0)
482685309fSrsc     return -1;
492685309fSrsc   return proc_kill(pid);
502685309fSrsc }
512685309fSrsc 
522685309fSrsc int
532685309fSrsc sys_getpid(void)
542685309fSrsc {
55b6095304Srsc   return cp->pid;
562685309fSrsc }
572685309fSrsc 
582685309fSrsc int
592685309fSrsc sys_sbrk(void)
602685309fSrsc {
61224f6598Srsc   int addr;
622685309fSrsc   int n;
632685309fSrsc 
64224f6598Srsc   if(argint(0, &n) < 0)
652685309fSrsc     return -1;
66224f6598Srsc   if((addr = growproc(n)) < 0)
672685309fSrsc     return -1;
682685309fSrsc   setupsegs(cp);
692685309fSrsc   return addr;
702685309fSrsc }
714bcd0f6aSrsc 
724bcd0f6aSrsc int
73*efc12b8eSrsc sys_sleep(void)
744bcd0f6aSrsc {
75*efc12b8eSrsc   int n, ticks0;
76*efc12b8eSrsc 
77*efc12b8eSrsc   if(argint(0, &n) < 0)
78*efc12b8eSrsc     return -1;
79*efc12b8eSrsc   acquire(&tickslock);
80*efc12b8eSrsc   ticks0 = ticks;
81*efc12b8eSrsc   while(ticks - ticks0 < n){
82*efc12b8eSrsc     if(cp->killed){
83*efc12b8eSrsc       release(&tickslock);
84*efc12b8eSrsc       return -1;
85*efc12b8eSrsc     }
86*efc12b8eSrsc     sleep(&ticks, &tickslock);
87*efc12b8eSrsc   }
88*efc12b8eSrsc   release(&tickslock);
894bcd0f6aSrsc   return 0;
904bcd0f6aSrsc }
91