aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/boot/compressed/misc.c31
-rw-r--r--arch/x86/boot/compressed/string.c33
2 files changed, 34 insertions, 30 deletions
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c
index 196eaf373a06..3100092b1346 100644
--- a/arch/x86/boot/compressed/misc.c
+++ b/arch/x86/boot/compressed/misc.c
@@ -10,6 +10,7 @@
10 */ 10 */
11 11
12#include "misc.h" 12#include "misc.h"
13#include "../string.h"
13 14
14/* WARNING!! 15/* WARNING!!
15 * This code is compiled with -fPIC and it is relocated dynamically 16 * This code is compiled with -fPIC and it is relocated dynamically
@@ -110,7 +111,6 @@ static void error(char *m);
110struct boot_params *real_mode; /* Pointer to real-mode data */ 111struct boot_params *real_mode; /* Pointer to real-mode data */
111 112
112void *memset(void *s, int c, size_t n); 113void *memset(void *s, int c, size_t n);
113void *memcpy(void *dest, const void *src, size_t n);
114 114
115memptr free_mem_ptr; 115memptr free_mem_ptr;
116memptr free_mem_end_ptr; 116memptr free_mem_end_ptr;
@@ -225,35 +225,6 @@ void *memset(void *s, int c, size_t n)
225 ss[i] = c; 225 ss[i] = c;
226 return s; 226 return s;
227} 227}
228#ifdef CONFIG_X86_32
229void *memcpy(void *dest, const void *src, size_t n)
230{
231 int d0, d1, d2;
232 asm volatile(
233 "rep ; movsl\n\t"
234 "movl %4,%%ecx\n\t"
235 "rep ; movsb\n\t"
236 : "=&c" (d0), "=&D" (d1), "=&S" (d2)
237 : "0" (n >> 2), "g" (n & 3), "1" (dest), "2" (src)
238 : "memory");
239
240 return dest;
241}
242#else
243void *memcpy(void *dest, const void *src, size_t n)
244{
245 long d0, d1, d2;
246 asm volatile(
247 "rep ; movsq\n\t"
248 "movq %4,%%rcx\n\t"
249 "rep ; movsb\n\t"
250 : "=&c" (d0), "=&D" (d1), "=&S" (d2)
251 : "0" (n >> 3), "g" (n & 7), "1" (dest), "2" (src)
252 : "memory");
253
254 return dest;
255}
256#endif
257 228
258static void error(char *x) 229static void error(char *x)
259{ 230{
diff --git a/arch/x86/boot/compressed/string.c b/arch/x86/boot/compressed/string.c
index 212004ec787d..3b5a82fc6ad7 100644
--- a/arch/x86/boot/compressed/string.c
+++ b/arch/x86/boot/compressed/string.c
@@ -11,3 +11,36 @@ int memcmp(const void *s1, const void *s2, size_t len)
11} 11}
12 12
13#include "../string.c" 13#include "../string.c"
14
15/* misc.h might pull in string_32.h which has a macro for memcpy. undef that */
16#undef memcpy
17
18#ifdef CONFIG_X86_32
19void *memcpy(void *dest, const void *src, size_t n)
20{
21 int d0, d1, d2;
22 asm volatile(
23 "rep ; movsl\n\t"
24 "movl %4,%%ecx\n\t"
25 "rep ; movsb\n\t"
26 : "=&c" (d0), "=&D" (d1), "=&S" (d2)
27 : "0" (n >> 2), "g" (n & 3), "1" (dest), "2" (src)
28 : "memory");
29
30 return dest;
31}
32#else
33void *memcpy(void *dest, const void *src, size_t n)
34{
35 long d0, d1, d2;
36 asm volatile(
37 "rep ; movsq\n\t"
38 "movq %4,%%rcx\n\t"
39 "rep ; movsb\n\t"
40 : "=&c" (d0), "=&D" (d1), "=&S" (d2)
41 : "0" (n >> 3), "g" (n & 7), "1" (dest), "2" (src)
42 : "memory");
43
44 return dest;
45}
46#endif