All of lore.kernel.org
 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 06/11] KVM: SVM: Implement emulation of vm_cr msr
Date: Wed, 24 Feb 2010 18:59:15 +0100	[thread overview]
Message-ID: <1267034360-5907-7-git-send-email-joerg.roedel@amd.com> (raw)
In-Reply-To: <1267034360-5907-1-git-send-email-joerg.roedel@amd.com>

This patch implements the emulation of the vm_cr msr for
nested svm.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
 arch/x86/include/asm/svm.h |    4 ++++
 arch/x86/kvm/svm.c         |   29 ++++++++++++++++++++++++++++-
 2 files changed, 32 insertions(+), 1 deletions(-)

diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h
index 38638cd..b26a38d 100644
--- a/arch/x86/include/asm/svm.h
+++ b/arch/x86/include/asm/svm.h
@@ -115,6 +115,10 @@ struct __attribute__ ((__packed__)) vmcb_control_area {
 #define SVM_IOIO_SIZE_MASK (7 << SVM_IOIO_SIZE_SHIFT)
 #define SVM_IOIO_ASIZE_MASK (7 << SVM_IOIO_ASIZE_SHIFT)
 
+#define SVM_VM_CR_VALID_MASK	0x001fULL
+#define SVM_VM_CR_SVM_LOCK_MASK 0x0008ULL
+#define SVM_VM_CR_SVM_DIS_MASK  0x0010ULL
+
 struct __attribute__ ((__packed__)) vmcb_seg {
 	u16 selector;
 	u16 attrib;
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 6b7590a..2450a7c 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -70,6 +70,7 @@ struct kvm_vcpu;
 struct nested_state {
 	struct vmcb *hsave;
 	u64 hsave_msr;
+	u64 vm_cr_msr;
 	u64 vmcb;
 
 	/* These are the merged vectors */
@@ -2273,7 +2274,7 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data)
 		*data = svm->nested.hsave_msr;
 		break;
 	case MSR_VM_CR:
-		*data = 0;
+		*data = svm->nested.vm_cr_msr;
 		break;
 	case MSR_IA32_UCODE_REV:
 		*data = 0x01000065;
@@ -2303,6 +2304,31 @@ static int rdmsr_interception(struct vcpu_svm *svm)
 	return 1;
 }
 
+static int svm_set_vm_cr(struct kvm_vcpu *vcpu, u64 data)
+{
+	struct vcpu_svm *svm = to_svm(vcpu);
+	int svm_dis, chg_mask;
+
+	if (data & ~SVM_VM_CR_VALID_MASK)
+		return 1;
+
+	chg_mask = SVM_VM_CR_VALID_MASK;
+
+	if (svm->nested.vm_cr_msr & SVM_VM_CR_SVM_DIS_MASK)
+		chg_mask &= ~(SVM_VM_CR_SVM_LOCK_MASK | SVM_VM_CR_SVM_DIS_MASK);
+
+	svm->nested.vm_cr_msr &= ~chg_mask;
+	svm->nested.vm_cr_msr |= (data & chg_mask);
+
+	svm_dis = svm->nested.vm_cr_msr & SVM_VM_CR_SVM_DIS_MASK;
+
+	/* check for svm_disable while efer.svme is set */
+	if (svm_dis && (vcpu->arch.efer & EFER_SVME))
+		return 1;
+
+	return 0;
+}
+
 static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 data)
 {
 	struct vcpu_svm *svm = to_svm(vcpu);
@@ -2369,6 +2395,7 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 data)
 		svm->nested.hsave_msr = data;
 		break;
 	case MSR_VM_CR:
+		return svm_set_vm_cr(vcpu, data);
 	case MSR_VM_IGNNE:
 		pr_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data);
 		break;
-- 
1.7.0



  parent reply	other threads:[~2010-02-24 17:59 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 ` Joerg Roedel [this message]
2010-02-25 10:28   ` [PATCH 06/11] KVM: SVM: Implement emulation of vm_cr msr 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 ` [PATCH 09/11] KVM: SVM: Handle nested selective_cr0 intercept correctly Joerg Roedel
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-7-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 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.