diff --git a/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp b/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp index 02b968e..b858b02 100644 --- a/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp +++ b/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp @@ -28,17 +28,17 @@ volatile bool CPUEnabled = false; static __attribute__((aligned(PAGE_SIZE))) CPUData CPUs[MAX_CPU] = {0}; CPUData *GetCPU(long id) { return &CPUs[id]; } -CPUData *GetCurrentCPU() +SafeFunction CPUData *GetCurrentCPU() { CPUData *data = (CPUData *)CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE); - if (data == nullptr && Interrupts::apic[0]) + if (unlikely(data == nullptr && Interrupts::apic[0])) data = &CPUs[((APIC::APIC *)Interrupts::apic[0])->Read(APIC::APIC_ID) >> 24]; - if (data == nullptr) + if (unlikely(data == nullptr)) return nullptr; // The caller should handle this. - if (!data->IsActive) + if (unlikely(data->IsActive != true)) { error("CPU %d is not active!", data->ID); if ((&CPUs[0])->IsActive) @@ -46,6 +46,7 @@ CPUData *GetCurrentCPU() else return nullptr; // We are in trouble. } + assert(data->Checksum == CPU_DATA_CHECKSUM); // This should never happen. return data; } diff --git a/Network/NetworkController.cpp b/Network/NetworkController.cpp index 5024ccd..1576cac 100644 --- a/Network/NetworkController.cpp +++ b/Network/NetworkController.cpp @@ -134,7 +134,7 @@ namespace NetworkInterfaceManager } TaskManager->GetCurrentThread()->SetPriority(Tasking::TaskPriority::Idle); - CPU::Pause(true); + CPU::Halt(true); } void NetworkInterface::StopNetworkStack()