Commit 90c8f92f5c807807ca74d5f2f313794925174e6b

Authored by H. Peter Anvin
1 parent 4532b305e8

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 Inline Diff

arch/x86/kernel/cpu/Makefile
1 # 1 #
2 # Makefile for x86-compatible CPU details, features and quirks 2 # Makefile for x86-compatible CPU details, features and quirks
3 # 3 #
4 4
5 # Don't trace early stages of a secondary CPU boot 5 # Don't trace early stages of a secondary CPU boot
6 ifdef CONFIG_FUNCTION_TRACER 6 ifdef CONFIG_FUNCTION_TRACER
7 CFLAGS_REMOVE_common.o = -pg 7 CFLAGS_REMOVE_common.o = -pg
8 CFLAGS_REMOVE_perf_event.o = -pg 8 CFLAGS_REMOVE_perf_event.o = -pg
9 endif 9 endif
10 10
11 # Make sure load_percpu_segment has no stackprotector 11 # Make sure load_percpu_segment has no stackprotector
12 nostackp := $(call cc-option, -fno-stack-protector) 12 nostackp := $(call cc-option, -fno-stack-protector)
13 CFLAGS_common.o := $(nostackp) 13 CFLAGS_common.o := $(nostackp)
14 14
15 obj-y := intel_cacheinfo.o addon_cpuid_features.o 15 obj-y := intel_cacheinfo.o addon_cpuid_features.o
16 obj-y += proc.o capflags.o powerflags.o common.o 16 obj-y += proc.o capflags.o powerflags.o common.o
17 obj-y += vmware.o hypervisor.o sched.o mshyperv.o 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 obj-$(CONFIG_X86_64) += bugs_64.o 20 obj-$(CONFIG_X86_64) += bugs_64.o
21 21
22 obj-$(CONFIG_CPU_SUP_INTEL) += intel.o 22 obj-$(CONFIG_CPU_SUP_INTEL) += intel.o
23 obj-$(CONFIG_CPU_SUP_AMD) += amd.o 23 obj-$(CONFIG_CPU_SUP_AMD) += amd.o
24 obj-$(CONFIG_CPU_SUP_CYRIX_32) += cyrix.o 24 obj-$(CONFIG_CPU_SUP_CYRIX_32) += cyrix.o
25 obj-$(CONFIG_CPU_SUP_CENTAUR) += centaur.o 25 obj-$(CONFIG_CPU_SUP_CENTAUR) += centaur.o
26 obj-$(CONFIG_CPU_SUP_TRANSMETA_32) += transmeta.o 26 obj-$(CONFIG_CPU_SUP_TRANSMETA_32) += transmeta.o
27 obj-$(CONFIG_CPU_SUP_UMC_32) += umc.o 27 obj-$(CONFIG_CPU_SUP_UMC_32) += umc.o
28 28
29 obj-$(CONFIG_PERF_EVENTS) += perf_event.o 29 obj-$(CONFIG_PERF_EVENTS) += perf_event.o
30 30
31 obj-$(CONFIG_X86_MCE) += mcheck/ 31 obj-$(CONFIG_X86_MCE) += mcheck/
32 obj-$(CONFIG_MTRR) += mtrr/ 32 obj-$(CONFIG_MTRR) += mtrr/
33 obj-$(CONFIG_CPU_FREQ) += cpufreq/ 33 obj-$(CONFIG_CPU_FREQ) += cpufreq/
34 34
35 obj-$(CONFIG_X86_LOCAL_APIC) += perfctr-watchdog.o 35 obj-$(CONFIG_X86_LOCAL_APIC) += perfctr-watchdog.o
36 36
37 quiet_cmd_mkcapflags = MKCAP $@ 37 quiet_cmd_mkcapflags = MKCAP $@
38 cmd_mkcapflags = $(PERL) $(srctree)/$(src)/mkcapflags.pl $< $@ 38 cmd_mkcapflags = $(PERL) $(srctree)/$(src)/mkcapflags.pl $< $@
39 39
40 cpufeature = $(src)/../../include/asm/cpufeature.h 40 cpufeature = $(src)/../../include/asm/cpufeature.h
41 41
42 targets += capflags.c 42 targets += capflags.c
43 $(obj)/capflags.c: $(cpufeature) $(src)/mkcapflags.pl FORCE 43 $(obj)/capflags.c: $(cpufeature) $(src)/mkcapflags.pl FORCE
44 $(call if_changed,mkcapflags) 44 $(call if_changed,mkcapflags)
45 45
arch/x86/kernel/cpu/cmpxchg.c
1 /* File was deleted
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
72 1 /*
73 2 * cmpxchg*() fallbacks for CPU not supporting these instructions
arch/x86/lib/Makefile
1 # 1 #
2 # Makefile for x86 specific library files. 2 # Makefile for x86 specific library files.
3 # 3 #
4 4
5 inat_tables_script = $(srctree)/arch/x86/tools/gen-insn-attr-x86.awk 5 inat_tables_script = $(srctree)/arch/x86/tools/gen-insn-attr-x86.awk
6 inat_tables_maps = $(srctree)/arch/x86/lib/x86-opcode-map.txt 6 inat_tables_maps = $(srctree)/arch/x86/lib/x86-opcode-map.txt
7 quiet_cmd_inat_tables = GEN $@ 7 quiet_cmd_inat_tables = GEN $@
8 cmd_inat_tables = $(AWK) -f $(inat_tables_script) $(inat_tables_maps) > $@ || rm -f $@ 8 cmd_inat_tables = $(AWK) -f $(inat_tables_script) $(inat_tables_maps) > $@ || rm -f $@
9 9
10 $(obj)/inat-tables.c: $(inat_tables_script) $(inat_tables_maps) 10 $(obj)/inat-tables.c: $(inat_tables_script) $(inat_tables_maps)
11 $(call cmd,inat_tables) 11 $(call cmd,inat_tables)
12 12
13 $(obj)/inat.o: $(obj)/inat-tables.c 13 $(obj)/inat.o: $(obj)/inat-tables.c
14 14
15 clean-files := inat-tables.c 15 clean-files := inat-tables.c
16 16
17 obj-$(CONFIG_SMP) += msr-smp.o cache-smp.o 17 obj-$(CONFIG_SMP) += msr-smp.o cache-smp.o
18 18
19 lib-y := delay.o 19 lib-y := delay.o
20 lib-y += thunk_$(BITS).o 20 lib-y += thunk_$(BITS).o
21 lib-y += usercopy_$(BITS).o getuser.o putuser.o 21 lib-y += usercopy_$(BITS).o getuser.o putuser.o
22 lib-y += memcpy_$(BITS).o 22 lib-y += memcpy_$(BITS).o
23 lib-$(CONFIG_INSTRUCTION_DECODER) += insn.o inat.o 23 lib-$(CONFIG_INSTRUCTION_DECODER) += insn.o inat.o
24 24
25 obj-y += msr.o msr-reg.o msr-reg-export.o 25 obj-y += msr.o msr-reg.o msr-reg-export.o
26 26
27 ifeq ($(CONFIG_X86_32),y) 27 ifeq ($(CONFIG_X86_32),y)
28 obj-y += atomic64_32.o 28 obj-y += atomic64_32.o
29 lib-y += atomic64_cx8_32.o 29 lib-y += atomic64_cx8_32.o
30 lib-y += checksum_32.o 30 lib-y += checksum_32.o
31 lib-y += strstr_32.o 31 lib-y += strstr_32.o
32 lib-y += semaphore_32.o string_32.o 32 lib-y += semaphore_32.o string_32.o
33 lib-y += cmpxchg.o
33 ifneq ($(CONFIG_X86_CMPXCHG64),y) 34 ifneq ($(CONFIG_X86_CMPXCHG64),y)
34 lib-y += cmpxchg8b_emu.o atomic64_386_32.o 35 lib-y += cmpxchg8b_emu.o atomic64_386_32.o
35 endif 36 endif
36 lib-$(CONFIG_X86_USE_3DNOW) += mmx_32.o 37 lib-$(CONFIG_X86_USE_3DNOW) += mmx_32.o
37 else 38 else
38 obj-y += iomap_copy_64.o 39 obj-y += iomap_copy_64.o
39 lib-y += csum-partial_64.o csum-copy_64.o csum-wrappers_64.o 40 lib-y += csum-partial_64.o csum-copy_64.o csum-wrappers_64.o
40 lib-y += thunk_64.o clear_page_64.o copy_page_64.o 41 lib-y += thunk_64.o clear_page_64.o copy_page_64.o
41 lib-y += memmove_64.o memset_64.o 42 lib-y += memmove_64.o memset_64.o
42 lib-y += copy_user_64.o rwlock_64.o copy_user_nocache_64.o 43 lib-y += copy_user_64.o rwlock_64.o copy_user_nocache_64.o
43 lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem_64.o 44 lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem_64.o
44 endif 45 endif
45 46
arch/x86/lib/cmpxchg.c
File was created 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
72
73