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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx>
---
 arch/x86/kvm/vmx/vmx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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"
-- 
2.19.2




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux