diff options
author | rsc <rsc> | 2007-09-27 20:32:45 +0000 |
---|---|---|
committer | rsc <rsc> | 2007-09-27 20:32:45 +0000 |
commit | 4f74de0edc243ffdae0233eb5c84d09c44677ccf (patch) | |
tree | a06bec65e5b6ad8db480963ffc6646a176baa8da | |
parent | ce2e7515552adca3a60e349de2931112736d17bf (diff) | |
download | xv6-labs-4f74de0edc243ffdae0233eb5c84d09c44677ccf.tar.gz xv6-labs-4f74de0edc243ffdae0233eb5c84d09c44677ccf.tar.bz2 xv6-labs-4f74de0edc243ffdae0233eb5c84d09c44677ccf.zip |
okay, that was long enough - revert
-rw-r--r-- | main.c | 8 | ||||
-rw-r--r-- | proc.c | 17 | ||||
-rw-r--r-- | proc.h | 5 |
3 files changed, 14 insertions, 16 deletions
@@ -42,14 +42,12 @@ main(void) userinit(); // first user process // Allocate scheduler stacks and boot the other CPUs. - for(i=0; i<ncpu; i++){ + for(i=0; i<ncpu; i++) cpus[i].stack = kalloc(KSTACKSIZE); - *(void**)(cpus[i].stack + KSTACKTOP) = 0; - } bootothers(); // Switch to our scheduler stack and continue with mpmain. - asm volatile("movl %0, %%esp" : : "r" (cpus[bcpu].stack+KSTACKTOP)); + asm volatile("movl %0, %%esp" : : "r" (cpus[bcpu].stack+KSTACKSIZE)); mpmain(); } @@ -86,7 +84,7 @@ bootothers(void) continue; // Fill in %esp, %eip and start code on cpu. - *(void**)(code-4) = c->stack + KSTACKTOP; + *(void**)(code-4) = c->stack + KSTACKSIZE; *(void**)(code-8) = mpmain; lapic_startap(c->apicid, (uint)code); @@ -75,7 +75,7 @@ setupsegs(struct proc *p) c = &cpus[cpu()]; c->ts.ss0 = SEG_PROCSTACK << 3; if(p) - c->ts.esp0 = (uint)(p->kstack + KSTACKTOP); + c->ts.esp0 = (uint)(p->kstack + KSTACKSIZE); else c->ts.esp0 = 0xffffffff; @@ -118,8 +118,7 @@ copyproc(struct proc *p) np->state = UNUSED; return 0; } - *(void**)(np->kstack + KSTACKTOP) = np; - np->tf = (struct trapframe*)(np->kstack + KSTACKTOP) - 1; + np->tf = (struct trapframe*)(np->kstack + KSTACKSIZE) - 1; if(p){ // Copy process state from p. np->parent = p; @@ -188,10 +187,12 @@ userinit(void) struct proc* curproc(void) { - uint esp; + struct proc *p; - asm volatile("movl %%esp, %0" : "=a" (esp)); - return *(struct proc**)((esp & ~(KSTACKSIZE-1)) + KSTACKTOP); + pushcli(); + p = cpus[cpu()].curproc; + popcli(); + return p; } //PAGEBREAK: 42 @@ -222,12 +223,14 @@ scheduler(void) // Switch to chosen process. It is the process's job // to release proc_table_lock and then reacquire it // before jumping back to us. + c->curproc = p; setupsegs(p); p->state = RUNNING; swtch(&c->context, &p->context); // Process is done running for now. // It should have changed its p->state before coming back. + c->curproc = 0; setupsegs(0); } @@ -236,7 +239,7 @@ scheduler(void) } // Enter scheduler. Must already hold proc_table_lock -// and have changed cp->state. +// and have changed curproc[cpu()]->state. void sched(void) { @@ -46,10 +46,6 @@ struct proc { char name[16]; // Process name (debugging) }; -// The word at kstack + KSTACKTOP is a pointer to the struct proc. -#define KSTACKTOP (KSTACKSIZE-4) - - // Process memory is laid out contiguously, low addresses first: // text // original data and bss @@ -59,6 +55,7 @@ struct proc { // Per-CPU state struct cpu { uchar apicid; // Local APIC ID + struct proc *curproc; // Process currently running. struct context context; // Switch here to enter scheduler struct taskstate ts; // Used by x86 to find stack for interrupt struct segdesc gdt[NSEGS]; // x86 global descriptor table |