Re: [PATCH 03/29] 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]

 



On Fri, Jan 18, 2019 at 01:20:11PM -0800, Sean Christopherson wrote:
> In the vCPU-run asm blob, the guest's RCX is temporarily saved onto the
> stack after VM-Exit as the exit flow must first load a register with a
> pointer to the vCPU's save area in order to save the guest's registers.
> RCX is arbitrarily designated as the scratch register.
> 
> 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's value or guest's value, at some point the code
> needs to access the stack using a non-traditional method, e.g. MOV
> instead of POP.  vCPU-run opts to create a placeholder on the stack for
> guest's RCX (by adjusting RSP) and saves RCX to its place immediately
> after VM-Exit (via MOV).
> 
> In other words, the purpose of the first 'PUSH RCX' at the start of
> the vCPU-run asm 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>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>

Thank you!
> ---
>  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 23e5fa58751a..adf59fd23a6c 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -6377,7 +6377,7 @@ static void __vmx_vcpu_run(struct kvm_vcpu *vcpu, struct vcpu_vmx *vmx)
>  	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.20.1
> 



[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