diff --git a/main.c b/main.c index 63e8e35..3f2d57a 100644 --- a/main.c +++ b/main.c @@ -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; istate = 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) { diff --git a/mp.c b/mp.c index 19e18d1..c6e7d3f 100644 --- a/mp.c +++ b/mp.c @@ -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); } } diff --git a/spinlock.c b/spinlock.c index 7ab0bbe..c0f236d 100644 --- a/spinlock.c +++ b/spinlock.c @@ -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(); }