From 7a27912dacfded593f14329a59fe38c33fafbe16 Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Wed, 10 Jun 2026 10:22:15 +0200 Subject: [PATCH] Dynamically allocate active processors affinity map --- xtoskrnl/hl/x86/cpu.cc | 29 +++++++++++++++++++++++++++-- xtoskrnl/includes/hl/cpu.hh | 3 ++- xtoskrnl/ke/amd64/krnlinit.cc | 1 + xtoskrnl/ke/i686/krnlinit.cc | 1 + 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/xtoskrnl/hl/x86/cpu.cc b/xtoskrnl/hl/x86/cpu.cc index 6988e0b66..202d4ef3b 100644 --- a/xtoskrnl/hl/x86/cpu.cc +++ b/xtoskrnl/hl/x86/cpu.cc @@ -32,8 +32,12 @@ HL::Cpu::InitializeProcessor(VOID) ProcessorBlock->StallScaleFactor = INITIAL_STALL_FACTOR; ProcessorBlock->Idr = 0xFFFFFFFF; - /* Register this CPU in the global active processors map */ - KE::Affinity::AtomicSetProcessorAffinity(&ActiveProcessors, ProcessorBlock->CpuNumber); + /* Check if active processors map is initialized */ + if(ActiveProcessors != NULLPTR) + { + /* Register this CPU in the global active processors map */ + KE::Affinity::AtomicSetProcessorAffinity(ActiveProcessors, ProcessorBlock->CpuNumber); + } /* Initialize APIC for this processor */ HL::Pic::InitializePic(); @@ -42,6 +46,27 @@ HL::Cpu::InitializeProcessor(VOID) HL::RunLevel::SetRunLevel(ProcessorBlock->RunLevel); } +XTAPI +XTSTATUS +HL::Cpu::InitializeProcessorAffinity(VOID) +{ + XTSTATUS Status; + + /* Allocate an array of pointers */ + Status = KE::Affinity::CreateAffinityMap(KE::Processor::GetInstalledCpus(), &ActiveProcessors); + if(Status != STATUS_SUCCESS) + { + /* Failed to allocate memory, return error */ + return Status; + } + + /* Register BSP in the global active processors map */ + KE::Affinity::SetProcessorAffinity(ActiveProcessors, 0); + + /* Return success */ + return STATUS_SUCCESS; +} + /** * Wakes up and initializes all Application Processors (APs) and transitions them into the active kernel. * diff --git a/xtoskrnl/includes/hl/cpu.hh b/xtoskrnl/includes/hl/cpu.hh index bc39fbe64..1587f350c 100644 --- a/xtoskrnl/includes/hl/cpu.hh +++ b/xtoskrnl/includes/hl/cpu.hh @@ -18,10 +18,11 @@ namespace HL class Cpu { private: - STATIC KAFFINITY_MAP ActiveProcessors; + STATIC PKAFFINITY_MAP ActiveProcessors; public: STATIC XTAPI VOID InitializeProcessor(VOID); + STATIC XTAPI XTSTATUS InitializeProcessorAffinity(VOID); STATIC XTAPI XTSTATUS StartAllProcessors(VOID); }; } diff --git a/xtoskrnl/ke/amd64/krnlinit.cc b/xtoskrnl/ke/amd64/krnlinit.cc index 3ccf3ea87..2dee793c8 100644 --- a/xtoskrnl/ke/amd64/krnlinit.cc +++ b/xtoskrnl/ke/amd64/krnlinit.cc @@ -119,6 +119,7 @@ KE::KernelInit::BootstrapKernel(VOID) /* Start all application processors */ KE::Processor::InitializeProcessorBlocks(); + HL::Cpu::InitializeProcessorAffinity(); HL::Cpu::StartAllProcessors(); /* Register DISPATCH interrupt handler */ diff --git a/xtoskrnl/ke/i686/krnlinit.cc b/xtoskrnl/ke/i686/krnlinit.cc index d723171e6..54a0d11a4 100644 --- a/xtoskrnl/ke/i686/krnlinit.cc +++ b/xtoskrnl/ke/i686/krnlinit.cc @@ -119,6 +119,7 @@ KE::KernelInit::BootstrapKernel(VOID) /* Start all application processors */ KE::Processor::InitializeProcessorBlocks(); + HL::Cpu::InitializeProcessorAffinity(); HL::Cpu::StartAllProcessors(); /* Register DISPATCH interrupt handler */