From d08e3c2dbea13cc88b1b833ef73ca41f2083d953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Wed, 22 Oct 2025 15:39:26 +0200 Subject: [PATCH 1/2] style(mman): rename variables for clarity --- src/syscalls/mman.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/syscalls/mman.rs b/src/syscalls/mman.rs index ec1078c2b6..df9af06abb 100644 --- a/src/syscalls/mman.rs +++ b/src/syscalls/mman.rs @@ -75,16 +75,17 @@ pub extern "C" fn sys_munmap(ptr: *mut u8, size: usize) -> i32 { ); debug!("Unmapping {virtual_address:X} ({size}) -> {physical_address:X}"); - let range = PageRange::from_start_len(physical_address.as_u64() as usize, size).unwrap(); - if let Err(_err) = unsafe { PHYSICAL_FREE_LIST.lock().deallocate(range) } { + let frame_range = + PageRange::from_start_len(physical_address.as_u64() as usize, size).unwrap(); + if let Err(_err) = unsafe { PHYSICAL_FREE_LIST.lock().deallocate(frame_range) } { // FIXME: return EINVAL instead, once wasmtime can handle it - error!("Unable to deallocate {range:?}"); + error!("Unable to deallocate {frame_range:?}"); } } - let range = PageRange::from_start_len(virtual_address.as_usize(), size).unwrap(); + let page_range = PageRange::from_start_len(virtual_address.as_usize(), size).unwrap(); unsafe { - KERNEL_FREE_LIST.lock().deallocate(range).unwrap(); + KERNEL_FREE_LIST.lock().deallocate(page_range).unwrap(); } 0 From 0cc67df87bcf635263883f80cceb72b2a0329c98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Wed, 22 Oct 2025 15:41:42 +0200 Subject: [PATCH 2/2] fix(mman): don't deallocate PROT_NONE frames --- src/syscalls/mman.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/syscalls/mman.rs b/src/syscalls/mman.rs index df9af06abb..a2363d8694 100644 --- a/src/syscalls/mman.rs +++ b/src/syscalls/mman.rs @@ -1,7 +1,8 @@ use core::ffi::{c_int, c_void}; use align_address::Align; -use free_list::{PageLayout, PageRange}; +use free_list::{FreeList, PageLayout, PageRange}; +use hermit_sync::SpinMutex; use memory_addresses::{PhysAddr, VirtAddr}; use crate::arch; @@ -26,6 +27,8 @@ bitflags! { } } +static PROT_NONE_FREE_LIST: SpinMutex> = SpinMutex::new(FreeList::new()); + /// Creates a new virtual memory mapping of the `size` specified with /// protection bits specified in `prot_flags`. #[hermit_macro::system(errno)] @@ -37,6 +40,9 @@ pub extern "C" fn sys_mmap(size: usize, prot_flags: MemoryProtection, ret: &mut let virtual_address = VirtAddr::from(page_range.start()); if prot_flags.is_empty() { *ret = virtual_address.as_mut_ptr(); + unsafe { + PROT_NONE_FREE_LIST.lock().deallocate(page_range).unwrap(); + } return 0; } let frame_layout = PageLayout::from_size(size).unwrap(); @@ -67,6 +73,11 @@ pub extern "C" fn sys_mmap(size: usize, prot_flags: MemoryProtection, ret: &mut pub extern "C" fn sys_munmap(ptr: *mut u8, size: usize) -> i32 { let virtual_address = VirtAddr::from_ptr(ptr); let size = size.align_up(BasePageSize::SIZE as usize); + let page_range = PageRange::from_start_len(virtual_address.as_usize(), size).unwrap(); + + if PROT_NONE_FREE_LIST.lock().allocate_at(page_range).is_ok() { + return 0; + } if let Some(physical_address) = arch::mm::paging::virtual_to_physical(virtual_address) { arch::mm::paging::unmap::( @@ -77,13 +88,11 @@ pub extern "C" fn sys_munmap(ptr: *mut u8, size: usize) -> i32 { let frame_range = PageRange::from_start_len(physical_address.as_u64() as usize, size).unwrap(); - if let Err(_err) = unsafe { PHYSICAL_FREE_LIST.lock().deallocate(frame_range) } { - // FIXME: return EINVAL instead, once wasmtime can handle it - error!("Unable to deallocate {frame_range:?}"); + unsafe { + PHYSICAL_FREE_LIST.lock().deallocate(frame_range).unwrap(); } } - let page_range = PageRange::from_start_len(virtual_address.as_usize(), size).unwrap(); unsafe { KERNEL_FREE_LIST.lock().deallocate(page_range).unwrap(); }