From 25828c17c664091617b3afa332ece574fd27e3cf Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 6 Aug 2023 00:44:52 -0300 Subject: [PATCH] x86_64 acpi: map rsdp --- kernel-src/arch/x86-64/acpi.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/kernel-src/arch/x86-64/acpi.c b/kernel-src/arch/x86-64/acpi.c index 88cbe3de..ce071525 100644 --- a/kernel-src/arch/x86-64/acpi.c +++ b/kernel-src/arch/x86-64/acpi.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,16 @@ void arch_acpi_init() { // FIXME search if no response __assert(rsdpreq.response); rsdp_t *rsdp = rsdpreq.response->address; + uintmax_t pageoffset = (uintptr_t)rsdp % PAGE_SIZE; + + // map rsdp + // make sure it doesn't cross a page boundary + // TODO support this + __assert(ROUND_DOWN((uintptr_t)rsdp, PAGE_SIZE) == ROUND_DOWN((uintptr_t)rsdp - 1 + sizeof(rsdp_t), PAGE_SIZE)); + + void *virt = vmm_map(NULL, sizeof(rsdp_t), VMM_FLAGS_PHYSICAL, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_NOEXEC, FROM_HHDM(rsdp)); + __assert(virt); + rsdp = (rsdp_t *)((uintptr_t)virt + pageoffset); if (rsdp->revision == 0) { printf("\e[93mACPI version 1.0 -- Using RSDT instead of XSDT.\e[0m\n");