• Linus Torvalds's avatar
    x86/nospec: Simplify alternative_msr_write() · 1aa7a573
    Linus Torvalds authored
    The macro is not type safe and I did look for why that "g" constraint for
    the asm doesn't work: it's because the asm is more fundamentally wrong.
    
    It does
    
            movl %[val], %%eax
    
    but "val" isn't a 32-bit value, so then gcc will pass it in a register, 
    and generate code like
    
            movl %rsi, %eax
    
    and gas will complain about a nonsensical 'mov' instruction (it's moving a 
    64-bit register to a 32-bit one).
    
    Passing it through memory will just hide the real bug - gcc still thinks 
    the memory location is 64-bit, but the "movl" will only load the first 32 
    bits and it all happens to work because x86 is little-endian.
    
    Convert it to a type safe inline function with a little trick which hands
    the feature into the ALTERNATIVE macro.
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: default avatarIngo Molnar <mingo@kernel.org>
    1aa7a573
nospec-branch.h 8.46 KB