summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorrsc <rsc>2006-07-16 15:50:13 +0000
committerrsc <rsc>2006-07-16 15:50:13 +0000
commitb74f4b57ae48719fca4fc621732b055b2debaf3e (patch)
treec485febec4a42c66783c05690a9bfb5c1b47b07f /main.c
parentef2bd07ae4cb2e27d62cfdcb7e71d82948fb80ed (diff)
downloadxv6-labs-b74f4b57ae48719fca4fc621732b055b2debaf3e.tar.gz
xv6-labs-b74f4b57ae48719fca4fc621732b055b2debaf3e.tar.bz2
xv6-labs-b74f4b57ae48719fca4fc621732b055b2debaf3e.zip
Keep interrupts disabled during startup.
Diffstat (limited to 'main.c')
-rw-r--r--main.c43
1 files changed, 27 insertions, 16 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)
{