diff --git a/main.c b/main.c
index cd893d5ba1cdd142ff48fb1894c535f268bb4ca6..5781322693c3b2f3e527009b27b3e9d7ee25290a 100644
--- a/main.c
+++ b/main.c
@@ -23,22 +23,24 @@ void
 main0(void)
 {
   int i;
+  int bcpu;
   struct proc *p;
 
   // clear BSS
   memset(edata, 0, end - edata);
 
-  // switch to bootstrap processor's stack
-  asm volatile("movl %0, %%esp" : : "r" (cpus[0].mpstack + MPSTACK - 32));
-  asm volatile("movl %0, %%ebp" : : "r" (cpus[0].mpstack + MPSTACK));
-
   // Prevent release() from enabling interrupts.
   for(i=0; i<NCPU; i++)
     cpus[i].nlock = 1;
 
   mp_init(); // collect info about this machine
+  bcpu = mp_bcpu();
+
+  // switch to bootstrap processor's stack
+  asm volatile("movl %0, %%esp" : : "r" (cpus[0].mpstack + MPSTACK - 32));
+  asm volatile("movl %0, %%ebp" : : "r" (cpus[0].mpstack + MPSTACK));
 
-  lapic_init(mp_bcpu());
+  lapic_init(bcpu);
 
   cprintf("\ncpu%d: starting xv6\n\n", cpu());
 
diff --git a/mp.c b/mp.c
index 59beda3ea7550ed2146fc803fb99912149549d6d..c34982d9849464f896a7caa2f5850c208244aa8f 100644
--- a/mp.c
+++ b/mp.c
@@ -191,7 +191,8 @@ mp_init(void)
 int
 mp_bcpu(void)
 {
-  return bcpu-cpus;
+  if (ismp) return bcpu-cpus;
+  else return 0;
 }
 
 extern void mpmain(void);