mirror of
https://github.com/qemu/qemu.git
synced 2024-12-17 01:03:51 +08:00
eb2edc42b1
Guests can now be debugged through the gdbstub. Support is added for single-stepping, software breakpoints, hardware breakpoints and watchpoints. The code has been structured like the KVM counterpart. While guest debugging is enabled, the guest can still read and write the DBG*_EL1 registers but they don't have any effect. Signed-off-by: Francesco Cagnin <fcagnin@quarkslab.com> Message-id: 20230601153107.81955-5-fcagnin@quarkslab.com Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
70 lines
1.5 KiB
C
70 lines
1.5 KiB
C
/*
|
|
* QEMU Hypervisor.framework support
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2. See
|
|
* the COPYING file in the top-level directory.
|
|
*
|
|
* Contributions after 2012-01-13 are licensed under the terms of the
|
|
* GNU GPL, version 2 or (at your option) any later version.
|
|
*/
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "qemu/error-report.h"
|
|
#include "sysemu/hvf.h"
|
|
#include "sysemu/hvf_int.h"
|
|
|
|
void assert_hvf_ok(hv_return_t ret)
|
|
{
|
|
if (ret == HV_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
switch (ret) {
|
|
case HV_ERROR:
|
|
error_report("Error: HV_ERROR");
|
|
break;
|
|
case HV_BUSY:
|
|
error_report("Error: HV_BUSY");
|
|
break;
|
|
case HV_BAD_ARGUMENT:
|
|
error_report("Error: HV_BAD_ARGUMENT");
|
|
break;
|
|
case HV_NO_RESOURCES:
|
|
error_report("Error: HV_NO_RESOURCES");
|
|
break;
|
|
case HV_NO_DEVICE:
|
|
error_report("Error: HV_NO_DEVICE");
|
|
break;
|
|
case HV_UNSUPPORTED:
|
|
error_report("Error: HV_UNSUPPORTED");
|
|
break;
|
|
default:
|
|
error_report("Unknown Error");
|
|
}
|
|
|
|
abort();
|
|
}
|
|
|
|
struct hvf_sw_breakpoint *hvf_find_sw_breakpoint(CPUState *cpu, target_ulong pc)
|
|
{
|
|
struct hvf_sw_breakpoint *bp;
|
|
|
|
QTAILQ_FOREACH(bp, &hvf_state->hvf_sw_breakpoints, entry) {
|
|
if (bp->pc == pc) {
|
|
return bp;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
int hvf_sw_breakpoints_active(CPUState *cpu)
|
|
{
|
|
return !QTAILQ_EMPTY(&hvf_state->hvf_sw_breakpoints);
|
|
}
|
|
|
|
int hvf_update_guest_debug(CPUState *cpu)
|
|
{
|
|
hvf_arch_update_guest_debug(cpu);
|
|
return 0;
|
|
}
|