diff options
-rw-r--r-- | arch/x86/boot/compressed/misc.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 8f7bef8e9fff..23f315c9f215 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
@@ -229,18 +229,35 @@ void *memset(void *s, int c, size_t n) | |||
229 | ss[i] = c; | 229 | ss[i] = c; |
230 | return s; | 230 | return s; |
231 | } | 231 | } |
232 | 232 | #ifdef CONFIG_X86_32 | |
233 | void *memcpy(void *dest, const void *src, size_t n) | 233 | void *memcpy(void *dest, const void *src, size_t n) |
234 | { | 234 | { |
235 | int i; | 235 | int d0, d1, d2; |
236 | const char *s = src; | 236 | asm volatile( |
237 | char *d = dest; | 237 | "rep ; movsl\n\t" |
238 | "movl %4,%%ecx\n\t" | ||
239 | "rep ; movsb\n\t" | ||
240 | : "=&c" (d0), "=&D" (d1), "=&S" (d2) | ||
241 | : "0" (n >> 2), "g" (n & 3), "1" (dest), "2" (src) | ||
242 | : "memory"); | ||
238 | 243 | ||
239 | for (i = 0; i < n; i++) | ||
240 | d[i] = s[i]; | ||
241 | return dest; | 244 | return dest; |
242 | } | 245 | } |
246 | #else | ||
247 | void *memcpy(void *dest, const void *src, size_t n) | ||
248 | { | ||
249 | long d0, d1, d2; | ||
250 | asm volatile( | ||
251 | "rep ; movsq\n\t" | ||
252 | "movq %4,%%rcx\n\t" | ||
253 | "rep ; movsb\n\t" | ||
254 | : "=&c" (d0), "=&D" (d1), "=&S" (d2) | ||
255 | : "0" (n >> 3), "g" (n & 7), "1" (dest), "2" (src) | ||
256 | : "memory"); | ||
243 | 257 | ||
258 | return dest; | ||
259 | } | ||
260 | #endif | ||
244 | 261 | ||
245 | static void error(char *x) | 262 | static void error(char *x) |
246 | { | 263 | { |