diff options
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 16 |
1 files changed, 12 insertions, 4 deletions
@@ -6,7 +6,6 @@ #include "x86.h" #include "proc.h" #include "spinlock.h" -#include "msr.h" struct { struct spinlock lock; @@ -17,7 +16,11 @@ static struct proc *initproc; int nextpid = 1; extern void forkret(void); + +// we can return two ways out of the kernel and +// for new processes we can choose either way extern void sysexit(void); +extern void trapret(void); static void wakeup1(void *chan); @@ -101,6 +104,10 @@ found: // Leave room for trap frame. sp -= sizeof *p->tf; + + if ((uint64) sp % 16) + panic("misaligned sp"); + p->tf = (struct trapframe*)sp; // Set up new context to start executing at forkret, @@ -132,6 +139,8 @@ userinit(void) inituvm(p->pgdir, _binary_initcode_start, (uint64)_binary_initcode_size); p->sz = PGSIZE; memset(p->tf, 0, sizeof(*p->tf)); + p->tf->cs = UCSEG | 0x3; + p->tf->ss = UDSEG | 0x3; p->tf->r11 = FL_IF; p->tf->rsp = PGSIZE; p->tf->rcx = 0; // beginning of initcode.S @@ -321,12 +330,12 @@ scheduler(void) { struct proc *p; struct cpu *c = mycpu(); + c->proc = 0; - for(;;){ // Enable interrupts on this processor. sti(); - + // Loop over process table looking for process to run. acquire(&ptable.lock); for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){ @@ -336,7 +345,6 @@ scheduler(void) // Switch to chosen process. It is the process's job // to release ptable.lock and then reacquire it // before jumping back to us. - c->proc = p; switchuvm(p); p->state = RUNNING; |