From fe2e78f3c7befc5a6c6aa87cfac1395ae8011c94 Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Tue, 19 May 2026 12:40:23 +0200 Subject: [PATCH] Extend AP bootstrap code --- xtoskrnl/ke/amd64/krnlinit.cc | 20 ++++++++++++++++---- xtoskrnl/ke/i686/krnlinit.cc | 20 ++++++++++++++++---- 2 files changed, 32 insertions(+), 8 deletions(-) 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(); }