aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/acpi
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/acpi')
-rw-r--r--kernel/src/acpi/manager.cpp44
1 files changed, 21 insertions, 23 deletions
diff --git a/kernel/src/acpi/manager.cpp b/kernel/src/acpi/manager.cpp
index 2f2a1bd..5876799 100644
--- a/kernel/src/acpi/manager.cpp
+++ b/kernel/src/acpi/manager.cpp
@@ -8,8 +8,10 @@
#include <acpi/acpi.hpp>
+#include <algorithm>
#include <cstddef>
#include <cstdint>
+#include <ranges>
#include <string_view>
namespace kernel::acpi
@@ -32,7 +34,7 @@ namespace kernel::acpi
}
auto physical_extended_table_address = kapi::memory::physical_address{xsdp->table_address()};
auto linear_extended_table_address = kapi::memory::hhdm_to_linear(physical_extended_table_address);
- m_rsdt = static_cast<::acpi::table_header const *>(linear_extended_table_address);
+ m_rsdt = static_cast<::acpi::xsdt const *>(linear_extended_table_address);
m_extended = true;
}
else
@@ -54,29 +56,12 @@ namespace kernel::acpi
kapi::system::panic("[OS:ACPI] Invalid RSDT checksum!");
}
- auto entry_size = m_extended ? sizeof(std::uint64_t) : sizeof(std::uint32_t);
- auto entry_count = (m_rsdt->length().value - sizeof(::acpi::table_header)) / entry_size;
- auto entries_base = reinterpret_cast<std::byte const *>(m_rsdt) + sizeof(::acpi::table_header);
+ auto check_and_register_table = [&](auto table_address) -> void {
+ auto physical_table_address = kapi::memory::physical_address{reinterpret_cast<std::uintptr_t>(table_address)};
+ auto mapped_table = kapi::memory::hhdm_to_linear(physical_table_address);
+ auto table = static_cast<::acpi::table_header const *>(mapped_table);
- for (std::size_t i = 0; i < entry_count; ++i)
- {
- auto physical_table_address = kapi::memory::physical_address{};
-
- if (m_extended)
- {
- auto entry = reinterpret_cast<std::uint64_t const *>(entries_base + (i * entry_size));
- physical_table_address = kapi::memory::physical_address{*entry};
- }
- else
- {
- auto entry = reinterpret_cast<std::uint32_t const *>(entries_base + (i * entry_size));
- physical_table_address = kapi::memory::physical_address{*entry};
- }
-
- auto linear_table_address = kapi::memory::hhdm_to_linear(physical_table_address);
- auto table = static_cast<::acpi::table_header const *>(linear_table_address);
-
- if (!::acpi::validate_checksum({reinterpret_cast<std::byte const *>(table), table->length().value}))
+ if (!::acpi::validate_checksum({static_cast<std::byte const *>(mapped_table), table->length().value}))
{
kstd::println(kstd::print_sink::stderr, "[OS:ACPI] Invalid table checksum!");
}
@@ -85,6 +70,19 @@ namespace kernel::acpi
kstd::println("[OS:ACPI] Found '{}' ACPI table", table->signature());
m_tables.emplace(table->signature(), table);
}
+ };
+
+ if (m_extended)
+ {
+ auto xsdt = static_cast<::acpi::xsdt const *>(m_rsdt);
+ std::ranges::for_each(*xsdt | std::views::transform([](auto const & entry) { return entry.address(); }),
+ check_and_register_table);
+ }
+ else
+ {
+ auto rsdt = static_cast<::acpi::rsdt const *>(m_rsdt);
+ std::ranges::for_each(*rsdt | std::views::transform([](auto const & entry) { return entry.address(); }),
+ check_and_register_table);
}
return !m_tables.empty();