[04/11] KVM: VMX: Modify only RSP when creating a placeholder for guest's RCX
diff mbox series

Message ID 20181220203026.22998-1-sean.j.christopherson@intel.com
State New
Headers show
Series
  • KVM: VMX: Clean up VM-Enter/VM-Exit asm code
Related show

Commit Message

Sean Christopherson Dec. 20, 2018, 8:30 p.m. UTC
In vmx_vcpu_run(), the guest's RCX is temporarily saved onto the stack
after VMX as the host's RCX need to be reloaded before guest registers
can be saved to struct vcpu_vmx (host RCX points at said struct).

Since the stack usage is to (1)save host, (2)save guest, (3)load host
and (4)load guest, the code can't conform to the stack's natural FIFO
semantics, i.e. it can't simply do PUSH/POP.  Regardless of whether it
is done for the host RCX or guest RCX, at some point the code needs to
manually adjust RSP and save/load to/from the stack using e.g. MOV.
vmx_vcpu_run() opts to create a placeholder on the stack for guest's
RCX (adjust RSP) and save RCX to its place immediately after VM-Exit.

In other words, the purpose of the first 'PUSH RCX' at the start of
vmx_vcpu_run()'s assembly blob is to adjust RSP down, i.e. there's no
need to actually access memory.  Use 'SUB $wordsize, RSP' instead of
'PUSH RCX' to make it more obvious that the intent is simply to create
a gap on the stack for the guest's RCX.

Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
---
 arch/x86/kvm/vmx/vmx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Patch
diff mbox series

diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index bd7f45fafab6..5d07d385b637 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -6124,7 +6124,7 @@  static void vmx_vcpu_run(struct kvm_vcpu *vcpu)
 	asm(
 		/* Store host registers */
 		"push %%" _ASM_DX "; push %%" _ASM_BP ";"
-		"push %%" _ASM_CX " \n\t" /* placeholder for guest rcx */
+		"sub $%c[wordsize], %%" _ASM_SP "\n\t" /* placeholder for guest rcx */
 		"push %%" _ASM_CX " \n\t"
 		"sub $%c[wordsize], %%" _ASM_SP "\n\t" /* temporarily adjust RSP for CALL */
 		"cmp %%" _ASM_SP ", %c[host_rsp](%%" _ASM_CX ") \n\t"