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); } }