diff options
author | Vivek Goyal <vgoyal@redhat.com> | 2014-03-18 15:26:39 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2014-03-19 18:44:04 -0400 |
commit | fb4cac573ef6dce8d7543b68306566561c2e5725 (patch) | |
tree | 9eea125e337817ac302d99878e12609bb5514bde /arch/x86/boot | |
parent | 820e8feca06ff744f60e5036c3178dde40b91afc (diff) |
x86, boot: Move memcmp() into string.h and string.c
Try to treat memcmp() in same way as memcpy() and memset(). Provide a
declaration in boot/string.h and by default user gets a memcmp() which
maps to builtin function.
Move optimized definition of memcmp() in boot/string.c. Now a user can
do #undef memcmp and link against string.c to use optimzied memcmp().
It also simplifies boot/compressed/string.c where we had to redefine
memcmp(). That extra definition is gone now.
Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Link: http://lkml.kernel.org/r/1395170800-11059-5-git-send-email-vgoyal@redhat.com
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'arch/x86/boot')
-rw-r--r-- | arch/x86/boot/boot.h | 8 | ||||
-rw-r--r-- | arch/x86/boot/compressed/string.c | 11 | ||||
-rw-r--r-- | arch/x86/boot/string.c | 14 | ||||
-rw-r--r-- | arch/x86/boot/string.h | 2 |
4 files changed, 16 insertions, 19 deletions
diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h index bed9665cc7e0..bd49ec61255c 100644 --- a/arch/x86/boot/boot.h +++ b/arch/x86/boot/boot.h | |||
@@ -177,14 +177,6 @@ static inline void wrgs32(u32 v, addr_t addr) | |||
177 | } | 177 | } |
178 | 178 | ||
179 | /* Note: these only return true/false, not a signed return value! */ | 179 | /* Note: these only return true/false, not a signed return value! */ |
180 | static inline int memcmp(const void *s1, const void *s2, size_t len) | ||
181 | { | ||
182 | u8 diff; | ||
183 | asm("repe; cmpsb; setnz %0" | ||
184 | : "=qm" (diff), "+D" (s1), "+S" (s2), "+c" (len)); | ||
185 | return diff; | ||
186 | } | ||
187 | |||
188 | static inline int memcmp_fs(const void *s1, addr_t s2, size_t len) | 180 | static inline int memcmp_fs(const void *s1, addr_t s2, size_t len) |
189 | { | 181 | { |
190 | u8 diff; | 182 | u8 diff; |
diff --git a/arch/x86/boot/compressed/string.c b/arch/x86/boot/compressed/string.c index 3b5a82fc6ad7..920b55e3e241 100644 --- a/arch/x86/boot/compressed/string.c +++ b/arch/x86/boot/compressed/string.c | |||
@@ -1,15 +1,4 @@ | |||
1 | #include "misc.h" | 1 | #include "misc.h" |
2 | |||
3 | /* Avoid intereference from any defines in string_32.h */ | ||
4 | #undef memcmp | ||
5 | int memcmp(const void *s1, const void *s2, size_t len) | ||
6 | { | ||
7 | u8 diff; | ||
8 | asm("repe; cmpsb; setnz %0" | ||
9 | : "=qm" (diff), "+D" (s1), "+S" (s2), "+c" (len)); | ||
10 | return diff; | ||
11 | } | ||
12 | |||
13 | #include "../string.c" | 2 | #include "../string.c" |
14 | 3 | ||
15 | /* misc.h might pull in string_32.h which has a macro for memcpy. undef that */ | 4 | /* misc.h might pull in string_32.h which has a macro for memcpy. undef that */ |
diff --git a/arch/x86/boot/string.c b/arch/x86/boot/string.c index 574dedfe2890..5339040ef86e 100644 --- a/arch/x86/boot/string.c +++ b/arch/x86/boot/string.c | |||
@@ -14,6 +14,20 @@ | |||
14 | 14 | ||
15 | #include "boot.h" | 15 | #include "boot.h" |
16 | 16 | ||
17 | /* | ||
18 | * This file gets included in compressed/string.c which might pull in | ||
19 | * string_32.h and which in turn maps memcmp to __builtin_memcmp(). Undo | ||
20 | * that first. | ||
21 | */ | ||
22 | #undef memcmp | ||
23 | int memcmp(const void *s1, const void *s2, size_t len) | ||
24 | { | ||
25 | u8 diff; | ||
26 | asm("repe; cmpsb; setnz %0" | ||
27 | : "=qm" (diff), "+D" (s1), "+S" (s2), "+c" (len)); | ||
28 | return diff; | ||
29 | } | ||
30 | |||
17 | int strcmp(const char *str1, const char *str2) | 31 | int strcmp(const char *str1, const char *str2) |
18 | { | 32 | { |
19 | const unsigned char *s1 = (const unsigned char *)str1; | 33 | const unsigned char *s1 = (const unsigned char *)str1; |
diff --git a/arch/x86/boot/string.h b/arch/x86/boot/string.h index 10939d8da2e0..725e820602b1 100644 --- a/arch/x86/boot/string.h +++ b/arch/x86/boot/string.h | |||
@@ -8,6 +8,7 @@ | |||
8 | 8 | ||
9 | void *memcpy(void *dst, const void *src, size_t len); | 9 | void *memcpy(void *dst, const void *src, size_t len); |
10 | void *memset(void *dst, int c, size_t len); | 10 | void *memset(void *dst, int c, size_t len); |
11 | int memcmp(const void *s1, const void *s2, size_t len); | ||
11 | 12 | ||
12 | /* | 13 | /* |
13 | * Access builtin version by default. If one needs to use optimized version, | 14 | * Access builtin version by default. If one needs to use optimized version, |
@@ -15,5 +16,6 @@ void *memset(void *dst, int c, size_t len); | |||
15 | */ | 16 | */ |
16 | #define memcpy(d,s,l) __builtin_memcpy(d,s,l) | 17 | #define memcpy(d,s,l) __builtin_memcpy(d,s,l) |
17 | #define memset(d,c,l) __builtin_memset(d,c,l) | 18 | #define memset(d,c,l) __builtin_memset(d,c,l) |
19 | #define memcmp __builtin_memcmp | ||
18 | 20 | ||
19 | #endif /* BOOT_STRING_H */ | 21 | #endif /* BOOT_STRING_H */ |