diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2008-02-01 11:45:14 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-02-01 11:45:14 -0500 |
commit | 9d55b9923a1b7ea8193b8875c57ec940dc2ff027 (patch) | |
tree | c80e51cc63c1e2316d4419b8644ff8359b8586f6 | |
parent | 5df7fa1c62146a0933767d040d400013310dbcc7 (diff) |
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>
-rw-r--r-- | include/asm-x86/futex.h | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/include/asm-x86/futex.h b/include/asm-x86/futex.h index 62828d63f1b1..9d919264923a 100644 --- a/include/asm-x86/futex.h +++ b/include/asm-x86/futex.h | |||
@@ -30,7 +30,7 @@ | |||
30 | "1: movl %2, %0\n \ | 30 | "1: movl %2, %0\n \ |
31 | movl %0, %3\n" \ | 31 | movl %0, %3\n" \ |
32 | insn "\n" \ | 32 | insn "\n" \ |
33 | "2: " LOCK_PREFIX "cmpxchgl %3, %2\n \ | 33 | "2: lock; cmpxchgl %3, %2\n \ |
34 | jnz 1b\n \ | 34 | jnz 1b\n \ |
35 | 3: .section .fixup,\"ax\"\n \ | 35 | 3: .section .fixup,\"ax\"\n \ |
36 | 4: mov %5, %1\n \ | 36 | 4: mov %5, %1\n \ |
@@ -72,7 +72,7 @@ futex_atomic_op_inuser(int encoded_op, int __user *uaddr) | |||
72 | __futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg); | 72 | __futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg); |
73 | break; | 73 | break; |
74 | case FUTEX_OP_ADD: | 74 | case FUTEX_OP_ADD: |
75 | __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret, oldval, | 75 | __futex_atomic_op1("lock; xaddl %0, %2", ret, oldval, |
76 | uaddr, oparg); | 76 | uaddr, oparg); |
77 | break; | 77 | break; |
78 | case FUTEX_OP_OR: | 78 | case FUTEX_OP_OR: |
@@ -111,8 +111,8 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | |||
111 | return -EFAULT; | 111 | return -EFAULT; |
112 | 112 | ||
113 | __asm__ __volatile__( | 113 | __asm__ __volatile__( |
114 | "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n" | ||
115 | 114 | ||
115 | "1: lock; cmpxchgl %3, %1 \n" | ||
116 | "2: .section .fixup, \"ax\" \n" | 116 | "2: .section .fixup, \"ax\" \n" |
117 | "3: mov %2, %0 \n" | 117 | "3: mov %2, %0 \n" |
118 | " jmp 2b \n" | 118 | " jmp 2b \n" |