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 | |
| 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>
| -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 */ |
