diff --git a/src/header/sys_mman/mod.rs b/src/header/sys_mman/mod.rs
index 7b6ce5a1f00ddb5620874abeac3bce284edb5129..9430cfb26f000b5af369a0abf9f40f9ab18ee96f 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 eb146ac78063157fa5154dd468b5c4c971cb9984..ebefcc6347afca6ee1e0cf2075649f09feb3b4f8 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 485ba0a1a76a94560f1b75741cc595629beb6261..3cb426cb71e6e514db078efbd217f3f9d185e260 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 90fa2ff2e62dfe67ee7a1217abaf77fc94e5a179..999554795ec058f30466fa52ebd683e4f81aae01 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 2e3ddaa68eae8ab8ddfe293e211f9bf5f0ea67c9..81b868ca74287421204b87b774f2721f2a61c44b 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;