aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi/acpi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kapi/acpi.cpp')
-rw-r--r--kernel/kapi/acpi.cpp32
1 files changed, 26 insertions, 6 deletions
diff --git a/kernel/kapi/acpi.cpp b/kernel/kapi/acpi.cpp
index aa0066d..787bcff 100644
--- a/kernel/kapi/acpi.cpp
+++ b/kernel/kapi/acpi.cpp
@@ -1,13 +1,18 @@
#include "kapi/acpi.hpp"
#include "kapi/memory.hpp"
+#include "kapi/system.hpp"
+
+#include "kernel/acpi/manager.hpp"
#include <kstd/units>
#include <algorithm>
+#include <atomic>
#include <bit>
#include <cstddef>
#include <cstdint>
+#include <optional>
#include <span>
#include <string_view>
@@ -16,12 +21,7 @@ namespace kapi::acpi
namespace
{
- constexpr auto validate_checksum(std::span<std::byte const> data) -> bool
- {
- auto sum = std::ranges::fold_left(
- data, std::uint8_t{}, [](std::uint8_t acc, auto byte) { return static_cast<std::uint8_t>(byte) + acc; });
- return sum == 0;
- }
+ auto constinit manager = std::optional<kernel::acpi::manager>{};
} // namespace
auto root_system_description_pointer::oem_id() const noexcept -> std::string_view
@@ -65,4 +65,24 @@ namespace kapi::acpi
return validate_checksum({reinterpret_cast<std::byte const *>(this), m_length});
}
+ 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!");
+ }
+
+ manager.emplace(sdp);
+ return manager->load_tables();
+ }
+
+ auto validate_checksum(std::span<std::byte const> data) -> bool
+ {
+ auto sum = std::ranges::fold_left(data, std::uint8_t{}, [](auto acc, auto byte) {
+ return static_cast<std::uint8_t>(acc + static_cast<std::uint8_t>(byte));
+ });
+ return sum == 0;
+ }
+
}; // namespace kapi::acpi