diff options
| author | Jeremy Soller <jackpot51@gmail.com> | 2016-12-15 13:10:37 -0700 |
|---|---|---|
| committer | Jeremy Soller <jackpot51@gmail.com> | 2016-12-15 16:33:23 -0700 |
| commit | 773a0a2edb9a79733aca9f07f1fa8d7d155c4abc (patch) | |
| tree | fff31001bfc5d96d04ebea5367d157a5738c2f01 /src/libstd/sys | |
| parent | 3e7543a16ec6450b8fe0c3d50bc341b5f143cc54 (diff) | |
| download | rust-773a0a2edb9a79733aca9f07f1fa8d7d155c4abc.tar.gz rust-773a0a2edb9a79733aca9f07f1fa8d7d155c4abc.zip | |
Add start functions, switch allocation crate to ralloc
Diffstat (limited to 'src/libstd/sys')
| -rw-r--r-- | src/libstd/sys/redox/start.rs | 81 |
1 files changed, 78 insertions, 3 deletions
diff --git a/src/libstd/sys/redox/start.rs b/src/libstd/sys/redox/start.rs index b689be1cf4d..87f58a4773c 100644 --- a/src/libstd/sys/redox/start.rs +++ b/src/libstd/sys/redox/start.rs @@ -1,6 +1,6 @@ use sys::syscall::exit; -#[allow(private_no_mangle_fns)] +#[unstable(feature = "start_fn", issue = "0")] #[no_mangle] #[naked] #[cfg(target_arch = "x86")] @@ -15,7 +15,7 @@ pub unsafe fn _start() { let _ = exit(0); } -#[allow(private_no_mangle_fns)] +#[unstable(feature = "start_fn", issue = "0")] #[no_mangle] #[naked] #[cfg(target_arch = "x86_64")] @@ -30,7 +30,7 @@ pub unsafe fn _start() { let _ = exit(0); } -#[allow(private_no_mangle_fns)] +#[unstable(feature = "start_fn", issue = "0")] #[no_mangle] pub unsafe extern "C" fn _start_stack(stack: *const usize){ extern "C" { @@ -41,3 +41,78 @@ pub unsafe extern "C" fn _start_stack(stack: *const usize){ let argv = stack.offset(1) as *const *const u8; let _ = exit(main(argc, argv)); } + +/// Memcpy +/// +/// Copy N bytes of memory from one location to another. +#[unstable(feature = "start_fn", issue = "0")] +#[no_mangle] +pub unsafe extern fn memcpy(dest: *mut u8, src: *const u8, + n: usize) -> *mut u8 { + let mut i = 0; + while i < n { + *((dest as usize + i) as *mut u8) = *((src as usize + i) as *const u8); + i += 1; + } + + dest +} + +/// Memmove +/// +/// Copy N bytes of memory from src to dest. The memory areas may overlap. +#[unstable(feature = "start_fn", issue = "0")] +#[no_mangle] +pub unsafe extern fn memmove(dest: *mut u8, src: *const u8, + n: usize) -> *mut u8 { + if src < dest as *const u8 { + let mut i = n; + while i != 0 { + i -= 1; + *((dest as usize + i) as *mut u8) = *((src as usize + i) as *const u8); + } + } else { + let mut i = 0; + while i < n { + *((dest as usize + i) as *mut u8) = *((src as usize + i) as *const u8); + i += 1; + } + } + + dest +} + +/// Memset +/// +/// Fill a block of memory with a specified value. +#[unstable(feature = "start_fn", issue = "0")] +#[no_mangle] +pub unsafe extern fn memset(dest: *mut u8, c: i32, n: usize) -> *mut u8 { + let mut i = 0; + while i < n { + *((dest as usize + i) as *mut u8) = c as u8; + i += 1; + } + + dest +} + +/// Memcmp +/// +/// Compare two blocks of memory. +#[unstable(feature = "start_fn", issue = "0")] +#[no_mangle] +pub unsafe extern fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 { + let mut i = 0; + + while i < n { + let a = *((s1 as usize + i) as *const u8); + let b = *((s2 as usize + i) as *const u8); + if a != b { + return a as i32 - b as i32 + } + i += 1; + } + + 0 +} |
