diff options
| -rw-r--r-- | main.c | 43 | ||||
| -rw-r--r-- | mp.c | 4 | ||||
| -rw-r--r-- | spinlock.c | 4 | 
3 files changed, 32 insertions, 19 deletions
@@ -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)  { @@ -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);    }  } @@ -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();  }  | 
