From aae1f224585c1b2ad6e1b8029a7c8dbc898f33bd Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 12 Oct 2022 04:34:56 +0300 Subject: [PATCH] Fixing SMP stub for x32 and arm64 --- .../aarch64/cpu/SymmetricMultiprocessing.cpp | 40 +++++++++++++++++++ .../amd64/cpu/SymmetricMultiprocessing.cpp | 11 ++--- .../i686/cpu/SymmetricMultiprocessing.cpp | 40 +++++++++++++++++++ 3 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 Architecture/aarch64/cpu/SymmetricMultiprocessing.cpp create mode 100644 Architecture/i686/cpu/SymmetricMultiprocessing.cpp diff --git a/Architecture/aarch64/cpu/SymmetricMultiprocessing.cpp b/Architecture/aarch64/cpu/SymmetricMultiprocessing.cpp new file mode 100644 index 0000000..b64644e --- /dev/null +++ b/Architecture/aarch64/cpu/SymmetricMultiprocessing.cpp @@ -0,0 +1,40 @@ +#include + +#include +#include +#include + +#include "../../../kernel.h" + +volatile bool CPUEnabled = false; + +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +static __attribute__((aligned(PAGE_SIZE))) CPUData CPUs[MAX_CPU] = {0}; + +CPUData *GetCPU(uint64_t id) { return &CPUs[id]; } + +CPUData *GetCurrentCPU() +{ + uint64_t ret = 0; + + if (!CPUs[ret].IsActive) + { + error("CPU %d is not active!", ret); + return &CPUs[0]; + } + + if (CPUs[ret].Checksum != CPU_DATA_CHECKSUM) + { + error("CPU %d data is corrupted!", ret); + return &CPUs[0]; + } + return &CPUs[ret]; +} + +namespace SMP +{ + void Initialize(void *madt) + { + fixme("SMP::Initialize() is not implemented!"); + } +} diff --git a/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp b/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp index 6fc6220..992c132 100644 --- a/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp +++ b/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp @@ -27,6 +27,7 @@ enum SMPTrampolineAddress volatile bool CPUEnabled = false; +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" static __attribute__((aligned(PAGE_SIZE))) CPUData CPUs[MAX_CPU] = {0}; CPUData *GetCPU(uint64_t id) { return &CPUs[id]; } @@ -58,7 +59,7 @@ extern "C" void StartCPU() { CPU::Interrupts(CPU::Disable); uint64_t CPU_ID; -#if defined(__amd64__) + // Enable CPU features { CPU::x64::CR0 cr0 = CPU::x64::readcr0(); @@ -103,9 +104,7 @@ extern "C" void StartCPU() // Initialize GDT and IDT Interrupts::Initialize(CPU_ID); -#elif defined(__i386__) -#elif defined(__aarch64__) -#endif + CPU::Interrupts(CPU::Enable); KPrint("CPU %d is online", CPU_ID); CPUEnabled = true; @@ -116,7 +115,6 @@ namespace SMP { void Initialize(void *madt) { -#if defined(__amd64__) for (uint8_t i = 0; i < ((ACPI::MADT *)madt)->CPUCores; i++) if ((((APIC::APIC *)Interrupts::apic)->Read(APIC::APIC::APIC_ID) >> 24) != ((ACPI::MADT *)madt)->lapic[i]->ACPIProcessorId) { @@ -148,8 +146,5 @@ namespace SMP trace("CPU %d loaded.", ((ACPI::MADT *)madt)->lapic[i]->APICId); CPUEnabled = false; } -#elif defined(__i386__) -#elif defined(__aarch64__) -#endif } } diff --git a/Architecture/i686/cpu/SymmetricMultiprocessing.cpp b/Architecture/i686/cpu/SymmetricMultiprocessing.cpp new file mode 100644 index 0000000..b64644e --- /dev/null +++ b/Architecture/i686/cpu/SymmetricMultiprocessing.cpp @@ -0,0 +1,40 @@ +#include + +#include +#include +#include + +#include "../../../kernel.h" + +volatile bool CPUEnabled = false; + +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +static __attribute__((aligned(PAGE_SIZE))) CPUData CPUs[MAX_CPU] = {0}; + +CPUData *GetCPU(uint64_t id) { return &CPUs[id]; } + +CPUData *GetCurrentCPU() +{ + uint64_t ret = 0; + + if (!CPUs[ret].IsActive) + { + error("CPU %d is not active!", ret); + return &CPUs[0]; + } + + if (CPUs[ret].Checksum != CPU_DATA_CHECKSUM) + { + error("CPU %d data is corrupted!", ret); + return &CPUs[0]; + } + return &CPUs[ret]; +} + +namespace SMP +{ + void Initialize(void *madt) + { + fixme("SMP::Initialize() is not implemented!"); + } +}