]> Devi Nivas Git - cs3210-lab0.git/commitdiff
stick mpstack in cpu structure
authorkaashoek <kaashoek>
Mon, 26 Jun 2006 16:40:43 +0000 (16:40 +0000)
committerkaashoek <kaashoek>
Mon, 26 Jun 2006 16:40:43 +0000 (16:40 +0000)
bootother.S
mp.c

index eee5ebeddb91a254c3b2021251a4492015743d93..8f2b2cedf189d0c416554d96a4531d29df105107 100644 (file)
@@ -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 d4284dc2c93e6b47b0e773f0336c460cdefa3f4d..f267b8a9b54e8d4af4dd9229f352c6e0f79305f8 100644 (file)
--- 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);