All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: Sean Christopherson <seanjc@google.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	Wanpeng Li <wanpengli@tencent.com>,
	Jim Mattson <jmattson@google.com>, Joerg Roedel <joro@8bytes.org>,
	kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	Reiji Watanabe <reijiw@google.com>
Subject: Re: [PATCH v2 10/10] KVM: x86: WARN on non-zero CRs at RESET to detect improper initalization
Date: Tue, 21 Sep 2021 15:59:14 +0200	[thread overview]
Message-ID: <8735py9gi5.fsf@vitty.brq.redhat.com> (raw)
In-Reply-To: <20210921000303.400537-11-seanjc@google.com>

Sean Christopherson <seanjc@google.com> writes:

> WARN if CR0, CR3, or CR4 are non-zero at RESET, which given the current
> KVM implementation, really means WARN if they're not zeroed at vCPU
> creation.  VMX in particular has several ->set_*() flows that read other
> registers to handle side effects, and because those flows are common to
> RESET and INIT, KVM subtly relies on emulated/virtualized registers to be
> zeroed at vCPU creation in order to do the right thing at RESET.
>
> Use CRs as a sentinel because they are most likely to be written as side
> effects, and because KVM specifically needs CR0.PG and CR0.PE to be '0'
> to correctly reflect the state of the vCPU's MMU.  CRs are also loaded
> and stored from/to the VMCS, and so adds some level of coverage to verify
> that KVM doesn't conflate zero-allocating the VMCS with properly
> initializing the VMCS with VMWRITEs.
>
> Note, '0' is somewhat arbitrary, vCPU creation can technically stuff any
> value for a register so long as it's coherent with respect to the current
> vCPU state.  In practice, '0' works for all registers and is convenient.
>
> Suggested-by: Vitaly Kuznetsov <vkuznets@redhat.com>
> Signed-off-by: Sean Christopherson <seanjc@google.com>
> ---
>  arch/x86/kvm/x86.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index ec61b90d9b73..4e25baac3977 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -10800,6 +10800,16 @@ void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
>  	unsigned long new_cr0;
>  	u32 eax, dummy;
>  
> +	/*
> +	 * Several of the "set" flows, e.g. ->set_cr0(), read other registers
> +	 * to handle side effects.  RESET emulation hits those flows and relies
> +	 * on emulated/virtualized registers, including those that are loaded
> +	 * into hardware, to be zeroed at vCPU creation.  Use CRs as a sentinel
> +	 * to detect improper or missing initialization.
> +	 */
> +	WARN_ON_ONCE(!init_event &&
> +		     (old_cr0 || kvm_read_cr3(vcpu) || kvm_read_cr4(vcpu)));
> +
>  	kvm_lapic_reset(vcpu, init_event);
>  
>  	vcpu->arch.hflags = 0;

Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>

-- 
Vitaly


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

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-21  0:02 [PATCH v2 00/10] KVM: x86: Clean up RESET "emulation" Sean Christopherson
2021-09-21  0:02 ` [PATCH v2 01/10] KVM: x86: Mark all registers as avail/dirty at vCPU creation Sean Christopherson
2021-09-21 13:40   ` Vitaly Kuznetsov
2021-09-21  0:02 ` [PATCH v2 02/10] KVM: x86: Clear KVM's cached guest CR3 at RESET/INIT Sean Christopherson
2021-09-21 13:52   ` Vitaly Kuznetsov
2021-09-21 13:55     ` Vitaly Kuznetsov
2021-09-21 17:35   ` Paolo Bonzini
2021-09-21  0:02 ` [PATCH v2 03/10] KVM: x86: Do not mark all registers as avail/dirty during RESET/INIT Sean Christopherson
2021-09-21  0:02 ` [PATCH v2 04/10] KVM: x86: Remove defunct setting of CR0.ET for guests during vCPU create Sean Christopherson
2021-09-21 14:23   ` Vitaly Kuznetsov
2021-09-21  0:02 ` [PATCH v2 05/10] KVM: x86: Remove defunct setting of XCR0 for guest " Sean Christopherson
2021-09-21 14:37   ` Vitaly Kuznetsov
2021-09-21  0:02 ` [PATCH v2 06/10] KVM: x86: Fold fx_init() into kvm_arch_vcpu_create() Sean Christopherson
2021-09-21 14:52   ` Vitaly Kuznetsov
2021-10-06 23:04     ` Sean Christopherson
2021-09-21  0:03 ` [PATCH v2 07/10] KVM: VMX: Drop explicit zeroing of MSR guest values at vCPU creation Sean Christopherson
2021-09-21 15:02   ` Vitaly Kuznetsov
2021-09-21  0:03 ` [PATCH v2 08/10] KVM: VMX: Move RESET emulation to vmx_vcpu_reset() Sean Christopherson
2021-09-21  0:03 ` [PATCH v2 09/10] KVM: SVM: Move RESET emulation to svm_vcpu_reset() Sean Christopherson
2021-09-21  0:03 ` [PATCH v2 10/10] KVM: x86: WARN on non-zero CRs at RESET to detect improper initalization Sean Christopherson
2021-09-21 13:59   ` Vitaly Kuznetsov [this message]
2021-09-23 16:23 ` [PATCH v2 00/10] KVM: x86: Clean up RESET "emulation" Paolo Bonzini

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=8735py9gi5.fsf@vitty.brq.redhat.com \
    --to=vkuznets@redhat.com \
    --cc=jmattson@google.com \
    --cc=joro@8bytes.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=reijiw@google.com \
    --cc=seanjc@google.com \
    --cc=wanpengli@tencent.com \
    /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.