xref: /qemu/gdbstub/user.c (revision 9455762f)
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