diff --git a/xtoskrnl/ke/amd64/krnlinit.cc b/xtoskrnl/ke/amd64/krnlinit.cc index 76b71f2..d4647ca 100644 --- a/xtoskrnl/ke/amd64/krnlinit.cc +++ b/xtoskrnl/ke/amd64/krnlinit.cc @@ -25,11 +25,14 @@ XTAPI VOID KE::KernelInit::BootstrapApplicationProcessor(IN PPROCESSOR_START_BLOCK StartBlock) { - PKPROCESSOR_BLOCK ProcessorBlock; + PKPROCESSOR_CONTROL_BLOCK ControlBlock; /* Initialize application CPU */ AR::ProcessorSupport::InitializeProcessor(StartBlock->ProcessorStructures); + /* Get processor control block */ + ControlBlock = KE::Processor::GetCurrentProcessorControlBlock(); + /* Initialize processor */ HL::Cpu::InitializeProcessor(); @@ -39,12 +42,21 @@ KE::KernelInit::BootstrapApplicationProcessor(IN PPROCESSOR_START_BLOCK StartBlo /* Mark processor as started */ StartBlock->Started = TRUE; - /* Get current processor block */ - ProcessorBlock = KE::Processor::GetCurrentProcessorBlock(); + /* Initialize CPU power state structures */ + PO::Idle::InitializeProcessorIdleState(ControlBlock); + + /* Save processor state */ + KE::Processor::SaveProcessorState(&ControlBlock->ProcessorState); + + /* Lower to APC runlevel */ + KE::RunLevel::LowerRunLevel(APC_LEVEL); + + /* Initialize local clock for this CPU */ + HL::Timer::InitializeLocalClock(); /* Enter infinite loop */ DebugPrint(L"KernelInit::BootstrapApplicationProcessor() finished for CPU #%lu. Entering infinite loop.\n", - ProcessorBlock->CpuNumber); + ControlBlock->CpuNumber); KE::Crash::HaltSystem(); } diff --git a/xtoskrnl/ke/i686/krnlinit.cc b/xtoskrnl/ke/i686/krnlinit.cc index cd4e12c..fc62d8d 100644 --- a/xtoskrnl/ke/i686/krnlinit.cc +++ b/xtoskrnl/ke/i686/krnlinit.cc @@ -25,11 +25,14 @@ XTAPI VOID KE::KernelInit::BootstrapApplicationProcessor(IN PPROCESSOR_START_BLOCK StartBlock) { - PKPROCESSOR_BLOCK ProcessorBlock; + PKPROCESSOR_CONTROL_BLOCK ControlBlock; /* Initialize application CPU */ AR::ProcessorSupport::InitializeProcessor(StartBlock->ProcessorStructures); + /* Get processor control block */ + ControlBlock = KE::Processor::GetCurrentProcessorControlBlock(); + /* Initialize processor */ HL::Cpu::InitializeProcessor(); @@ -39,12 +42,21 @@ KE::KernelInit::BootstrapApplicationProcessor(IN PPROCESSOR_START_BLOCK StartBlo /* Mark processor as started */ StartBlock->Started = TRUE; - /* Get current processor block */ - ProcessorBlock = KE::Processor::GetCurrentProcessorBlock(); + /* Initialize CPU power state structures */ + PO::Idle::InitializeProcessorIdleState(ControlBlock); + + /* Save processor state */ + KE::Processor::SaveProcessorState(&ControlBlock->ProcessorState); + + /* Lower to APC runlevel */ + KE::RunLevel::LowerRunLevel(APC_LEVEL); + + /* Initialize local clock for this CPU */ + HL::Timer::InitializeLocalClock(); /* Enter infinite loop */ DebugPrint(L"KernelInit::BootstrapApplicationProcessor() finished for CPU #%lu. Entering infinite loop.\n", - ProcessorBlock->CpuNumber); + ControlBlock->CpuNumber); KE::Crash::HaltSystem(); }