summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <rsc>2007-09-27 20:32:45 +0000
committerrsc <rsc>2007-09-27 20:32:45 +0000
commit4f74de0edc243ffdae0233eb5c84d09c44677ccf (patch)
treea06bec65e5b6ad8db480963ffc6646a176baa8da
parentce2e7515552adca3a60e349de2931112736d17bf (diff)
downloadxv6-labs-4f74de0edc243ffdae0233eb5c84d09c44677ccf.tar.gz
xv6-labs-4f74de0edc243ffdae0233eb5c84d09c44677ccf.tar.bz2
xv6-labs-4f74de0edc243ffdae0233eb5c84d09c44677ccf.zip
okay, that was long enough - revert
-rw-r--r--main.c8
-rw-r--r--proc.c17
-rw-r--r--proc.h5
3 files changed, 14 insertions, 16 deletions
diff --git a/main.c b/main.c
index 0f1acc8..464112b 100644
--- a/main.c
+++ b/main.c
@@ -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);
diff --git a/proc.c b/proc.c
index d937258..e139c39 100644
--- a/proc.c
+++ b/proc.c
@@ -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)
{
diff --git a/proc.h b/proc.h
index a2abb82..2063baa 100644
--- a/proc.h
+++ b/proc.h
@@ -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