xref: /openbmc/qemu/include/gdbstub/commands.h (revision 29318db1)
1 #ifndef GDBSTUB_COMMANDS_H
2 #define GDBSTUB
3 
4 typedef void (*GdbCmdHandler)(GArray *params, void *user_ctx);
5 
6 typedef enum GDBThreadIdKind {
7     GDB_ONE_THREAD = 0,
8     GDB_ALL_THREADS,     /* One process, all threads */
9     GDB_ALL_PROCESSES,
10     GDB_READ_THREAD_ERR
11 } GDBThreadIdKind;
12 
13 typedef union GdbCmdVariant {
14     const char *data;
15     uint8_t opcode;
16     unsigned long val_ul;
17     unsigned long long val_ull;
18     struct {
19         GDBThreadIdKind kind;
20         uint32_t pid;
21         uint32_t tid;
22     } thread_id;
23 } GdbCmdVariant;
24 
25 #define gdb_get_cmd_param(p, i)    (&g_array_index(p, GdbCmdVariant, i))
26 
27 /**
28  * typedef GdbCmdParseEntry - gdb command parser
29  *
30  * This structure keeps the information necessary to match a gdb command,
31  * parse it (extract its parameters), and select the correct handler for it.
32  *
33  * @cmd: The command to be matched
34  * @cmd_startswith: If true, @cmd is compared using startswith
35  * @schema: Each schema for the command parameter entry consists of 2 chars,
36  * the first char represents the parameter type handling the second char
37  * represents the delimiter for the next parameter.
38  *
39  * Currently supported schema types:
40  * 'l' -> unsigned long (stored in .val_ul)
41  * 'L' -> unsigned long long (stored in .val_ull)
42  * 's' -> string (stored in .data)
43  * 'o' -> single char (stored in .opcode)
44  * 't' -> thread id (stored in .thread_id)
45  * '?' -> skip according to delimiter
46  *
47  * Currently supported delimiters:
48  * '?' -> Stop at any delimiter (",;:=\0")
49  * '0' -> Stop at "\0"
50  * '.' -> Skip 1 char unless reached "\0"
51  * Any other value is treated as the delimiter value itself
52  *
53  * @allow_stop_reply: True iff the gdbstub can respond to this command with a
54  * "stop reply" packet. The list of commands that accept such response is
55  * defined at the GDB Remote Serial Protocol documentation. See:
56  * https://sourceware.org/gdb/onlinedocs/gdb/Stop-Reply-Packets.html#Stop-Reply-Packets.
57  *
58  * @need_cpu_context: Pass current CPU context to command handler via user_ctx.
59  */
60 typedef struct GdbCmdParseEntry {
61     GdbCmdHandler handler;
62     const char *cmd;
63     bool cmd_startswith;
64     const char *schema;
65     bool allow_stop_reply;
66     bool need_cpu_context;
67 } GdbCmdParseEntry;
68 
69 /**
70  * gdb_put_packet() - put string into gdb server's buffer so it is sent
71  * to the client
72  */
73 int gdb_put_packet(const char *buf);
74 
75 /**
76  * gdb_extend_query_table() - Extend query table.
77  * @table: GPtrArray of GdbCmdParseEntry entries.
78  *
79  * The caller should free @table afterwards
80  */
81 void gdb_extend_query_table(GPtrArray *table);
82 
83 /**
84  * gdb_extend_set_table() - Extend set table.
85  * @table: GPtrArray of GdbCmdParseEntry entries.
86  *
87  * The caller should free @table afterwards
88  */
89 void gdb_extend_set_table(GPtrArray *table);
90 
91 /**
92  * gdb_extend_qsupported_features() - Extend the qSupported features string.
93  * @qsupported_features: The additional qSupported feature(s) string. The string
94  * should start with a semicolon and, if there are more than one feature, the
95  * features should be separate by a semicolon.
96  *
97  * The caller should free @qsupported_features afterwards if
98  * dynamically allocated.
99  */
100 void gdb_extend_qsupported_features(char *qsupported_features);
101 
102 /**
103  * Convert a hex string to bytes. Conversion is done per byte, so 2 hex digits
104  * are converted to 1 byte. Invalid hex digits are treated as 0 digits.
105  */
106 void gdb_hextomem(GByteArray *mem, const char *buf, int len);
107 
108 #endif /* GDBSTUB_COMMANDS_H */
109