|
@@ -2016,12 +2016,15 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
|
|
|
{
|
|
|
struct debug_reg *dbg_reg;
|
|
|
int n, b = 0, w = 0;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ vcpu_load(vcpu);
|
|
|
|
|
|
if (!(dbg->control & KVM_GUESTDBG_ENABLE)) {
|
|
|
vcpu->arch.dbg_reg.dbcr0 = 0;
|
|
|
vcpu->guest_debug = 0;
|
|
|
kvm_guest_protect_msr(vcpu, MSR_DE, false);
|
|
|
- return 0;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
kvm_guest_protect_msr(vcpu, MSR_DE, true);
|
|
@@ -2053,8 +2056,9 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
|
|
|
#endif
|
|
|
|
|
|
if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP))
|
|
|
- return 0;
|
|
|
+ goto out;
|
|
|
|
|
|
+ ret = -EINVAL;
|
|
|
for (n = 0; n < (KVMPPC_BOOKE_IAC_NUM + KVMPPC_BOOKE_DAC_NUM); n++) {
|
|
|
uint64_t addr = dbg->arch.bp[n].addr;
|
|
|
uint32_t type = dbg->arch.bp[n].type;
|
|
@@ -2065,21 +2069,24 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
|
|
|
if (type & ~(KVMPPC_DEBUG_WATCH_READ |
|
|
|
KVMPPC_DEBUG_WATCH_WRITE |
|
|
|
KVMPPC_DEBUG_BREAKPOINT))
|
|
|
- return -EINVAL;
|
|
|
+ goto out;
|
|
|
|
|
|
if (type & KVMPPC_DEBUG_BREAKPOINT) {
|
|
|
/* Setting H/W breakpoint */
|
|
|
if (kvmppc_booke_add_breakpoint(dbg_reg, addr, b++))
|
|
|
- return -EINVAL;
|
|
|
+ goto out;
|
|
|
} else {
|
|
|
/* Setting H/W watchpoint */
|
|
|
if (kvmppc_booke_add_watchpoint(dbg_reg, addr,
|
|
|
type, w++))
|
|
|
- return -EINVAL;
|
|
|
+ goto out;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return 0;
|
|
|
+ ret = 0;
|
|
|
+out:
|
|
|
+ vcpu_put(vcpu);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
void kvmppc_booke_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|