/* * gdbstub user-mode helper routines. * * We know for user-mode we are using TCG so we can call stuff directly. * * Copyright (c) 2022 Linaro Ltd * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "qemu/osdep.h" #include "exec/hwaddr.h" #include "exec/gdbstub.h" #include "hw/core/cpu.h" #include "internals.h" bool gdb_supports_guest_debug(void) { /* user-mode == TCG == supported */ return true; } int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len) { CPUState *cpu; int err = 0; switch (type) { case GDB_BREAKPOINT_SW: case GDB_BREAKPOINT_HW: CPU_FOREACH(cpu) { err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL); if (err) { break; } } return err; default: /* user-mode doesn't support watchpoints */ return -ENOSYS; } } int gdb_breakpoint_remove(CPUState *cs, int type, hwaddr addr, hwaddr len) { CPUState *cpu; int err = 0; switch (type) { case GDB_BREAKPOINT_SW: case GDB_BREAKPOINT_HW: CPU_FOREACH(cpu) { err = cpu_breakpoint_remove(cpu, addr, BP_GDB); if (err) { break; } } return err; default: /* user-mode doesn't support watchpoints */ return -ENOSYS; } } void gdb_breakpoint_remove_all(CPUState *cs) { cpu_breakpoint_remove_all(cs, BP_GDB); }