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