From e0b2f2a582c3834a4a42af19967dcb1ef3ed2b3a Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 16 May 2023 19:35:09 -0300 Subject: [PATCH] mmu: arch_mmu_destroytable --- kernel-src/arch/x86-64/mmu.c | 18 ++++++++++++++++++ kernel-src/include/x86-64/arch/mmu.h | 1 + 2 files changed, 19 insertions(+) diff --git a/kernel-src/arch/x86-64/mmu.c b/kernel-src/arch/x86-64/mmu.c index 8bc0e10f..edb6cb40 100644 --- a/kernel-src/arch/x86-64/mmu.c +++ b/kernel-src/arch/x86-64/mmu.c @@ -111,6 +111,24 @@ static bool add_page(pagetableptr_t top, void *vaddr, uint64_t entry, int depth) return true; } +static void destroy(uint64_t *table, int depth) { + for (int i = 0; i < 512; ++i) { + void *addr = (void *)((*table & ADDRMASK)); + if (addr == NULL) + continue; + + if (depth > 0) + destroy(MAKE_HHDM(addr), depth - 1); + + pmm_free(addr, 1); + } +} + +void arch_mmu_destroytable(pagetableptr_t table) { + destroy(MAKE_HHDM(table), 3); + pmm_free(table, 1); +} + bool arch_mmu_map(pagetableptr_t table, void *paddr, void *vaddr, mmuflags_t flags) { uint64_t entry = ((uintptr_t)paddr & ADDRMASK) | flags; return add_page(table, vaddr, entry, 0); diff --git a/kernel-src/include/x86-64/arch/mmu.h b/kernel-src/include/x86-64/arch/mmu.h index fa5971c8..7957ae4c 100644 --- a/kernel-src/include/x86-64/arch/mmu.h +++ b/kernel-src/include/x86-64/arch/mmu.h @@ -19,6 +19,7 @@ typedef uint64_t mmuflags_t; typedef uint64_t * pagetableptr_t; // physical address +void arch_mmu_destroytable(pagetableptr_t table); bool arch_mmu_map(pagetableptr_t table, void *paddr, void *vaddr, mmuflags_t flags); void arch_mmu_invalidate(void *vaddr); void arch_mmu_unmap(pagetableptr_t table, void *vaddr);