mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-09 22:05:41 +00:00
qapi: Update scripts to commit 01b2ffcedd94ad7b42bc870e4c6936c87ad03429
This commit is contained in:
parent
dd77730d49
commit
a6623ce754
|
@ -14,6 +14,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
#include "qapi/dealloc-visitor.h"
|
#include "qapi/dealloc-visitor.h"
|
||||||
#include "qapi-types.h"
|
#include "qapi-types.h"
|
||||||
#include "qapi-visit.h"
|
#include "qapi-visit.h"
|
||||||
|
|
|
@ -16,8 +16,6 @@
|
||||||
#ifndef QAPI_TYPES_H
|
#ifndef QAPI_TYPES_H
|
||||||
#define QAPI_TYPES_H
|
#define QAPI_TYPES_H
|
||||||
|
|
||||||
#include "qemu/typedefs.h"
|
|
||||||
#include "unicorn/platform.h"
|
|
||||||
|
|
||||||
#ifndef QAPI_TYPES_BUILTIN
|
#ifndef QAPI_TYPES_BUILTIN
|
||||||
#define QAPI_TYPES_BUILTIN
|
#define QAPI_TYPES_BUILTIN
|
||||||
|
@ -33,104 +31,133 @@ typedef enum QType {
|
||||||
QTYPE_QBOOL = 6,
|
QTYPE_QBOOL = 6,
|
||||||
QTYPE__MAX = 7,
|
QTYPE__MAX = 7,
|
||||||
} QType;
|
} QType;
|
||||||
|
|
||||||
extern const char *const QType_lookup[];
|
extern const char *const QType_lookup[];
|
||||||
|
|
||||||
typedef struct anyList anyList;
|
typedef struct anyList anyList;
|
||||||
|
|
||||||
struct anyList {
|
struct anyList {
|
||||||
anyList *next;
|
anyList *next;
|
||||||
QObject *value;
|
QObject *value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_anyList(anyList *obj);
|
void qapi_free_anyList(anyList *obj);
|
||||||
|
|
||||||
typedef struct boolList boolList;
|
typedef struct boolList boolList;
|
||||||
|
|
||||||
struct boolList {
|
struct boolList {
|
||||||
boolList *next;
|
boolList *next;
|
||||||
bool value;
|
bool value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_boolList(boolList *obj);
|
void qapi_free_boolList(boolList *obj);
|
||||||
|
|
||||||
typedef struct int16List int16List;
|
typedef struct int16List int16List;
|
||||||
|
|
||||||
struct int16List {
|
struct int16List {
|
||||||
int16List *next;
|
int16List *next;
|
||||||
int16_t value;
|
int16_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_int16List(int16List *obj);
|
void qapi_free_int16List(int16List *obj);
|
||||||
|
|
||||||
typedef struct int32List int32List;
|
typedef struct int32List int32List;
|
||||||
|
|
||||||
struct int32List {
|
struct int32List {
|
||||||
int32List *next;
|
int32List *next;
|
||||||
int32_t value;
|
int32_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_int32List(int32List *obj);
|
void qapi_free_int32List(int32List *obj);
|
||||||
|
|
||||||
typedef struct int64List int64List;
|
typedef struct int64List int64List;
|
||||||
|
|
||||||
struct int64List {
|
struct int64List {
|
||||||
int64List *next;
|
int64List *next;
|
||||||
int64_t value;
|
int64_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_int64List(int64List *obj);
|
void qapi_free_int64List(int64List *obj);
|
||||||
|
|
||||||
typedef struct int8List int8List;
|
typedef struct int8List int8List;
|
||||||
|
|
||||||
struct int8List {
|
struct int8List {
|
||||||
int8List *next;
|
int8List *next;
|
||||||
int8_t value;
|
int8_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_int8List(int8List *obj);
|
void qapi_free_int8List(int8List *obj);
|
||||||
|
|
||||||
typedef struct intList intList;
|
typedef struct intList intList;
|
||||||
|
|
||||||
struct intList {
|
struct intList {
|
||||||
intList *next;
|
intList *next;
|
||||||
int64_t value;
|
int64_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_intList(intList *obj);
|
void qapi_free_intList(intList *obj);
|
||||||
|
|
||||||
typedef struct numberList numberList;
|
typedef struct numberList numberList;
|
||||||
|
|
||||||
struct numberList {
|
struct numberList {
|
||||||
numberList *next;
|
numberList *next;
|
||||||
double value;
|
double value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_numberList(numberList *obj);
|
void qapi_free_numberList(numberList *obj);
|
||||||
|
|
||||||
typedef struct sizeList sizeList;
|
typedef struct sizeList sizeList;
|
||||||
|
|
||||||
struct sizeList {
|
struct sizeList {
|
||||||
sizeList *next;
|
sizeList *next;
|
||||||
uint64_t value;
|
uint64_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_sizeList(sizeList *obj);
|
void qapi_free_sizeList(sizeList *obj);
|
||||||
|
|
||||||
typedef struct strList strList;
|
typedef struct strList strList;
|
||||||
|
|
||||||
struct strList {
|
struct strList {
|
||||||
strList *next;
|
strList *next;
|
||||||
char *value;
|
char *value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_strList(strList *obj);
|
void qapi_free_strList(strList *obj);
|
||||||
|
|
||||||
typedef struct uint16List uint16List;
|
typedef struct uint16List uint16List;
|
||||||
|
|
||||||
struct uint16List {
|
struct uint16List {
|
||||||
uint16List *next;
|
uint16List *next;
|
||||||
uint16_t value;
|
uint16_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_uint16List(uint16List *obj);
|
void qapi_free_uint16List(uint16List *obj);
|
||||||
|
|
||||||
typedef struct uint32List uint32List;
|
typedef struct uint32List uint32List;
|
||||||
|
|
||||||
struct uint32List {
|
struct uint32List {
|
||||||
uint32List *next;
|
uint32List *next;
|
||||||
uint32_t value;
|
uint32_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_uint32List(uint32List *obj);
|
void qapi_free_uint32List(uint32List *obj);
|
||||||
|
|
||||||
typedef struct uint64List uint64List;
|
typedef struct uint64List uint64List;
|
||||||
|
|
||||||
struct uint64List {
|
struct uint64List {
|
||||||
uint64List *next;
|
uint64List *next;
|
||||||
uint64_t value;
|
uint64_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_uint64List(uint64List *obj);
|
void qapi_free_uint64List(uint64List *obj);
|
||||||
|
|
||||||
typedef struct uint8List uint8List;
|
typedef struct uint8List uint8List;
|
||||||
|
|
||||||
struct uint8List {
|
struct uint8List {
|
||||||
uint8List *next;
|
uint8List *next;
|
||||||
uint8_t value;
|
uint8_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_uint8List(uint8List *obj);
|
void qapi_free_uint8List(uint8List *obj);
|
||||||
|
|
||||||
#endif /* QAPI_TYPES_BUILTIN */
|
#endif /* QAPI_TYPES_BUILTIN */
|
||||||
|
@ -147,6 +174,7 @@ typedef enum QapiErrorClass {
|
||||||
QAPI_ERROR_CLASS_KVMMISSINGCAP = 5,
|
QAPI_ERROR_CLASS_KVMMISSINGCAP = 5,
|
||||||
QAPI_ERROR_CLASS__MAX = 6,
|
QAPI_ERROR_CLASS__MAX = 6,
|
||||||
} QapiErrorClass;
|
} QapiErrorClass;
|
||||||
|
|
||||||
extern const char *const QapiErrorClass_lookup[];
|
extern const char *const QapiErrorClass_lookup[];
|
||||||
|
|
||||||
typedef struct X86CPUFeatureWordInfo X86CPUFeatureWordInfo;
|
typedef struct X86CPUFeatureWordInfo X86CPUFeatureWordInfo;
|
||||||
|
@ -164,11 +192,13 @@ typedef enum X86CPURegister32 {
|
||||||
X86_CPU_REGISTER32_EDI = 7,
|
X86_CPU_REGISTER32_EDI = 7,
|
||||||
X86_CPU_REGISTER32__MAX = 8,
|
X86_CPU_REGISTER32__MAX = 8,
|
||||||
} X86CPURegister32;
|
} X86CPURegister32;
|
||||||
|
|
||||||
extern const char *const X86CPURegister32_lookup[];
|
extern const char *const X86CPURegister32_lookup[];
|
||||||
|
|
||||||
struct DummyForceArrays {
|
struct DummyForceArrays {
|
||||||
X86CPUFeatureWordInfoList *unused;
|
X86CPUFeatureWordInfoList *unused;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_DummyForceArrays(DummyForceArrays *obj);
|
void qapi_free_DummyForceArrays(DummyForceArrays *obj);
|
||||||
|
|
||||||
struct X86CPUFeatureWordInfo {
|
struct X86CPUFeatureWordInfo {
|
||||||
|
@ -178,11 +208,14 @@ struct X86CPUFeatureWordInfo {
|
||||||
X86CPURegister32 cpuid_register;
|
X86CPURegister32 cpuid_register;
|
||||||
int64_t features;
|
int64_t features;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_X86CPUFeatureWordInfo(X86CPUFeatureWordInfo *obj);
|
void qapi_free_X86CPUFeatureWordInfo(X86CPUFeatureWordInfo *obj);
|
||||||
|
|
||||||
struct X86CPUFeatureWordInfoList {
|
struct X86CPUFeatureWordInfoList {
|
||||||
X86CPUFeatureWordInfoList *next;
|
X86CPUFeatureWordInfoList *next;
|
||||||
X86CPUFeatureWordInfo *value;
|
X86CPUFeatureWordInfo *value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qapi_free_X86CPUFeatureWordInfoList(X86CPUFeatureWordInfoList *obj);
|
void qapi_free_X86CPUFeatureWordInfoList(X86CPUFeatureWordInfoList *obj);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qapi-visit.h"
|
#include "qapi-visit.h"
|
||||||
|
@ -142,8 +143,9 @@ void visit_type_X86CPUFeatureWordInfoList(Visitor *v, const char *name, X86CPUFe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_X86CPUFeatureWordInfoList(*obj);
|
qapi_free_X86CPUFeatureWordInfoList(*obj);
|
||||||
|
@ -179,8 +181,9 @@ void visit_type_anyList(Visitor *v, const char *name, anyList **obj, Error **err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_anyList(*obj);
|
qapi_free_anyList(*obj);
|
||||||
|
@ -209,8 +212,9 @@ void visit_type_boolList(Visitor *v, const char *name, boolList **obj, Error **e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_boolList(*obj);
|
qapi_free_boolList(*obj);
|
||||||
|
@ -239,8 +243,9 @@ void visit_type_int16List(Visitor *v, const char *name, int16List **obj, Error *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_int16List(*obj);
|
qapi_free_int16List(*obj);
|
||||||
|
@ -269,8 +274,9 @@ void visit_type_int32List(Visitor *v, const char *name, int32List **obj, Error *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_int32List(*obj);
|
qapi_free_int32List(*obj);
|
||||||
|
@ -299,8 +305,9 @@ void visit_type_int64List(Visitor *v, const char *name, int64List **obj, Error *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_int64List(*obj);
|
qapi_free_int64List(*obj);
|
||||||
|
@ -329,8 +336,9 @@ void visit_type_int8List(Visitor *v, const char *name, int8List **obj, Error **e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_int8List(*obj);
|
qapi_free_int8List(*obj);
|
||||||
|
@ -359,8 +367,9 @@ void visit_type_intList(Visitor *v, const char *name, intList **obj, Error **err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_intList(*obj);
|
qapi_free_intList(*obj);
|
||||||
|
@ -389,8 +398,9 @@ void visit_type_numberList(Visitor *v, const char *name, numberList **obj, Error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_numberList(*obj);
|
qapi_free_numberList(*obj);
|
||||||
|
@ -419,8 +429,9 @@ void visit_type_sizeList(Visitor *v, const char *name, sizeList **obj, Error **e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_sizeList(*obj);
|
qapi_free_sizeList(*obj);
|
||||||
|
@ -449,8 +460,9 @@ void visit_type_strList(Visitor *v, const char *name, strList **obj, Error **err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_strList(*obj);
|
qapi_free_strList(*obj);
|
||||||
|
@ -479,8 +491,9 @@ void visit_type_uint16List(Visitor *v, const char *name, uint16List **obj, Error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_uint16List(*obj);
|
qapi_free_uint16List(*obj);
|
||||||
|
@ -509,8 +522,9 @@ void visit_type_uint32List(Visitor *v, const char *name, uint32List **obj, Error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_uint32List(*obj);
|
qapi_free_uint32List(*obj);
|
||||||
|
@ -539,8 +553,9 @@ void visit_type_uint64List(Visitor *v, const char *name, uint64List **obj, Error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_uint64List(*obj);
|
qapi_free_uint64List(*obj);
|
||||||
|
@ -569,8 +584,9 @@ void visit_type_uint8List(Visitor *v, const char *name, uint8List **obj, Error *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_uint8List(*obj);
|
qapi_free_uint8List(*obj);
|
||||||
|
|
|
@ -1,6 +1,76 @@
|
||||||
# -*- Mode: Python -*-
|
# -*- Mode: Python -*-
|
||||||
|
##
|
||||||
|
# = Introduction
|
||||||
#
|
#
|
||||||
# QAPI Schema
|
# This document describes all commands currently supported by QMP.
|
||||||
|
#
|
||||||
|
# Most of the time their usage is exactly the same as in the user Monitor, this
|
||||||
|
# means that any other document which also describe commands (the manpage,
|
||||||
|
# QEMU's manual, etc) can and should be consulted.
|
||||||
|
#
|
||||||
|
# QMP has two types of commands: regular and query commands. Regular commands
|
||||||
|
# usually change the Virtual Machine's state someway, while query commands just
|
||||||
|
# return information. The sections below are divided accordingly.
|
||||||
|
#
|
||||||
|
# It's important to observe that all communication examples are formatted in
|
||||||
|
# a reader-friendly way, so that they're easier to understand. However, in real
|
||||||
|
# protocol usage, they're emitted as a single line.
|
||||||
|
#
|
||||||
|
# Also, the following notation is used to denote data flow:
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# | -> data issued by the Client
|
||||||
|
# | <- Server data response
|
||||||
|
#
|
||||||
|
# Please, refer to the QMP specification (docs/qmp-spec.txt) for
|
||||||
|
# detailed information on the Server command and response formats.
|
||||||
|
#
|
||||||
|
# = Stability Considerations
|
||||||
|
#
|
||||||
|
# The current QMP command set (described in this file) may be useful for a
|
||||||
|
# number of use cases, however it's limited and several commands have bad
|
||||||
|
# defined semantics, specially with regard to command completion.
|
||||||
|
#
|
||||||
|
# These problems are going to be solved incrementally in the next QEMU releases
|
||||||
|
# and we're going to establish a deprecation policy for badly defined commands.
|
||||||
|
#
|
||||||
|
# If you're planning to adopt QMP, please observe the following:
|
||||||
|
#
|
||||||
|
# 1. The deprecation policy will take effect and be documented soon, please
|
||||||
|
# check the documentation of each used command as soon as a new release of
|
||||||
|
# QEMU is available
|
||||||
|
#
|
||||||
|
# 2. DO NOT rely on anything which is not explicit documented
|
||||||
|
#
|
||||||
|
# 3. Errors, in special, are not documented. Applications should NOT check
|
||||||
|
# for specific errors classes or data (it's strongly recommended to only
|
||||||
|
# check for the "error" key)
|
||||||
|
#
|
||||||
|
##
|
||||||
|
|
||||||
|
{ 'pragma': { 'doc-required': true } }
|
||||||
|
|
||||||
|
# Whitelists to permit QAPI rule violations; think twice before you
|
||||||
|
# add to them!
|
||||||
|
{ 'pragma': {
|
||||||
|
# Commands allowed to return a non-dictionary:
|
||||||
|
'returns-whitelist': [
|
||||||
|
'human-monitor-command',
|
||||||
|
'qom-get',
|
||||||
|
'query-migrate-cache-size',
|
||||||
|
'query-tpm-models',
|
||||||
|
'query-tpm-types',
|
||||||
|
'ringbuf-read' ],
|
||||||
|
'name-case-whitelist': [
|
||||||
|
'ACPISlotType', # DIMM, visible through query-acpi-ospm-status
|
||||||
|
'CpuInfoMIPS', # PC, visible through query-cpu
|
||||||
|
'CpuInfoTricore', # PC, visible through query-cpu
|
||||||
|
'QapiErrorClass', # all members, visible through errors
|
||||||
|
'UuidInfo', # UUID, visible through query-uuid
|
||||||
|
'X86CPURegister32', # all members, visible indirectly through qom-get
|
||||||
|
'q_obj_CpuInfo-base' # CPU, visible through query-cpu
|
||||||
|
] } }
|
||||||
|
|
||||||
# QAPI common definitions
|
# QAPI common definitions
|
||||||
{ 'include': 'qapi/common.json' }
|
{ 'include': 'qapi/common.json' }
|
||||||
|
@ -22,7 +92,7 @@
|
||||||
#
|
#
|
||||||
# @cpuid-input-eax: Input EAX value for CPUID instruction for that feature word
|
# @cpuid-input-eax: Input EAX value for CPUID instruction for that feature word
|
||||||
#
|
#
|
||||||
# @cpuid-input-ecx: #optional Input ECX value for CPUID instruction for that
|
# @cpuid-input-ecx: Input ECX value for CPUID instruction for that
|
||||||
# feature word
|
# feature word
|
||||||
#
|
#
|
||||||
# @cpuid-register: Output register containing the feature bits
|
# @cpuid-register: Output register containing the feature bits
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
# -*- Mode: Python -*-
|
# -*- Mode: Python -*-
|
||||||
#
|
|
||||||
# QAPI common definitions
|
|
||||||
|
|
||||||
##
|
##
|
||||||
# @QapiErrorClass
|
# = QAPI common definitions
|
||||||
|
##
|
||||||
|
|
||||||
|
##
|
||||||
|
# @QapiErrorClass:
|
||||||
#
|
#
|
||||||
# QEMU error classes
|
# QEMU error classes
|
||||||
#
|
#
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
from qapi import *
|
from qapi import *
|
||||||
|
|
||||||
|
|
||||||
# variants must be emitted before their container; track what has already
|
# variants must be emitted before their container; track what has already
|
||||||
# been output
|
# been output
|
||||||
objects_seen = set()
|
objects_seen = set()
|
||||||
|
@ -25,8 +26,10 @@ typedef struct %(c_name)s %(c_name)s;
|
||||||
''',
|
''',
|
||||||
c_name=c_name(name))
|
c_name=c_name(name))
|
||||||
|
|
||||||
|
|
||||||
def gen_array(name, element_type):
|
def gen_array(name, element_type):
|
||||||
return mcgen('''
|
return mcgen('''
|
||||||
|
|
||||||
struct %(c_name)s {
|
struct %(c_name)s {
|
||||||
%(c_name)s *next;
|
%(c_name)s *next;
|
||||||
%(c_type)s value;
|
%(c_type)s value;
|
||||||
|
@ -37,7 +40,6 @@ struct %(c_name)s {
|
||||||
|
|
||||||
def gen_struct_members(members):
|
def gen_struct_members(members):
|
||||||
ret = ''
|
ret = ''
|
||||||
|
|
||||||
for memb in members:
|
for memb in members:
|
||||||
if memb.optional:
|
if memb.optional:
|
||||||
ret += mcgen('''
|
ret += mcgen('''
|
||||||
|
@ -114,39 +116,6 @@ static inline %(base)s *qapi_%(c_name)s_base(const %(c_name)s *obj)
|
||||||
c_name=c_name(name), base=base.c_name())
|
c_name=c_name(name), base=base.c_name())
|
||||||
|
|
||||||
|
|
||||||
def gen_alternate_qtypes_decl(name):
|
|
||||||
return mcgen('''
|
|
||||||
|
|
||||||
extern const int %(c_name)s_qtypes[];
|
|
||||||
''',
|
|
||||||
c_name=c_name(name))
|
|
||||||
|
|
||||||
|
|
||||||
def gen_alternate_qtypes(name, variants):
|
|
||||||
ret = mcgen('''
|
|
||||||
|
|
||||||
const int %(c_name)s_qtypes[QTYPE__MAX] = {
|
|
||||||
''',
|
|
||||||
c_name=c_name(name))
|
|
||||||
|
|
||||||
for var in variants.variants:
|
|
||||||
qtype = var.type.alternate_qtype()
|
|
||||||
assert qtype
|
|
||||||
|
|
||||||
ret += mcgen('''
|
|
||||||
[%(qtype)s] = %(enum_const)s,
|
|
||||||
''',
|
|
||||||
qtype=qtype,
|
|
||||||
enum_const=c_enum_const(variants.tag_member.type.name,
|
|
||||||
var.name))
|
|
||||||
|
|
||||||
|
|
||||||
ret += mcgen('''
|
|
||||||
};
|
|
||||||
''')
|
|
||||||
return ret
|
|
||||||
|
|
||||||
|
|
||||||
def gen_variants(variants):
|
def gen_variants(variants):
|
||||||
ret = mcgen('''
|
ret = mcgen('''
|
||||||
union { /* union tag is @%(c_name)s */
|
union { /* union tag is @%(c_name)s */
|
||||||
|
@ -169,6 +138,7 @@ def gen_variants(variants):
|
||||||
|
|
||||||
def gen_type_cleanup_decl(name):
|
def gen_type_cleanup_decl(name):
|
||||||
ret = mcgen('''
|
ret = mcgen('''
|
||||||
|
|
||||||
void qapi_free_%(c_name)s(%(c_name)s *obj);
|
void qapi_free_%(c_name)s(%(c_name)s *obj);
|
||||||
''',
|
''',
|
||||||
c_name=c_name(name))
|
c_name=c_name(name))
|
||||||
|
@ -208,7 +178,6 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
|
||||||
self.decl = ''
|
self.decl = ''
|
||||||
self.defn = ''
|
self.defn = ''
|
||||||
self._fwdecl = ''
|
self._fwdecl = ''
|
||||||
self._fwdefn = ''
|
|
||||||
self._btin = guardstart('QAPI_TYPES_BUILTIN')
|
self._btin = guardstart('QAPI_TYPES_BUILTIN')
|
||||||
|
|
||||||
def visit_end(self):
|
def visit_end(self):
|
||||||
|
@ -265,9 +234,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
|
||||||
|
|
||||||
def visit_alternate_type(self, name, info, variants):
|
def visit_alternate_type(self, name, info, variants):
|
||||||
self._fwdecl += gen_fwd_object_or_array(name)
|
self._fwdecl += gen_fwd_object_or_array(name)
|
||||||
self._fwdefn += gen_alternate_qtypes(name, variants)
|
|
||||||
self.decl += gen_object(name, None, [variants.tag_member], variants)
|
self.decl += gen_object(name, None, [variants.tag_member], variants)
|
||||||
self.decl += gen_alternate_qtypes_decl(name)
|
|
||||||
self._gen_type_cleanup(name)
|
self._gen_type_cleanup(name)
|
||||||
|
|
||||||
# If you link code generated from multiple schemata, you want only one
|
# If you link code generated from multiple schemata, you want only one
|
||||||
|
@ -277,10 +244,10 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
|
||||||
do_builtins = False
|
do_builtins = False
|
||||||
|
|
||||||
(input_file, output_dir, do_c, do_h, prefix, opts) = \
|
(input_file, output_dir, do_c, do_h, prefix, opts) = \
|
||||||
parse_command_line("b", ["builtins"])
|
parse_command_line('b', ['builtins'])
|
||||||
|
|
||||||
for o, a in opts:
|
for o, a in opts:
|
||||||
if o in ("-b", "--builtins"):
|
if o in ('-b', '--builtins'):
|
||||||
do_builtins = True
|
do_builtins = True
|
||||||
|
|
||||||
c_comment = '''
|
c_comment = '''
|
||||||
|
@ -312,23 +279,19 @@ h_comment = '''
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
'''
|
'''
|
||||||
|
|
||||||
(fdef, fdecl) = open_output(output_dir, do_c, do_h, prefix,
|
(fdef, fdecl) = open_output(output_dir, do_c, do_h, prefix,
|
||||||
'qapi-types.c', 'qapi-types.h',
|
'qapi-types.c', 'qapi-types.h',
|
||||||
c_comment, h_comment)
|
c_comment, h_comment)
|
||||||
|
|
||||||
fdef.write(mcgen('''
|
fdef.write(mcgen('''
|
||||||
|
#include "qemu/osdep.h"
|
||||||
#include "qapi/dealloc-visitor.h"
|
#include "qapi/dealloc-visitor.h"
|
||||||
#include "%(prefix)sqapi-types.h"
|
#include "%(prefix)sqapi-types.h"
|
||||||
#include "%(prefix)sqapi-visit.h"
|
#include "%(prefix)sqapi-visit.h"
|
||||||
''',
|
''',
|
||||||
prefix=prefix))
|
prefix=prefix))
|
||||||
|
|
||||||
# To avoid circular headers, use only typedefs.h here, not qobject.h
|
|
||||||
fdecl.write(mcgen('''
|
|
||||||
#include "qemu/typedefs.h"
|
|
||||||
#include "unicorn/platform.h"
|
|
||||||
'''))
|
|
||||||
|
|
||||||
schema = QAPISchema(input_file)
|
schema = QAPISchema(input_file)
|
||||||
gen = QAPISchemaGenTypeVisitor()
|
gen = QAPISchemaGenTypeVisitor()
|
||||||
schema.visit(gen)
|
schema.visit(gen)
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
# See the COPYING file in the top-level directory.
|
# See the COPYING file in the top-level directory.
|
||||||
|
|
||||||
from qapi import *
|
from qapi import *
|
||||||
import re
|
|
||||||
|
|
||||||
def gen_visit_decl(name, scalar=False):
|
def gen_visit_decl(name, scalar=False):
|
||||||
c_type = c_name(name) + ' *'
|
c_type = c_name(name) + ' *'
|
||||||
|
@ -89,6 +89,7 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
|
||||||
var.name,
|
var.name,
|
||||||
variants.tag_member.type.prefix),
|
variants.tag_member.type.prefix),
|
||||||
c_type=var.type.c_name(), c_name=c_name(var.name))
|
c_type=var.type.c_name(), c_name=c_name(var.name))
|
||||||
|
|
||||||
ret += mcgen('''
|
ret += mcgen('''
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
|
@ -131,8 +132,9 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_propagate(errp, err);
|
if (!err) {
|
||||||
err = NULL;
|
visit_check_list(v, &err);
|
||||||
|
}
|
||||||
visit_end_list(v, (void **)obj);
|
visit_end_list(v, (void **)obj);
|
||||||
if (err && visit_is_input(v)) {
|
if (err && visit_is_input(v)) {
|
||||||
qapi_free_%(c_name)s(*obj);
|
qapi_free_%(c_name)s(*obj);
|
||||||
|
@ -159,8 +161,8 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s *obj, Error
|
||||||
|
|
||||||
|
|
||||||
def gen_visit_alternate(name, variants):
|
def gen_visit_alternate(name, variants):
|
||||||
ret = ''
|
|
||||||
promote_int = 'true'
|
promote_int = 'true'
|
||||||
|
ret = ''
|
||||||
for var in variants.variants:
|
for var in variants.variants:
|
||||||
if var.type.alternate_qtype() == 'QTYPE_QNUM':
|
if var.type.alternate_qtype() == 'QTYPE_QNUM':
|
||||||
promote_int = 'false'
|
promote_int = 'false'
|
||||||
|
@ -332,10 +334,10 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
|
||||||
do_builtins = False
|
do_builtins = False
|
||||||
|
|
||||||
(input_file, output_dir, do_c, do_h, prefix, opts) = \
|
(input_file, output_dir, do_c, do_h, prefix, opts) = \
|
||||||
parse_command_line("b", ["builtins"])
|
parse_command_line('b', ['builtins'])
|
||||||
|
|
||||||
for o, a in opts:
|
for o, a in opts:
|
||||||
if o in ("-b", "--builtins"):
|
if o in ('-b', '--builtins'):
|
||||||
do_builtins = True
|
do_builtins = True
|
||||||
|
|
||||||
c_comment = '''
|
c_comment = '''
|
||||||
|
@ -372,6 +374,7 @@ h_comment = '''
|
||||||
c_comment, h_comment)
|
c_comment, h_comment)
|
||||||
|
|
||||||
fdef.write(mcgen('''
|
fdef.write(mcgen('''
|
||||||
|
#include "qemu/osdep.h"
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "%(prefix)sqapi-visit.h"
|
#include "%(prefix)sqapi-visit.h"
|
||||||
|
|
1042
qemu/scripts/qapi.py
1042
qemu/scripts/qapi.py
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue