diff --git a/kernel/aster-nix/src/syscall/madvise.rs b/kernel/aster-nix/src/syscall/madvise.rs index 28b9566d9..4d9a794ec 100644 --- a/kernel/aster-nix/src/syscall/madvise.rs +++ b/kernel/aster-nix/src/syscall/madvise.rs @@ -21,11 +21,24 @@ pub fn sys_madvise(start: Vaddr, len: usize, behavior: i32) -> Result { warn!("MADV_DONTNEED isn't implemented, do nothing for now."); } + MadviseBehavior::MADV_FREE => madv_free(start, len)?, _ => todo!(), } Ok(SyscallReturn::Return(0)) } +fn madv_free(start: Vaddr, len: usize) -> Result<()> { + debug_assert!(start % PAGE_SIZE == 0); + debug_assert!(len % PAGE_SIZE == 0); + + let current = current!(); + let root_vmar = current.root_vmar(); + let advised_range = start..start + len; + let _ = root_vmar.destroy(advised_range); + + Ok(()) +} + #[repr(i32)] #[derive(Debug, Clone, Copy, TryFromInt)] #[allow(non_camel_case_types)]