|
@@ -1555,6 +1555,21 @@ static int kvm_riscv_handle_csr(CPUState *cs, struct kvm_run *run)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static bool kvm_riscv_handle_debug(CPUState *cs)
|
|
|
+{
|
|
|
+ RISCVCPU *cpu = RISCV_CPU(cs);
|
|
|
+ CPURISCVState *env = &cpu->env;
|
|
|
+
|
|
|
+ /* Ensure PC is synchronised */
|
|
|
+ kvm_cpu_synchronize_state(cs);
|
|
|
+
|
|
|
+ if (kvm_find_sw_breakpoint(cs, env->pc)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
|
|
|
{
|
|
|
int ret = 0;
|
|
@@ -1565,6 +1580,11 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
|
|
|
case KVM_EXIT_RISCV_CSR:
|
|
|
ret = kvm_riscv_handle_csr(cs, run);
|
|
|
break;
|
|
|
+ case KVM_EXIT_DEBUG:
|
|
|
+ if (kvm_riscv_handle_debug(cs)) {
|
|
|
+ ret = EXCP_DEBUG;
|
|
|
+ }
|
|
|
+ break;
|
|
|
default:
|
|
|
qemu_log_mask(LOG_UNIMP, "%s: un-handled exit reason %d\n",
|
|
|
__func__, run->exit_reason);
|