Commit 90c8f92f5c807807ca74d5f2f313794925174e6b
1 parent
4532b305e8
Exists in
master
and in
4 other branches
x86, asm: Move cmpxchg emulation code to arch/x86/lib
Move cmpxchg emulation code from arch/x86/kernel/cpu (which is otherwise CPU identification) to arch/x86/lib, where other emulation code lives already. Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> LKML-Reference: <AANLkTikAmaDPji-TVDarmG1yD=fwbffcsmEU=YEuP+8r@mail.gmail.com>
Showing 4 changed files with 74 additions and 73 deletions Side-by-side Diff
arch/x86/kernel/cpu/Makefile
... | ... | @@ -16,7 +16,7 @@ |
16 | 16 | obj-y += proc.o capflags.o powerflags.o common.o |
17 | 17 | obj-y += vmware.o hypervisor.o sched.o mshyperv.o |
18 | 18 | |
19 | -obj-$(CONFIG_X86_32) += bugs.o cmpxchg.o | |
19 | +obj-$(CONFIG_X86_32) += bugs.o | |
20 | 20 | obj-$(CONFIG_X86_64) += bugs_64.o |
21 | 21 | |
22 | 22 | obj-$(CONFIG_CPU_SUP_INTEL) += intel.o |
arch/x86/kernel/cpu/cmpxchg.c
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 | |
55 | - | |
56 | -#ifndef CONFIG_X86_CMPXCHG64 | |
57 | -unsigned long long cmpxchg_486_u64(volatile void *ptr, u64 old, u64 new) | |
58 | -{ | |
59 | - u64 prev; | |
60 | - unsigned long flags; | |
61 | - | |
62 | - /* Poor man's cmpxchg8b for 386 and 486. Unsuitable for SMP */ | |
63 | - local_irq_save(flags); | |
64 | - prev = *(u64 *)ptr; | |
65 | - if (prev == old) | |
66 | - *(u64 *)ptr = new; | |
67 | - local_irq_restore(flags); | |
68 | - return prev; | |
69 | -} | |
70 | -EXPORT_SYMBOL(cmpxchg_486_u64); | |
71 | -#endif |
arch/x86/lib/Makefile
arch/x86/lib/cmpxchg.c
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 | |
55 | + | |
56 | +#ifndef CONFIG_X86_CMPXCHG64 | |
57 | +unsigned long long cmpxchg_486_u64(volatile void *ptr, u64 old, u64 new) | |
58 | +{ | |
59 | + u64 prev; | |
60 | + unsigned long flags; | |
61 | + | |
62 | + /* Poor man's cmpxchg8b for 386 and 486. Unsuitable for SMP */ | |
63 | + local_irq_save(flags); | |
64 | + prev = *(u64 *)ptr; | |
65 | + if (prev == old) | |
66 | + *(u64 *)ptr = new; | |
67 | + local_irq_restore(flags); | |
68 | + return prev; | |
69 | +} | |
70 | +EXPORT_SYMBOL(cmpxchg_486_u64); | |
71 | +#endif |