Skip to content

Commit 844afc1

Browse files
committed
KVM: VMX: Use on-stack copy of @flags in __vmx_vcpu_run()
When testing for VMLAUNCH vs. VMRESUME, use the copy of @flags from the stack instead of first moving it to EBX, and then propagating VMX_RUN_VMRESUME to RFLAGS.CF (because RBX is clobbered with the guest value prior to the conditional branch to VMLAUNCH). Stashing information in RFLAGS is gross, especially with the writer and reader being bifurcated by yet more gnarly assembly code. Opportunistically drop the SHIFT macros as they existed purely to allow the VM-Enter flow to use Bit Test. Suggested-by: Borislav Petkov <bp@alien8.de> Acked-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Brendan Jackman <jackmanb@google.com> Link: https://patch.msgid.link/20251113233746.1703361-2-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent 11d9846 commit 844afc1

File tree

2 files changed

+7
-16
lines changed

2 files changed

+7
-16
lines changed

arch/x86/kvm/vmx/run_flags.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,8 @@
22
#ifndef __KVM_X86_VMX_RUN_FLAGS_H
33
#define __KVM_X86_VMX_RUN_FLAGS_H
44

5-
#define VMX_RUN_VMRESUME_SHIFT 0
6-
#define VMX_RUN_SAVE_SPEC_CTRL_SHIFT 1
7-
#define VMX_RUN_CLEAR_CPU_BUFFERS_FOR_MMIO_SHIFT 2
8-
9-
#define VMX_RUN_VMRESUME BIT(VMX_RUN_VMRESUME_SHIFT)
10-
#define VMX_RUN_SAVE_SPEC_CTRL BIT(VMX_RUN_SAVE_SPEC_CTRL_SHIFT)
11-
#define VMX_RUN_CLEAR_CPU_BUFFERS_FOR_MMIO BIT(VMX_RUN_CLEAR_CPU_BUFFERS_FOR_MMIO_SHIFT)
5+
#define VMX_RUN_VMRESUME BIT(0)
6+
#define VMX_RUN_SAVE_SPEC_CTRL BIT(1)
7+
#define VMX_RUN_CLEAR_CPU_BUFFERS_FOR_MMIO BIT(2)
128

139
#endif /* __KVM_X86_VMX_RUN_FLAGS_H */

arch/x86/kvm/vmx/vmenter.S

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ SYM_FUNC_START(__vmx_vcpu_run)
9292
/* Save @vmx for SPEC_CTRL handling */
9393
push %_ASM_ARG1
9494

95-
/* Save @flags for SPEC_CTRL handling */
95+
/* Save @flags (used for VMLAUNCH vs. VMRESUME and mitigations). */
9696
push %_ASM_ARG3
9797

9898
/*
@@ -101,9 +101,6 @@ SYM_FUNC_START(__vmx_vcpu_run)
101101
*/
102102
push %_ASM_ARG2
103103

104-
/* Copy @flags to EBX, _ASM_ARG3 is volatile. */
105-
mov %_ASM_ARG3L, %ebx
106-
107104
lea (%_ASM_SP), %_ASM_ARG2
108105
call vmx_update_host_rsp
109106

@@ -137,9 +134,6 @@ SYM_FUNC_START(__vmx_vcpu_run)
137134
/* Load @regs to RAX. */
138135
mov (%_ASM_SP), %_ASM_AX
139136

140-
/* Check if vmlaunch or vmresume is needed */
141-
bt $VMX_RUN_VMRESUME_SHIFT, %ebx
142-
143137
/* Load guest registers. Don't clobber flags. */
144138
mov VCPU_RCX(%_ASM_AX), %_ASM_CX
145139
mov VCPU_RDX(%_ASM_AX), %_ASM_DX
@@ -163,8 +157,9 @@ SYM_FUNC_START(__vmx_vcpu_run)
163157
/* Clobbers EFLAGS.ZF */
164158
CLEAR_CPU_BUFFERS
165159

166-
/* Check EFLAGS.CF from the VMX_RUN_VMRESUME bit test above. */
167-
jnc .Lvmlaunch
160+
/* Check @flags to see if VMLAUNCH or VMRESUME is needed. */
161+
testl $VMX_RUN_VMRESUME, WORD_SIZE(%_ASM_SP)
162+
jz .Lvmlaunch
168163

169164
/*
170165
* After a successful VMRESUME/VMLAUNCH, control flow "magically"

0 commit comments

Comments
 (0)