|
1 | 1 | use core::isize; |
2 | 2 |
|
| 3 | +use va_list::VaList; |
| 4 | + |
3 | 5 | use c_types::*; |
4 | 6 | use errno::{set_errno, EINVAL, ENOMEM}; |
5 | 7 | use platform::mman::*; |
@@ -37,6 +39,29 @@ pub unsafe extern "C" fn __mmap(start: *mut c_void, |
37 | 39 | syscall!(MMAP, start, len, prot, flags, fd, off) as *mut c_void |
38 | 40 | } |
39 | 41 |
|
| 42 | +#[no_mangle] |
| 43 | +pub unsafe extern "C" fn __mremap(old_address: *mut c_void, |
| 44 | + old_len: size_t, |
| 45 | + new_len: size_t, |
| 46 | + flags: c_int, |
| 47 | + mut args: VaList) |
| 48 | + -> *mut c_void { |
| 49 | + |
| 50 | + let mut new_address = 0 as *mut c_void; |
| 51 | + |
| 52 | + if new_len >= isize::MAX as usize { |
| 53 | + set_errno(ENOMEM); |
| 54 | + return MAP_FAILED; |
| 55 | + } |
| 56 | + |
| 57 | + if flags & MREMAP_FIXED != 0 { |
| 58 | + __vm_wait(); |
| 59 | + new_address = args.get::<usize>() as *mut c_void; |
| 60 | + } |
| 61 | + |
| 62 | + syscall!(MREMAP, old_address, old_len, new_len, flags, new_address) as *mut c_void |
| 63 | +} |
| 64 | + |
40 | 65 | #[no_mangle] |
41 | 66 | pub unsafe extern "C" fn madvise(address: *mut c_void, len: usize, advice: c_int) -> c_int { |
42 | 67 | syscall!(MADVISE, address, len, advice) as c_int |
@@ -86,3 +111,13 @@ pub unsafe extern "C" fn mmap64(start: *mut c_void, |
86 | 111 | -> *mut c_void { |
87 | 112 | __mmap(start, len, prot, flags, fd, off) |
88 | 113 | } |
| 114 | + |
| 115 | +#[no_mangle] |
| 116 | +pub unsafe extern "C" fn mremap(old_address: *mut c_void, |
| 117 | + old_len: size_t, |
| 118 | + new_len: size_t, |
| 119 | + flags: c_int, |
| 120 | + args: VaList) |
| 121 | + -> *mut c_void { |
| 122 | + __mremap(old_address, old_len, new_len, flags, args) |
| 123 | +} |
0 commit comments