xref: /openbmc/qemu/include/exec/gdbstub.h (revision 5885bcef3d760e84d17eb4113e85f2aea0bd0582)
1022c62cbSPaolo Bonzini #ifndef GDBSTUB_H
2022c62cbSPaolo Bonzini #define GDBSTUB_H
3022c62cbSPaolo Bonzini 
4956af7daSAkihiko Odaki typedef struct GDBFeature {
5956af7daSAkihiko Odaki     const char *xmlname;
6956af7daSAkihiko Odaki     const char *xml;
7eb37086fSAkihiko Odaki     const char *name;
8eb37086fSAkihiko Odaki     const char * const *regs;
96c2313e8SAkihiko Odaki     int num_regs;
10956af7daSAkihiko Odaki } GDBFeature;
11956af7daSAkihiko Odaki 
12e84f4524SAkihiko Odaki typedef struct GDBFeatureBuilder {
13e84f4524SAkihiko Odaki     GDBFeature *feature;
14e84f4524SAkihiko Odaki     GPtrArray *xml;
15eb37086fSAkihiko Odaki     GPtrArray *regs;
16e84f4524SAkihiko Odaki     int base_reg;
17e84f4524SAkihiko Odaki } GDBFeatureBuilder;
18e84f4524SAkihiko Odaki 
195ef0317fSAlex Bennée 
20022c62cbSPaolo Bonzini /* Get or set a register.  Returns the size of the register.  */
2166260159SAkihiko Odaki typedef int (*gdb_get_reg_cb)(CPUState *cpu, GByteArray *buf, int reg);
2266260159SAkihiko Odaki typedef int (*gdb_set_reg_cb)(CPUState *cpu, uint8_t *buf, int reg);
238dd7a4b3SAlex Bennée 
248dd7a4b3SAlex Bennée /**
25ee59fa1dSAkihiko Odaki  * gdb_init_cpu(): Initialize the CPU for gdbstub.
26ee59fa1dSAkihiko Odaki  * @cpu: The CPU to be initialized.
27ee59fa1dSAkihiko Odaki  */
28ee59fa1dSAkihiko Odaki void gdb_init_cpu(CPUState *cpu);
29ee59fa1dSAkihiko Odaki 
30ee59fa1dSAkihiko Odaki /**
318dd7a4b3SAlex Bennée  * gdb_register_coprocessor() - register a supplemental set of registers
328dd7a4b3SAlex Bennée  * @cpu - the CPU associated with registers
338dd7a4b3SAlex Bennée  * @get_reg - get function (gdb reading)
348dd7a4b3SAlex Bennée  * @set_reg - set function (gdb modifying)
358dd7a4b3SAlex Bennée  * @num_regs - number of registers in set
368dd7a4b3SAlex Bennée  * @xml - xml name of set
378dd7a4b3SAlex Bennée  * @gpos - non-zero to append to "general" register set at @gpos
388dd7a4b3SAlex Bennée  */
3922169d41SAndreas Färber void gdb_register_coprocessor(CPUState *cpu,
40a010bdbeSAlex Bennée                               gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg,
41ac1e8671SAkihiko Odaki                               const GDBFeature *feature, int g_pos);
42022c62cbSPaolo Bonzini 
43fcedd920SAlex Bennée /**
44*242da180SSalil Mehta  * gdb_unregister_coprocessor_all() - unregisters supplemental set of registers
45*242da180SSalil Mehta  * @cpu - the CPU associated with registers
46*242da180SSalil Mehta  */
47*242da180SSalil Mehta void gdb_unregister_coprocessor_all(CPUState *cpu);
48*242da180SSalil Mehta 
49*242da180SSalil Mehta /**
50fcedd920SAlex Bennée  * gdbserver_start: start the gdb server
51fcedd920SAlex Bennée  * @port_or_device: connection spec for gdb
52fcedd920SAlex Bennée  *
53fcedd920SAlex Bennée  * For CONFIG_USER this is either a tcp port or a path to a fifo. For
54fcedd920SAlex Bennée  * system emulation you can use a full chardev spec for your gdbserver
55fcedd920SAlex Bennée  * port.
56fcedd920SAlex Bennée  */
57fcedd920SAlex Bennée int gdbserver_start(const char *port_or_device);
58022c62cbSPaolo Bonzini 
591218b68eSAkihiko Odaki /**
60e84f4524SAkihiko Odaki  * gdb_feature_builder_init() - Initialize GDBFeatureBuilder.
61e84f4524SAkihiko Odaki  * @builder: The builder to be initialized.
62e84f4524SAkihiko Odaki  * @feature: The feature to be filled.
63e84f4524SAkihiko Odaki  * @name: The name of the feature.
64e84f4524SAkihiko Odaki  * @xmlname: The name of the XML.
65e84f4524SAkihiko Odaki  * @base_reg: The base number of the register ID.
66e84f4524SAkihiko Odaki  */
67e84f4524SAkihiko Odaki void gdb_feature_builder_init(GDBFeatureBuilder *builder, GDBFeature *feature,
68e84f4524SAkihiko Odaki                               const char *name, const char *xmlname,
69e84f4524SAkihiko Odaki                               int base_reg);
70e84f4524SAkihiko Odaki 
71e84f4524SAkihiko Odaki /**
72e84f4524SAkihiko Odaki  * gdb_feature_builder_append_tag() - Append a tag.
73e84f4524SAkihiko Odaki  * @builder: The builder.
74e84f4524SAkihiko Odaki  * @format: The format of the tag.
75e84f4524SAkihiko Odaki  * @...: The values to be formatted.
76e84f4524SAkihiko Odaki  */
77e84f4524SAkihiko Odaki void G_GNUC_PRINTF(2, 3)
78e84f4524SAkihiko Odaki gdb_feature_builder_append_tag(const GDBFeatureBuilder *builder,
79e84f4524SAkihiko Odaki                                const char *format, ...);
80e84f4524SAkihiko Odaki 
81e84f4524SAkihiko Odaki /**
82e84f4524SAkihiko Odaki  * gdb_feature_builder_append_reg() - Append a register.
83e84f4524SAkihiko Odaki  * @builder: The builder.
84e84f4524SAkihiko Odaki  * @name: The register's name; it must be unique within a CPU.
85e84f4524SAkihiko Odaki  * @bitsize: The register's size, in bits.
86e84f4524SAkihiko Odaki  * @regnum: The offset of the register's number in the feature.
87e84f4524SAkihiko Odaki  * @type: The type of the register.
88e84f4524SAkihiko Odaki  * @group: The register group to which this register belongs; it can be NULL.
89e84f4524SAkihiko Odaki  */
90e84f4524SAkihiko Odaki void gdb_feature_builder_append_reg(const GDBFeatureBuilder *builder,
91e84f4524SAkihiko Odaki                                     const char *name,
92e84f4524SAkihiko Odaki                                     int bitsize,
93e84f4524SAkihiko Odaki                                     int regnum,
94e84f4524SAkihiko Odaki                                     const char *type,
95e84f4524SAkihiko Odaki                                     const char *group);
96e84f4524SAkihiko Odaki 
97e84f4524SAkihiko Odaki /**
98e84f4524SAkihiko Odaki  * gdb_feature_builder_end() - End building GDBFeature.
99e84f4524SAkihiko Odaki  * @builder: The builder.
100e84f4524SAkihiko Odaki  */
101e84f4524SAkihiko Odaki void gdb_feature_builder_end(const GDBFeatureBuilder *builder);
102e84f4524SAkihiko Odaki 
103e84f4524SAkihiko Odaki /**
1041218b68eSAkihiko Odaki  * gdb_find_static_feature() - Find a static feature.
1051218b68eSAkihiko Odaki  * @xmlname: The name of the XML.
1061218b68eSAkihiko Odaki  *
1071218b68eSAkihiko Odaki  * Return: The static feature.
1081218b68eSAkihiko Odaki  */
1091218b68eSAkihiko Odaki const GDBFeature *gdb_find_static_feature(const char *xmlname);
1101218b68eSAkihiko Odaki 
111c3d0b466SAlex Bennée /**
112c3d0b466SAlex Bennée  * gdb_read_register() - Read a register associated with a CPU.
113c3d0b466SAlex Bennée  * @cpu: The CPU associated with the register.
114c3d0b466SAlex Bennée  * @buf: The buffer that the read register will be appended to.
115c3d0b466SAlex Bennée  * @reg: The register's number returned by gdb_find_feature_register().
116c3d0b466SAlex Bennée  *
117c3d0b466SAlex Bennée  * Return: The number of read bytes.
118c3d0b466SAlex Bennée  */
119c3d0b466SAlex Bennée int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
120c3d0b466SAlex Bennée 
121c3d0b466SAlex Bennée /**
122c3d0b466SAlex Bennée  * typedef GDBRegDesc - a register description from gdbstub
123c3d0b466SAlex Bennée  */
124c3d0b466SAlex Bennée typedef struct {
125c3d0b466SAlex Bennée     int gdb_reg;
126c3d0b466SAlex Bennée     const char *name;
127c3d0b466SAlex Bennée     const char *feature_name;
128c3d0b466SAlex Bennée } GDBRegDesc;
129c3d0b466SAlex Bennée 
130c3d0b466SAlex Bennée /**
131c3d0b466SAlex Bennée  * gdb_get_register_list() - Return list of all registers for CPU
132c3d0b466SAlex Bennée  * @cpu: The CPU being searched
133c3d0b466SAlex Bennée  *
134c3d0b466SAlex Bennée  * Returns a GArray of GDBRegDesc, caller frees array but not the
135c3d0b466SAlex Bennée  * const strings.
136c3d0b466SAlex Bennée  */
137c3d0b466SAlex Bennée GArray *gdb_get_register_list(CPUState *cpu);
138c3d0b466SAlex Bennée 
139e52fc5e1SPhilippe Mathieu-Daudé void gdb_set_stop_cpu(CPUState *cpu);
140e52fc5e1SPhilippe Mathieu-Daudé 
141956af7daSAkihiko Odaki /* in gdbstub-xml.c, generated by scripts/feature_to_c.py */
142956af7daSAkihiko Odaki extern const GDBFeature gdb_static_features[];
143022c62cbSPaolo Bonzini 
144b31bf9f8SAlex Bennée #endif /* GDBSTUB_H */
145