|
@@ -509,6 +509,11 @@ do { \
|
|
|
* it in software. The address used in the cmpxchg16 instruction must be
|
|
|
* aligned to a 16 byte boundary.
|
|
|
*/
|
|
|
+#ifdef CONFIG_SMP
|
|
|
+#define CMPXCHG16B_EMU_CALL "call this_cpu_cmpxchg16b_emu\n\t" P6_NOP3
|
|
|
+#else
|
|
|
+#define CMPXCHG16B_EMU_CALL "call this_cpu_cmpxchg16b_emu\n\t" P6_NOP2
|
|
|
+#endif
|
|
|
#define percpu_cmpxchg16b_double(pcp1, o1, o2, n1, n2) \
|
|
|
({ \
|
|
|
char __ret; \
|
|
@@ -517,7 +522,7 @@ do { \
|
|
|
typeof(o2) __o2 = o2; \
|
|
|
typeof(o2) __n2 = n2; \
|
|
|
typeof(o2) __dummy; \
|
|
|
- alternative_io("call this_cpu_cmpxchg16b_emu\n\t" P6_NOP4, \
|
|
|
+ alternative_io(CMPXCHG16B_EMU_CALL, \
|
|
|
"cmpxchg16b " __percpu_prefix "(%%rsi)\n\tsetz %0\n\t", \
|
|
|
X86_FEATURE_CX16, \
|
|
|
ASM_OUTPUT2("=a"(__ret), "=d"(__dummy)), \
|