#include "kernel/acpi/manager.hpp" #include "kapi/acpi.hpp" #include "kapi/memory.hpp" #include "kapi/system.hpp" #include namespace kernel::acpi { manager::manager(kapi::acpi::root_system_description_pointer const & sdp) : m_sdp{&sdp} { if (m_sdp->signature() != "RSD PTR ") { kapi::system::panic("[OS:ACPI] Invalid RSDP signature!"); } if (m_sdp->revision() >= 2) { auto const xsdp = static_cast(m_sdp); if (!xsdp->validate()) { kapi::system::panic("[OS:ACPI] Invalid XSDP signature!"); } auto physical_extended_table_address = xsdp->table_address(); auto linear_extended_table_address = kapi::memory::hhdm_to_linear(physical_extended_table_address); m_rsdt = static_cast(linear_extended_table_address); m_extended = true; } else { if (!m_sdp->validate()) { kapi::system::panic("[OS:ACPI] Invalid RSDP checksum!"); } auto physical_root_table_address = m_sdp->table_address(); auto linear_root_table_address = kapi::memory::hhdm_to_linear(physical_root_table_address); m_rsdt = static_cast(linear_root_table_address); } } auto manager::load_tables() -> bool { if (!kapi::acpi::validate_checksum({reinterpret_cast(m_rsdt), m_rsdt->length})) { kapi::system::panic("[OS:ACPI] Invalid RSDT checksum!"); } return false; } } // namespace kernel::acpi