Skip to content

Commit

Permalink
percpu: Omit segment prefix in the UP case for cmpxchg_double
Browse files Browse the repository at this point in the history
Omit the segment prefix in the UP case. GS is not used then
and we will generate segfaults if cmpxchg16b is used otherwise.

Signed-off-by: Christoph Lameter <cl@linux.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Christoph Lameter authored and Linus Torvalds committed Mar 28, 2011
1 parent 76597cd commit d7c3f8c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
10 changes: 6 additions & 4 deletions arch/x86/include/asm/percpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
#include <linux/stringify.h>

#ifdef CONFIG_SMP
#define __percpu_arg(x) "%%"__stringify(__percpu_seg)":%P" #x
#define __percpu_prefix "%%"__stringify(__percpu_seg)":"
#define __my_cpu_offset percpu_read(this_cpu_off)

/*
Expand All @@ -62,9 +62,11 @@
(typeof(*(ptr)) __kernel __force *)tcp_ptr__; \
})
#else
#define __percpu_arg(x) "%P" #x
#define __percpu_prefix ""
#endif

#define __percpu_arg(x) __percpu_prefix "%P" #x

/*
* Initialized pointers to per-cpu variables needed for the boot
* processor need to use these macros to get the proper address
Expand Down Expand Up @@ -516,11 +518,11 @@ do { \
typeof(o2) __n2 = n2; \
typeof(o2) __dummy; \
alternative_io("call this_cpu_cmpxchg16b_emu\n\t" P6_NOP4, \
"cmpxchg16b %%gs:(%%rsi)\n\tsetz %0\n\t", \
"cmpxchg16b " __percpu_prefix "(%%rsi)\n\tsetz %0\n\t", \
X86_FEATURE_CX16, \
ASM_OUTPUT2("=a"(__ret), "=d"(__dummy)), \
"S" (&pcp1), "b"(__n1), "c"(__n2), \
"a"(__o1), "d"(__o2)); \
"a"(__o1), "d"(__o2) : "memory"); \
__ret; \
})

Expand Down
14 changes: 10 additions & 4 deletions arch/x86/lib/cmpxchg16b_emu.S
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@
#include <asm/frame.h>
#include <asm/dwarf2.h>

#ifdef CONFIG_SMP
#define SEG_PREFIX %gs:
#else
#define SEG_PREFIX
#endif

.text

/*
Expand Down Expand Up @@ -37,13 +43,13 @@ this_cpu_cmpxchg16b_emu:
pushf
cli

cmpq %gs:(%rsi), %rax
cmpq SEG_PREFIX(%rsi), %rax
jne not_same
cmpq %gs:8(%rsi), %rdx
cmpq SEG_PREFIX 8(%rsi), %rdx
jne not_same

movq %rbx, %gs:(%rsi)
movq %rcx, %gs:8(%rsi)
movq %rbx, SEG_PREFIX(%rsi)
movq %rcx, SEG_PREFIX 8(%rsi)

popf
mov $1, %al
Expand Down

0 comments on commit d7c3f8c

Please sign in to comment.