#include "kapi/acpi.hpp" #include "kapi/memory.hpp" #include #include #include #include #include #include #include namespace kapi::acpi { namespace { constexpr auto validate_checksum(std::span data) -> bool { auto sum = std::ranges::fold_left( data, std::uint8_t{}, [](std::uint8_t acc, auto byte) { return static_cast(byte) + acc; }); return sum == 0; } } // namespace auto root_system_description_pointer::oem_id() const noexcept -> std::string_view { return {m_oem_id.data(), m_oem_id.size()}; } auto root_system_description_pointer::revision() const noexcept -> std::uint8_t { return m_revision; } auto root_system_description_pointer::signature() const noexcept -> std::string_view { return {m_signature.data(), m_signature.size()}; } auto root_system_description_pointer::table_address() const noexcept -> memory::physical_address { auto raw = std::bit_cast(m_rsdt_address); return memory::physical_address{static_cast(raw)}; } auto root_system_description_pointer::validate() const noexcept -> bool { return validate_checksum({reinterpret_cast(this), sizeof(root_system_description_pointer)}); } auto extended_system_description_pointer::length() const noexcept -> kstd::units::bytes { return kstd::units::bytes{m_length}; } auto extended_system_description_pointer::table_address() const noexcept -> memory::physical_address { return memory::physical_address{std::bit_cast(m_xsdt_address)}; } auto extended_system_description_pointer::validate() const noexcept -> bool { return validate_checksum({reinterpret_cast(this), m_length}); } }; // namespace kapi::acpi