mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
libxl: make devid a type so it is initialized properly
Previously device ids in libxl were treated as integers meaning they were being initialized to 0, which is a valid device id. This patch makes devid its own type in libxl and initializes it to -1, an invalid value. This fixes a bug where if you try to do a xl DEV-attach multiple time it will continuously try to reattach device 0 instead of generating a new device id. Signed-off-by: Matthew Fioravante <matthew.fioravante@jhuapl.edu> Reviewed-by: George Dunlap <george.dunlap@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Committed-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
1 parent
45f57813f6
commit
fb0ddeafbc
7 files changed
+22
-8
No files matched your search
@@ -60,7 +60,7 @@ def gen_rand_init(ty, v, indent = " ", parent = None):
|
||||
passby=idl.PASS_BY_REFERENCE))
|
||||
elif ty.typename in ["libxl_uuid", "libxl_mac", "libxl_hwcap"]:
|
||||
s += "rand_bytes((uint8_t *)%s, sizeof(*%s));\n" % (v,v)
|
||||
elif ty.typename in ["libxl_domid"] or isinstance(ty, idl.Number):
|
||||
elif ty.typename in ["libxl_domid", "libxl_devid"] or isinstance(ty, idl.Number):
|
||||
s += "%s = rand() %% (sizeof(%s)*8);\n" % \
|
||||
(ty.pass_arg(v, parent is None),
|
||||
ty.pass_arg(v, parent is None))
|
||||
|
||||
@@ -307,6 +307,7 @@ void libxl_cpuid_dispose(libxl_cpuid_policy_list *cpuid_list);
|
||||
#define LIBXL_PCI_FUNC_ALL (~0U)
|
||||
|
||||
typedef uint32_t libxl_domid;
|
||||
typedef int libxl_devid;
|
||||
|
||||
/*
|
||||
* Formatting Enumerations.
|
||||
|
||||
@@ -8,6 +8,7 @@ namespace("libxl_")
|
||||
libxl_defbool = Builtin("defbool", passby=PASS_BY_REFERENCE)
|
||||
|
||||
libxl_domid = Builtin("domid", json_fn = "yajl_gen_integer", autogenerate_json = False)
|
||||
libxl_devid = Builtin("devid", json_fn = "yajl_gen_integer", autogenerate_json = False, signed = True, init_val="-1")
|
||||
libxl_uuid = Builtin("uuid", passby=PASS_BY_REFERENCE)
|
||||
libxl_mac = Builtin("mac", passby=PASS_BY_REFERENCE)
|
||||
libxl_bitmap = Builtin("bitmap", dispose_fn="libxl_bitmap_dispose", passby=PASS_BY_REFERENCE)
|
||||
@@ -337,7 +338,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
|
||||
|
||||
libxl_device_vfb = Struct("device_vfb", [
|
||||
("backend_domid", libxl_domid),
|
||||
("devid", integer),
|
||||
("devid", libxl_devid),
|
||||
("vnc", libxl_vnc_info),
|
||||
("sdl", libxl_sdl_info),
|
||||
# set keyboard layout, default is en-us keyboard
|
||||
@@ -346,7 +347,7 @@ libxl_device_vfb = Struct("device_vfb", [
|
||||
|
||||
libxl_device_vkb = Struct("device_vkb", [
|
||||
("backend_domid", libxl_domid),
|
||||
("devid", integer),
|
||||
("devid", libxl_devid),
|
||||
])
|
||||
|
||||
libxl_device_disk = Struct("device_disk", [
|
||||
@@ -363,7 +364,7 @@ libxl_device_disk = Struct("device_disk", [
|
||||
|
||||
libxl_device_nic = Struct("device_nic", [
|
||||
("backend_domid", libxl_domid),
|
||||
("devid", integer),
|
||||
("devid", libxl_devid),
|
||||
("mtu", integer),
|
||||
("model", string),
|
||||
("mac", libxl_mac),
|
||||
@@ -393,7 +394,7 @@ libxl_diskinfo = Struct("diskinfo", [
|
||||
("backend_id", uint32),
|
||||
("frontend", string),
|
||||
("frontend_id", uint32),
|
||||
("devid", integer),
|
||||
("devid", libxl_devid),
|
||||
("state", integer),
|
||||
("evtch", integer),
|
||||
("rref", integer),
|
||||
@@ -404,7 +405,7 @@ libxl_nicinfo = Struct("nicinfo", [
|
||||
("backend_id", uint32),
|
||||
("frontend", string),
|
||||
("frontend_id", uint32),
|
||||
("devid", integer),
|
||||
("devid", libxl_devid),
|
||||
("state", integer),
|
||||
("evtch", integer),
|
||||
("rref_tx", integer),
|
||||
|
||||
@@ -10,6 +10,7 @@ builtins = {
|
||||
"int": ("int", "%(c)s = Int_val(%(o)s)", "Val_int(%(c)s)" ),
|
||||
"char *": ("string", "%(c)s = dup_String_val(gc, %(o)s)", "caml_copy_string(%(c)s)"),
|
||||
"libxl_domid": ("domid", "%(c)s = Int_val(%(o)s)", "Val_int(%(c)s)" ),
|
||||
"libxl_devid": ("devid", "%(c)s = Int_val(%(o)s)", "Val_int(%(c)s)" ),
|
||||
"libxl_defbool": ("bool option", "%(c)s = Defbool_val(%(o)s)", "Val_defbool(%(c)s)" ),
|
||||
"libxl_uuid": ("int array", "Uuid_val(gc, lg, &%(c)s, %(o)s)", "Val_uuid(&%(c)s)"),
|
||||
"libxl_key_value_list": ("(string * string) list", None, None),
|
||||
@@ -41,8 +42,8 @@ def stub_fn_name(ty, name):
|
||||
return "stub_xl_%s_%s" % (ty.rawname,name)
|
||||
|
||||
def ocaml_type_of(ty):
|
||||
if ty.rawname == "domid":
|
||||
return "domid"
|
||||
if ty.rawname in ["domid","devid"]:
|
||||
return ty.rawname
|
||||
elif isinstance(ty,idl.UInt):
|
||||
if ty.width in [8, 16]:
|
||||
# handle as ints
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
exception Error of string
|
||||
|
||||
type domid = int
|
||||
type devid = int
|
||||
|
||||
(* @@LIBXL_TYPES@@ *)
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
exception Error of string
|
||||
|
||||
type domid = int
|
||||
type devid = int
|
||||
|
||||
(* @@LIBXL_TYPES@@ *)
|
||||
|
||||
|
||||
@@ -281,6 +281,11 @@ int attrib__libxl_domid_set(PyObject *v, libxl_domid *domid) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int attrib__libxl_devid_set(PyObject *v, libxl_devid *devid) {
|
||||
*devid = PyInt_AsLong(v);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int attrib__struct_in_addr_set(PyObject *v, struct in_addr *pptr)
|
||||
{
|
||||
PyErr_SetString(PyExc_NotImplementedError, "Setting in_addr");
|
||||
@@ -342,6 +347,10 @@ PyObject *attrib__libxl_domid_get(libxl_domid *domid) {
|
||||
return PyInt_FromLong(*domid);
|
||||
}
|
||||
|
||||
PyObject *attrib__libxl_devid_get(libxl_devid *devid) {
|
||||
return PyInt_FromLong(*devid);
|
||||
}
|
||||
|
||||
PyObject *attrib__struct_in_addr_get(struct in_addr *pptr)
|
||||
{
|
||||
PyErr_SetString(PyExc_NotImplementedError, "Getting in_addr");
|
||||
|
||||