diff options
author | rsc <rsc> | 2006-07-16 15:50:13 +0000 |
---|---|---|
committer | rsc <rsc> | 2006-07-16 15:50:13 +0000 |
commit | b74f4b57ae48719fca4fc621732b055b2debaf3e (patch) | |
tree | c485febec4a42c66783c05690a9bfb5c1b47b07f | |
parent | ef2bd07ae4cb2e27d62cfdcb7e71d82948fb80ed (diff) | |
download | xv6-labs-b74f4b57ae48719fca4fc621732b055b2debaf3e.tar.gz xv6-labs-b74f4b57ae48719fca4fc621732b055b2debaf3e.tar.bz2 xv6-labs-b74f4b57ae48719fca4fc621732b055b2debaf3e.zip |
Keep interrupts disabled during startup.
-rw-r--r-- | main.c | 43 | ||||
-rw-r--r-- | mp.c | 4 | ||||
-rw-r--r-- | spinlock.c | 4 |
3 files changed, 32 insertions, 19 deletions
@@ -11,36 +11,30 @@ #include "spinlock.h" extern char edata[], end[]; -extern int acpu; extern uint8_t _binary_user1_start[], _binary_user1_size[]; extern uint8_t _binary_usertests_start[], _binary_usertests_size[]; extern uint8_t _binary_userfs_start[], _binary_userfs_size[]; extern int use_console_lock; -struct spinlock sillylock; // hold this to keep interrupts disabled - +// CPU 0 starts running C code here. int main() { + int i; struct proc *p; - if (acpu) { - cprintf("an application processor\n"); - idtinit(); // CPU's idt - lapic_init(cpu()); - lapic_timerinit(); - lapic_enableintr(); - scheduler(); - } - acpu = 1; - // clear BSS memset(edata, 0, end - edata); + // Make sure interrupts stay disabled on all processors + // until each signals it is ready, by pretending to hold + // an extra lock. + for(i=0; i<NCPU; i++) + cpus[i].nlock++; + mp_init(); // collect info about this machine - acquire(&sillylock); use_console_lock = 1; lapic_init(mp_bcpu()); @@ -78,7 +72,8 @@ main() // init disk device //ide_init(); - // become interruptable + // Enable interrupts on this processor. + cpus[cpu()].nlock--; sti(); p = copyproc(&proc[0]); @@ -87,13 +82,29 @@ main() //load_icode(p, _binary_userfs_start, (unsigned) _binary_userfs_size); p->state = RUNNABLE; cprintf("loaded userfs\n"); - release(&sillylock); scheduler(); return 0; } +// Additional processors start here. +int +mpmain(void) +{ + cprintf("an application processor\n"); + idtinit(); // CPU's idt + lapic_init(cpu()); + lapic_timerinit(); + lapic_enableintr(); + + // Enable interrupts on this processor. + cpus[cpu()].nlock--; + sti(); + + scheduler(); +} + void load_icode(struct proc *p, uint8_t *binary, unsigned size) { @@ -191,6 +191,8 @@ mp_bcpu(void) return bcpu-cpus; } +extern void mpmain(void); + void mp_startthem() { @@ -205,7 +207,7 @@ mp_startthem() if (c == cpu()) continue; cprintf ("starting processor %d\n", c); *(unsigned *)(APBOOTCODE-4) = (unsigned) (cpus[c].mpstack) + MPSTACK; // tell it what to use for %esp - *(unsigned *)(APBOOTCODE-8) = (unsigned)&main; // tell it where to jump to + *(unsigned *)(APBOOTCODE-8) = (unsigned)mpmain; // tell it where to jump to lapic_startap(cpus[c].apicid, (uint32_t) APBOOTCODE); } } @@ -10,7 +10,7 @@ // because cprintf uses them itself. #define cprintf dont_use_cprintf -extern int bootstrap; +extern int use_console_lock; int getcallerpc(void *v) @@ -34,7 +34,7 @@ release(struct spinlock * lock) { cpuid(0, 0, 0, 0, 0); // memory barrier lock->locked = 0; - if(--cpus[cpu()].nlock == 0 && !bootstrap) + if(--cpus[cpu()].nlock == 0) sti(); } |