• Peter Zijlstra's avatar
    x86/alternative: Rewrite optimize_nops() some · 6c480f22
    Peter Zijlstra authored
    Address two issues:
    
     - it no longer hard requires single byte NOP runs - now it accepts any
       NOP and NOPL encoded instruction (but not the more complicated 32bit
       NOPs).
    
     - it writes a single 'instruction' replacement.
    
    Specifically, ORC unwinder relies on the tail NOP of an alternative to
    be a single instruction. In particular, it relies on the inner bytes not
    being executed.
    
    Once the max supported NOP length has been reached (currently 8, could easily
    be extended to 11 on x86_64), switch to JMP.d8 and INT3 padding to
    achieve the same result.
    
    Objtool uses this guarantee in the analysis of alternative/overlapping
    CFI state for the ORC unwinder data. Every instruction edge gets a CFI
    state and the more instructions the larger the chance of conflicts.
    
      [ bp:
      - Add a comment over add_nop() to explain why it does it this way
      - Make add_nops() PARAVIRT only as it is used solely there now ]
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
    Link: https://lore.kernel.org/r/20230208171431.373412974@infradead.org
    6c480f22
alternative.c 55.2 KB