From defed6445642872721b8accdbed209ede2cc73f8 Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 11 Oct 2022 23:26:20 -0300 Subject: [PATCH] mmu: destroy ctx --- src/arch/x86_64/include/arch/mmu.h | 1 + src/arch/x86_64/mmu.c | 33 ++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/arch/x86_64/include/arch/mmu.h b/src/arch/x86_64/include/arch/mmu.h index 3b9ae7b2..ab6c72e3 100644 --- a/src/arch/x86_64/include/arch/mmu.h +++ b/src/arch/x86_64/include/arch/mmu.h @@ -21,6 +21,7 @@ typedef uint64_t* arch_mmu_tableptr; +void arch_mmu_destroy(arch_mmu_tableptr context); int arch_mmu_map(arch_mmu_tableptr, void*, void*, size_t); bool arch_mmu_isaccessed(arch_mmu_tableptr, void*); void* arch_mmu_getphysicaladdr(arch_mmu_tableptr, void*); diff --git a/src/arch/x86_64/mmu.c b/src/arch/x86_64/mmu.c index b633b15c..2263c80d 100644 --- a/src/arch/x86_64/mmu.c +++ b/src/arch/x86_64/mmu.c @@ -108,8 +108,6 @@ static bool setpage(arch_mmu_tableptr context, void* vaddr, uint64_t entry){ } - - static uint64_t getmapping(arch_mmu_tableptr context, void* vaddr){ uint64_t addr = (uint64_t)vaddr; size_t pdpt = (addr >> 39) & 0b111111111; @@ -150,6 +148,37 @@ void* arch_mmu_getphysicaladdr(arch_mmu_tableptr context, void* addr){ return paddr; } + +static void destroy(uint64_t* table, int depth){ + + for(size_t i = 0; i < 512; ++i){ + + if(depth == 0 && i == 256) + break; + + uint64_t paddr = table[i]; + + if(!paddr) + continue; + + paddr &= ~((uint64_t)0xFFF); + paddr &= ~(uint64_t)ARCH_MMU_MAP_NOEXEC; + + if(depth < 3) + destroy(paddr+limine_hhdm_offset, depth+1); + + pmm_free(paddr, 1); + + } + +} + +void arch_mmu_destroy(arch_mmu_tableptr context){ + if(context < limine_hhdm_offset) + context = (uint8_t*)context + (uintptr_t)limine_hhdm_offset; + destroy(context, 0); +} + bool arch_mmu_isaccessed(arch_mmu_tableptr context, void* addr){ return (getmapping(context, addr) & ARCH_MMU_MAP_ACCESSED) != 0; }