mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
tools: libxl: add an Enumeration type to the IDL
The IDL requires a specific value for each enumerate, this make it much easier to avoid (or at least track) ABI changes since they must now be explicit. I believe I have used the same values as would have been chosen previoulsy but have not confirmed. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Ian Jackson <ian.jackson.citrix.com> Committed-by: Ian Jackson <ian.jackson.citrix.com>
This commit is contained in:
1 parent
2da839263c
commit
8b403a1dfd
8 files changed
+176
-123
No files matched your search
+22
-1
@@ -34,7 +34,28 @@ def libxl_C_instance_of(ty, instancename):
|
||||
|
||||
def libxl_C_type_define(ty, indent = ""):
|
||||
s = ""
|
||||
if isinstance(ty, libxltypes.Aggregate):
|
||||
|
||||
if isinstance(ty, libxltypes.Enumeration):
|
||||
if ty.comment is not None:
|
||||
s += format_comment(0, ty.comment)
|
||||
|
||||
if ty.typename is None:
|
||||
s += "enum {\n"
|
||||
else:
|
||||
s += "typedef enum %s {\n" % ty.typename
|
||||
|
||||
for v in ty.values:
|
||||
if v.comment is not None:
|
||||
s += format_comment(4, v.comment)
|
||||
x = "%s = %d" % (v.name, v.value)
|
||||
x = x.replace("\n", "\n ")
|
||||
s += " " + x + ",\n"
|
||||
if ty.typename is None:
|
||||
s += "}"
|
||||
else:
|
||||
s += "} %s" % ty.typename
|
||||
|
||||
elif isinstance(ty, libxltypes.Aggregate):
|
||||
if ty.comment is not None:
|
||||
s += format_comment(0, ty.comment)
|
||||
|
||||
|
||||
@@ -82,6 +82,30 @@ libxltype.Reference
|
||||
Complex type-Classes
|
||||
--------------------
|
||||
|
||||
libxltype.Enumeration
|
||||
|
||||
A class representing an enumeration (named integer values).
|
||||
|
||||
The values are available in the list Enumeration.values. Each
|
||||
element in the list is of type libxltype.EnumerationValue.
|
||||
|
||||
Each EnumerationValue has the following properties:
|
||||
|
||||
EnumerationValue.enum Reference to containing Enumeration
|
||||
EnumerationValue.name The C name of this value, including
|
||||
the namespace and typename of the
|
||||
containing Enumeration (e.g.
|
||||
"LIBXL_FOOENUM_VALUE")
|
||||
EnumerationValue.rawname The C name of this value, excluding
|
||||
the namespace but including the
|
||||
typename of the containing
|
||||
Enumeration (e.g. "FOOENUM_VALUE")
|
||||
EnumerationValue.valuename The name of this value, excluding the
|
||||
name of the containing Enumeration
|
||||
and any namespace (e.g. "VALUE")
|
||||
EnumerationValue.value The integer value associated with this name.
|
||||
EnumerationValue.comment A free text comment which describes the member.
|
||||
|
||||
libxltype.Aggregate
|
||||
|
||||
Base class for type-Classes which contain a number of other types
|
||||
|
||||
@@ -161,49 +161,6 @@ typedef struct {
|
||||
#define LIBXL_CPUARRAY_INVALID_ENTRY ~0
|
||||
void libxl_cpuarray_destroy(libxl_cpuarray *array);
|
||||
|
||||
typedef enum {
|
||||
LIBXL_DOMAIN_TYPE_FV = 1,
|
||||
LIBXL_DOMAIN_TYPE_PV,
|
||||
} libxl_domain_type;
|
||||
|
||||
typedef enum libxl_device_model_version {
|
||||
/* Historical qemu-xen device model (qemu-dm) */
|
||||
LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL = 1,
|
||||
/* Upstream based qemu-xen device model */
|
||||
LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN = 2,
|
||||
} libxl_device_model_version;
|
||||
|
||||
typedef enum {
|
||||
LIBXL_CONSOLE_TYPE_SERIAL = 1,
|
||||
LIBXL_CONSOLE_TYPE_PV,
|
||||
} libxl_console_type;
|
||||
|
||||
typedef enum {
|
||||
LIBXL_CONSOLE_BACKEND_XENCONSOLED,
|
||||
LIBXL_CONSOLE_BACKEND_IOEMU,
|
||||
} libxl_console_backend;
|
||||
|
||||
typedef enum {
|
||||
LIBXL_DISK_FORMAT_UNKNOWN = 0,
|
||||
LIBXL_DISK_FORMAT_QCOW,
|
||||
LIBXL_DISK_FORMAT_QCOW2,
|
||||
LIBXL_DISK_FORMAT_VHD,
|
||||
LIBXL_DISK_FORMAT_RAW,
|
||||
LIBXL_DISK_FORMAT_EMPTY,
|
||||
} libxl_disk_format;
|
||||
|
||||
typedef enum {
|
||||
LIBXL_DISK_BACKEND_UNKNOWN = 0,
|
||||
LIBXL_DISK_BACKEND_PHY,
|
||||
LIBXL_DISK_BACKEND_TAP,
|
||||
LIBXL_DISK_BACKEND_QDISK,
|
||||
} libxl_disk_backend;
|
||||
|
||||
typedef enum {
|
||||
LIBXL_NIC_TYPE_IOEMU = 1,
|
||||
LIBXL_NIC_TYPE_VIF,
|
||||
} libxl_nic_type;
|
||||
|
||||
typedef struct {
|
||||
/*
|
||||
* Path is always set if the file reference is valid. However if
|
||||
@@ -252,18 +209,6 @@ enum {
|
||||
|
||||
#define LIBXL_VERSION 0
|
||||
|
||||
typedef enum libxl_action_on_shutdown {
|
||||
LIBXL_ACTION_ON_SHUTDOWN_DESTROY,
|
||||
|
||||
LIBXL_ACTION_ON_SHUTDOWN_RESTART,
|
||||
LIBXL_ACTION_ON_SHUTDOWN_RESTART_RENAME,
|
||||
|
||||
LIBXL_ACTION_ON_SHUTDOWN_PRESERVE,
|
||||
|
||||
LIBXL_ACTION_ON_SHUTDOWN_COREDUMP_DESTROY,
|
||||
LIBXL_ACTION_ON_SHUTDOWN_COREDUMP_RESTART,
|
||||
} libxl_action_on_shutdown;
|
||||
|
||||
typedef struct {
|
||||
libxl_domain_create_info c_info;
|
||||
libxl_domain_build_info b_info;
|
||||
@@ -327,11 +272,6 @@ int libxl_run_bootloader(libxl_ctx *ctx,
|
||||
|
||||
/* events handling */
|
||||
|
||||
typedef enum {
|
||||
LIBXL_EVENT_TYPE_DOMAIN_DEATH,
|
||||
LIBXL_EVENT_TYPE_DISK_EJECT,
|
||||
} libxl_event_type;
|
||||
|
||||
typedef struct {
|
||||
/* event type */
|
||||
libxl_event_type type;
|
||||
@@ -494,11 +434,6 @@ int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid,
|
||||
* On error return, *data_r and *datalen_r are undefined.
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
LIBXL_BUTTON_POWER,
|
||||
LIBXL_BUTTON_SLEEP
|
||||
} libxl_button;
|
||||
|
||||
int libxl_button_press(libxl_ctx *ctx, uint32_t domid, libxl_button button);
|
||||
|
||||
int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo);
|
||||
|
||||
+67
-7
@@ -8,13 +8,6 @@ libxl_uuid = Builtin("uuid")
|
||||
libxl_mac = Builtin("mac")
|
||||
libxl_cpumap = Builtin("cpumap", destructor_fn="libxl_cpumap_destroy", passby=PASS_BY_REFERENCE)
|
||||
libxl_cpuarray = Builtin("cpuarray", destructor_fn="libxl_cpuarray_destroy", passby=PASS_BY_REFERENCE)
|
||||
libxl_domain_type = Number("domain_type", namespace="libxl_")
|
||||
libxl_device_model_version = Number("device_model_version", namespace="libxl_")
|
||||
libxl_console_backend = Number("console_backend", namespace="libxl_")
|
||||
libxl_console_type = Number("console_type", namespace="libxl_")
|
||||
libxl_disk_format = Number("disk_format", namespace="libxl_")
|
||||
libxl_disk_backend = Number("disk_backend", namespace="libxl_")
|
||||
libxl_nic_type = Number("nic_type", namespace="libxl_")
|
||||
libxl_cpuid_policy_list = Builtin("cpuid_policy_list", destructor_fn="libxl_cpuid_destroy", passby=PASS_BY_REFERENCE)
|
||||
|
||||
libxl_string_list = Builtin("string_list", destructor_fn="libxl_string_list_destroy", passby=PASS_BY_REFERENCE)
|
||||
@@ -23,6 +16,73 @@ libxl_file_reference = Builtin("file_reference", destructor_fn="libxl_file_refer
|
||||
|
||||
libxl_hwcap = Builtin("hwcap")
|
||||
|
||||
#
|
||||
# Constants / Enumerations
|
||||
#
|
||||
|
||||
libxl_domain_type = Enumeration("domain_type", [
|
||||
(1, "FV"),
|
||||
(2, "PV"),
|
||||
])
|
||||
|
||||
libxl_device_model_version = Enumeration("device_model_version", [
|
||||
(1, "QEMU_XEN_TRADITIONAL", "Historical qemu-xen device model (qemu-dm)"),
|
||||
(2, "QEMU_XEN", "Upstream based qemu-xen device model"),
|
||||
])
|
||||
|
||||
libxl_console_type = Enumeration("console_type", [
|
||||
(1, "SERIAL"),
|
||||
(2, "PV"),
|
||||
])
|
||||
|
||||
libxl_console_backend = Enumeration("console_backend", [
|
||||
(1, "XENCONSOLED"),
|
||||
(2, "IOEMU"),
|
||||
])
|
||||
|
||||
libxl_disk_format = Enumeration("disk_format", [
|
||||
(0, "UNKNOWN"),
|
||||
(1, "QCOW"),
|
||||
(2, "QCOW2"),
|
||||
(3, "VHD"),
|
||||
(4, "RAW"),
|
||||
(5, "EMPTY"),
|
||||
])
|
||||
|
||||
libxl_disk_backend = Enumeration("disk_backend", [
|
||||
(0, "UNKNOWN"),
|
||||
(1, "PHY"),
|
||||
(2, "TAP"),
|
||||
(3, "QDISK"),
|
||||
])
|
||||
|
||||
libxl_nic_type = Enumeration("nic_type", [
|
||||
(1, "IOEMU"),
|
||||
(2, "VIF"),
|
||||
])
|
||||
|
||||
libxl_action_on_shutdown = Enumeration("action_on_shutdown", [
|
||||
(1, "DESTROY"),
|
||||
|
||||
(2, "RESTART"),
|
||||
(3, "RESTART_RENAME"),
|
||||
|
||||
(4, "PRESERVE"),
|
||||
|
||||
(5, "COREDUMP_DESTROY"),
|
||||
(6, "COREDUMP_RESTART"),
|
||||
])
|
||||
|
||||
libxl_event_type = Enumeration("event_type", [
|
||||
(1, "DOMAIN_DEATH"),
|
||||
(2, "DISK_EJECT"),
|
||||
])
|
||||
|
||||
libxl_button = Enumeration("button", [
|
||||
(1, "POWER"),
|
||||
(2, "SLEEP"),
|
||||
])
|
||||
|
||||
#
|
||||
# Complex libxl types
|
||||
#
|
||||
|
||||
@@ -52,6 +52,35 @@ class UInt(Number):
|
||||
|
||||
self.width = w
|
||||
|
||||
class EnumerationValue(object):
|
||||
def __init__(self, enum, value, name, **kwargs):
|
||||
self.enum = enum
|
||||
|
||||
self.valuename = str.upper(name)
|
||||
self.rawname = str.upper(enum.rawname) + "_" + self.valuename
|
||||
self.name = str.upper(enum.namespace) + self.rawname
|
||||
self.value = value
|
||||
self.comment = kwargs.setdefault("comment", None)
|
||||
|
||||
class Enumeration(Type):
|
||||
def __init__(self, typename, values, **kwargs):
|
||||
kwargs.setdefault('destructor_fn', None)
|
||||
Type.__init__(self, typename, **kwargs)
|
||||
|
||||
self.values = []
|
||||
for v in values:
|
||||
# (value, name[, comment=None])
|
||||
if len(v) == 2:
|
||||
(num,name) = v
|
||||
comment = None
|
||||
elif len(v) == 3:
|
||||
num,name,comment = v
|
||||
else:
|
||||
raise ""
|
||||
self.values.append(EnumerationValue(self, num, name,
|
||||
comment=comment,
|
||||
typename=self.rawname))
|
||||
|
||||
class BitField(Type):
|
||||
def __init__(self, ty, w, **kwargs):
|
||||
kwargs.setdefault('namespace', None)
|
||||
|
||||
@@ -451,6 +451,8 @@ static int parse_action_on_shutdown(const char *buf, libxl_action_on_shutdown *a
|
||||
for (i = 0; i < sizeof(action_on_shutdown_names) / sizeof(action_on_shutdown_names[0]); i++) {
|
||||
n = action_on_shutdown_names[i];
|
||||
|
||||
if (!n) continue;
|
||||
|
||||
if (strcmp(buf, n) == 0) {
|
||||
*a = i;
|
||||
return 1;
|
||||
|
||||
+32
-21
@@ -9,6 +9,8 @@ import libxltypes
|
||||
def py_type(ty):
|
||||
if ty == libxltypes.bool or isinstance(ty, libxltypes.BitField) and ty.width == 1:
|
||||
return TYPE_BOOL
|
||||
if isinstance(ty, libxltypes.Enumeration):
|
||||
return TYPE_UINT
|
||||
if isinstance(ty, libxltypes.Number):
|
||||
if ty.signed:
|
||||
return TYPE_INT
|
||||
@@ -34,15 +36,16 @@ def fsanitize(name):
|
||||
|
||||
def py_decls(ty):
|
||||
l = []
|
||||
l.append('_hidden Py_%s *Py%s_New(void);\n'%(ty.rawname, ty.rawname))
|
||||
l.append('_hidden int Py%s_Check(PyObject *self);\n'%ty.rawname)
|
||||
for f in ty.fields:
|
||||
if py_type(f.type) is not None:
|
||||
continue
|
||||
l.append('_hidden PyObject *attrib__%s_get(%s *%s);'%(\
|
||||
fsanitize(f.type.typename), f.type.typename, f.name))
|
||||
l.append('_hidden int attrib__%s_set(PyObject *v, %s *%s);'%(\
|
||||
fsanitize(f.type.typename), f.type.typename, f.name))
|
||||
if isinstance(ty, libxltypes.Aggregate):
|
||||
l.append('_hidden Py_%s *Py%s_New(void);\n'%(ty.rawname, ty.rawname))
|
||||
l.append('_hidden int Py%s_Check(PyObject *self);\n'%ty.rawname)
|
||||
for f in ty.fields:
|
||||
if py_type(f.type) is not None:
|
||||
continue
|
||||
l.append('_hidden PyObject *attrib__%s_get(%s *%s);'%(\
|
||||
fsanitize(f.type.typename), f.type.typename, f.name))
|
||||
l.append('_hidden int attrib__%s_set(PyObject *v, %s *%s);'%(\
|
||||
fsanitize(f.type.typename), f.type.typename, f.name))
|
||||
return '\n'.join(l) + "\n"
|
||||
|
||||
def py_attrib_get(ty, f):
|
||||
@@ -189,16 +192,23 @@ def py_initfuncs(types):
|
||||
l.append('void genwrap__init(PyObject *m)')
|
||||
l.append('{')
|
||||
for ty in types:
|
||||
l.append(' if (PyType_Ready(&Py%s_Type) >= 0) {'%ty.rawname)
|
||||
l.append(' Py_INCREF(&Py%s_Type);'%ty.rawname)
|
||||
l.append(' PyModule_AddObject(m, "%s", (PyObject *)&Py%s_Type);'%(ty.rawname, ty.rawname))
|
||||
l.append(' }')
|
||||
if isinstance(ty, libxltypes.Enumeration):
|
||||
for v in ty.values:
|
||||
l.append(' PyModule_AddIntConstant(m, "%s", %s);' % (v.rawname, v.name))
|
||||
elif isinstance(ty, libxltypes.Aggregate):
|
||||
l.append(' if (PyType_Ready(&Py%s_Type) >= 0) {'%ty.rawname)
|
||||
l.append(' Py_INCREF(&Py%s_Type);'%ty.rawname)
|
||||
l.append(' PyModule_AddObject(m, "%s", (PyObject *)&Py%s_Type);'%(ty.rawname, ty.rawname))
|
||||
l.append(' }')
|
||||
else:
|
||||
raise NotImplementedError("unknown type %s (%s)" % (ty.typename, type(ty)))
|
||||
|
||||
l.append('}')
|
||||
return '\n'.join(l) + "\n\n"
|
||||
|
||||
def tree_frob(types):
|
||||
ret = types[:]
|
||||
for ty in ret:
|
||||
for ty in [ty for ty in ret if isinstance(ty, libxltypes.Aggregate)]:
|
||||
ty.fields = filter(lambda f:f.name is not None and f.type.typename is not None, ty.fields)
|
||||
return ret
|
||||
|
||||
@@ -249,8 +259,8 @@ _hidden PyObject *genwrap__ll_get(long long val);
|
||||
_hidden int genwrap__ll_set(PyObject *v, long long *val, long long mask);
|
||||
|
||||
""" % " ".join(sys.argv))
|
||||
for ty in types:
|
||||
f.write('/* Internal APU for %s wrapper */\n'%ty.typename)
|
||||
for ty in [ty for ty in types if isinstance(ty, libxltypes.Aggregate)]:
|
||||
f.write('/* Internal API for %s wrapper */\n'%ty.typename)
|
||||
f.write(py_wrapstruct(ty))
|
||||
f.write(py_decls(ty))
|
||||
f.write('\n')
|
||||
@@ -276,10 +286,11 @@ _hidden int genwrap__ll_set(PyObject *v, long long *val, long long mask);
|
||||
|
||||
""" % tuple((' '.join(sys.argv),) + (os.path.split(decls)[-1:]),))
|
||||
for ty in types:
|
||||
f.write('/* Attribute get/set functions for %s */\n'%ty.typename)
|
||||
for a in ty.fields:
|
||||
f.write(py_attrib_get(ty,a))
|
||||
f.write(py_attrib_set(ty,a))
|
||||
f.write(py_object_def(ty))
|
||||
if isinstance(ty, libxltypes.Aggregate):
|
||||
f.write('/* Attribute get/set functions for %s */\n'%ty.typename)
|
||||
for a in ty.fields:
|
||||
f.write(py_attrib_get(ty,a))
|
||||
f.write(py_attrib_set(ty,a))
|
||||
f.write(py_object_def(ty))
|
||||
f.write(py_initfuncs(types))
|
||||
f.close()
|
||||
@@ -769,35 +769,6 @@ PyMODINIT_FUNC initxl(void)
|
||||
_INT_CONST(m, SHUTDOWN_crash);
|
||||
_INT_CONST(m, SHUTDOWN_watchdog);
|
||||
|
||||
_INT_CONST_LIBXL(m, DOMAIN_TYPE_FV);
|
||||
_INT_CONST_LIBXL(m, DOMAIN_TYPE_PV);
|
||||
|
||||
_INT_CONST_LIBXL(m, CONSOLE_TYPE_SERIAL);
|
||||
_INT_CONST_LIBXL(m, CONSOLE_TYPE_PV);
|
||||
|
||||
_INT_CONST_LIBXL(m, CONSOLE_BACKEND_XENCONSOLED);
|
||||
_INT_CONST_LIBXL(m, CONSOLE_BACKEND_IOEMU);
|
||||
|
||||
_INT_CONST_LIBXL(m, DISK_FORMAT_UNKNOWN);
|
||||
_INT_CONST_LIBXL(m, DISK_FORMAT_QCOW);
|
||||
_INT_CONST_LIBXL(m, DISK_FORMAT_QCOW2);
|
||||
_INT_CONST_LIBXL(m, DISK_FORMAT_VHD);
|
||||
_INT_CONST_LIBXL(m, DISK_FORMAT_RAW);
|
||||
_INT_CONST_LIBXL(m, DISK_FORMAT_EMPTY);
|
||||
|
||||
_INT_CONST_LIBXL(m, DISK_BACKEND_UNKNOWN);
|
||||
_INT_CONST_LIBXL(m, DISK_BACKEND_PHY);
|
||||
_INT_CONST_LIBXL(m, DISK_BACKEND_TAP);
|
||||
_INT_CONST_LIBXL(m, DISK_BACKEND_QDISK);
|
||||
|
||||
_INT_CONST_LIBXL(m, NIC_TYPE_IOEMU);
|
||||
_INT_CONST_LIBXL(m, NIC_TYPE_VIF);
|
||||
|
||||
_INT_CONST_LIBXL(m, EVENT_TYPE_DOMAIN_DEATH);
|
||||
_INT_CONST_LIBXL(m, EVENT_TYPE_DISK_EJECT);
|
||||
|
||||
_INT_CONST_LIBXL(m, BUTTON_POWER);
|
||||
_INT_CONST_LIBXL(m, BUTTON_SLEEP);
|
||||
genwrap__init(m);
|
||||
}
|
||||
|
||||
|
||||