Kernel: Map all ACPI tables on initialization
This makes their usage much easier and less error prone They won't mapped be processes when we get to there, so this won't be a problem
This commit is contained in:
parent
4034bef42e
commit
93abee9c7c
|
@ -84,8 +84,7 @@ namespace Kernel
|
||||||
static BAN::ErrorOr<void> initialize();
|
static BAN::ErrorOr<void> initialize();
|
||||||
static ACPI& get();
|
static ACPI& get();
|
||||||
|
|
||||||
BAN::ErrorOr<const SDTHeader*> get_header(const char[4]);
|
const SDTHeader* get_header(const char[4]);
|
||||||
void unmap_header(const SDTHeader*);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ACPI() = default;
|
ACPI() = default;
|
||||||
|
|
|
@ -135,28 +135,25 @@ namespace Kernel
|
||||||
|
|
||||||
MMU::get().allocate_range(m_header_table, m_entry_count * m_entry_size, MMU::Flags::Present);
|
MMU::get().allocate_range(m_header_table, m_entry_count * m_entry_size, MMU::Flags::Present);
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < m_entry_count; i++)
|
||||||
|
{
|
||||||
|
auto* header = get_header_from_index(i);
|
||||||
|
MMU::get().allocate_page((uintptr_t)header, MMU::Flags::Present);
|
||||||
|
MMU::get().allocate_range((uintptr_t)header, header->length, MMU::Flags::Present);
|
||||||
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<const ACPI::SDTHeader*> ACPI::get_header(const char signature[4])
|
const ACPI::SDTHeader* ACPI::get_header(const char signature[4])
|
||||||
{
|
{
|
||||||
for (uint32_t i = 0; i < m_entry_count; i++)
|
for (uint32_t i = 0; i < m_entry_count; i++)
|
||||||
{
|
{
|
||||||
const SDTHeader* header = get_header_from_index(i);
|
const SDTHeader* header = get_header_from_index(i);
|
||||||
MMU::get().allocate_range((uintptr_t)header, header->length, MMU::Flags::Present);
|
|
||||||
if (is_valid_std_header(header) && memcmp(header->signature, signature, 4) == 0)
|
if (is_valid_std_header(header) && memcmp(header->signature, signature, 4) == 0)
|
||||||
return header;
|
return header;
|
||||||
unmap_header(header);
|
|
||||||
}
|
}
|
||||||
return BAN::Error::from_error_code(ErrorCode::ACPI_NoSuchHeader);
|
return nullptr;
|
||||||
}
|
|
||||||
|
|
||||||
void ACPI::unmap_header(const ACPI::SDTHeader* header)
|
|
||||||
{
|
|
||||||
// I have to improve MMU page mapping so we can actually unmap
|
|
||||||
// without unmapping other mapped tables
|
|
||||||
(void)header;
|
|
||||||
//MMU::get().unallocate_range((uintptr_t)header, header->length);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const ACPI::SDTHeader* ACPI::get_header_from_index(size_t index)
|
const ACPI::SDTHeader* ACPI::get_header_from_index(size_t index)
|
||||||
|
|
|
@ -91,15 +91,13 @@ APIC* APIC::create()
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto header_or_error = Kernel::ACPI::get().get_header("APIC");
|
const MADT* madt = (const MADT*)Kernel::ACPI::get().get_header("APIC");
|
||||||
if (header_or_error.is_error())
|
if (madt == nullptr)
|
||||||
{
|
{
|
||||||
dprintln("{}", header_or_error.error());
|
dprintln("Could not find MADT header");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const MADT* madt = (const MADT*)header_or_error.value();
|
|
||||||
|
|
||||||
APIC* apic = new APIC;
|
APIC* apic = new APIC;
|
||||||
apic->m_local_apic = madt->local_apic;
|
apic->m_local_apic = madt->local_apic;
|
||||||
for (uint32_t i = 0x00; i <= 0xFF; i++)
|
for (uint32_t i = 0x00; i <= 0xFF; i++)
|
||||||
|
@ -139,8 +137,6 @@ APIC* APIC::create()
|
||||||
madt_entry_addr += entry->length;
|
madt_entry_addr += entry->length;
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel::ACPI::get().unmap_header(madt);
|
|
||||||
|
|
||||||
if (apic->m_local_apic == 0 || apic->m_io_apics.empty())
|
if (apic->m_local_apic == 0 || apic->m_io_apics.empty())
|
||||||
{
|
{
|
||||||
dprintln("MADT did not provide necessary information");
|
dprintln("MADT did not provide necessary information");
|
||||||
|
|
Loading…
Reference in New Issue