From 0f1f66668b032520cc9cf728b91ae1ec4e9b348b Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 15 Feb 2023 07:13:25 +0200 Subject: [PATCH] Optimize smp GetCurrentCPU() --- .../amd64/cpu/SymmetricMultiprocessing.cpp | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp b/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp index b858b02..29fde3b 100644 --- a/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp +++ b/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp @@ -28,27 +28,22 @@ volatile bool CPUEnabled = false; static __attribute__((aligned(PAGE_SIZE))) CPUData CPUs[MAX_CPU] = {0}; CPUData *GetCPU(long id) { return &CPUs[id]; } + SafeFunction CPUData *GetCurrentCPU() { - CPUData *data = (CPUData *)CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE); + if (unlikely(!Interrupts::apic[0])) + return &CPUs[0]; /* No APIC means we are on the BSP. */ + int CoreID = ((APIC::APIC *)Interrupts::apic[0])->Read(APIC::APIC_ID) >> 24; - if (unlikely(data == nullptr && Interrupts::apic[0])) - data = &CPUs[((APIC::APIC *)Interrupts::apic[0])->Read(APIC::APIC_ID) >> 24]; - - if (unlikely(data == nullptr)) - return nullptr; // The caller should handle this. - - if (unlikely(data->IsActive != true)) + if (unlikely((&CPUs[CoreID])->IsActive != true)) { - error("CPU %d is not active!", data->ID); - if ((&CPUs[0])->IsActive) - return &CPUs[0]; - else - return nullptr; // We are in trouble. + error("CPU %d is not active!", CoreID); + assert((&CPUs[0])->IsActive == true); /* We can't continue without the BSP. */ + return &CPUs[0]; } - assert(data->Checksum == CPU_DATA_CHECKSUM); // This should never happen. - return data; + assert((&CPUs[CoreID])->Checksum == CPU_DATA_CHECKSUM); /* This should never happen. */ + return &CPUs[CoreID]; } extern "C" void StartCPU()