OSDN Git Service

gdbstub: make various helpers visible to the rest of the module
[qmiga/qemu.git] / gdbstub / internals.h
1 /*
2  * gdbstub internals
3  *
4  * Copyright (c) 2022 Linaro Ltd
5  *
6  * SPDX-License-Identifier: GPL-2.0-or-later
7  */
8
9 #ifndef GDBSTUB_INTERNALS_H
10 #define GDBSTUB_INTERNALS_H
11
12 #include "exec/cpu-common.h"
13
14 #define MAX_PACKET_LENGTH 4096
15
16 /*
17  * Shared structures and definitions
18  */
19
20 typedef struct GDBProcess {
21     uint32_t pid;
22     bool attached;
23
24     char target_xml[1024];
25 } GDBProcess;
26
27 enum RSState {
28     RS_INACTIVE,
29     RS_IDLE,
30     RS_GETLINE,
31     RS_GETLINE_ESC,
32     RS_GETLINE_RLE,
33     RS_CHKSUM1,
34     RS_CHKSUM2,
35 };
36
37 typedef struct GDBState {
38     bool init;       /* have we been initialised? */
39     CPUState *c_cpu; /* current CPU for step/continue ops */
40     CPUState *g_cpu; /* current CPU for other ops */
41     CPUState *query_cpu; /* for q{f|s}ThreadInfo */
42     enum RSState state; /* parsing state */
43     char line_buf[MAX_PACKET_LENGTH];
44     int line_buf_index;
45     int line_sum; /* running checksum */
46     int line_csum; /* checksum at the end of the packet */
47     GByteArray *last_packet;
48     int signal;
49     bool multiprocess;
50     GDBProcess *processes;
51     int process_num;
52     char syscall_buf[256];
53     gdb_syscall_complete_cb current_syscall_cb;
54     GString *str_buf;
55     GByteArray *mem_buf;
56     int sstep_flags;
57     int supported_sstep_flags;
58 } GDBState;
59
60
61 /*
62  * Inline utility function, convert from int to hex and back
63  */
64
65 static inline int fromhex(int v)
66 {
67     if (v >= '0' && v <= '9') {
68         return v - '0';
69     } else if (v >= 'A' && v <= 'F') {
70         return v - 'A' + 10;
71     } else if (v >= 'a' && v <= 'f') {
72         return v - 'a' + 10;
73     } else {
74         return 0;
75     }
76 }
77
78 static inline int tohex(int v)
79 {
80     if (v < 10) {
81         return v + '0';
82     } else {
83         return v - 10 + 'a';
84     }
85 }
86
87 /*
88  * Connection helpers for both softmmu and user backends
89  */
90
91 void gdb_put_strbuf(void);
92 int gdb_put_packet(const char *buf);
93 int gdb_put_packet_binary(const char *buf, int len, bool dump);
94 void gdb_hextomem(GByteArray *mem, const char *buf, int len);
95 void gdb_memtohex(GString *buf, const uint8_t *mem, int len);
96 void gdb_memtox(GString *buf, const char *mem, int len);
97 void gdb_read_byte(uint8_t ch);
98
99 /* utility helpers */
100 CPUState *gdb_first_attached_cpu(void);
101 void gdb_append_thread_id(CPUState *cpu, GString *buf);
102 int gdb_get_cpu_index(CPUState *cpu);
103
104 void gdb_init_gdbserver_state(void);
105 void gdb_create_default_process(GDBState *s);
106
107 /*
108  * Helpers with separate softmmu and user implementations
109  */
110 void gdb_put_buffer(const uint8_t *buf, int len);
111
112 /*
113  * Break/Watch point support - there is an implementation for softmmu
114  * and user mode.
115  */
116 bool gdb_supports_guest_debug(void);
117 int gdb_breakpoint_insert(CPUState *cs, int type, vaddr addr, vaddr len);
118 int gdb_breakpoint_remove(CPUState *cs, int type, vaddr addr, vaddr len);
119 void gdb_breakpoint_remove_all(CPUState *cs);
120
121 #endif /* GDBSTUB_INTERNALS_H */