All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Christopherson <seanjc@google.com>
To: Maxim Levitsky <mlevitsk@redhat.com>
Cc: kvm@vger.kernel.org, Joerg Roedel <joro@8bytes.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Jim Mattson <jmattson@google.com>,
	"maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT)"
	<x86@kernel.org>,
	"open list:X86 ARCHITECTURE (32-BIT AND 64-BIT)" 
	<linux-kernel@vger.kernel.org>,
	Wanpeng Li <wanpengli@tencent.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Borislav Petkov <bp@alien8.de>, "H. Peter Anvin" <hpa@zytor.com>,
	Ingo Molnar <mingo@redhat.com>,
	Vitaly Kuznetsov <vkuznets@redhat.com>
Subject: Re: [PATCH v2 3/3] KVM: nSVM: call KVM_REQ_GET_NESTED_STATE_PAGES on exit from SMM mode
Date: Thu, 9 Sep 2021 00:59:45 +0000	[thread overview]
Message-ID: <YTlcgQHLmkjtvVks@google.com> (raw)
In-Reply-To: <20210823114618.1184209-4-mlevitsk@redhat.com>

On Mon, Aug 23, 2021, Maxim Levitsky wrote:
> This allows nested SVM code to be more similar to nested VMX code.
> 
> Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
> ---
>  arch/x86/kvm/svm/nested.c | 9 ++++++---
>  arch/x86/kvm/svm/svm.c    | 8 +++++++-
>  arch/x86/kvm/svm/svm.h    | 3 ++-
>  3 files changed, 15 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c
> index 5e13357da21e..678fd21f6077 100644
> --- a/arch/x86/kvm/svm/nested.c
> +++ b/arch/x86/kvm/svm/nested.c
> @@ -572,7 +572,7 @@ static void nested_svm_copy_common_state(struct vmcb *from_vmcb, struct vmcb *to
>  }
>  
>  int enter_svm_guest_mode(struct kvm_vcpu *vcpu, u64 vmcb12_gpa,
> -			 struct vmcb *vmcb12)
> +			 struct vmcb *vmcb12, bool from_entry)

from_vmrun would be a better name.  VMX uses the slightly absstract from_vmentry
because of the VMLAUNCH vs. VMRESUME silliness.  If we want to explicitly follow
VMX then from_vmentry would be more appropriate, but I don't see any reason not
to be more precise.

>  {
>  	struct vcpu_svm *svm = to_svm(vcpu);
>  	int ret;
> @@ -602,13 +602,16 @@ int enter_svm_guest_mode(struct kvm_vcpu *vcpu, u64 vmcb12_gpa,
>  	nested_vmcb02_prepare_save(svm, vmcb12);
>  
>  	ret = nested_svm_load_cr3(&svm->vcpu, vmcb12->save.cr3,
> -				  nested_npt_enabled(svm), true);
> +				  nested_npt_enabled(svm), from_entry);
>  	if (ret)
>  		return ret;
>  
>  	if (!npt_enabled)
>  		vcpu->arch.mmu->inject_page_fault = svm_inject_page_fault_nested;
>  
> +	if (!from_entry)
> +		kvm_make_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu);
> +
>  	svm_set_gif(svm, true);
>  
>  	return 0;
> @@ -674,7 +677,7 @@ int nested_svm_vmrun(struct kvm_vcpu *vcpu)
>  
>  	svm->nested.nested_run_pending = 1;
>  
> -	if (enter_svm_guest_mode(vcpu, vmcb12_gpa, vmcb12))
> +	if (enter_svm_guest_mode(vcpu, vmcb12_gpa, vmcb12, true))
>  		goto out_exit_err;
>  
>  	if (nested_svm_vmrun_msrpm(svm))
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index ea7a4dacd42f..76ee15af8c48 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -4354,6 +4354,12 @@ static int svm_leave_smm(struct kvm_vcpu *vcpu, const char *smstate)
>  			if (svm_allocate_nested(svm))
>  				return 1;
>  
> +			/* Exit from the SMM to the non root mode also uses
> +			 * the KVM_REQ_GET_NESTED_STATE_PAGES request,
> +			 * but in this case the pdptrs must be always reloaded
> +			 */
> +			vcpu->arch.pdptrs_from_userspace = false;

Hmm, I think this belongs in the previous patch.  And I would probably go so far
as to say it belongs in emulator_leave_smm(), i.e. pdptrs_from_userspace should
be cleared on RSM regardless of what mode is being resumed.

> +
>  			/*
>  			 * Restore L1 host state from L1 HSAVE area as VMCB01 was
>  			 * used during SMM (see svm_enter_smm())
> @@ -4368,7 +4374,7 @@ static int svm_leave_smm(struct kvm_vcpu *vcpu, const char *smstate)
>  
>  			vmcb12 = map.hva;
>  			nested_load_control_from_vmcb12(svm, &vmcb12->control);
> -			ret = enter_svm_guest_mode(vcpu, vmcb12_gpa, vmcb12);
> +			ret = enter_svm_guest_mode(vcpu, vmcb12_gpa, vmcb12, false);
>  
>  			kvm_vcpu_unmap(vcpu, &map, true);
>  			kvm_vcpu_unmap(vcpu, &map_save, true);
> diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h
> index 524d943f3efc..51ffa46ab257 100644
> --- a/arch/x86/kvm/svm/svm.h
> +++ b/arch/x86/kvm/svm/svm.h
> @@ -459,7 +459,8 @@ static inline bool nested_exit_on_nmi(struct vcpu_svm *svm)
>  	return vmcb_is_intercept(&svm->nested.ctl, INTERCEPT_NMI);
>  }
>  
> -int enter_svm_guest_mode(struct kvm_vcpu *vcpu, u64 vmcb_gpa, struct vmcb *vmcb12);
> +int enter_svm_guest_mode(struct kvm_vcpu *vcpu,
> +		u64 vmcb_gpa, struct vmcb *vmcb12, bool from_entry);

Alignment is funky, it can/should match the definition, e.g.

int enter_svm_guest_mode(struct kvm_vcpu *vcpu, u64 vmcb12_gpa,
			 struct vmcb *vmcb12, bool from_entry);

>  void svm_leave_nested(struct vcpu_svm *svm);
>  void svm_free_nested(struct vcpu_svm *svm);
>  int svm_allocate_nested(struct vcpu_svm *svm);
> -- 
> 2.26.3
> 

  reply	other threads:[~2021-09-09  0:59 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-23 11:46 [PATCH v2 0/3] KVM: few more SMM fixes Maxim Levitsky
2021-08-23 11:46 ` [PATCH v2 1/3] KVM: nSVM: restore the L1 host state prior to resuming a nested guest on SMM exit Maxim Levitsky
2021-09-08 22:04   ` Sean Christopherson
2021-09-12 10:33     ` Maxim Levitsky
2021-08-23 11:46 ` [PATCH v2 2/3] KVM: x86: force PDPTRs reload " Maxim Levitsky
2021-09-09  0:55   ` Sean Christopherson
2021-09-12 10:33     ` Maxim Levitsky
2021-08-23 11:46 ` [PATCH v2 3/3] KVM: nSVM: call KVM_REQ_GET_NESTED_STATE_PAGES on exit from SMM mode Maxim Levitsky
2021-09-09  0:59   ` Sean Christopherson [this message]
2021-09-12 10:35     ` Maxim Levitsky
2021-08-23 13:01 ` [PATCH v2 0/3] KVM: few more SMM fixes Maxim Levitsky

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YTlcgQHLmkjtvVks@google.com \
    --to=seanjc@google.com \
    --cc=bp@alien8.de \
    --cc=hpa@zytor.com \
    --cc=jmattson@google.com \
    --cc=joro@8bytes.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=mlevitsk@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=vkuznets@redhat.com \
    --cc=wanpengli@tencent.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.