aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBorislav Petkov <bp@suse.de>2015-04-04 17:07:42 -0400
committerIngo Molnar <mingo@kernel.org>2015-04-06 03:24:09 -0400
commit69df353ff305805fc16082d0c5bfa6e20fa8b863 (patch)
tree2d6377b1a094d38e0993ba94c0b9a72d3ff716b5
parentfc3e958a2b552fe6210e6de3bebb4348156a0b5f (diff)
x86/alternatives: Guard NOPs optimization
Take a look at the first instruction byte before optimizing the NOP - there might be something else there already, like the ALTERNATIVE_2() in rdtsc_barrier() which NOPs out on AMD even though we just patched in an MFENCE. This happens because the alternatives sees X86_FEATURE_MFENCE_RDTSC, AMD CPUs set it, we patch in the MFENCE and right afterwards it sees X86_FEATURE_LFENCE_RDTSC which AMD CPUs don't set and we blindly optimize the NOP. Checking whether at least the first byte is 0x90 prevents that. Signed-off-by: Borislav Petkov <bp@suse.de> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1428181662-18020-1-git-send-email-bp@alien8.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/x86/kernel/alternative.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index 7c4ad005d7a0..aef653193160 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -325,6 +325,9 @@ done:
325 325
326static void __init_or_module optimize_nops(struct alt_instr *a, u8 *instr) 326static void __init_or_module optimize_nops(struct alt_instr *a, u8 *instr)
327{ 327{
328 if (instr[0] != 0x90)
329 return;
330
328 add_nops(instr + (a->instrlen - a->padlen), a->padlen); 331 add_nops(instr + (a->instrlen - a->padlen), a->padlen);
329 332
330 DUMP_BYTES(instr, a->instrlen, "%p: [%d:%d) optimized NOPs: ", 333 DUMP_BYTES(instr, a->instrlen, "%p: [%d:%d) optimized NOPs: ",