Skip to content

Commit deb822a

Browse files
committed
Porting mremap().
1 parent 669a250 commit deb822a

5 files changed

Lines changed: 41 additions & 41 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ crate-type = ["staticlib", "dylib"]
1111
lazy_static = { version = "0.2.1", features = ["spin_no_std"] }
1212
rlibc = "1.0.0"
1313
syscall = "0.2.1"
14+
va_list = "0.0.3"
1415

1516
[profile.release]
1617
debug = true

musl/src/mman/mremap.c

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/lib.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
#![no_std]
22
#![feature(asm, lang_items, linkage)]
3+
//#![needs_panic_runtime]
34

45
#![allow(non_camel_case_types)]
56

67
#[macro_use]
78
extern crate lazy_static;
89
extern crate syscall;
10+
extern crate va_list;
911

1012
#[macro_use]
1113
pub mod syscall_mgt;
@@ -65,16 +67,10 @@ pub mod signal {
6567
pub use platform::signal::*;
6668
}
6769

68-
#[lang = "eh_personality"]
70+
/*#[lang = "eh_personality"]
6971
extern "C" fn eh_personality() {}
7072
7173
#[lang = "panic_fmt"]
7274
fn panic_fmt() -> ! {
7375
loop {}
74-
}
75-
76-
#[cfg(test)]
77-
mod test {
78-
#[test]
79-
fn it_works() {}
80-
}
76+
}*/

src/mmap.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use core::isize;
22

3+
use va_list::VaList;
4+
35
use c_types::*;
46
use errno::{set_errno, EINVAL, ENOMEM};
57
use platform::mman::*;
@@ -37,6 +39,29 @@ pub unsafe extern "C" fn __mmap(start: *mut c_void,
3739
syscall!(MMAP, start, len, prot, flags, fd, off) as *mut c_void
3840
}
3941

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+
4065
#[no_mangle]
4166
pub unsafe extern "C" fn madvise(address: *mut c_void, len: usize, advice: c_int) -> c_int {
4267
syscall!(MADVISE, address, len, advice) as c_int
@@ -86,3 +111,13 @@ pub unsafe extern "C" fn mmap64(start: *mut c_void,
86111
-> *mut c_void {
87112
__mmap(start, len, prot, flags, fd, off)
88113
}
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+
}

src/platform/linux-x86_64/mman.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ pub const PAGE_SIZE: off_t = 4096;
55
pub const MAP_FAILED: *mut c_void = 0xffffffffffffffff as *mut c_void;
66

77
pub const MAP_FIXED: c_int = 0x10;
8+
pub const MREMAP_FIXED: c_int = 2;

0 commit comments

Comments
 (0)