diff --git a/Kernel/Firmware/ACPI/StaticParsing.cpp b/Kernel/Firmware/ACPI/StaticParsing.cpp index be067277806..bb0c18bf536 100644 --- a/Kernel/Firmware/ACPI/StaticParsing.cpp +++ b/Kernel/Firmware/ACPI/StaticParsing.cpp @@ -30,74 +30,4 @@ Optional find_rsdp() return rsdp; } -static bool match_table_signature(PhysicalAddress table_header, StringView signature) -{ - VERIFY(signature.length() == 4); - - auto check_in_region = [&](size_t length, auto&& callback) -> bool { - auto region = Memory::map_typed(table_header, length).release_value_but_fixme_should_propagate_errors(); - return callback(region.ptr()); - }; - - u32 length = 0; - auto check_signature_and_get_length = [&](u8 const* base) -> bool { - if (memcmp(reinterpret_cast(base), signature.characters_without_null_termination(), 4) != 0) - return false; - length = ByteReader::load32(base + 4); - return true; - }; - - auto validate_checksum = [&](u8 const* base) -> bool { - u8 checksum = 0; - for (u32 i = 0; i < length; ++i) - checksum += base[i]; - return checksum == 0; - }; - - return check_in_region(8, check_signature_and_get_length) && check_in_region(length, validate_checksum); -} - -ErrorOr> search_table_in_xsdt(PhysicalAddress xsdt_address, StringView signature) -{ - VERIFY(signature.length() == 4); - - auto xsdt = TRY(Memory::map_typed<::ACPI::Structures::XSDT>(xsdt_address)); - - for (size_t i = 0; i < ((xsdt->h.length - sizeof(::ACPI::Structures::SDTHeader)) / sizeof(u64)); ++i) { - if (match_table_signature(PhysicalAddress((PhysicalPtr)xsdt->table_ptrs[i]), signature)) - return PhysicalAddress((PhysicalPtr)xsdt->table_ptrs[i]); - } - return Optional {}; -} - -ErrorOr> find_table(PhysicalAddress rsdp_address, StringView signature) -{ - VERIFY(signature.length() == 4); - - auto rsdp = TRY(Memory::map_typed<::ACPI::Structures::RSDPDescriptor20>(rsdp_address)); - - if (rsdp->base.revision == 0) - return search_table_in_rsdt(PhysicalAddress(rsdp->base.rsdt_ptr), signature); - - if (rsdp->base.revision >= 2) { - if (rsdp->xsdt_ptr) - return search_table_in_xsdt(PhysicalAddress(rsdp->xsdt_ptr), signature); - return search_table_in_rsdt(PhysicalAddress(rsdp->base.rsdt_ptr), signature); - } - VERIFY_NOT_REACHED(); -} - -ErrorOr> search_table_in_rsdt(PhysicalAddress rsdt_address, StringView signature) -{ - VERIFY(signature.length() == 4); - - auto rsdt = TRY(Memory::map_typed<::ACPI::Structures::RSDT>(rsdt_address)); - - for (u32 i = 0; i < ((rsdt->h.length - sizeof(::ACPI::Structures::SDTHeader)) / sizeof(u32)); i++) { - if (match_table_signature(PhysicalAddress((PhysicalPtr)rsdt->table_ptrs[i]), signature)) - return PhysicalAddress((PhysicalPtr)rsdt->table_ptrs[i]); - } - return Optional {}; -} - } diff --git a/Kernel/Firmware/ACPI/StaticParsing.h b/Kernel/Firmware/ACPI/StaticParsing.h index d5cd917985c..e92b307cd6f 100644 --- a/Kernel/Firmware/ACPI/StaticParsing.h +++ b/Kernel/Firmware/ACPI/StaticParsing.h @@ -14,8 +14,4 @@ namespace Kernel::ACPI::StaticParsing { Optional find_rsdp(); -ErrorOr> find_table(PhysicalAddress rsdp, StringView signature); -ErrorOr> search_table_in_xsdt(PhysicalAddress xsdt, StringView signature); -ErrorOr> search_table_in_rsdt(PhysicalAddress rsdt, StringView signature); - }