From d447751c30f25cd914b873cc38fb2af05588e312 Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 30 Jul 2024 20:49:38 -0300 Subject: [PATCH] vmm: properly handle direct physical mapping unmap --- kernel-src/include/kernel/vmm.h | 2 +- kernel-src/mm/vmm.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/kernel-src/include/kernel/vmm.h b/kernel-src/include/kernel/vmm.h index 451f6284..3b5601c1 100644 --- a/kernel-src/include/kernel/vmm.h +++ b/kernel-src/include/kernel/vmm.h @@ -12,7 +12,7 @@ #define VMM_FLAGS_EXACT 16 #define VMM_FLAGS_SHARED 32 -#define VMM_PERMANENT_FLAGS_MASK (VMM_FLAGS_FILE | VMM_FLAGS_SHARED) +#define VMM_PERMANENT_FLAGS_MASK (VMM_FLAGS_FILE | VMM_FLAGS_SHARED | VMM_FLAGS_PHYSICAL) #define VMM_ACTION_READ 1 #define VMM_ACTION_WRITE 2 diff --git a/kernel-src/mm/vmm.c b/kernel-src/mm/vmm.c index 2aecdcc6..7acf7dc1 100644 --- a/kernel-src/mm/vmm.c +++ b/kernel-src/mm/vmm.c @@ -243,9 +243,10 @@ static void destroyrange(vmmrange_t *range, uintmax_t _offset, size_t size, int pmm_release(physical); } } else { - // anonymous or private non character device mapping + // anonymous, physical or private non character device mapping arch_mmu_unmap(_cpu()->vmmctx->pagetable, vaddr); - pmm_release(physical); + if ((range->flags & VMM_FLAGS_PHYSICAL) == 0) + pmm_release(physical); } }