aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi
diff options
context:
space:
mode:
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 &