diff options
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/acpi/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | libs/acpi/acpi/acpi.hpp | 10 | ||||
| -rw-r--r-- | libs/acpi/acpi/common/basic_table.cpp | 26 | ||||
| -rw-r--r-- | libs/acpi/acpi/common/basic_table.hpp | 26 | ||||
| -rw-r--r-- | libs/acpi/acpi/common/basic_table.test.cpp | 21 | ||||
| -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.cpp | 16 | ||||
| -rw-r--r-- | libs/acpi/acpi/common/table_header.hpp | 5 | ||||
| -rw-r--r-- | libs/acpi/acpi/common/table_header.test.cpp | 4 | ||||
| -rw-r--r-- | libs/acpi/acpi/pointers.cpp | 2 |
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> |
