]> Git Repo - qemu.git/blame - docs/qapi-code-gen.txt
Merge remote-tracking branch 'remotes/bonzini/softmmu-smap' into staging
[qemu.git] / docs / qapi-code-gen.txt
CommitLineData
b84da831
MR
1= How to use the QAPI code generator =
2
3* Note: as of this writing, QMP does not use QAPI. Eventually QMP
4commands will be converted to use QAPI internally. The following
5information describes QMP/QAPI as it will exist after the
6conversion.
7
8QAPI is a native C API within QEMU which provides management-level
9functionality to internal/external users. For external
10users/processes, this interface is made available by a JSON-based
11QEMU Monitor protocol that is provided by the QMP server.
12
13To map QMP-defined interfaces to the native C QAPI implementations,
14a JSON-based schema is used to define types and function
15signatures, and a set of scripts is used to generate types/signatures,
16and marshaling/dispatch code. The QEMU Guest Agent also uses these
4238e264 17scripts, paired with a separate schema, to generate
b84da831
MR
18marshaling/dispatch code for the guest agent server running in the
19guest.
20
21This document will describe how the schemas, scripts, and resulting
22code is used.
23
24
25== QMP/Guest agent schema ==
26
27This file defines the types, commands, and events used by QMP. It should
28fully describe the interface used by QMP.
29
30This file is designed to be loosely based on JSON although it's technically
31executable Python. While dictionaries are used, they are parsed as
32OrderedDicts so that ordering is preserved.
33
34There are two basic syntaxes used, type definitions and command definitions.
35
36The first syntax defines a type and is represented by a dictionary. There are
51631493
KW
37three kinds of user-defined types that are supported: complex types,
38enumeration types and union types.
b84da831 39
51631493
KW
40Generally speaking, types definitions should always use CamelCase for the type
41names. Command names should be all lower case with words separated by a hyphen.
42
a719a27c
LV
43
44=== Includes ===
45
46The QAPI schema definitions can be modularized using the 'include' directive:
47
48 { 'include': 'path/to/file.json'}
49
50The directive is evaluated recursively, and include paths are relative to the
24fd8489 51file using the directive. Multiple includes of the same file are safe.
a719a27c
LV
52
53
51631493
KW
54=== Complex types ===
55
56A complex type is a dictionary containing a single key whose value is a
b84da831
MR
57dictionary. This corresponds to a struct in C or an Object in JSON. An
58example of a complex type is:
59
60 { 'type': 'MyType',
acf8394e 61 'data': { 'member1': 'str', 'member2': 'int', '*member3': 'str' } }
b84da831 62
cc162655
EB
63The use of '*' as a prefix to the name means the member is optional.
64
65The default initialization value of an optional argument should not be changed
66between versions of QEMU unless the new default maintains backward
67compatibility to the user-visible behavior of the old default.
68
69With proper documentation, this policy still allows some flexibility; for
70example, documenting that a default of 0 picks an optimal buffer size allows
71one release to declare the optimal size at 512 while another release declares
72the optimal size at 4096 - the user-visible behavior is not the bytes used by
73the buffer, but the fact that the buffer was optimal size.
74
75On input structures (only mentioned in the 'data' side of a command), changing
76from mandatory to optional is safe (older clients will supply the option, and
77newer clients can benefit from the default); changing from optional to
78mandatory is backwards incompatible (older clients may be omitting the option,
79and must continue to work).
80
81On output structures (only mentioned in the 'returns' side of a command),
82changing from mandatory to optional is in general unsafe (older clients may be
83expecting the field, and could crash if it is missing), although it can be done
84if the only way that the optional argument will be omitted is when it is
85triggered by the presence of a new input flag to the command that older clients
86don't know to send. Changing from optional to mandatory is safe.
87
88A structure that is used in both input and output of various commands
89must consider the backwards compatibility constraints of both directions
90of use.
622f557f
KW
91
92A complex type definition can specify another complex type as its base.
93In this case, the fields of the base type are included as top-level fields
94of the new complex type's dictionary in the QMP wire format. An example
95definition is:
96
97 { 'type': 'BlockdevOptionsGenericFormat', 'data': { 'file': 'str' } }
98 { 'type': 'BlockdevOptionsGenericCOWFormat',
99 'base': 'BlockdevOptionsGenericFormat',
100 'data': { '*backing': 'str' } }
101
102An example BlockdevOptionsGenericCOWFormat object on the wire could use
103both fields like this:
104
105 { "file": "/some/place/my-image",
106 "backing": "/some/place/my-backing-file" }
107
51631493
KW
108=== Enumeration types ===
109
110An enumeration type is a dictionary containing a single key whose value is a
b84da831
MR
111list of strings. An example enumeration is:
112
113 { 'enum': 'MyEnum', 'data': [ 'value1', 'value2', 'value3' ] }
114
51631493
KW
115=== Union types ===
116
117Union types are used to let the user choose between several different data
118types. A union type is defined using a dictionary as explained in the
119following paragraphs.
120
121
122A simple union type defines a mapping from discriminator values to data types
123like in this example:
124
125 { 'type': 'FileOptions', 'data': { 'filename': 'str' } }
126 { 'type': 'Qcow2Options',
127 'data': { 'backing-file': 'str', 'lazy-refcounts': 'bool' } }
128
129 { 'union': 'BlockdevOptions',
130 'data': { 'file': 'FileOptions',
131 'qcow2': 'Qcow2Options' } }
132
133In the QMP wire format, a simple union is represented by a dictionary that
134contains the 'type' field as a discriminator, and a 'data' field that is of the
135specified data type corresponding to the discriminator value:
136
137 { "type": "qcow2", "data" : { "backing-file": "/some/place/my-image",
138 "lazy-refcounts": true } }
139
140
141A union definition can specify a complex type as its base. In this case, the
142fields of the complex type are included as top-level fields of the union
143dictionary in the QMP wire format. An example definition is:
144
145 { 'type': 'BlockdevCommonOptions', 'data': { 'readonly': 'bool' } }
146 { 'union': 'BlockdevOptions',
147 'base': 'BlockdevCommonOptions',
148 'data': { 'raw': 'RawOptions',
149 'qcow2': 'Qcow2Options' } }
150
151And it looks like this on the wire:
152
153 { "type": "qcow2",
154 "readonly": false,
155 "data" : { "backing-file": "/some/place/my-image",
156 "lazy-refcounts": true } }
157
50f2bdc7
KW
158
159Flat union types avoid the nesting on the wire. They are used whenever a
160specific field of the base type is declared as the discriminator ('type' is
5223070c 161then no longer generated). The discriminator must be of enumeration type.
50f2bdc7
KW
162The above example can then be modified as follows:
163
bceae769 164 { 'enum': 'BlockdevDriver', 'data': [ 'raw', 'qcow2' ] }
50f2bdc7 165 { 'type': 'BlockdevCommonOptions',
bceae769 166 'data': { 'driver': 'BlockdevDriver', 'readonly': 'bool' } }
50f2bdc7
KW
167 { 'union': 'BlockdevOptions',
168 'base': 'BlockdevCommonOptions',
169 'discriminator': 'driver',
170 'data': { 'raw': 'RawOptions',
171 'qcow2': 'Qcow2Options' } }
172
173Resulting in this JSON object:
174
175 { "driver": "qcow2",
176 "readonly": false,
177 "backing-file": "/some/place/my-image",
178 "lazy-refcounts": true }
179
180
69dd62df
KW
181A special type of unions are anonymous unions. They don't form a dictionary in
182the wire format but allow the direct use of different types in their place. As
183they aren't structured, they don't have any explicit discriminator but use
184the (QObject) data type of their value as an implicit discriminator. This means
185that they are restricted to using only one discriminator value per QObject
186type. For example, you cannot have two different complex types in an anonymous
187union, or two different integer types.
188
189Anonymous unions are declared using an empty dictionary as their discriminator.
190The discriminator values never appear on the wire, they are only used in the
191generated C code. Anonymous unions cannot have a base type.
192
193 { 'union': 'BlockRef',
194 'discriminator': {},
195 'data': { 'definition': 'BlockdevOptions',
196 'reference': 'str' } }
197
198This example allows using both of the following example objects:
199
200 { "file": "my_existing_block_device_id" }
201 { "file": { "driver": "file",
202 "readonly": false,
63922c64 203 "filename": "/tmp/mydisk.qcow2" } }
69dd62df
KW
204
205
51631493 206=== Commands ===
b84da831
MR
207
208Commands are defined by using a list containing three members. The first
209member is the command name, the second member is a dictionary containing
210arguments, and the third member is the return type.
211
212An example command is:
213
214 { 'command': 'my-command',
215 'data': { 'arg1': 'str', '*arg2': 'str' },
acf8394e 216 'returns': 'str' }
b84da831 217
b84da831
MR
218
219== Code generation ==
220
221Schemas are fed into 3 scripts to generate all the code/files that, paired
222with the core QAPI libraries, comprise everything required to take JSON
223commands read in by a QMP/guest agent server, unmarshal the arguments into
224the underlying C types, call into the corresponding C function, and map the
225response back to a QMP/guest agent response to be returned to the user.
226
227As an example, we'll use the following schema, which describes a single
228complex user-defined type (which will produce a C struct, along with a list
229node structure that can be used to chain together a list of such types in
230case we want to accept/return a list of this type with a command), and a
231command which takes that type as a parameter and returns the same type:
232
87a560c4 233 $ cat example-schema.json
b84da831
MR
234 { 'type': 'UserDefOne',
235 'data': { 'integer': 'int', 'string': 'str' } }
236
237 { 'command': 'my-command',
238 'data': {'arg1': 'UserDefOne'},
239 'returns': 'UserDefOne' }
b84da831
MR
240
241=== scripts/qapi-types.py ===
242
243Used to generate the C types defined by a schema. The following files are
244created:
245
246$(prefix)qapi-types.h - C types corresponding to types defined in
247 the schema you pass in
248$(prefix)qapi-types.c - Cleanup functions for the above C types
249
250The $(prefix) is an optional parameter used as a namespace to keep the
251generated code from one schema/code-generation separated from others so code
252can be generated/used from multiple schemas without clobbering previously
253created code.
254
255Example:
256
87a560c4
MA
257 $ python scripts/qapi-types.py --output-dir="qapi-generated" \
258 --prefix="example-" --input-file=example-schema.json
259 $ cat qapi-generated/example-qapi-types.c
6e2bb3ec
MA
260[Uninteresting stuff omitted...]
261
262 void qapi_free_UserDefOneList(UserDefOneList * obj)
263 {
264 QapiDeallocVisitor *md;
265 Visitor *v;
266
267 if (!obj) {
268 return;
269 }
270
271 md = qapi_dealloc_visitor_new();
272 v = qapi_dealloc_get_visitor(md);
273 visit_type_UserDefOneList(v, &obj, NULL, NULL);
274 qapi_dealloc_visitor_cleanup(md);
275 }
b84da831 276
b84da831
MR
277 void qapi_free_UserDefOne(UserDefOne * obj)
278 {
279 QapiDeallocVisitor *md;
280 Visitor *v;
281
282 if (!obj) {
283 return;
284 }
285
286 md = qapi_dealloc_visitor_new();
287 v = qapi_dealloc_get_visitor(md);
288 visit_type_UserDefOne(v, &obj, NULL, NULL);
289 qapi_dealloc_visitor_cleanup(md);
290 }
291
87a560c4 292 $ cat qapi-generated/example-qapi-types.h
6e2bb3ec
MA
293[Uninteresting stuff omitted...]
294
295 #ifndef EXAMPLE_QAPI_TYPES_H
296 #define EXAMPLE_QAPI_TYPES_H
b84da831 297
6e2bb3ec 298[Builtin types omitted...]
b84da831
MR
299
300 typedef struct UserDefOne UserDefOne;
301
302 typedef struct UserDefOneList
303 {
6e2bb3ec
MA
304 union {
305 UserDefOne *value;
306 uint64_t padding;
307 };
b84da831
MR
308 struct UserDefOneList *next;
309 } UserDefOneList;
310
6e2bb3ec
MA
311[Functions on builtin types omitted...]
312
b84da831
MR
313 struct UserDefOne
314 {
315 int64_t integer;
316 char * string;
317 };
318
6e2bb3ec 319 void qapi_free_UserDefOneList(UserDefOneList * obj);
b84da831
MR
320 void qapi_free_UserDefOne(UserDefOne * obj);
321
322 #endif
323
b84da831
MR
324=== scripts/qapi-visit.py ===
325
326Used to generate the visitor functions used to walk through and convert
327a QObject (as provided by QMP) to a native C data structure and
328vice-versa, as well as the visitor function used to dealloc a complex
329schema-defined C type.
330
331The following files are generated:
332
333$(prefix)qapi-visit.c: visitor function for a particular C type, used
334 to automagically convert QObjects into the
335 corresponding C type and vice-versa, as well
336 as for deallocating memory for an existing C
337 type
338
339$(prefix)qapi-visit.h: declarations for previously mentioned visitor
340 functions
341
342Example:
343
87a560c4
MA
344 $ python scripts/qapi-visit.py --output-dir="qapi-generated"
345 --prefix="example-" --input-file=example-schema.json
346 $ cat qapi-generated/example-qapi-visit.c
6e2bb3ec 347[Uninteresting stuff omitted...]
b84da831 348
6e2bb3ec
MA
349 static void visit_type_UserDefOne_fields(Visitor *m, UserDefOne ** obj, Error **errp)
350 {
351 Error *err = NULL;
352 visit_type_int(m, &(*obj)->integer, "integer", &err);
297a3646
MA
353 if (err) {
354 goto out;
355 }
6e2bb3ec 356 visit_type_str(m, &(*obj)->string, "string", &err);
297a3646
MA
357 if (err) {
358 goto out;
359 }
6e2bb3ec 360
297a3646 361 out:
6e2bb3ec
MA
362 error_propagate(errp, err);
363 }
b84da831
MR
364
365 void visit_type_UserDefOne(Visitor *m, UserDefOne ** obj, const char *name, Error **errp)
366 {
297a3646
MA
367 Error *err = NULL;
368
369 visit_start_struct(m, (void **)obj, "UserDefOne", name, sizeof(UserDefOne), &err);
370 if (!err) {
371 if (*obj) {
372 visit_type_UserDefOne_fields(m, obj, errp);
6e2bb3ec 373 }
297a3646 374 visit_end_struct(m, &err);
6e2bb3ec 375 }
297a3646 376 error_propagate(errp, err);
b84da831
MR
377 }
378
379 void visit_type_UserDefOneList(Visitor *m, UserDefOneList ** obj, const char *name, Error **errp)
380 {
6e2bb3ec 381 Error *err = NULL;
297a3646 382 GenericList *i, **prev;
6e2bb3ec 383
297a3646
MA
384 visit_start_list(m, name, &err);
385 if (err) {
386 goto out;
387 }
388
389 for (prev = (GenericList **)obj;
390 !err && (i = visit_next_list(m, prev, &err)) != NULL;
391 prev = &i) {
392 UserDefOneList *native_i = (UserDefOneList *)i;
393 visit_type_UserDefOne(m, &native_i->value, NULL, &err);
b84da831 394 }
297a3646
MA
395
396 error_propagate(errp, err);
397 err = NULL;
398 visit_end_list(m, &err);
399 out:
400 error_propagate(errp, err);
b84da831 401 }
87a560c4
MA
402 $ python scripts/qapi-commands.py --output-dir="qapi-generated" \
403 --prefix="example-" --input-file=example-schema.json
404 $ cat qapi-generated/example-qapi-visit.h
6e2bb3ec 405[Uninteresting stuff omitted...]
b84da831 406
6e2bb3ec
MA
407 #ifndef EXAMPLE_QAPI_VISIT_H
408 #define EXAMPLE_QAPI_VISIT_H
b84da831 409
6e2bb3ec 410[Visitors for builtin types omitted...]
b84da831
MR
411
412 void visit_type_UserDefOne(Visitor *m, UserDefOne ** obj, const char *name, Error **errp);
413 void visit_type_UserDefOneList(Visitor *m, UserDefOneList ** obj, const char *name, Error **errp);
414
415 #endif
b84da831 416
b84da831
MR
417=== scripts/qapi-commands.py ===
418
419Used to generate the marshaling/dispatch functions for the commands defined
420in the schema. The following files are generated:
421
422$(prefix)qmp-marshal.c: command marshal/dispatch functions for each
423 QMP command defined in the schema. Functions
424 generated by qapi-visit.py are used to
2542bfd5 425 convert QObjects received from the wire into
b84da831
MR
426 function parameters, and uses the same
427 visitor functions to convert native C return
428 values to QObjects from transmission back
429 over the wire.
430
431$(prefix)qmp-commands.h: Function prototypes for the QMP commands
432 specified in the schema.
433
434Example:
435
87a560c4 436 $ cat qapi-generated/example-qmp-marshal.c
6e2bb3ec 437[Uninteresting stuff omitted...]
b84da831 438
b84da831
MR
439 static void qmp_marshal_output_my_command(UserDefOne * ret_in, QObject **ret_out, Error **errp)
440 {
297a3646 441 Error *local_err = NULL;
b84da831 442 QmpOutputVisitor *mo = qmp_output_visitor_new();
f9bee751 443 QapiDeallocVisitor *md;
b84da831
MR
444 Visitor *v;
445
446 v = qmp_output_get_visitor(mo);
297a3646
MA
447 visit_type_UserDefOne(v, &ret_in, "unused", &local_err);
448 if (local_err) {
449 goto out;
6e2bb3ec 450 }
297a3646
MA
451 *ret_out = qmp_output_get_qobject(mo);
452
453 out:
454 error_propagate(errp, local_err);
6e2bb3ec 455 qmp_output_visitor_cleanup(mo);
f9bee751 456 md = qapi_dealloc_visitor_new();
b84da831 457 v = qapi_dealloc_get_visitor(md);
6e2bb3ec 458 visit_type_UserDefOne(v, &ret_in, "unused", NULL);
b84da831 459 qapi_dealloc_visitor_cleanup(md);
b84da831
MR
460 }
461
6e2bb3ec 462 static void qmp_marshal_input_my_command(QDict *args, QObject **ret, Error **errp)
b84da831 463 {
297a3646 464 Error *local_err = NULL;
b84da831 465 UserDefOne * retval = NULL;
f9bee751 466 QmpInputVisitor *mi = qmp_input_visitor_new_strict(QOBJECT(args));
b84da831
MR
467 QapiDeallocVisitor *md;
468 Visitor *v;
469 UserDefOne * arg1 = NULL;
470
b84da831 471 v = qmp_input_get_visitor(mi);
297a3646
MA
472 visit_type_UserDefOne(v, &arg1, "arg1", &local_err);
473 if (local_err) {
b84da831
MR
474 goto out;
475 }
297a3646
MA
476
477 retval = qmp_my_command(arg1, &local_err);
478 if (local_err) {
479 goto out;
6e2bb3ec 480 }
b84da831 481
297a3646
MA
482 qmp_marshal_output_my_command(retval, ret, &local_err);
483
b84da831 484 out:
297a3646 485 error_propagate(errp, local_err);
f9bee751 486 qmp_input_visitor_cleanup(mi);
b84da831
MR
487 md = qapi_dealloc_visitor_new();
488 v = qapi_dealloc_get_visitor(md);
6e2bb3ec 489 visit_type_UserDefOne(v, &arg1, "arg1", NULL);
b84da831
MR
490 qapi_dealloc_visitor_cleanup(md);
491 return;
492 }
493
494 static void qmp_init_marshal(void)
495 {
6e2bb3ec 496 qmp_register_command("my-command", qmp_marshal_input_my_command, QCO_NO_OPTIONS);
b84da831
MR
497 }
498
499 qapi_init(qmp_init_marshal);
87a560c4 500 $ cat qapi-generated/example-qmp-commands.h
6e2bb3ec 501[Uninteresting stuff omitted...]
b84da831 502
6e2bb3ec
MA
503 #ifndef EXAMPLE_QMP_COMMANDS_H
504 #define EXAMPLE_QMP_COMMANDS_H
b84da831
MR
505
506 #include "example-qapi-types.h"
6e2bb3ec
MA
507 #include "qapi/qmp/qdict.h"
508 #include "qapi/error.h"
b84da831
MR
509
510 UserDefOne * qmp_my_command(UserDefOne * arg1, Error **errp);
511
512 #endif
This page took 0.307631 seconds and 4 git commands to generate.