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: The table with the additional query packet handlers. 78 * @size: The number of handlers to be added. 79 */ 80 void gdb_extend_query_table(GdbCmdParseEntry *table, int size); 81 82 /** 83 * gdb_extend_set_table() - Extend set table. 84 * @table: The table with the additional set packet handlers. 85 * @size: The number of handlers to be added. 86 */ 87 void gdb_extend_set_table(GdbCmdParseEntry *table, int size); 88 89 /** 90 * gdb_extend_qsupported_features() - Extend the qSupported features string. 91 * @qsupported_features: The additional qSupported feature(s) string. The string 92 * should start with a semicolon and, if there are more than one feature, the 93 * features should be separate by a semiocolon. 94 */ 95 void gdb_extend_qsupported_features(char *qsupported_features); 96 97 /** 98 * Convert a hex string to bytes. Conversion is done per byte, so 2 hex digits 99 * are converted to 1 byte. Invalid hex digits are treated as 0 digits. 100 */ 101 void gdb_hextomem(GByteArray *mem, const char *buf, int len); 102 103 #endif /* GDBSTUB_COMMANDS_H */ 104