diff --git a/kernel/include/kernel/ACPI.h b/kernel/include/kernel/ACPI.h index 4937a6af8a..69905c221f 100644 --- a/kernel/include/kernel/ACPI.h +++ b/kernel/include/kernel/ACPI.h @@ -108,7 +108,7 @@ namespace Kernel static BAN::ErrorOr initialize(); static ACPI& get(); - const SDTHeader* get_header(const char[4]); + const SDTHeader* get_header(BAN::StringView signature, uint32_t index); private: ACPI() = default; diff --git a/kernel/kernel/ACPI.cpp b/kernel/kernel/ACPI.cpp index ae447ce3e8..ab99558665 100644 --- a/kernel/kernel/ACPI.cpp +++ b/kernel/kernel/ACPI.cpp @@ -222,13 +222,20 @@ namespace Kernel return {}; } - const ACPI::SDTHeader* ACPI::get_header(const char signature[4]) + const ACPI::SDTHeader* ACPI::get_header(BAN::StringView signature, uint32_t index) { + if (signature.size() != 4) + { + dprintln("Trying to get ACPI header with {} byte signature ??", signature.size()); + return nullptr; + } + uint32_t cnt = 0; for (auto& mapped_header : m_mapped_headers) { auto* header = mapped_header.as_header(); - if (memcmp(header->signature, signature, 4) == 0) - return header; + if (memcmp(header->signature, signature.data(), 4) == 0) + if (cnt++ == index) + return header; } return nullptr; } diff --git a/kernel/kernel/APIC.cpp b/kernel/kernel/APIC.cpp index 02cfa9cc42..1af40d70fc 100644 --- a/kernel/kernel/APIC.cpp +++ b/kernel/kernel/APIC.cpp @@ -95,7 +95,7 @@ namespace Kernel return nullptr; } - const MADT* madt = (const MADT*)Kernel::ACPI::get().get_header("APIC"); + const MADT* madt = (const MADT*)Kernel::ACPI::get().get_header("APIC"sv, 0); if (madt == nullptr) { dprintln("Could not find MADT header"); diff --git a/kernel/kernel/Timer/HPET.cpp b/kernel/kernel/Timer/HPET.cpp index e660b2d881..59089e90d0 100644 --- a/kernel/kernel/Timer/HPET.cpp +++ b/kernel/kernel/Timer/HPET.cpp @@ -46,7 +46,7 @@ namespace Kernel BAN::ErrorOr HPET::initialize(bool force_pic) { - auto* header = (ACPI::HPET*)ACPI::get().get_header("HPET"); + auto* header = (ACPI::HPET*)ACPI::get().get_header("HPET"sv, 0); if (header == nullptr) return BAN::Error::from_errno(ENODEV); diff --git a/kernel/kernel/lai_host.cpp b/kernel/kernel/lai_host.cpp index 3b3eba9d0d..d7b854b2d6 100644 --- a/kernel/kernel/lai_host.cpp +++ b/kernel/kernel/lai_host.cpp @@ -51,8 +51,7 @@ void laihost_panic(const char* msg) void* laihost_scan(const char* sig, size_t index) { - ASSERT(index == 0); - return (void*)ACPI::get().get_header(sig); + return (void*)ACPI::get().get_header(sig, index); } void* laihost_map(size_t address, size_t count)