aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-04-06 17:24:36 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-04-06 18:07:17 +0200
commitf456f1674d48932846eb7b5ec1df630ad67e7e3d (patch)
tree1722176d1aa98d0942fb10cfade035c658bf4d14 /kernel/kapi
parentc18feddd51d1a1398d1245229c5f889dd40554b3 (diff)
downloadteachos-f456f1674d48932846eb7b5ec1df630ad67e7e3d.tar.xz
teachos-f456f1674d48932846eb7b5ec1df630ad67e7e3d.zip
kernel/acpi: discover local interrupt controllers
Diffstat (limited to 'kernel/kapi')
-rw-r--r--kernel/kapi/acpi.cpp43
-rw-r--r--kernel/kapi/devices.cpp10
2 files changed, 52 insertions, 1 deletions
diff --git a/kernel/kapi/acpi.cpp b/kernel/kapi/acpi.cpp
index 998d7a0..1283d7e 100644
--- a/kernel/kapi/acpi.cpp
+++ b/kernel/kapi/acpi.cpp
@@ -5,6 +5,7 @@
#include "kernel/acpi/manager.hpp"
+#include <kstd/memory>
#include <kstd/units>
#include <algorithm>
@@ -110,12 +111,47 @@ namespace kapi::acpi
return {m_signature.data(), m_signature.size()};
}
+ [[nodiscard]] auto madt_header::local_interrupt_controller_address() const noexcept -> memory::physical_address
+ {
+ return memory::physical_address{static_cast<std::uintptr_t>(m_local_interrupt_controller_address)};
+ }
+
+ [[nodiscard]] auto madt_header::flags() const noexcept -> std::uint32_t
+ {
+ return m_flags;
+ }
+
+ [[nodiscard]] auto madt_subtable_header::type() const noexcept -> std::uint8_t
+ {
+ return m_type;
+ }
+
+ [[nodiscard]] auto madt_subtable_header::length() const noexcept -> std::size_t
+ {
+ return m_length;
+ }
+
+ [[nodiscard]] auto madt_local_apic::apic_id() const noexcept -> std::uint8_t
+ {
+ return m_apic_id;
+ }
+
+ [[nodiscard]] auto madt_local_apic::flags() const noexcept -> std::uint32_t
+ {
+ return m_flags;
+ }
+
+ [[nodiscard]] auto madt_local_apic::processor_id() const noexcept -> std::uint32_t
+ {
+ return m_processor_id;
+ }
+
auto init(root_system_description_pointer const & sdp) -> bool
{
auto static constinit initialized = std::atomic_flag{};
if (initialized.test_and_set())
{
- system::panic("[OS::ACPI] The ACPI manager has already been initialized!");
+ system::panic("[OS:ACPI] The ACPI manager has already been initialized!");
}
manager.emplace(sdp);
@@ -130,4 +166,9 @@ namespace kapi::acpi
return sum == 0;
}
+ auto get_table(std::string_view signature) -> kstd::observer_ptr<system_description_table_header const>
+ {
+ return manager->get_table(signature);
+ }
+
}; // namespace kapi::acpi
diff --git a/kernel/kapi/devices.cpp b/kernel/kapi/devices.cpp
index 031f2c9..b2911b0 100644
--- a/kernel/kapi/devices.cpp
+++ b/kernel/kapi/devices.cpp
@@ -1,7 +1,9 @@
#include "kapi/devices.hpp"
+#include "kapi/acpi.hpp"
#include "kapi/system.hpp"
+#include "kernel/devices/cpu.hpp"
#include "kernel/devices/root_bus.hpp"
#include <kstd/flat_map>
@@ -35,6 +37,14 @@ namespace kapi::devices
auto & bus = root_bus.emplace();
register_device(bus);
bus.init();
+
+ auto madt = kapi::acpi::get_table("APIC");
+ if (madt)
+ {
+ auto cpu_major = allocate_major_number();
+ auto cpu = kstd::make_unique<kernel::devices::cpu>(cpu_major);
+ bus.add_child(std::move(cpu));
+ }
}
auto get_root_bus() -> bus &