1ae7467b1SAlex Bennée /* 2ae7467b1SAlex Bennée * gdbstub user-mode helper routines. 3ae7467b1SAlex Bennée * 4ae7467b1SAlex Bennée * We know for user-mode we are using TCG so we can call stuff directly. 5ae7467b1SAlex Bennée * 69455762fSAlex Bennée * Copyright (c) 2003-2005 Fabrice Bellard 7ae7467b1SAlex Bennée * Copyright (c) 2022 Linaro Ltd 8ae7467b1SAlex Bennée * 99455762fSAlex Bennée * SPDX-License-Identifier: LGPL-2.0+ 10ae7467b1SAlex Bennée */ 11ae7467b1SAlex Bennée 12ae7467b1SAlex Bennée #include "qemu/osdep.h" 13ae7467b1SAlex Bennée #include "exec/gdbstub.h" 14ae7467b1SAlex Bennée #include "hw/core/cpu.h" 15ae7467b1SAlex Bennée #include "internals.h" 16ae7467b1SAlex Bennée 17a48e7d9eSAlex Bennée bool gdb_supports_guest_debug(void) 18a48e7d9eSAlex Bennée { 19a48e7d9eSAlex Bennée /* user-mode == TCG == supported */ 20a48e7d9eSAlex Bennée return true; 21a48e7d9eSAlex Bennée } 22a48e7d9eSAlex Bennée 2355b5b8e9SPhilippe Mathieu-Daudé int gdb_breakpoint_insert(CPUState *cs, int type, vaddr addr, vaddr len) 24ae7467b1SAlex Bennée { 25ae7467b1SAlex Bennée CPUState *cpu; 26ae7467b1SAlex Bennée int err = 0; 27ae7467b1SAlex Bennée 28ae7467b1SAlex Bennée switch (type) { 29ae7467b1SAlex Bennée case GDB_BREAKPOINT_SW: 30ae7467b1SAlex Bennée case GDB_BREAKPOINT_HW: 31ae7467b1SAlex Bennée CPU_FOREACH(cpu) { 32ae7467b1SAlex Bennée err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL); 33ae7467b1SAlex Bennée if (err) { 34ae7467b1SAlex Bennée break; 35ae7467b1SAlex Bennée } 36ae7467b1SAlex Bennée } 37ae7467b1SAlex Bennée return err; 38ae7467b1SAlex Bennée default: 39ae7467b1SAlex Bennée /* user-mode doesn't support watchpoints */ 40ae7467b1SAlex Bennée return -ENOSYS; 41ae7467b1SAlex Bennée } 42ae7467b1SAlex Bennée } 43ae7467b1SAlex Bennée 4455b5b8e9SPhilippe Mathieu-Daudé int gdb_breakpoint_remove(CPUState *cs, int type, vaddr addr, vaddr len) 45ae7467b1SAlex Bennée { 46ae7467b1SAlex Bennée CPUState *cpu; 47ae7467b1SAlex Bennée int err = 0; 48ae7467b1SAlex Bennée 49ae7467b1SAlex Bennée switch (type) { 50ae7467b1SAlex Bennée case GDB_BREAKPOINT_SW: 51ae7467b1SAlex Bennée case GDB_BREAKPOINT_HW: 52ae7467b1SAlex Bennée CPU_FOREACH(cpu) { 53ae7467b1SAlex Bennée err = cpu_breakpoint_remove(cpu, addr, BP_GDB); 54ae7467b1SAlex Bennée if (err) { 55ae7467b1SAlex Bennée break; 56ae7467b1SAlex Bennée } 57ae7467b1SAlex Bennée } 58ae7467b1SAlex Bennée return err; 59ae7467b1SAlex Bennée default: 60ae7467b1SAlex Bennée /* user-mode doesn't support watchpoints */ 61ae7467b1SAlex Bennée return -ENOSYS; 62ae7467b1SAlex Bennée } 63ae7467b1SAlex Bennée } 64ae7467b1SAlex Bennée 65ae7467b1SAlex Bennée void gdb_breakpoint_remove_all(CPUState *cs) 66ae7467b1SAlex Bennée { 67ae7467b1SAlex Bennée cpu_breakpoint_remove_all(cs, BP_GDB); 68ae7467b1SAlex Bennée } 69