All of lore.kernel.org
 help / color / mirror / Atom feed
From: Avi Kivity <avi@redhat.com>
To: kvm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH 07/38] KVM: VMX: Fix emulation of DR4 and DR5
Date: Tue, 16 Feb 2010 12:35:05 +0200	[thread overview]
Message-ID: <1266316536-28936-8-git-send-email-avi@redhat.com> (raw)
In-Reply-To: <1266316536-28936-1-git-send-email-avi@redhat.com>

From: Jan Kiszka <jan.kiszka@siemens.com>

Make sure DR4 and DR5 are aliased to DR6 and DR7, respectively, if
CR4.DE is not set.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
---
 arch/x86/kvm/vmx.c |   35 ++++++++++++++++++++++++++---------
 1 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 9727773..c7b99e1 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -3039,6 +3039,15 @@ static int handle_cr(struct kvm_vcpu *vcpu)
 	return 0;
 }
 
+static int check_dr_alias(struct kvm_vcpu *vcpu)
+{
+	if (kvm_read_cr4_bits(vcpu, X86_CR4_DE)) {
+		kvm_queue_exception(vcpu, UD_VECTOR);
+		return -1;
+	}
+	return 0;
+}
+
 static int handle_dr(struct kvm_vcpu *vcpu)
 {
 	unsigned long exit_qualification;
@@ -3081,14 +3090,20 @@ static int handle_dr(struct kvm_vcpu *vcpu)
 		case 0 ... 3:
 			val = vcpu->arch.db[dr];
 			break;
+		case 4:
+			if (check_dr_alias(vcpu) < 0)
+				return 1;
+			/* fall through */
 		case 6:
 			val = vcpu->arch.dr6;
 			break;
-		case 7:
+		case 5:
+			if (check_dr_alias(vcpu) < 0)
+				return 1;
+			/* fall through */
+		default: /* 7 */
 			val = vcpu->arch.dr7;
 			break;
-		default:
-			val = 0;
 		}
 		kvm_register_write(vcpu, reg, val);
 	} else {
@@ -3099,12 +3114,10 @@ static int handle_dr(struct kvm_vcpu *vcpu)
 			if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP))
 				vcpu->arch.eff_db[dr] = val;
 			break;
-		case 4 ... 5:
-			if (kvm_read_cr4_bits(vcpu, X86_CR4_DE)) {
-				kvm_queue_exception(vcpu, UD_VECTOR);
+		case 4:
+			if (check_dr_alias(vcpu) < 0)
 				return 1;
-			}
-			break;
+			/* fall through */
 		case 6:
 			if (val & 0xffffffff00000000ULL) {
 				kvm_inject_gp(vcpu, 0);
@@ -3112,7 +3125,11 @@ static int handle_dr(struct kvm_vcpu *vcpu)
 			}
 			vcpu->arch.dr6 = (val & DR6_VOLATILE) | DR6_FIXED_1;
 			break;
-		case 7:
+		case 5:
+			if (check_dr_alias(vcpu) < 0)
+				return 1;
+			/* fall through */
+		default: /* 7 */
 			if (val & 0xffffffff00000000ULL) {
 				kvm_inject_gp(vcpu, 0);
 				return 1;
-- 
1.6.5.3


  parent reply	other threads:[~2010-02-16 10:43 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-16 10:34 [PATCH 00/38] KVM updates for the 2.6.34 merge window (batch 3/4) Avi Kivity
2010-02-16 10:34 ` [PATCH 01/38] KVM: export <asm/hyperv.h> Avi Kivity
2010-02-16 10:35 ` [PATCH 02/38] KVM: VMX: Remove emulation failure report Avi Kivity
2010-02-16 10:35 ` [PATCH 03/38] KVM: fix Hyper-V hypercall warnings and wrong mask value Avi Kivity
2010-02-16 10:35 ` [PATCH 04/38] KVM: fix cleanup_srcu_struct on vm destruction Avi Kivity
2010-02-16 10:35 ` [PATCH 05/38] KVM: x86: Use macros for x86_emulate_ops to avoid future mistakes Avi Kivity
2010-02-16 10:35 ` [PATCH 06/38] KVM: VMX: Fix exceptions of mov to dr Avi Kivity
2010-02-16 10:35 ` Avi Kivity [this message]
2010-02-16 10:35 ` [PATCH 08/38] KVM: VMX: Clean up DR6 emulation Avi Kivity
2010-02-16 10:35 ` [PATCH 09/38] KVM: SVM: Clean up and enhance mov dr emulation Avi Kivity
2010-02-16 10:35 ` [PATCH 10/38] KVM: SVM: Trap all debug register accesses Avi Kivity
2010-02-16 10:35 ` [PATCH 11/38] KVM: Fix kvm_coalesced_mmio_ring duplicate allocation Avi Kivity
2010-02-16 10:35 ` [PATCH 12/38] KVM: x86: fix checking of cr0 validity Avi Kivity
2010-02-16 10:35 ` [PATCH 13/38] KVM: Allow kvm_load_guest_fpu() even when !vcpu->fpu_active Avi Kivity
2010-02-16 10:35 ` [PATCH 14/38] KVM: Drop kvm_{load,put}_guest_fpu() exports Avi Kivity
2010-02-16 10:35 ` [PATCH 15/38] KVM: Activate fpu on clts Avi Kivity
2010-02-16 10:35 ` [PATCH 16/38] KVM: Add a helper for checking if the guest is in protected mode Avi Kivity
2010-02-16 10:35 ` [PATCH 17/38] KVM: Move cr0/cr4/efer related helpers to x86.h Avi Kivity
2010-02-16 10:35 ` [PATCH 18/38] KVM: Rename vcpu->shadow_efer to efer Avi Kivity
2010-02-16 10:35 ` [PATCH 19/38] KVM: Optimize kvm_read_cr[04]_bits() Avi Kivity
2010-02-16 10:35 ` [PATCH 20/38] KVM: trace guest fpu loads and unloads Avi Kivity
2010-02-16 10:35 ` [PATCH 21/38] KVM: MMU: Remove some useless code from alloc_mmu_pages() Avi Kivity
2010-02-16 10:35 ` [PATCH 22/38] KVM: PPC E500: Add register l1csr0 emulation Avi Kivity
2010-02-16 10:35 ` [PATCH 23/38] KVM: PPC: Add PVR/PIR init for E500 Avi Kivity
2010-02-16 10:35 ` [PATCH 24/38] KVM: PPC E500: fix tlbcfg emulation Avi Kivity
2010-02-16 10:35 ` [PATCH 25/38] KVM: VMX: Pass cr0.mp through to the guest when the fpu is active Avi Kivity
2010-02-16 10:35 ` [PATCH 26/38] KVM: mark segments accessed on HW task switch Avi Kivity
2010-02-16 10:35 ` [PATCH 27/38] KVM: Fix msr trace Avi Kivity
2010-02-16 10:35 ` [PATCH 28/38] KVM: Trace failed msr reads and writes Avi Kivity
2010-02-16 10:35 ` [PATCH 29/38] KVM: VMX: Remove redundant check in vm_need_virtualize_apic_accesses() Avi Kivity
2010-02-16 10:35 ` [PATCH 30/38] KVM: enable PCI multiple-segments for pass-through device Avi Kivity
2010-02-16 10:35 ` [PATCH 31/38] KVM: fix load_guest_segment_descriptor() to return X86EMUL_* Avi Kivity
2010-02-16 10:35 ` [PATCH 32/38] KVM: fix kvm_fix_hypercall() " Avi Kivity
2010-02-16 10:35 ` [PATCH 33/38] KVM: VMX: Wire up .fpu_activate() callback Avi Kivity
2010-02-16 10:35 ` [PATCH 34/38] KVM: ia64: Fix string literal continuation lines Avi Kivity
2010-02-16 10:35 ` [PATCH 35/38] KVM: VMX: Remove redundant test in vmx_set_efer() Avi Kivity
2010-02-16 10:35 ` [PATCH 36/38] KVM: Introduce kvm_host_page_size Avi Kivity
2010-02-16 10:35 ` [PATCH 37/38] KVM: VMX: emulate accessed bit for EPT Avi Kivity
2010-02-16 10:35 ` [PATCH 38/38] KVM: Remove redundant reading of rax on OUT instructions 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=1266316536-28936-8-git-send-email-avi@redhat.com \
    --to=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.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.