diff options
-rw-r--r-- | arch/x86/include/asm/alternative.h | 8 | ||||
-rw-r--r-- | arch/x86/kernel/alternative.c | 6 |
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 | } |