]>
Commit | Line | Data |
---|---|---|
ae7467b1 AB |
1 | /* |
2 | * gdbstub user-mode helper routines. | |
3 | * | |
4 | * We know for user-mode we are using TCG so we can call stuff directly. | |
5 | * | |
6 | * Copyright (c) 2022 Linaro Ltd | |
7 | * | |
8 | * SPDX-License-Identifier: GPL-2.0-or-later | |
9 | */ | |
10 | ||
11 | #include "qemu/osdep.h" | |
12 | #include "exec/hwaddr.h" | |
13 | #include "exec/gdbstub.h" | |
14 | #include "hw/core/cpu.h" | |
15 | #include "internals.h" | |
16 | ||
a48e7d9e AB |
17 | bool gdb_supports_guest_debug(void) |
18 | { | |
19 | /* user-mode == TCG == supported */ | |
20 | return true; | |
21 | } | |
22 | ||
ae7467b1 AB |
23 | int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len) |
24 | { | |
25 | CPUState *cpu; | |
26 | int err = 0; | |
27 | ||
28 | switch (type) { | |
29 | case GDB_BREAKPOINT_SW: | |
30 | case GDB_BREAKPOINT_HW: | |
31 | CPU_FOREACH(cpu) { | |
32 | err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL); | |
33 | if (err) { | |
34 | break; | |
35 | } | |
36 | } | |
37 | return err; | |
38 | default: | |
39 | /* user-mode doesn't support watchpoints */ | |
40 | return -ENOSYS; | |
41 | } | |
42 | } | |
43 | ||
44 | int gdb_breakpoint_remove(CPUState *cs, int type, hwaddr addr, hwaddr len) | |
45 | { | |
46 | CPUState *cpu; | |
47 | int err = 0; | |
48 | ||
49 | switch (type) { | |
50 | case GDB_BREAKPOINT_SW: | |
51 | case GDB_BREAKPOINT_HW: | |
52 | CPU_FOREACH(cpu) { | |
53 | err = cpu_breakpoint_remove(cpu, addr, BP_GDB); | |
54 | if (err) { | |
55 | break; | |
56 | } | |
57 | } | |
58 | return err; | |
59 | default: | |
60 | /* user-mode doesn't support watchpoints */ | |
61 | return -ENOSYS; | |
62 | } | |
63 | } | |
64 | ||
65 | void gdb_breakpoint_remove_all(CPUState *cs) | |
66 | { | |
67 | cpu_breakpoint_remove_all(cs, BP_GDB); | |
68 | } |