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 | } |
