diff --git a/proc.c b/proc.c index d74a5e9..2ed2952 100644 --- a/proc.c +++ b/proc.c @@ -55,7 +55,7 @@ growproc(int n) newmem = kalloc(cp->sz + n); if(newmem == 0) - return 0xffffffff; + return -1; memmove(newmem, cp->mem, cp->sz); memset(newmem + cp->sz, 0, n); oldmem = cp->mem; @@ -159,8 +159,10 @@ userinit(void) p->mem = kalloc(p->sz); p->cwd = namei("/"); memset(p->tf, 0, sizeof(*p->tf)); - p->tf->es = p->tf->ds = p->tf->ss = (SEG_UDATA << 3) | DPL_USER; p->tf->cs = (SEG_UCODE << 3) | DPL_USER; + p->tf->ds = (SEG_UDATA << 3) | DPL_USER; + p->tf->es = p->tf->ds; + p->tf->ss = p->tf->ds; p->tf->eflags = FL_IF; p->tf->esp = p->sz; @@ -168,6 +170,7 @@ userinit(void) p->tf->esp -= 4; *(uint*)(p->mem + p->tf->esp) = 0xefefefef; + // On entry to user space, start executing at beginning of initcode.S. p->tf->eip = 0; memmove(p->mem, _binary_initcode_start, (int)_binary_initcode_size); safestrcpy(p->name, "initcode", sizeof(p->name)); @@ -298,7 +301,7 @@ sleep(void *chan, struct spinlock *lk) //PAGEBREAK! // Wake up all processes sleeping on chan. // Proc_table_lock must be held. -void +static void wakeup1(void *chan) { struct proc *p;