1
1
use sys:: syscall:: exit;
2
2
3
- #[ allow ( private_no_mangle_fns ) ]
3
+ #[ unstable ( feature = "start_fn" , issue = "0" ) ]
4
4
#[ no_mangle]
5
5
#[ naked]
6
6
#[ cfg( target_arch = "x86" ) ]
@@ -15,7 +15,7 @@ pub unsafe fn _start() {
15
15
let _ = exit ( 0 ) ;
16
16
}
17
17
18
- #[ allow ( private_no_mangle_fns ) ]
18
+ #[ unstable ( feature = "start_fn" , issue = "0" ) ]
19
19
#[ no_mangle]
20
20
#[ naked]
21
21
#[ cfg( target_arch = "x86_64" ) ]
@@ -30,7 +30,7 @@ pub unsafe fn _start() {
30
30
let _ = exit ( 0 ) ;
31
31
}
32
32
33
- #[ allow ( private_no_mangle_fns ) ]
33
+ #[ unstable ( feature = "start_fn" , issue = "0" ) ]
34
34
#[ no_mangle]
35
35
pub unsafe extern "C" fn _start_stack ( stack : * const usize ) {
36
36
extern "C" {
@@ -41,3 +41,78 @@ pub unsafe extern "C" fn _start_stack(stack: *const usize){
41
41
let argv = stack. offset ( 1 ) as * const * const u8 ;
42
42
let _ = exit ( main ( argc, argv) ) ;
43
43
}
44
+
45
+ /// Memcpy
46
+ ///
47
+ /// Copy N bytes of memory from one location to another.
48
+ #[ unstable( feature = "start_fn" , issue = "0" ) ]
49
+ #[ no_mangle]
50
+ pub unsafe extern fn memcpy ( dest : * mut u8 , src : * const u8 ,
51
+ n : usize ) -> * mut u8 {
52
+ let mut i = 0 ;
53
+ while i < n {
54
+ * ( ( dest as usize + i) as * mut u8 ) = * ( ( src as usize + i) as * const u8 ) ;
55
+ i += 1 ;
56
+ }
57
+
58
+ dest
59
+ }
60
+
61
+ /// Memmove
62
+ ///
63
+ /// Copy N bytes of memory from src to dest. The memory areas may overlap.
64
+ #[ unstable( feature = "start_fn" , issue = "0" ) ]
65
+ #[ no_mangle]
66
+ pub unsafe extern fn memmove ( dest : * mut u8 , src : * const u8 ,
67
+ n : usize ) -> * mut u8 {
68
+ if src < dest as * const u8 {
69
+ let mut i = n;
70
+ while i != 0 {
71
+ i -= 1 ;
72
+ * ( ( dest as usize + i) as * mut u8 ) = * ( ( src as usize + i) as * const u8 ) ;
73
+ }
74
+ } else {
75
+ let mut i = 0 ;
76
+ while i < n {
77
+ * ( ( dest as usize + i) as * mut u8 ) = * ( ( src as usize + i) as * const u8 ) ;
78
+ i += 1 ;
79
+ }
80
+ }
81
+
82
+ dest
83
+ }
84
+
85
+ /// Memset
86
+ ///
87
+ /// Fill a block of memory with a specified value.
88
+ #[ unstable( feature = "start_fn" , issue = "0" ) ]
89
+ #[ no_mangle]
90
+ pub unsafe extern fn memset ( dest : * mut u8 , c : i32 , n : usize ) -> * mut u8 {
91
+ let mut i = 0 ;
92
+ while i < n {
93
+ * ( ( dest as usize + i) as * mut u8 ) = c as u8 ;
94
+ i += 1 ;
95
+ }
96
+
97
+ dest
98
+ }
99
+
100
+ /// Memcmp
101
+ ///
102
+ /// Compare two blocks of memory.
103
+ #[ unstable( feature = "start_fn" , issue = "0" ) ]
104
+ #[ no_mangle]
105
+ pub unsafe extern fn memcmp ( s1 : * const u8 , s2 : * const u8 , n : usize ) -> i32 {
106
+ let mut i = 0 ;
107
+
108
+ while i < n {
109
+ let a = * ( ( s1 as usize + i) as * const u8 ) ;
110
+ let b = * ( ( s2 as usize + i) as * const u8 ) ;
111
+ if a != b {
112
+ return a as i32 - b as i32
113
+ }
114
+ i += 1 ;
115
+ }
116
+
117
+ 0
118
+ }
0 commit comments