mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Joerg Roedel <joerg.roedel@amd.com>
To: Avi Kivity <avi@redhat.com>, Marcelo Tosatti <mtosatti@redhat.com>
Cc: Alexander Graf <agraf@suse.de>,
	kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	Joerg Roedel <joerg.roedel@amd.com>
Subject: [PATCH 09/11] KVM: SVM: Handle nested selective_cr0 intercept correctly
Date: Wed, 24 Feb 2010 18:59:18 +0100	[thread overview]
Message-ID: <1267034360-5907-10-git-send-email-joerg.roedel@amd.com> (raw)
In-Reply-To: <1267034360-5907-1-git-send-email-joerg.roedel@amd.com>

If we have the following situation with nested svm:

1. Host KVM intercepts cr0 writes
2. Guest hypervisor intercepts only selective cr0 writes

Then we get an cr0 write intercept which is handled on the
host. But that intercepts may actually be a selective cr0
intercept for the guest. This patch checks for this
condition and injects a selective cr0 intercept if needed.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
 arch/x86/kvm/svm.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 2450a7c..22654de 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1037,6 +1037,27 @@ static void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
 {
 	struct vcpu_svm *svm = to_svm(vcpu);
 
+	if (is_nested(svm)) {
+		/*
+		 * We are here because we run in nested mode, the host kvm
+		 * intercepts cr0 writes but the l1 hypervisor does not.
+		 * But the L1 hypervisor may intercept selective cr0 writes.
+		 * This needs to be checked here.
+		 */
+		unsigned long old, new;
+
+		/* Remove bits that would trigger a real cr0 write intercept */
+		old = vcpu->arch.cr0 & SVM_CR0_SELECTIVE_MASK;
+		new = cr0 & SVM_CR0_SELECTIVE_MASK;
+
+		if (old == new) {
+			/* cr0 write with ts and mp unchanged */
+			svm->vmcb->control.exit_code = SVM_EXIT_CR0_SEL_WRITE;
+			if (nested_svm_exit_handled(svm) == NESTED_EXIT_DONE)
+				return;
+		}
+	}
+
 #ifdef CONFIG_X86_64
 	if (vcpu->arch.efer & EFER_LME) {
 		if (!is_paging(vcpu) && (cr0 & X86_CR0_PG)) {
-- 
1.7.0



  parent reply	other threads:[~2010-02-24 18:00 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-24 17:59 [PATCH 0/11] Another set of nested svm fixes and optimizations Joerg Roedel
2010-02-24 17:59 ` [PATCH 01/11] KVM: SVM: Coding style cleanup Joerg Roedel
2010-02-24 18:02   ` Joerg Roedel
2010-02-24 17:59 ` [PATCH 02/11] KVM: SVM: Reset MMU on nested_svm_vmrun for NPT too Joerg Roedel
2010-02-24 17:59 ` [PATCH 03/11] KVM: SVM: Check for nested intercepts on NMI injection Joerg Roedel
2010-02-24 17:59 ` [PATCH 04/11] KVM: SVM: Restore tracing of nested vmcb address Joerg Roedel
2010-02-24 17:59 ` [PATCH 05/11] KVM: SVM: Add kvm_nested_intercepts tracepoint Joerg Roedel
2010-02-24 17:59 ` [PATCH 06/11] KVM: SVM: Implement emulation of vm_cr msr Joerg Roedel
2010-02-25 10:28   ` Avi Kivity
2010-02-24 17:59 ` [PATCH 07/11] KVM: SVM: Ignore write of hwcr.ignne Joerg Roedel
2010-02-24 17:59 ` [PATCH 08/11] KVM: x86: Don't set arch.cr0 in kvm_set_cr0 Joerg Roedel
2010-02-24 17:59 ` Joerg Roedel [this message]
2010-02-24 17:59 ` [PATCH 10/11] KVM: SVM: Clear exit_info for injected INTR exits Joerg Roedel
2010-02-24 17:59 ` [PATCH 11/11] KVM: SVM: Optimize nested svm msrpm merging Joerg Roedel
2010-02-24 19:27   ` Alexander Graf
2010-02-24 19:37     ` Joerg Roedel
2010-02-24 19:58       ` Avi Kivity
2010-02-24 20:00         ` Alexander Graf
2010-02-24 20:09           ` Avi Kivity
2010-02-25 10:32 ` [PATCH 0/11] Another set of nested svm fixes and optimizations Avi Kivity

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=1267034360-5907-10-git-send-email-joerg.roedel@amd.com \
    --to=joerg.roedel@amd.com \
    --cc=agraf@suse.de \
    --cc=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mtosatti@redhat.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

Powered by JetHome