KVM: VMX: Fix emulation of DR4 and DR5

Previous thread: KVM: PPC: Use accessor functions for GPR access by Linux Kernel Mailing List on Friday, March 5, 2010 - 2:59 pm. (1 message)

Next thread: KVM: Add HYPER-V apic access MSRs by Linux Kernel Mailing List on Friday, March 5, 2010 - 2:59 pm. (1 message)
From: Linux Kernel Mailing List
Date: Friday, March 5, 2010 - 2:59 pm

Gitweb:     http://git.kernel.org/linus/138ac8d88f91e2a6a278aa5cee9120c714c4ce2d
Commit:     138ac8d88f91e2a6a278aa5cee9120c714c4ce2d
Parent:     f2483415293b180945da707e7dbe74e5daa72651
Author:     Jan Kiszka <jan.kiszka@siemens.com>
AuthorDate: Wed Jan 20 18:20:20 2010 +0100
Committer:  Marcelo Tosatti <mtosatti@redhat.com>
CommitDate: Mon Mar 1 12:36:01 2010 -0300

    KVM: VMX: Fix emulation of DR4 and DR5
    
    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, ...
Previous thread: KVM: PPC: Use accessor functions for GPR access by Linux Kernel Mailing List on Friday, March 5, 2010 - 2:59 pm. (1 message)

Next thread: KVM: Add HYPER-V apic access MSRs by Linux Kernel Mailing List on Friday, March 5, 2010 - 2:59 pm. (1 message)