@@ -24,149 +24,6 @@ bool arch_check_interrupt(void) {
2424 return (sstatus & SSTATUS_SIE ) != 0 ;
2525}
2626
27- void * memcpy (void * restrict dest , const void * restrict src , size_t n ) {
28- unsigned char * d = dest ;
29- const unsigned char * s = src ;
30-
31- #ifdef __GNUC__
32-
33- # if __BYTE_ORDER == __LITTLE_ENDIAN
34- # define LS >>
35- # define RS <<
36- # else
37- # define LS <<
38- # define RS >>
39- # endif
40-
41- typedef uint32_t __attribute__ ( (__may_alias__ )) u32 ;
42- uint32_t w , x ;
43-
44- for (; (uintptr_t )s % 4 && n ; n -- )
45- * d ++ = * s ++ ;
46-
47- if ((uintptr_t )d % 4 == 0 ) {
48- for (; n >= 16 ; s += 16 , d += 16 , n -= 16 ) {
49- * (u32 * )(d + 0 ) = * (u32 * )(s + 0 );
50- * (u32 * )(d + 4 ) = * (u32 * )(s + 4 );
51- * (u32 * )(d + 8 ) = * (u32 * )(s + 8 );
52- * (u32 * )(d + 12 ) = * (u32 * )(s + 12 );
53- }
54- if (n & 8 ) {
55- * (u32 * )(d + 0 ) = * (u32 * )(s + 0 );
56- * (u32 * )(d + 4 ) = * (u32 * )(s + 4 );
57- d += 8 ;
58- s += 8 ;
59- }
60- if (n & 4 ) {
61- * (u32 * )(d + 0 ) = * (u32 * )(s + 0 );
62- d += 4 ;
63- s += 4 ;
64- }
65- if (n & 2 ) {
66- * d ++ = * s ++ ;
67- * d ++ = * s ++ ;
68- }
69- if (n & 1 ) { * d = * s ; }
70- return dest ;
71- }
72-
73- if (n >= 32 ) switch ((uintptr_t )d % 4 ) {
74- case 1 :
75- w = * (u32 * )s ;
76- * d ++ = * s ++ ;
77- * d ++ = * s ++ ;
78- * d ++ = * s ++ ;
79- n -= 3 ;
80- for (; n >= 17 ; s += 16 , d += 16 , n -= 16 ) {
81- x = * (u32 * )(s + 1 );
82- * (u32 * )(d + 0 ) = (w LS 24 ) | (x RS 8 );
83- w = * (u32 * )(s + 5 );
84- * (u32 * )(d + 4 ) = (x LS 24 ) | (w RS 8 );
85- x = * (u32 * )(s + 9 );
86- * (u32 * )(d + 8 ) = (w LS 24 ) | (x RS 8 );
87- w = * (u32 * )(s + 13 );
88- * (u32 * )(d + 12 ) = (x LS 24 ) | (w RS 8 );
89- }
90- break ;
91- case 2 :
92- w = * (u32 * )s ;
93- * d ++ = * s ++ ;
94- * d ++ = * s ++ ;
95- n -= 2 ;
96- for (; n >= 18 ; s += 16 , d += 16 , n -= 16 ) {
97- x = * (u32 * )(s + 2 );
98- * (u32 * )(d + 0 ) = (w LS 16 ) | (x RS 16 );
99- w = * (u32 * )(s + 6 );
100- * (u32 * )(d + 4 ) = (x LS 16 ) | (w RS 16 );
101- x = * (u32 * )(s + 10 );
102- * (u32 * )(d + 8 ) = (w LS 16 ) | (x RS 16 );
103- w = * (u32 * )(s + 14 );
104- * (u32 * )(d + 12 ) = (x LS 16 ) | (w RS 16 );
105- }
106- break ;
107- case 3 :
108- w = * (u32 * )s ;
109- * d ++ = * s ++ ;
110- n -= 1 ;
111- for (; n >= 19 ; s += 16 , d += 16 , n -= 16 ) {
112- x = * (u32 * )(s + 3 );
113- * (u32 * )(d + 0 ) = (w LS 8 ) | (x RS 24 );
114- w = * (u32 * )(s + 7 );
115- * (u32 * )(d + 4 ) = (x LS 8 ) | (w RS 24 );
116- x = * (u32 * )(s + 11 );
117- * (u32 * )(d + 8 ) = (w LS 8 ) | (x RS 24 );
118- w = * (u32 * )(s + 15 );
119- * (u32 * )(d + 12 ) = (x LS 8 ) | (w RS 24 );
120- }
121- break ;
122- }
123- if (n & 16 ) {
124- * d ++ = * s ++ ;
125- * d ++ = * s ++ ;
126- * d ++ = * s ++ ;
127- * d ++ = * s ++ ;
128- * d ++ = * s ++ ;
129- * d ++ = * s ++ ;
130- * d ++ = * s ++ ;
131- * d ++ = * s ++ ;
132- * d ++ = * s ++ ;
133- * d ++ = * s ++ ;
134- * d ++ = * s ++ ;
135- * d ++ = * s ++ ;
136- * d ++ = * s ++ ;
137- * d ++ = * s ++ ;
138- * d ++ = * s ++ ;
139- * d ++ = * s ++ ;
140- }
141- if (n & 8 ) {
142- * d ++ = * s ++ ;
143- * d ++ = * s ++ ;
144- * d ++ = * s ++ ;
145- * d ++ = * s ++ ;
146- * d ++ = * s ++ ;
147- * d ++ = * s ++ ;
148- * d ++ = * s ++ ;
149- * d ++ = * s ++ ;
150- }
151- if (n & 4 ) {
152- * d ++ = * s ++ ;
153- * d ++ = * s ++ ;
154- * d ++ = * s ++ ;
155- * d ++ = * s ++ ;
156- }
157- if (n & 2 ) {
158- * d ++ = * s ++ ;
159- * d ++ = * s ++ ;
160- }
161- if (n & 1 ) { * d = * s ; }
162- return dest ;
163- #endif
164-
165- for (; n ; n -- )
166- * d ++ = * s ++ ;
167- return dest ;
168- }
169-
17027bool arch_elf_test_head (Elf64_Ehdr * ehdr ) {
17128 if (ehdr -> e_ident [EI_MAG0 ] != ELFMAG0 || ehdr -> e_ident [EI_MAG1 ] != ELFMAG1 ||
17229 ehdr -> e_ident [EI_MAG2 ] != ELFMAG2 || ehdr -> e_ident [EI_MAG3 ] != ELFMAG3 ||
0 commit comments