aboutsummaryrefslogtreecommitdiff
path: root/libs/acpi
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-04-15 20:46:29 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-04-15 20:46:29 +0200
commit27c654f3f0a069113b6abb70817cfe2c5096711e (patch)
treeeda64e44953bbb3a94d86db1a572491745e619ac /libs/acpi
parent6344a2a81b94a00aaaa987d0e0d40993ed581d5e (diff)
downloadteachos-27c654f3f0a069113b6abb70817cfe2c5096711e.tar.xz
teachos-27c654f3f0a069113b6abb70817cfe2c5096711e.zip
acpi: add basic table type
Diffstat (limited to 'libs/acpi')
-rw-r--r--libs/acpi/CMakeLists.txt4
-rw-r--r--libs/acpi/acpi/acpi.hpp10
-rw-r--r--libs/acpi/acpi/common/basic_table.cpp26
-rw-r--r--libs/acpi/acpi/common/basic_table.hpp26
-rw-r--r--libs/acpi/acpi/common/basic_table.test.cpp21
-rw-r--r--libs/acpi/acpi/common/checksum.cpp (renamed from libs/acpi/acpi/checksum.cpp)2
-rw-r--r--libs/acpi/acpi/common/checksum.hpp (renamed from libs/acpi/acpi/checksum.hpp)0
-rw-r--r--libs/acpi/acpi/common/table_header.cpp16
-rw-r--r--libs/acpi/acpi/common/table_header.hpp5
-rw-r--r--libs/acpi/acpi/common/table_header.test.cpp4
-rw-r--r--libs/acpi/acpi/pointers.cpp2
11 files changed, 94 insertions, 22 deletions
diff --git a/libs/acpi/CMakeLists.txt b/libs/acpi/CMakeLists.txt
index b9c607d..f850fe4 100644
--- a/libs/acpi/CMakeLists.txt
+++ b/libs/acpi/CMakeLists.txt
@@ -19,7 +19,8 @@ file(GLOB_RECURSE ACPI_HEADERS
)
target_sources("acpi" PRIVATE
- "acpi/checksum.cpp"
+ "acpi/common/basic_table.cpp"
+ "acpi/common/checksum.cpp"
"acpi/common/table_header.cpp"
"acpi/madt.cpp"
"acpi/pointers.cpp"
@@ -60,6 +61,7 @@ if(NOT CMAKE_CROSSCOMPILING)
set_source_files_properties("test_data/tables.S" PROPERTIES OBJECT_DEPENDS "${GENERATED_TABLE_BLOBS}")
add_executable("acpi_tests"
+ "acpi/common/basic_table.test.cpp"
"acpi/common/table_header.test.cpp"
"acpi/madt.test.cpp"
"acpi/pointers.test.cpp"
diff --git a/libs/acpi/acpi/acpi.hpp b/libs/acpi/acpi/acpi.hpp
index fb358cc..47050f2 100644
--- a/libs/acpi/acpi/acpi.hpp
+++ b/libs/acpi/acpi/acpi.hpp
@@ -1,10 +1,10 @@
#ifndef ACPI_ACPI_HPP
#define ACPI_ACPI_HPP
-#include <acpi/checksum.hpp> // IWYU pragma: export
-#include <acpi/madt.hpp> // IWYU pragma: export
-#include <acpi/pointers.hpp> // IWYU pragma: export
-#include <acpi/sdt.hpp> // IWYU pragma: export
-#include <acpi/table_type.hpp> // IWYU pragma: export
+#include <acpi/common/checksum.hpp> // IWYU pragma: export
+#include <acpi/madt.hpp> // IWYU pragma: export
+#include <acpi/pointers.hpp> // IWYU pragma: export
+#include <acpi/sdt.hpp> // IWYU pragma: export
+#include <acpi/table_type.hpp> // IWYU pragma: export
#endif
diff --git a/libs/acpi/acpi/common/basic_table.cpp b/libs/acpi/acpi/common/basic_table.cpp
new file mode 100644
index 0000000..5cec91a
--- /dev/null
+++ b/libs/acpi/acpi/common/basic_table.cpp
@@ -0,0 +1,26 @@
+#include <acpi/common/basic_table.hpp>
+#include <acpi/common/checksum.hpp>
+#include <acpi/common/table_header.hpp>
+
+#include <cstddef>
+#include <span>
+
+namespace acpi
+{
+
+ auto basic_table::validate_checksum() const noexcept -> bool
+ {
+ return acpi::validate_checksum({reinterpret_cast<std::byte const *>(this), m_header.length().value});
+ }
+
+ auto basic_table::as_span() const noexcept -> std::span<std::byte const>
+ {
+ return {reinterpret_cast<std::byte const *>(this), m_header.length().value};
+ }
+
+ auto basic_table::header() const noexcept -> table_header const &
+ {
+ return m_header;
+ }
+
+} // namespace acpi \ No newline at end of file
diff --git a/libs/acpi/acpi/common/basic_table.hpp b/libs/acpi/acpi/common/basic_table.hpp
new file mode 100644
index 0000000..43bf533
--- /dev/null
+++ b/libs/acpi/acpi/common/basic_table.hpp
@@ -0,0 +1,26 @@
+#ifndef ACPI_COMMON_BASIC_TABLE_HPP
+#define ACPI_COMMON_BASIC_TABLE_HPP
+
+#include <acpi/common/table_header.hpp>
+
+#include <cstddef>
+#include <span>
+
+namespace acpi
+{
+
+ struct basic_table
+ {
+ [[nodiscard]] auto validate_checksum() const noexcept -> bool;
+
+ [[nodiscard]] auto as_span() const noexcept -> std::span<std::byte const>;
+
+ [[nodiscard]] auto header() const noexcept -> table_header const &;
+
+ private:
+ table_header m_header;
+ };
+
+} // namespace acpi
+
+#endif \ No newline at end of file
diff --git a/libs/acpi/acpi/common/basic_table.test.cpp b/libs/acpi/acpi/common/basic_table.test.cpp
new file mode 100644
index 0000000..e292b9f
--- /dev/null
+++ b/libs/acpi/acpi/common/basic_table.test.cpp
@@ -0,0 +1,21 @@
+#include <acpi/common/basic_table.hpp>
+#include <catch2/catch_test_macros.hpp>
+#include <test_data/tables.hpp>
+
+SCENARIO("Basic table functions", "[basic_table]")
+{
+ GIVEN("A valid compiled table header")
+ {
+ auto data = acpi::test_data::tables::table_header();
+
+ WHEN("parsing the table")
+ {
+ auto table = reinterpret_cast<acpi::basic_table const *>(data.data());
+
+ THEN("the checksum is valid")
+ {
+ REQUIRE(table->validate_checksum());
+ }
+ }
+ }
+}
diff --git a/libs/acpi/acpi/checksum.cpp b/libs/acpi/acpi/common/checksum.cpp
index 56275c8..09425dd 100644
--- a/libs/acpi/acpi/checksum.cpp
+++ b/libs/acpi/acpi/common/checksum.cpp
@@ -1,4 +1,4 @@
-#include <acpi/checksum.hpp>
+#include <acpi/common/checksum.hpp>
#include <algorithm>
#include <cstddef>
diff --git a/libs/acpi/acpi/checksum.hpp b/libs/acpi/acpi/common/checksum.hpp
index a92c242..a92c242 100644
--- a/libs/acpi/acpi/checksum.hpp
+++ b/libs/acpi/acpi/common/checksum.hpp
diff --git a/libs/acpi/acpi/common/table_header.cpp b/libs/acpi/acpi/common/table_header.cpp
index 17a8219..c69ff5d 100644
--- a/libs/acpi/acpi/common/table_header.cpp
+++ b/libs/acpi/acpi/common/table_header.cpp
@@ -27,7 +27,7 @@ namespace acpi
static_assert(sizeof(common_table_header_data) == common_table_header_size);
- auto common_table_header::creator_revision() const noexcept -> decltype(common_table_header_data::creator_revision)
+ auto table_header::creator_revision() const noexcept -> decltype(common_table_header_data::creator_revision)
{
using type = decltype(common_table_header_data::creator_revision);
@@ -42,7 +42,7 @@ namespace acpi
return value;
}
- auto common_table_header::creator_id() const noexcept -> std::string_view
+ auto table_header::creator_id() const noexcept -> std::string_view
{
constexpr auto size = sizeof(common_table_header_data::creator_id);
constexpr auto offset = offsetof(common_table_header_data, creator_id);
@@ -52,7 +52,7 @@ namespace acpi
return std::string_view{base + offset, size};
}
- auto common_table_header::length() const noexcept -> kstd::units::bytes
+ auto table_header::length() const noexcept -> kstd::units::bytes
{
using type = decltype(common_table_header_data::length);
@@ -67,7 +67,7 @@ namespace acpi
return kstd::units::bytes{raw_value};
}
- auto common_table_header::oem_id() const noexcept -> std::string_view
+ auto table_header::oem_id() const noexcept -> std::string_view
{
constexpr auto size = sizeof(common_table_header_data::oem_id);
constexpr auto offset = offsetof(common_table_header_data, oem_id);
@@ -77,7 +77,7 @@ namespace acpi
return std::string_view{base + offset, size};
}
- auto common_table_header::oem_table_id() const noexcept -> std::string_view
+ auto table_header::oem_table_id() const noexcept -> std::string_view
{
constexpr auto size = sizeof(common_table_header_data::oem_table_id);
constexpr auto offset = offsetof(common_table_header_data, oem_table_id);
@@ -87,7 +87,7 @@ namespace acpi
return std::string_view{base + offset, size};
}
- auto common_table_header::oem_revision() const noexcept -> decltype(common_table_header_data::oem_revision)
+ auto table_header::oem_revision() const noexcept -> decltype(common_table_header_data::oem_revision)
{
using type = decltype(common_table_header_data::oem_revision);
@@ -102,7 +102,7 @@ namespace acpi
return value;
}
- auto common_table_header::revision() const noexcept -> decltype(common_table_header_data::revision)
+ auto table_header::revision() const noexcept -> decltype(common_table_header_data::revision)
{
using type = decltype(common_table_header_data::revision);
@@ -117,7 +117,7 @@ namespace acpi
return value;
}
- auto common_table_header::signature() const noexcept -> std::string_view
+ auto table_header::signature() const noexcept -> std::string_view
{
constexpr auto size = sizeof(common_table_header_data::signature);
constexpr auto offset = offsetof(common_table_header_data, signature);
diff --git a/libs/acpi/acpi/common/table_header.hpp b/libs/acpi/acpi/common/table_header.hpp
index 8ecfd0a..529da81 100644
--- a/libs/acpi/acpi/common/table_header.hpp
+++ b/libs/acpi/acpi/common/table_header.hpp
@@ -19,7 +19,7 @@ namespace acpi
//! Multibyte fields in the header are not guaranteed to be naturally aligned by the firmware. Therefore, no direct
//! access to multibyte fields is provided. Instead, the provided member functions handle alignment of the multibyte
//! values and thus provide a safe interface to the header fields.
- struct common_table_header
+ struct table_header
{
//! Get the revision of the utility used to create this table.
[[nodiscard]] auto creator_revision() const noexcept -> std::uint32_t;
@@ -45,9 +45,6 @@ namespace acpi
//! Get the signature of this table.
[[nodiscard]] auto signature() const noexcept -> std::string_view;
- //! Validate this table's checksum
- [[nodiscard]] auto validate() const noexcept -> bool;
-
private:
std::array<std::byte, common_table_header_size> m_data;
};
diff --git a/libs/acpi/acpi/common/table_header.test.cpp b/libs/acpi/acpi/common/table_header.test.cpp
index e43e403..d6976b3 100644
--- a/libs/acpi/acpi/common/table_header.test.cpp
+++ b/libs/acpi/acpi/common/table_header.test.cpp
@@ -12,7 +12,7 @@ SCENARIO("Common table header parsing", "[common_table_header]")
WHEN("parsing the header")
{
- auto header = reinterpret_cast<acpi::common_table_header const *>(data.data());
+ auto header = reinterpret_cast<acpi::table_header const *>(data.data());
THEN("the signature is correct")
{
@@ -26,7 +26,7 @@ SCENARIO("Common table header parsing", "[common_table_header]")
THEN("the length is correct")
{
- REQUIRE(header->length() == kstd::type_size<acpi::common_table_header>);
+ REQUIRE(header->length() == kstd::type_size<acpi::table_header>);
}
THEN("the oem id is correct")
diff --git a/libs/acpi/acpi/pointers.cpp b/libs/acpi/acpi/pointers.cpp
index 8a8629f..45a42ce 100644
--- a/libs/acpi/acpi/pointers.cpp
+++ b/libs/acpi/acpi/pointers.cpp
@@ -1,6 +1,6 @@
#include <kstd/units>
-#include <acpi/checksum.hpp>
+#include <acpi/common/checksum.hpp>
#include <acpi/pointers.hpp>
#include <bit>