Kernel: Allow getting ACPI headers with same signature
This commit is contained in:
parent
72f3c378dd
commit
f842a9255f
|
@ -108,7 +108,7 @@ namespace Kernel
|
||||||
static BAN::ErrorOr<void> initialize();
|
static BAN::ErrorOr<void> initialize();
|
||||||
static ACPI& get();
|
static ACPI& get();
|
||||||
|
|
||||||
const SDTHeader* get_header(const char[4]);
|
const SDTHeader* get_header(BAN::StringView signature, uint32_t index);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ACPI() = default;
|
ACPI() = default;
|
||||||
|
|
|
@ -222,13 +222,20 @@ namespace Kernel
|
||||||
return {};
|
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)
|
for (auto& mapped_header : m_mapped_headers)
|
||||||
{
|
{
|
||||||
auto* header = mapped_header.as_header();
|
auto* header = mapped_header.as_header();
|
||||||
if (memcmp(header->signature, signature, 4) == 0)
|
if (memcmp(header->signature, signature.data(), 4) == 0)
|
||||||
return header;
|
if (cnt++ == index)
|
||||||
|
return header;
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,7 @@ namespace Kernel
|
||||||
return nullptr;
|
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)
|
if (madt == nullptr)
|
||||||
{
|
{
|
||||||
dprintln("Could not find MADT header");
|
dprintln("Could not find MADT header");
|
||||||
|
|
|
@ -46,7 +46,7 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<void> HPET::initialize(bool force_pic)
|
BAN::ErrorOr<void> 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)
|
if (header == nullptr)
|
||||||
return BAN::Error::from_errno(ENODEV);
|
return BAN::Error::from_errno(ENODEV);
|
||||||
|
|
||||||
|
|
|
@ -51,8 +51,7 @@ void laihost_panic(const char* msg)
|
||||||
|
|
||||||
void* laihost_scan(const char* sig, size_t index)
|
void* laihost_scan(const char* sig, size_t index)
|
||||||
{
|
{
|
||||||
ASSERT(index == 0);
|
return (void*)ACPI::get().get_header(sig, index);
|
||||||
return (void*)ACPI::get().get_header(sig);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void* laihost_map(size_t address, size_t count)
|
void* laihost_map(size_t address, size_t count)
|
||||||
|
|
Loading…
Reference in New Issue