xref: /qemu/gdbstub/user.c (revision a48e7d9e)
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  *
6ae7467b1SAlex Bennée  * Copyright (c) 2022 Linaro Ltd
7ae7467b1SAlex Bennée  *
8ae7467b1SAlex Bennée  * SPDX-License-Identifier: GPL-2.0-or-later
9ae7467b1SAlex Bennée  */
10ae7467b1SAlex Bennée 
11ae7467b1SAlex Bennée #include "qemu/osdep.h"
12ae7467b1SAlex Bennée #include "exec/hwaddr.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 
17*a48e7d9eSAlex Bennée bool gdb_supports_guest_debug(void)
18*a48e7d9eSAlex Bennée {
19*a48e7d9eSAlex Bennée     /* user-mode == TCG == supported */
20*a48e7d9eSAlex Bennée     return true;
21*a48e7d9eSAlex Bennée }
22*a48e7d9eSAlex Bennée 
23ae7467b1SAlex Bennée int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr 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 
44ae7467b1SAlex Bennée int gdb_breakpoint_remove(CPUState *cs, int type, hwaddr addr, hwaddr 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