kvm/emulate: Fix SETcc emulation function offsets with SLS

The commit in Fixes started adding INT3 after RETs as a mitigation
against straight-line speculation.

The fastop SETcc implementation in kvm's insn emulator uses macro magic
to generate all possible SETcc functions and to jump to them when
emulating the respective instruction.

However, it hardcodes the size and alignment of those functions to 4: a
three-byte SETcc insn and a single-byte RET. BUT, with SLS, there's an
INT3 that gets slapped after the RET, which brings the whole scheme out
of alignment:

15: 0f 90 c0 seto %al
18: c3 ret
19: cc int3
1a: 0f 1f 00 nopl (%rax)
1d: 0f 91 c0 setno %al
20: c3 ret
21: cc int3
22: 0f 1f 00 nopl (%rax)
25: 0f 92 c0 setb %al
28: c3 ret
29: cc int3

and this explodes like this:

int3: 0000 [#1] PREEMPT SMP PTI
CPU: 0 PID: 2435 Comm: qemu-system-x86 Not tainted 5.17.0-rc8-sls #1
Hardware name: Dell Inc. Precision WorkStation T3400 /0TP412, BIOS A14 04/30/2012
RIP: 0010:setc+0x5/0x8 [kvm]
Code: 00 00 0f 1f 00 0f b6 05 43 24 06 00 c3 cc 0f 1f 80 00 00 00 00 0f 90 c0 c3 cc 0f \
1f 00 0f 91 c0 c3 cc 0f 1f 00 0f 92 c0 c3 cc <0f> 1f 00 0f 93 c0 c3 cc 0f 1f 00 \
0f 94 c0 c3 cc 0f 1f 00 0f 95 c0
Call Trace:
<TASK>
? x86_emulate_insn [kvm]
? x86_emulate_instruction [kvm]
? vmx_handle_exit [kvm_intel]
? kvm_arch_vcpu_ioctl_run [kvm]
? kvm_vcpu_ioctl [kvm]
? __x64_sys_ioctl
? do_syscall_64
? entry_SYSCALL_64_after_hwframe
</TASK>

Raise the alignment value when SLS is enabled and use a macro for that
instead of hard-coding naked numbers.

Fixes: e463a09af2f0 ("x86: Add straight-line-speculation mitigation")
Reported-by: Jamie Heilman <jamie@audible.transient.net>
Signed-off-by: Borislav Petkov <bp@suse.de>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Tested-by: Jamie Heilman <jamie@audible.transient.net>
Link: https://lore.kernel.org/r/YjGzJwjrvxg5YZ0Z@audible.transient.net
[Add a comment and a bit of safety checking, since this is going to be changed
again for IBT support. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

authored by Borislav Petkov and committed by Paolo Bonzini fe83f5ea 34e047aa

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