Merge tag 'for-linus-5.17' of git://git.kernel.org/pub/scm/virt/kvm/kvm

Pull kvm fix from Paolo Bonzini:
"Fix for the SLS mitigation, which makes a 'SETcc/RET' pair grow
to 'SETcc/RET/INT3'.

This doesn't fit in 4 bytes any more, so the alignment has to
change to 8 for this case"

* tag 'for-linus-5.17' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
kvm/emulate: Fix SETcc emulation function offsets with SLS

Changed files
+17 -2
arch
x86
kvm
+17 -2
arch/x86/kvm/emulate.c
··· 429 429 FOP_END 430 430 431 431 /* Special case for SETcc - 1 instruction per cc */ 432 + 433 + /* 434 + * Depending on .config the SETcc functions look like: 435 + * 436 + * SETcc %al [3 bytes] 437 + * RET [1 byte] 438 + * INT3 [1 byte; CONFIG_SLS] 439 + * 440 + * Which gives possible sizes 4 or 5. When rounded up to the 441 + * next power-of-two alignment they become 4 or 8. 442 + */ 443 + #define SETCC_LENGTH (4 + IS_ENABLED(CONFIG_SLS)) 444 + #define SETCC_ALIGN (4 << IS_ENABLED(CONFIG_SLS)) 445 + static_assert(SETCC_LENGTH <= SETCC_ALIGN); 446 + 432 447 #define FOP_SETCC(op) \ 433 - ".align 4 \n\t" \ 448 + ".align " __stringify(SETCC_ALIGN) " \n\t" \ 434 449 ".type " #op ", @function \n\t" \ 435 450 #op ": \n\t" \ 436 451 #op " %al \n\t" \ ··· 1062 1047 static __always_inline u8 test_cc(unsigned int condition, unsigned long flags) 1063 1048 { 1064 1049 u8 rc; 1065 - void (*fop)(void) = (void *)em_setcc + 4 * (condition & 0xf); 1050 + void (*fop)(void) = (void *)em_setcc + SETCC_ALIGN * (condition & 0xf); 1066 1051 1067 1052 flags = (flags & EFLAGS_MASK) | X86_EFLAGS_IF; 1068 1053 asm("push %[flags]; popf; " CALL_NOSPEC