]> Devi Nivas Git - cs3210-lab0.git/commitdiff
Keep interrupts disabled during startup.
authorrsc <rsc>
Sun, 16 Jul 2006 15:50:13 +0000 (15:50 +0000)
committerrsc <rsc>
Sun, 16 Jul 2006 15:50:13 +0000 (15:50 +0000)
main.c
mp.c
spinlock.c

diff --git a/main.c b/main.c
index 63e8e35875d517df592077734352b9d760c36f84..3f2d57ae8cfadb05167a7da381bf8f5ed72d379c 100644 (file)
--- a/main.c
+++ b/main.c
 #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)
 {
diff --git a/mp.c b/mp.c
index 19e18d103a097d2d16a753994906f39016f1eecc..c6e7d3fb500b82189892f946c5835211d970ccfe 100644 (file)
--- 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);
   }
 }
index 7ab0bbeb41cca23f268e882aa0b0d9614013352c..c0f236d24af40f9745a3f947abba14c85a80ea03 100644 (file)
@@ -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();
 }