• Borislav Petkov (AMD)'s avatar
    x86/alternatives: Use the correct length when optimizing NOPs · 9dba9c67
    Borislav Petkov (AMD) authored
    Commit in Fixes moved the optimize_nops() call inside apply_relocation()
    and made it a second optimization pass after the relocations have been
    done.
    
    Since optimize_nops() works only on NOPs, that is fine and it'll simply
    jump over instructions which are not NOPs.
    
    However, it made that call with repl_len as the buffer length to
    optimize.
    
    However, it can happen that there are alternatives calls like this one:
    
      alternative("mfence; lfence", "", ALT_NOT(X86_FEATURE_APIC_MSRS_FENCE));
    
    where the replacement length is 0. And using repl_len is wrong because
    apply_alternatives() expands the buffer size to the length of the source
    insn that is being patched, by padding it with one-byte NOPs:
    
    	for (; insn_buff_sz < a->instrlen; insn_buff_sz++)
    		insn_buff[insn_buff_sz] = 0x90;
    
    Long story short: pass the length of the original instruction(s) as the
    length of the temporary buffer which to optimize.
    
    Result:
    
      SMP alternatives: feat: 11*32+27, old: (lapic_next_deadline+0x9/0x50 (ffffffff81061829) len: 6), repl: (ffffffff89b1cc60, len: 0) flags: 0x1
      SMP alternatives: ffffffff81061829:   old_insn: 0f ae f0 0f ae e8
      SMP alternatives: ffffffff81061829: final_insn: 90 90 90 90 90 90
    
    =>
    
      SMP alternatives: feat: 11*32+27, old: (lapic_next_deadline+0x9/0x50 (ffffffff81061839) len: 6), repl: (ffffffff89b1cc60, len: 0) flags: 0x1
      SMP alternatives: ffffffff81061839: [0:6) optimized NOPs: 66 0f 1f 44 00 00
      SMP alternatives: ffffffff81061839:   old_insn: 0f ae f0 0f ae e8
      SMP alternatives: ffffffff81061839: final_insn: 66 0f 1f 44 00 00
    
    Fixes: da8f9cf7 ("x86/alternatives: Get rid of __optimize_nops()")
    Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Link: https://lore.kernel.org/r/20240515104804.32004-1-bp@kernel.org
    9dba9c67
alternative.c 59.6 KB