target/riscv/kvm: handle the exit with debug reason
If the breakpoint belongs to the userspace then set the ret value. Signed-off-by: Chao Du <duchao@eswincomputing.com> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Acked-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20240606014501.20763-3-duchao@eswincomputing.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
80b605056d
commit
b60520392d
@ -1555,6 +1555,21 @@ static int kvm_riscv_handle_csr(CPUState *cs, struct kvm_run *run)
|
|||||||
return ret;
|
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 kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -1565,6 +1580,11 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
|
|||||||
case KVM_EXIT_RISCV_CSR:
|
case KVM_EXIT_RISCV_CSR:
|
||||||
ret = kvm_riscv_handle_csr(cs, run);
|
ret = kvm_riscv_handle_csr(cs, run);
|
||||||
break;
|
break;
|
||||||
|
case KVM_EXIT_DEBUG:
|
||||||
|
if (kvm_riscv_handle_debug(cs)) {
|
||||||
|
ret = EXCP_DEBUG;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
qemu_log_mask(LOG_UNIMP, "%s: un-handled exit reason %d\n",
|
qemu_log_mask(LOG_UNIMP, "%s: un-handled exit reason %d\n",
|
||||||
__func__, run->exit_reason);
|
__func__, run->exit_reason);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user