summaryrefslogtreecommitdiff
path: root/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'syscall.c')
-rw-r--r--syscall.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/syscall.c b/syscall.c
index beadcbb..1d2eb54 100644
--- a/syscall.c
+++ b/syscall.c
@@ -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;
}