diff options
| author | H. Peter Anvin <hpa@linux.intel.com> | 2012-11-28 14:50:24 -0500 |
|---|---|---|
| committer | H. Peter Anvin <hpa@linux.intel.com> | 2012-11-29 16:23:01 -0500 |
| commit | d55c5a93db2d5fa95f233ab153f594365d95b777 (patch) | |
| tree | f589ea96fe3fab9c935c0963dab7ec8f8a7745fb | |
| parent | eb068e781020cf491333c773fb41820b57bfada4 (diff) | |
x86, 386 removal: Remove CONFIG_CMPXCHG
All 486+ CPUs support CMPXCHG, so remove the fallback 386 support
code.
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Link: http://lkml.kernel.org/r/1354132230-21854-3-git-send-email-hpa@linux.intel.com
| -rw-r--r-- | arch/x86/Kconfig.cpu | 3 | ||||
| -rw-r--r-- | arch/x86/include/asm/cmpxchg_32.h | 55 | ||||
| -rw-r--r-- | arch/x86/include/asm/percpu.h | 3 | ||||
| -rw-r--r-- | arch/x86/lib/Makefile | 1 | ||||
| -rw-r--r-- | arch/x86/lib/cmpxchg.c | 54 | ||||
| -rw-r--r-- | arch/x86/xen/Kconfig | 2 |
6 files changed, 1 insertions, 117 deletions
diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu index 36a07ebf2240..1290a696349e 100644 --- a/arch/x86/Kconfig.cpu +++ b/arch/x86/Kconfig.cpu | |||
| @@ -297,9 +297,6 @@ config X86_INTERNODE_CACHE_SHIFT | |||
| 297 | default "12" if X86_VSMP | 297 | default "12" if X86_VSMP |
| 298 | default X86_L1_CACHE_SHIFT | 298 | default X86_L1_CACHE_SHIFT |
| 299 | 299 | ||
| 300 | config X86_CMPXCHG | ||
| 301 | def_bool y | ||
| 302 | |||
| 303 | config X86_L1_CACHE_SHIFT | 300 | config X86_L1_CACHE_SHIFT |
| 304 | int | 301 | int |
| 305 | default "7" if MPENTIUM4 || MPSC | 302 | default "7" if MPENTIUM4 || MPSC |
diff --git a/arch/x86/include/asm/cmpxchg_32.h b/arch/x86/include/asm/cmpxchg_32.h index 53f4b219336b..f8bf2eecab86 100644 --- a/arch/x86/include/asm/cmpxchg_32.h +++ b/arch/x86/include/asm/cmpxchg_32.h | |||
| @@ -34,9 +34,7 @@ static inline void set_64bit(volatile u64 *ptr, u64 value) | |||
| 34 | : "memory"); | 34 | : "memory"); |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | #ifdef CONFIG_X86_CMPXCHG | ||
| 38 | #define __HAVE_ARCH_CMPXCHG 1 | 37 | #define __HAVE_ARCH_CMPXCHG 1 |
| 39 | #endif | ||
| 40 | 38 | ||
| 41 | #ifdef CONFIG_X86_CMPXCHG64 | 39 | #ifdef CONFIG_X86_CMPXCHG64 |
| 42 | #define cmpxchg64(ptr, o, n) \ | 40 | #define cmpxchg64(ptr, o, n) \ |
| @@ -73,59 +71,6 @@ static inline u64 __cmpxchg64_local(volatile u64 *ptr, u64 old, u64 new) | |||
| 73 | return prev; | 71 | return prev; |
| 74 | } | 72 | } |
| 75 | 73 | ||
| 76 | #ifndef CONFIG_X86_CMPXCHG | ||
| 77 | /* | ||
| 78 | * Building a kernel capable running on 80386. It may be necessary to | ||
| 79 | * simulate the cmpxchg on the 80386 CPU. For that purpose we define | ||
| 80 | * a function for each of the sizes we support. | ||
| 81 | */ | ||
| 82 | |||
| 83 | extern unsigned long cmpxchg_386_u8(volatile void *, u8, u8); | ||
| 84 | extern unsigned long cmpxchg_386_u16(volatile void *, u16, u16); | ||
| 85 | extern unsigned long cmpxchg_386_u32(volatile void *, u32, u32); | ||
| 86 | |||
| 87 | static inline unsigned long cmpxchg_386(volatile void *ptr, unsigned long old, | ||
| 88 | unsigned long new, int size) | ||
| 89 | { | ||
| 90 | switch (size) { | ||
| 91 | case 1: | ||
| 92 | return cmpxchg_386_u8(ptr, old, new); | ||
| 93 | case 2: | ||
| 94 | return cmpxchg_386_u16(ptr, old, new); | ||
| 95 | case 4: | ||
| 96 | return cmpxchg_386_u32(ptr, old, new); | ||
| 97 | } | ||
| 98 | return old; | ||
| 99 | } | ||
| 100 | |||
| 101 | #define cmpxchg(ptr, o, n) \ | ||
| 102 | ({ \ | ||
| 103 | __typeof__(*(ptr)) __ret; \ | ||
| 104 | if (likely(boot_cpu_data.x86 > 3)) \ | ||
| 105 | __ret = (__typeof__(*(ptr)))__cmpxchg((ptr), \ | ||
| 106 | (unsigned long)(o), (unsigned long)(n), \ | ||
| 107 | sizeof(*(ptr))); \ | ||
| 108 | else \ | ||
| 109 | __ret = (__typeof__(*(ptr)))cmpxchg_386((ptr), \ | ||
| 110 | (unsigned long)(o), (unsigned long)(n), \ | ||
| 111 | sizeof(*(ptr))); \ | ||
| 112 | __ret; \ | ||
| 113 | }) | ||
| 114 | #define cmpxchg_local(ptr, o, n) \ | ||
| 115 | ({ \ | ||
| 116 | __typeof__(*(ptr)) __ret; \ | ||
| 117 | if (likely(boot_cpu_data.x86 > 3)) \ | ||
| 118 | __ret = (__typeof__(*(ptr)))__cmpxchg_local((ptr), \ | ||
| 119 | (unsigned long)(o), (unsigned long)(n), \ | ||
| 120 | sizeof(*(ptr))); \ | ||
| 121 | else \ | ||
| 122 | __ret = (__typeof__(*(ptr)))cmpxchg_386((ptr), \ | ||
| 123 | (unsigned long)(o), (unsigned long)(n), \ | ||
| 124 | sizeof(*(ptr))); \ | ||
| 125 | __ret; \ | ||
| 126 | }) | ||
| 127 | #endif | ||
| 128 | |||
| 129 | #ifndef CONFIG_X86_CMPXCHG64 | 74 | #ifndef CONFIG_X86_CMPXCHG64 |
| 130 | /* | 75 | /* |
| 131 | * Building a kernel capable running on 80386 and 80486. It may be necessary | 76 | * Building a kernel capable running on 80386 and 80486. It may be necessary |
diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index 1104afaba52b..0da5200ee79d 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h | |||
| @@ -406,7 +406,6 @@ do { \ | |||
| 406 | #define this_cpu_xchg_2(pcp, nval) percpu_xchg_op(pcp, nval) | 406 | #define this_cpu_xchg_2(pcp, nval) percpu_xchg_op(pcp, nval) |
| 407 | #define this_cpu_xchg_4(pcp, nval) percpu_xchg_op(pcp, nval) | 407 | #define this_cpu_xchg_4(pcp, nval) percpu_xchg_op(pcp, nval) |
| 408 | 408 | ||
| 409 | #ifndef CONFIG_M386 | ||
| 410 | #define __this_cpu_add_return_1(pcp, val) percpu_add_return_op(pcp, val) | 409 | #define __this_cpu_add_return_1(pcp, val) percpu_add_return_op(pcp, val) |
| 411 | #define __this_cpu_add_return_2(pcp, val) percpu_add_return_op(pcp, val) | 410 | #define __this_cpu_add_return_2(pcp, val) percpu_add_return_op(pcp, val) |
| 412 | #define __this_cpu_add_return_4(pcp, val) percpu_add_return_op(pcp, val) | 411 | #define __this_cpu_add_return_4(pcp, val) percpu_add_return_op(pcp, val) |
| @@ -421,8 +420,6 @@ do { \ | |||
| 421 | #define this_cpu_cmpxchg_2(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval) | 420 | #define this_cpu_cmpxchg_2(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval) |
| 422 | #define this_cpu_cmpxchg_4(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval) | 421 | #define this_cpu_cmpxchg_4(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval) |
| 423 | 422 | ||
| 424 | #endif /* !CONFIG_M386 */ | ||
| 425 | |||
| 426 | #ifdef CONFIG_X86_CMPXCHG64 | 423 | #ifdef CONFIG_X86_CMPXCHG64 |
| 427 | #define percpu_cmpxchg8b_double(pcp1, pcp2, o1, o2, n1, n2) \ | 424 | #define percpu_cmpxchg8b_double(pcp1, pcp2, o1, o2, n1, n2) \ |
| 428 | ({ \ | 425 | ({ \ |
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile index b00f6785da74..96b2c6697c9d 100644 --- a/arch/x86/lib/Makefile +++ b/arch/x86/lib/Makefile | |||
| @@ -32,7 +32,6 @@ ifeq ($(CONFIG_X86_32),y) | |||
| 32 | lib-y += checksum_32.o | 32 | lib-y += checksum_32.o |
| 33 | lib-y += strstr_32.o | 33 | lib-y += strstr_32.o |
| 34 | lib-y += string_32.o | 34 | lib-y += string_32.o |
| 35 | lib-y += cmpxchg.o | ||
| 36 | ifneq ($(CONFIG_X86_CMPXCHG64),y) | 35 | ifneq ($(CONFIG_X86_CMPXCHG64),y) |
| 37 | lib-y += cmpxchg8b_emu.o atomic64_386_32.o | 36 | lib-y += cmpxchg8b_emu.o atomic64_386_32.o |
| 38 | endif | 37 | endif |
diff --git a/arch/x86/lib/cmpxchg.c b/arch/x86/lib/cmpxchg.c deleted file mode 100644 index 5d619f6df3ee..000000000000 --- a/arch/x86/lib/cmpxchg.c +++ /dev/null | |||
| @@ -1,54 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * cmpxchg*() fallbacks for CPU not supporting these instructions | ||
| 3 | */ | ||
| 4 | |||
| 5 | #include <linux/kernel.h> | ||
| 6 | #include <linux/smp.h> | ||
| 7 | #include <linux/module.h> | ||
| 8 | |||
| 9 | #ifndef CONFIG_X86_CMPXCHG | ||
| 10 | unsigned long cmpxchg_386_u8(volatile void *ptr, u8 old, u8 new) | ||
| 11 | { | ||
| 12 | u8 prev; | ||
| 13 | unsigned long flags; | ||
| 14 | |||
| 15 | /* Poor man's cmpxchg for 386. Unsuitable for SMP */ | ||
| 16 | local_irq_save(flags); | ||
| 17 | prev = *(u8 *)ptr; | ||
| 18 | if (prev == old) | ||
| 19 | *(u8 *)ptr = new; | ||
| 20 | local_irq_restore(flags); | ||
| 21 | return prev; | ||
| 22 | } | ||
| 23 | EXPORT_SYMBOL(cmpxchg_386_u8); | ||
| 24 | |||
| 25 | unsigned long cmpxchg_386_u16(volatile void *ptr, u16 old, u16 new) | ||
| 26 | { | ||
| 27 | u16 prev; | ||
| 28 | unsigned long flags; | ||
| 29 | |||
| 30 | /* Poor man's cmpxchg for 386. Unsuitable for SMP */ | ||
| 31 | local_irq_save(flags); | ||
| 32 | prev = *(u16 *)ptr; | ||
| 33 | if (prev == old) | ||
| 34 | *(u16 *)ptr = new; | ||
| 35 | local_irq_restore(flags); | ||
| 36 | return prev; | ||
| 37 | } | ||
| 38 | EXPORT_SYMBOL(cmpxchg_386_u16); | ||
| 39 | |||
| 40 | unsigned long cmpxchg_386_u32(volatile void *ptr, u32 old, u32 new) | ||
| 41 | { | ||
| 42 | u32 prev; | ||
| 43 | unsigned long flags; | ||
| 44 | |||
| 45 | /* Poor man's cmpxchg for 386. Unsuitable for SMP */ | ||
| 46 | local_irq_save(flags); | ||
| 47 | prev = *(u32 *)ptr; | ||
| 48 | if (prev == old) | ||
| 49 | *(u32 *)ptr = new; | ||
| 50 | local_irq_restore(flags); | ||
| 51 | return prev; | ||
| 52 | } | ||
| 53 | EXPORT_SYMBOL(cmpxchg_386_u32); | ||
| 54 | #endif | ||
diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig index fdce49c7aff6..9a6775c9ddca 100644 --- a/arch/x86/xen/Kconfig +++ b/arch/x86/xen/Kconfig | |||
| @@ -7,7 +7,7 @@ config XEN | |||
| 7 | select PARAVIRT | 7 | select PARAVIRT |
| 8 | select PARAVIRT_CLOCK | 8 | select PARAVIRT_CLOCK |
| 9 | depends on X86_64 || (X86_32 && X86_PAE && !X86_VISWS) | 9 | depends on X86_64 || (X86_32 && X86_PAE && !X86_VISWS) |
| 10 | depends on X86_CMPXCHG && X86_TSC | 10 | depends on X86_TSC |
| 11 | help | 11 | help |
| 12 | This is the Linux Xen port. Enabling this will allow the | 12 | This is the Linux Xen port. Enabling this will allow the |
| 13 | kernel to boot in a paravirtualized environment under the | 13 | kernel to boot in a paravirtualized environment under the |
