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:
Bananymous 2023-04-15 23:53:45 +03:00
parent 1c22e90fa0
commit 88f60b5e41
3 changed files with 13 additions and 21 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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");