target/arm/kvm: Move kvm_arm_handle_debug and unexport
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Gavin Shan <gshan@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
ea79c59989
commit
5cba8f26de
@ -988,6 +988,83 @@ static int kvm_arm_handle_dabt_nisv(CPUState *cs, uint64_t esr_iss,
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* kvm_arm_handle_debug:
|
||||
* @cs: CPUState
|
||||
* @debug_exit: debug part of the KVM exit structure
|
||||
*
|
||||
* Returns: TRUE if the debug exception was handled.
|
||||
*
|
||||
* See v8 ARM ARM D7.2.27 ESR_ELx, Exception Syndrome Register
|
||||
*
|
||||
* To minimise translating between kernel and user-space the kernel
|
||||
* ABI just provides user-space with the full exception syndrome
|
||||
* register value to be decoded in QEMU.
|
||||
*/
|
||||
static bool kvm_arm_handle_debug(CPUState *cs,
|
||||
struct kvm_debug_exit_arch *debug_exit)
|
||||
{
|
||||
int hsr_ec = syn_get_ec(debug_exit->hsr);
|
||||
ARMCPU *cpu = ARM_CPU(cs);
|
||||
CPUARMState *env = &cpu->env;
|
||||
|
||||
/* Ensure PC is synchronised */
|
||||
kvm_cpu_synchronize_state(cs);
|
||||
|
||||
switch (hsr_ec) {
|
||||
case EC_SOFTWARESTEP:
|
||||
if (cs->singlestep_enabled) {
|
||||
return true;
|
||||
} else {
|
||||
/*
|
||||
* The kernel should have suppressed the guest's ability to
|
||||
* single step at this point so something has gone wrong.
|
||||
*/
|
||||
error_report("%s: guest single-step while debugging unsupported"
|
||||
" (%"PRIx64", %"PRIx32")",
|
||||
__func__, env->pc, debug_exit->hsr);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case EC_AA64_BKPT:
|
||||
if (kvm_find_sw_breakpoint(cs, env->pc)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case EC_BREAKPOINT:
|
||||
if (find_hw_breakpoint(cs, env->pc)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case EC_WATCHPOINT:
|
||||
{
|
||||
CPUWatchpoint *wp = find_hw_watchpoint(cs, debug_exit->far);
|
||||
if (wp) {
|
||||
cs->watchpoint_hit = wp;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
error_report("%s: unhandled debug exit (%"PRIx32", %"PRIx64")",
|
||||
__func__, debug_exit->hsr, env->pc);
|
||||
}
|
||||
|
||||
/* If we are not handling the debug exception it must belong to
|
||||
* the guest. Let's re-use the existing TCG interrupt code to set
|
||||
* everything up properly.
|
||||
*/
|
||||
cs->exception_index = EXCP_BKPT;
|
||||
env->exception.syndrome = debug_exit->hsr;
|
||||
env->exception.vaddress = debug_exit->far;
|
||||
env->exception.target_el = 1;
|
||||
qemu_mutex_lock_iothread();
|
||||
arm_cpu_do_interrupt(cs);
|
||||
qemu_mutex_unlock_iothread();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
|
||||
{
|
||||
int ret = 0;
|
||||
|
@ -1121,73 +1121,3 @@ int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* See v8 ARM ARM D7.2.27 ESR_ELx, Exception Syndrome Register
|
||||
*
|
||||
* To minimise translating between kernel and user-space the kernel
|
||||
* ABI just provides user-space with the full exception syndrome
|
||||
* register value to be decoded in QEMU.
|
||||
*/
|
||||
|
||||
bool kvm_arm_handle_debug(CPUState *cs, struct kvm_debug_exit_arch *debug_exit)
|
||||
{
|
||||
int hsr_ec = syn_get_ec(debug_exit->hsr);
|
||||
ARMCPU *cpu = ARM_CPU(cs);
|
||||
CPUARMState *env = &cpu->env;
|
||||
|
||||
/* Ensure PC is synchronised */
|
||||
kvm_cpu_synchronize_state(cs);
|
||||
|
||||
switch (hsr_ec) {
|
||||
case EC_SOFTWARESTEP:
|
||||
if (cs->singlestep_enabled) {
|
||||
return true;
|
||||
} else {
|
||||
/*
|
||||
* The kernel should have suppressed the guest's ability to
|
||||
* single step at this point so something has gone wrong.
|
||||
*/
|
||||
error_report("%s: guest single-step while debugging unsupported"
|
||||
" (%"PRIx64", %"PRIx32")",
|
||||
__func__, env->pc, debug_exit->hsr);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case EC_AA64_BKPT:
|
||||
if (kvm_find_sw_breakpoint(cs, env->pc)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case EC_BREAKPOINT:
|
||||
if (find_hw_breakpoint(cs, env->pc)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case EC_WATCHPOINT:
|
||||
{
|
||||
CPUWatchpoint *wp = find_hw_watchpoint(cs, debug_exit->far);
|
||||
if (wp) {
|
||||
cs->watchpoint_hit = wp;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
error_report("%s: unhandled debug exit (%"PRIx32", %"PRIx64")",
|
||||
__func__, debug_exit->hsr, env->pc);
|
||||
}
|
||||
|
||||
/* If we are not handling the debug exception it must belong to
|
||||
* the guest. Let's re-use the existing TCG interrupt code to set
|
||||
* everything up properly.
|
||||
*/
|
||||
cs->exception_index = EXCP_BKPT;
|
||||
env->exception.syndrome = debug_exit->hsr;
|
||||
env->exception.vaddress = debug_exit->far;
|
||||
env->exception.target_el = 1;
|
||||
qemu_mutex_lock_iothread();
|
||||
arm_cpu_do_interrupt(cs);
|
||||
qemu_mutex_unlock_iothread();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -445,13 +445,4 @@ static inline uint32_t kvm_arm_sve_get_vls(CPUState *cs)
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* kvm_arm_handle_debug:
|
||||
* @cs: CPUState
|
||||
* @debug_exit: debug part of the KVM exit structure
|
||||
*
|
||||
* Returns: TRUE if the debug exception was handled.
|
||||
*/
|
||||
bool kvm_arm_handle_debug(CPUState *cs, struct kvm_debug_exit_arch *debug_exit);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user