From 116583cdc7e4fe065450d3bf5bc2a44ca7e394dd Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 15 Apr 2023 10:40:52 +0100 Subject: [PATCH] sys_mman: adding madvise. --- src/header/sys_mman/mod.rs | 5 +++++ src/platform/linux/mod.rs | 4 ++++ src/platform/pal/mod.rs | 2 ++ src/platform/redox/mod.rs | 5 +++++ tests/sys_mman.c | 6 ++++-- 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/header/sys_mman/mod.rs b/src/header/sys_mman/mod.rs index 7b6ce5a1f0..9430cfb26f 100644 --- a/src/header/sys_mman/mod.rs +++ b/src/header/sys_mman/mod.rs @@ -87,6 +87,11 @@ pub unsafe extern "C" fn munmap(addr: *mut c_void, len: size_t) -> c_int { Sys::munmap(addr, len) } +#[no_mangle] +pub unsafe extern "C" fn madvise(addr: *mut c_void, len: size_t, flags: c_int) -> c_int { + Sys::madvise(addr, len, flags) +} + #[cfg(target_os = "linux")] static SHM_PATH: &'static [u8] = b"/dev/shm/"; diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index eb146ac780..ebefcc6347 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -355,6 +355,10 @@ impl Pal for Sys { e(syscall!(MUNMAP, addr, len)) as c_int } + unsafe fn madvise(addr: *mut c_void, len: usize, flags: c_int) -> c_int { + e(syscall!(MADVISE, addr, len, flags)) as c_int + } + fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int { e(unsafe { syscall!(NANOSLEEP, rqtp, rmtp) }) as c_int } diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs index 485ba0a1a7..3cb426cb71 100644 --- a/src/platform/pal/mod.rs +++ b/src/platform/pal/mod.rs @@ -139,6 +139,8 @@ pub trait Pal { unsafe fn munlock(addr: *const c_void, len: usize) -> c_int; + unsafe fn madvise(addr: *mut c_void, len: usize, flags: c_int) -> c_int; + fn munlockall() -> c_int; unsafe fn munmap(addr: *mut c_void, len: usize) -> c_int; diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 90fa2ff2e6..999554795e 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -694,6 +694,11 @@ impl Pal for Sys { 0 } + unsafe fn madvise(addr: *mut c_void, len: usize, flags: c_int) -> c_int { + eprintln!("madvise {:p} {:x} {:x}", addr, len, flags); + e(Err(syscall::Error::new(syscall::ENOSYS))) as c_int + } + fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int { let redox_rqtp = unsafe { redox_timespec::from(&*rqtp) }; let mut redox_rmtp: redox_timespec; diff --git a/tests/sys_mman.c b/tests/sys_mman.c index 2e3ddaa68e..81b868ca74 100644 --- a/tests/sys_mman.c +++ b/tests/sys_mman.c @@ -12,11 +12,13 @@ int main() { puts("Mapping 1 page of memory..."); char *map1 = mmap((void *) 0x200000000, (size_t) page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE, -1, 0); puts("Mapping 3 pages of memory..."); - char *map2 = mmap(map1 + page_size, (size_t) page_size * 3, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE, -1, 0); + char *map2 = mmap(map1 + page_size, (size_t) page_size * 4, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE, -1, 0); ERROR_IF(mmap, map1, == MAP_FAILED); ERROR_IF(mmap, map2, == MAP_FAILED); + (void)madvise(map1 + page_size + 3, page_size, PROT_NONE); + puts("Randomizing mapping #1"); for (int i = 0; i < page_size; ++i) { map1[i] = (char) (rand() & 0xFF); @@ -43,7 +45,7 @@ int main() { // map2[page_size] = 0; puts("Unmapping it all at once!"); - munmap(map1, (size_t) page_size * 4); + munmap(map1, (size_t) page_size * 5); // Page fault: // *map2 = 0;