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 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
... ... @@ -30,6 +30,7 @@
30 30 lib-y += checksum_32.o
31 31 lib-y += strstr_32.o
32 32 lib-y += semaphore_32.o string_32.o
  33 + lib-y += cmpxchg.o
33 34 ifneq ($(CONFIG_X86_CMPXCHG64),y)
34 35 lib-y += cmpxchg8b_emu.o atomic64_386_32.o
35 36 endif
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