From b74f4b57ae48719fca4fc621732b055b2debaf3e Mon Sep 17 00:00:00 2001 From: rsc Date: Sun, 16 Jul 2006 15:50:13 +0000 Subject: Keep interrupts disabled during startup. --- main.c | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) (limited to 'main.c') 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; istate = 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) { -- cgit v1.2.3