Currently, when handling hardware breakpoints, we always set values
for all the 4 hardware debug registers, regardless it is needed or
not. This patch fixes the bug.

Signed-off-by: Nguyen Anh Quynh <[EMAIL PROTECTED]>
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index 7bdffe6..c6187c8 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -180,7 +180,7 @@ struct kvm_mmu_memory_cache {
  */
 struct kvm_guest_debug {
 	int enabled;
-	unsigned long bp[4];
+	struct kvm_breakpoint bp[4];
 	int singlestep;
 };
 
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c
index 2c4f01b..88ca030 100644
--- a/drivers/kvm/vmx.c
+++ b/drivers/kvm/vmx.c
@@ -706,20 +706,23 @@ static int set_guest_debug(struct kvm_vcpu *vcpu, struct kvm_debug_guest *dbg)
 {
 	unsigned long dr7 = 0x400;
 	int old_singlestep;
+	int i;
 
 	old_singlestep = vcpu->guest_debug.singlestep;
-
 	vcpu->guest_debug.enabled = dbg->enabled;
-	if (vcpu->guest_debug.enabled) {
-		int i;
 
+	for (i = 0; i < 4; ++i)
+		vcpu->guest_debug.bp[i].enabled = 0;
+
+	if (vcpu->guest_debug.enabled) {
 		dr7 |= 0x200;  /* exact */
 		for (i = 0; i < 4; ++i) {
-			if (!dbg->breakpoints[i].enabled)
-				continue;
-			vcpu->guest_debug.bp[i] = dbg->breakpoints[i].address;
-			dr7 |= 2 << (i*2);    /* global enable */
-			dr7 |= 0 << (i*4+16); /* execution breakpoint */
+			if (dbg->breakpoints[i].enabled) {
+				vcpu->guest_debug.bp[i].enabled = 1;
+				vcpu->guest_debug.bp[i].address = dbg->breakpoints[i].address;
+				dr7 |= 2 << (i*2);    /* global enable */
+				dr7 |= 0 << (i*4+16); /* execution breakpoint */
+			}
 		}
 
 		vcpu->guest_debug.singlestep = dbg->singlestep;
@@ -1519,12 +1522,18 @@ static void do_interrupt_requests(struct kvm_vcpu *vcpu,
 
 static void kvm_guest_debug_pre(struct kvm_vcpu *vcpu)
 {
+#define SET_DEBUGREG(i) \
+	if (dbg->bp[i].enabled) { \
+		set_debugreg(dbg->bp[i].address, i); \
+	}
+
 	struct kvm_guest_debug *dbg = &vcpu->guest_debug;
 
-	set_debugreg(dbg->bp[0], 0);
-	set_debugreg(dbg->bp[1], 1);
-	set_debugreg(dbg->bp[2], 2);
-	set_debugreg(dbg->bp[3], 3);
+	SET_DEBUGREG(0);
+	SET_DEBUGREG(1);
+	SET_DEBUGREG(2);
+	SET_DEBUGREG(3);
+#undef SET_DEBUGREG
 
 	if (dbg->singlestep) {
 		unsigned long flags;
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to