diff options
Diffstat (limited to 'arch/powerpc/kvm/booke.c')
-rw-r--r-- | arch/powerpc/kvm/booke.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index 97ec5b7fce9c..ed5b0dd58726 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c | |||
@@ -994,6 +994,11 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
994 | case BOOKE_INTERRUPT_HV_PRIV: | 994 | case BOOKE_INTERRUPT_HV_PRIV: |
995 | emulated = kvmppc_get_last_inst(vcpu, false, &last_inst); | 995 | emulated = kvmppc_get_last_inst(vcpu, false, &last_inst); |
996 | break; | 996 | break; |
997 | case BOOKE_INTERRUPT_PROGRAM: | ||
998 | /* SW breakpoints arrive as illegal instructions on HV */ | ||
999 | if (vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) | ||
1000 | emulated = kvmppc_get_last_inst(vcpu, false, &last_inst); | ||
1001 | break; | ||
997 | default: | 1002 | default: |
998 | break; | 1003 | break; |
999 | } | 1004 | } |
@@ -1071,6 +1076,18 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
1071 | break; | 1076 | break; |
1072 | 1077 | ||
1073 | case BOOKE_INTERRUPT_PROGRAM: | 1078 | case BOOKE_INTERRUPT_PROGRAM: |
1079 | if ((vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) && | ||
1080 | (last_inst == KVMPPC_INST_SW_BREAKPOINT)) { | ||
1081 | /* | ||
1082 | * We are here because of an SW breakpoint instr, | ||
1083 | * so lets return to host to handle. | ||
1084 | */ | ||
1085 | r = kvmppc_handle_debug(run, vcpu); | ||
1086 | run->exit_reason = KVM_EXIT_DEBUG; | ||
1087 | kvmppc_account_exit(vcpu, DEBUG_EXITS); | ||
1088 | break; | ||
1089 | } | ||
1090 | |||
1074 | if (vcpu->arch.shared->msr & (MSR_PR | MSR_GS)) { | 1091 | if (vcpu->arch.shared->msr & (MSR_PR | MSR_GS)) { |
1075 | /* | 1092 | /* |
1076 | * Program traps generated by user-level software must | 1093 | * Program traps generated by user-level software must |
@@ -1647,7 +1664,7 @@ int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id, | |||
1647 | *val = get_reg_val(id, vcpu->arch.tsr); | 1664 | *val = get_reg_val(id, vcpu->arch.tsr); |
1648 | break; | 1665 | break; |
1649 | case KVM_REG_PPC_DEBUG_INST: | 1666 | case KVM_REG_PPC_DEBUG_INST: |
1650 | *val = get_reg_val(id, KVMPPC_INST_EHPRIV_DEBUG); | 1667 | *val = get_reg_val(id, KVMPPC_INST_SW_BREAKPOINT); |
1651 | break; | 1668 | break; |
1652 | case KVM_REG_PPC_VRSAVE: | 1669 | case KVM_REG_PPC_VRSAVE: |
1653 | *val = get_reg_val(id, vcpu->arch.vrsave); | 1670 | *val = get_reg_val(id, vcpu->arch.vrsave); |