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 /arch/x86 | |
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
Diffstat (limited to 'arch/x86')
-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 |