summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.c43
-rw-r--r--mp.c4
-rw-r--r--spinlock.c4
3 files changed, 32 insertions, 19 deletions
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; 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 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();
}