diff options
Diffstat (limited to 'syscall.c')
-rw-r--r-- | syscall.c | 33 |
1 files changed, 21 insertions, 12 deletions
@@ -42,13 +42,16 @@ fetcharg(int argno, int *ip) return fetchint(curproc[cpu()], esp + 8 + 4*argno, ip); } -void +int sys_fork() { - newproc(); + struct proc *np; + + np = newproc(); + return np->pid; } -void +int sys_exit() { struct proc *p; @@ -67,14 +70,16 @@ sys_exit() p->pid = 1; swtch(); + + return 0; } -void +int sys_wait() { struct proc *p; struct proc *cp = curproc[cpu()]; - int any; + int any, pid; cprintf("waid pid %d ppid %d\n", cp->pid, cp->ppid); @@ -84,28 +89,30 @@ sys_wait() if(p->state == ZOMBIE && p->ppid == cp->pid){ kfree(p->mem, p->sz); kfree(p->kstack, KSTACKSIZE); + pid = p->pid; p->state = UNUSED; cprintf("%x collected %x\n", cp, p); - return; + return pid; } if(p->state != UNUSED && p->ppid == cp->pid) any = 1; } if(any == 0){ cprintf("%x nothing to wait for\n", cp); - return; + return -1; } sleep(cp); } } -void +int sys_cons_putc() { int c; fetcharg(0, &c); cons_putc(c & 0xff); + return 0; } void @@ -113,24 +120,26 @@ syscall() { struct proc *cp = curproc[cpu()]; int num = cp->tf->tf_regs.reg_eax; + int ret = -1; cprintf("%x sys %d\n", cp, num); switch(num){ case SYS_fork: - sys_fork(); + ret = sys_fork(); break; case SYS_exit: - sys_exit(); + ret = sys_exit(); break; case SYS_wait: - sys_wait(); + ret = sys_wait(); break; case SYS_cons_putc: - sys_cons_putc(); + ret = sys_cons_putc(); break; default: cprintf("unknown sys call %d\n", num); // XXX fault break; } + cp->tf->tf_regs.reg_eax = ret; } |