aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/alternative.h8
-rw-r--r--arch/x86/kernel/alternative.c6
2 files changed, 9 insertions, 5 deletions
diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h
index 3b5b828767b6..55fee12cea6d 100644
--- a/arch/x86/include/asm/alternative.h
+++ b/arch/x86/include/asm/alternative.h
@@ -28,12 +28,14 @@
28 */ 28 */
29 29
30#ifdef CONFIG_SMP 30#ifdef CONFIG_SMP
31#define LOCK_PREFIX \ 31#define LOCK_PREFIX_HERE \
32 ".section .smp_locks,\"a\"\n" \ 32 ".section .smp_locks,\"a\"\n" \
33 _ASM_ALIGN "\n" \ 33 _ASM_ALIGN "\n" \
34 _ASM_PTR "661f\n" /* address */ \ 34 _ASM_PTR "671f\n" /* address */ \
35 ".previous\n" \ 35 ".previous\n" \
36 "661:\n\tlock; " 36 "671:"
37
38#define LOCK_PREFIX LOCK_PREFIX_HERE "\n\tlock; "
37 39
38#else /* ! CONFIG_SMP */ 40#else /* ! CONFIG_SMP */
39#define LOCK_PREFIX "" 41#define LOCK_PREFIX ""
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index 2589ea4c60ce..80b222ea4cf6 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -244,7 +244,8 @@ static void alternatives_smp_lock(u8 **start, u8 **end, u8 *text, u8 *text_end)
244 if (*ptr > text_end) 244 if (*ptr > text_end)
245 continue; 245 continue;
246 /* turn DS segment override prefix into lock prefix */ 246 /* turn DS segment override prefix into lock prefix */
247 text_poke(*ptr, ((unsigned char []){0xf0}), 1); 247 if (**ptr == 0x3e)
248 text_poke(*ptr, ((unsigned char []){0xf0}), 1);
248 }; 249 };
249 mutex_unlock(&text_mutex); 250 mutex_unlock(&text_mutex);
250} 251}
@@ -263,7 +264,8 @@ static void alternatives_smp_unlock(u8 **start, u8 **end, u8 *text, u8 *text_end
263 if (*ptr > text_end) 264 if (*ptr > text_end)
264 continue; 265 continue;
265 /* turn lock prefix into DS segment override prefix */ 266 /* turn lock prefix into DS segment override prefix */
266 text_poke(*ptr, ((unsigned char []){0x3E}), 1); 267 if (**ptr == 0xf0)
268 text_poke(*ptr, ((unsigned char []){0x3E}), 1);
267 }; 269 };
268 mutex_unlock(&text_mutex); 270 mutex_unlock(&text_mutex);
269} 271}