diff --git a/bootother.S b/bootother.S index eee5ebe..8f2b2ce 100644 --- a/bootother.S +++ b/bootother.S @@ -14,7 +14,7 @@ * mp.c puts the correct %esp in start-4, and the place to jump * to in start-8. * - * Credit: Cliff Frey + * Credit: Cliff Frey and Plan 9 */ .set PROT_MODE_CSEG,0x8 # code segment selector diff --git a/mp.c b/mp.c index d4284dc..f267b8a 100644 --- a/mp.c +++ b/mp.c @@ -91,20 +91,18 @@ enum { /* LAPIC_TDCR */ }; #define APBOOTCODE 0x7000 // XXX hack +#define MPSTACK 512 -static struct MP* mp; /* The MP floating point structure */ +static struct MP* mp; // The MP floating point structure static uint32_t *lapicaddr; static struct cpu { - uint8_t apicid; /* Local APIC ID */ - int lintr[2]; /* Local APIC */ + uint8_t apicid; // Local APIC ID + int lintr[2]; // Local APIC + char mpstack[MPSTACK]; // per-cpu start-up stack, only used to get into main() } cpus[NCPU]; static int ncpu; static struct cpu *bcpu; -// per-cpu start-up stack, only used to get into main() -#define MPSTACK 512 -char mpstacks[NCPU * MPSTACK]; - static int lapic_read(int r) { @@ -361,7 +359,7 @@ mp_init() if (cpus+c == bcpu) continue; cprintf ("starting processor %d\n", c); release_grant_spinlock(&kernel_lock, c); - *(unsigned *)(APBOOTCODE-4) = (unsigned) mpstacks + (c + 1) * MPSTACK; // tell it what to use for %esp + *(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 lapic_startap(cpus + c, (uint32_t) APBOOTCODE); acquire_spinlock(&kernel_lock);