x86: replace LOCK_PREFIX in futex.h

The exception fixup for the futex macros __futex_atomic_op1/2 and
futex_atomic_cmpxchg_inatomic() is missing an entry when the lock
prefix is replaced by a NOP via SMP alternatives.

Chuck Ebert tracked this down from the information provided in:
https://bugzilla.redhat.com/show_bug.cgi?id=429412

A possible solution would be to add another fixup after the
LOCK_PREFIX, so both the LOCK and NOP case have their own entry in the
exception table, but it's not really worth the trouble.

Simply replace LOCK_PREFIX with lock and keep those untouched by SMP
alternatives.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Thomas Gleixner 2008-02-01 17:45:14 +01:00 committed by Ingo Molnar
parent 5df7fa1c62
commit 9d55b9923a

View File

@ -30,7 +30,7 @@
"1: movl %2, %0\n \ "1: movl %2, %0\n \
movl %0, %3\n" \ movl %0, %3\n" \
insn "\n" \ insn "\n" \
"2: " LOCK_PREFIX "cmpxchgl %3, %2\n \ "2: lock; cmpxchgl %3, %2\n \
jnz 1b\n \ jnz 1b\n \
3: .section .fixup,\"ax\"\n \ 3: .section .fixup,\"ax\"\n \
4: mov %5, %1\n \ 4: mov %5, %1\n \
@ -72,7 +72,7 @@ futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
__futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg); __futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg);
break; break;
case FUTEX_OP_ADD: case FUTEX_OP_ADD:
__futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret, oldval, __futex_atomic_op1("lock; xaddl %0, %2", ret, oldval,
uaddr, oparg); uaddr, oparg);
break; break;
case FUTEX_OP_OR: case FUTEX_OP_OR:
@ -111,8 +111,8 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
return -EFAULT; return -EFAULT;
__asm__ __volatile__( __asm__ __volatile__(
"1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
"1: lock; cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n" "2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n" "3: mov %2, %0 \n"
" jmp 2b \n" " jmp 2b \n"