internal static int MpMain(int cpu) { Tracing.Log(Tracing.Audit, "processor"); Processor processor = Processor.EnableProcessor(cpu); // Initialize dispatcher Processor.InitializeDispatcher(cpu); // Initialize the HAL processor services // Note that this must occur after EnableProcessor, as the kernel // thread does not get bound until then. (It gets bound much // earlier in the boot processor case -- need to decide if this difference is // really appropriate.) Platform.Cpu(cpu).InitializeServices(); Platform.InitializeHal(processor); Thread.CurrentThread.Affinity = cpu; Processor.ActivateTimer(cpu); #if DEBUG_SYSTEM_LOCKUP // Spin one CPU on debugger. For instance with a quad-proc // box, spin CPU 3. while (cpu == 3) { if (DebugStub.PollForBreak() == true) { DebugStub.Break(); } } #endif // DEBUG_SYSTEM_LOCKUP Processor.RestoreInterrupts(true); Tracing.Log(Tracing.Audit, "Looping in processor's kernel thread."); //while (cpu > 0) { // Thread.Yield(); //} // This probably won't be the // ultimate way of dissociating kernel entry threads // from the kernel. DebugStub.Print("AP Processor started, about to wait\n"); mpEndEvent.WaitOne(); return(0); }