From f842a9255fc7226d15d128b7d0a63ec58ee38f45 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 13 Oct 2023 11:24:21 +0300 Subject: [PATCH] Kernel: Allow getting ACPI headers with same signature --- kernel/include/kernel/ACPI.h | 2 +- kernel/kernel/ACPI.cpp | 13 ++++++++++--- kernel/kernel/APIC.cpp | 2 +- kernel/kernel/Timer/HPET.cpp | 2 +- kernel/kernel/lai_host.cpp | 3 +-- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/kernel/include/kernel/ACPI.h b/kernel/include/kernel/ACPI.h index 4937a6af8..69905c221 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 ae447ce3e..ab9955866 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 02cfa9cc4..1af40d70f 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 e660b2d88..59089e90d 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 3b3eba9d0..d7b854b2d 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)