From: Paolo Bonzini <pbonzini@redhat.com>
To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Cc: seanjc@google.com
Subject: [PATCH 12/23] KVM: SVM: merge update_cr0_intercept into svm_set_cr0
Date: Tue, 2 Mar 2021 14:33:32 -0500 [thread overview]
Message-ID: <20210302193343.313318-13-pbonzini@redhat.com> (raw)
In-Reply-To: <20210302193343.313318-1-pbonzini@redhat.com>
The logic of update_cr0_intercept is pointlessly complicated.
All svm_set_cr0 is compute the effective cr0 and compare it with
the guest value.
Inlining the function and simplifying the condition
clarifies what it is doing.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
arch/x86/kvm/svm/svm.c | 54 +++++++++++++++++-------------------------
1 file changed, 22 insertions(+), 32 deletions(-)
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index e7fcd92551e5..968d1a1f2927 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -1718,37 +1718,10 @@ static void svm_set_gdt(struct kvm_vcpu *vcpu, struct desc_ptr *dt)
vmcb_mark_dirty(svm->vmcb, VMCB_DT);
}
-static void update_cr0_intercept(struct vcpu_svm *svm)
-{
- ulong gcr0;
- u64 *hcr0;
-
- /*
- * SEV-ES guests must always keep the CR intercepts cleared. CR
- * tracking is done using the CR write traps.
- */
- if (sev_es_guest(svm->vcpu.kvm))
- return;
-
- gcr0 = svm->vcpu.arch.cr0;
- hcr0 = &svm->vmcb->save.cr0;
- *hcr0 = (*hcr0 & ~SVM_CR0_SELECTIVE_MASK)
- | (gcr0 & SVM_CR0_SELECTIVE_MASK);
-
- vmcb_mark_dirty(svm->vmcb, VMCB_CR);
-
- if (gcr0 == *hcr0) {
- svm_clr_intercept(svm, INTERCEPT_CR0_READ);
- svm_clr_intercept(svm, INTERCEPT_CR0_WRITE);
- } else {
- svm_set_intercept(svm, INTERCEPT_CR0_READ);
- svm_set_intercept(svm, INTERCEPT_CR0_WRITE);
- }
-}
-
void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
{
struct vcpu_svm *svm = to_svm(vcpu);
+ u64 hcr0 = cr0;
#ifdef CONFIG_X86_64
if (vcpu->arch.efer & EFER_LME && !vcpu->arch.guest_state_protected) {
@@ -1766,7 +1739,7 @@ void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
vcpu->arch.cr0 = cr0;
if (!npt_enabled)
- cr0 |= X86_CR0_PG | X86_CR0_WP;
+ hcr0 |= X86_CR0_PG | X86_CR0_WP;
/*
* re-enable caching here because the QEMU bios
@@ -1774,10 +1747,27 @@ void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
* reboot
*/
if (kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_CD_NW_CLEARED))
- cr0 &= ~(X86_CR0_CD | X86_CR0_NW);
- svm->vmcb->save.cr0 = cr0;
+ hcr0 &= ~(X86_CR0_CD | X86_CR0_NW);
+
+ svm->vmcb->save.cr0 = hcr0;
vmcb_mark_dirty(svm->vmcb, VMCB_CR);
- update_cr0_intercept(svm);
+
+ /*
+ * SEV-ES guests must always keep the CR intercepts cleared. CR
+ * tracking is done using the CR write traps.
+ */
+ if (sev_es_guest(svm->vcpu.kvm))
+ return;
+
+ if (hcr0 == cr0) {
+ /* Selective CR0 write remains on. */
+ svm_clr_intercept(svm, INTERCEPT_CR0_READ);
+ svm_clr_intercept(svm, INTERCEPT_CR0_WRITE);
+ } else {
+ svm_set_intercept(svm, INTERCEPT_CR0_READ);
+ svm_set_intercept(svm, INTERCEPT_CR0_WRITE);
+ }
+
}
static bool svm_is_valid_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
--
2.26.2
next prev parent reply other threads:[~2021-03-02 22:37 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-02 19:33 [PATCH 00/23] SVM queue for 5.13 Paolo Bonzini
2021-03-02 19:33 ` [PATCH 01/23] KVM: SVM: Use a separate vmcb for the nested L2 guest Paolo Bonzini
2021-03-02 19:33 ` [PATCH 02/23] KVM: nSVM: Track the physical cpu of the vmcb vmrun through the vmcb Paolo Bonzini
2021-03-02 19:33 ` [PATCH 03/23] KVM: nSVM: Track the ASID generation " Paolo Bonzini
2021-03-02 19:33 ` [PATCH 04/23] KVM: nSVM: rename functions and variables according to vmcbXY nomenclature Paolo Bonzini
2021-03-02 19:33 ` [PATCH 05/23] KVM: nSVM: do not copy vmcb01->control blindly to vmcb02->control Paolo Bonzini
2021-03-02 19:33 ` [PATCH 06/23] KVM: nSVM: do not mark all VMCB01 fields dirty on nested vmexit Paolo Bonzini
2021-03-02 19:33 ` [PATCH 07/23] KVM: nSVM: do not mark all VMCB02 " Paolo Bonzini
2021-03-02 19:33 ` [PATCH 08/23] KVM: nSVM: only copy L1 non-VMLOAD/VMSAVE data in svm_set_nested_state() Paolo Bonzini
2021-03-02 19:33 ` [PATCH 09/23] KVM: nSVM: Add missing checks for reserved bits to svm_set_nested_state() Paolo Bonzini
2021-03-02 19:33 ` [PATCH 10/23] KVM: x86: Move nVMX's consistency check macro to common code Paolo Bonzini
2021-03-02 19:33 ` [PATCH 11/23] KVM: nSVM: Trace VM-Enter consistency check failures Paolo Bonzini
2021-03-02 19:33 ` Paolo Bonzini [this message]
2021-03-02 19:33 ` [PATCH 13/23] KVM: SVM: Pass struct kvm_vcpu to exit handlers (and many, many other places) Paolo Bonzini
2021-03-02 19:33 ` [PATCH 14/23] KVM: nSVM: Add VMLOAD/VMSAVE helper to deduplicate code Paolo Bonzini
2021-03-02 19:33 ` [PATCH 15/23] KVM: x86: Move XSETBV emulation to common code Paolo Bonzini
2021-03-02 19:33 ` [PATCH 16/23] KVM: x86: Move trivial instruction-based exit handlers " Paolo Bonzini
2021-03-02 19:33 ` [PATCH 17/23] KVM: x86: Move RDPMC emulation " Paolo Bonzini
2021-03-02 19:33 ` [PATCH 18/23] KVM: SVM: Don't manually emulate RDPMC if nrips=0 Paolo Bonzini
2021-03-02 19:33 ` [PATCH 19/23] KVM: SVM: Skip intercepted PAUSE instructions after emulation Paolo Bonzini
2021-03-02 19:33 ` [PATCH 20/23] KVM: SVM: move VMLOAD/VMSAVE to C code Paolo Bonzini
2021-03-02 19:33 ` [PATCH 21/23] KVM: nSVM: always use vmcb01 to for vmsave/vmload of guest state Paolo Bonzini
2021-03-02 19:33 ` [PATCH 22/23] x86/cpufeatures: Add the Virtual SPEC_CTRL feature Paolo Bonzini
2021-03-02 19:33 ` [PATCH 23/23] KVM: SVM: Add support for Virtual SPEC_CTRL 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=20210302193343.313318-13-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=seanjc@google.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).