aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-04-06 18:43:28 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-04-06 18:43:28 +0200
commitf50815110789a0f8f6e5ca66ffd49b26578791a9 (patch)
tree992b3c344e69fab4dc56872566bc7323e8892913 /arch/x86_64
parent8d08b3b905d211e989848e1abf3a8ff2535836c8 (diff)
downloadteachos-f50815110789a0f8f6e5ca66ffd49b26578791a9.tar.xz
teachos-f50815110789a0f8f6e5ca66ffd49b26578791a9.zip
kernel: generalize CPU discovery
Diffstat (limited to 'arch/x86_64')
-rw-r--r--arch/x86_64/CMakeLists.txt1
-rw-r--r--arch/x86_64/kapi/acpi.cpp13
-rw-r--r--arch/x86_64/kapi/platform.cpp70
3 files changed, 71 insertions, 13 deletions
diff --git a/arch/x86_64/CMakeLists.txt b/arch/x86_64/CMakeLists.txt
index 62a2aad..87cb98c 100644
--- a/arch/x86_64/CMakeLists.txt
+++ b/arch/x86_64/CMakeLists.txt
@@ -19,6 +19,7 @@ target_sources("x86_64" PRIVATE
"kapi/devices.cpp"
"kapi/interrupts.cpp"
"kapi/memory.cpp"
+ "kapi/platform.cpp"
"kapi/system.cpp"
# CPU Initialization
diff --git a/arch/x86_64/kapi/acpi.cpp b/arch/x86_64/kapi/acpi.cpp
index 9766154..ec38aee 100644
--- a/arch/x86_64/kapi/acpi.cpp
+++ b/arch/x86_64/kapi/acpi.cpp
@@ -1,16 +1,9 @@
#include "kapi/acpi.hpp"
-#include "kapi/devices.hpp"
-#include "kapi/memory.hpp"
-
#include "arch/boot/boot.hpp"
-#include "arch/devices/local_apic.hpp"
#include <kstd/memory>
-#include <cstddef>
-#include <cstdint>
-
namespace kapi::acpi
{
@@ -34,10 +27,4 @@ namespace kapi::acpi
return kstd::make_observer(system_description_pointer);
}
- auto create_local_interrupt_controller(std::size_t major, std::size_t minor, std::uint64_t hardware_id,
- memory::physical_address address) -> kstd::unique_ptr<devices::device>
- {
- return kstd::make_unique<arch::devices::local_apic>(major, minor, hardware_id, address);
- }
-
} // namespace kapi::acpi \ No newline at end of file
diff --git a/arch/x86_64/kapi/platform.cpp b/arch/x86_64/kapi/platform.cpp
new file mode 100644
index 0000000..2e7c7e4
--- /dev/null
+++ b/arch/x86_64/kapi/platform.cpp
@@ -0,0 +1,70 @@
+#include "kapi/platform.hpp"
+
+#include "kapi/acpi.hpp"
+#include "kapi/devices.hpp"
+#include "kapi/memory.hpp"
+
+#include "arch/devices/local_apic.hpp"
+
+#include <kstd/memory>
+#include <kstd/print>
+
+#include <cstddef>
+#include <cstdint>
+
+namespace kapi::platform
+{
+
+ namespace
+ {
+ constexpr auto default_lapic_address = kapi::memory::physical_address{0xFEE0'0000};
+ }
+
+ auto discover_cpu_topology(kapi::devices::bus & bus) -> bool
+ {
+ auto madt = kapi::acpi::get_table("APIC");
+ if (!madt)
+ {
+ kstd::println("[x86_64:PLT] Failed to find ACPI APIC table");
+ return false;
+ }
+
+ auto const * current = reinterpret_cast<std::byte const *>(madt.get()) + sizeof(kapi::acpi::madt_header);
+ auto const * end = reinterpret_cast<std::byte const *>(madt.get()) + madt->length();
+
+ auto bsp_found = false;
+ auto core_count = 0uz;
+
+ while (current < end)
+ {
+ auto const * sub_table = reinterpret_cast<kapi::acpi::madt_subtable_header const *>(current);
+ if (sub_table->type() == 0)
+ {
+ auto const * local_apic = reinterpret_cast<kapi::acpi::madt_local_apic const *>(sub_table);
+ if (local_apic->flags() & 0b11)
+ {
+ auto is_bsp = !bsp_found;
+ bsp_found = true;
+
+ if (kapi::platform::cpu_detected(bus, local_apic->processor_id(), is_bsp))
+ {
+ ++core_count;
+ }
+ }
+ }
+
+ current += sub_table->length();
+ }
+
+ kstd::println("[x86_64:PLT] Found {} CPU cores", core_count);
+
+ return core_count > 0;
+ }
+
+ auto create_core_interrupt_controller(std::size_t major, std::size_t minor, std::uint64_t hardware_id)
+ -> kstd::unique_ptr<devices::device>
+ {
+ return kstd::make_unique<arch::devices::local_apic>(major, minor, hardware_id, default_lapic_address);
+ }
+
+} // namespace kapi::platform \ No newline at end of file