mirror of https://github.com/xemu-project/xemu.git
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;
|
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 kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
|
@ -1121,73 +1121,3 @@ int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
|
||||||
}
|
}
|
||||||
return 0;
|
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
|
#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
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue