sys_mman: adding madvise.
This commit is contained in:
@@ -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/";
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
+4
-2
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user