[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 3/6] libxl: vkb add list and info functions
From: Oleksandr Grytsov <oleksandr_grytsov@xxxxxxxx> Signed-off-by: Oleksandr Grytsov <oleksandr_grytsov@xxxxxxxx> Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/libxl/libxl.h | 10 +++ tools/libxl/libxl_types.idl | 11 ++++ tools/libxl/libxl_utils.h | 3 + tools/libxl/libxl_vkb.c | 127 +++++++++++++++++++++++++++++++++++- 4 files changed, 149 insertions(+), 2 deletions(-) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index a09d069358..123b46078b 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -2013,6 +2013,16 @@ int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid, const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; +libxl_device_vkb *libxl_device_vkb_list(libxl_ctx *ctx, + uint32_t domid, int *num) + LIBXL_EXTERNAL_CALLERS_ONLY; +void libxl_device_vkb_list_free(libxl_device_vkb* list, int num) + LIBXL_EXTERNAL_CALLERS_ONLY; +int libxl_device_vkb_getinfo(libxl_ctx *ctx, uint32_t domid, + libxl_device_vkb *vkb, + libxl_vkbinfo *vkbinfo) + LIBXL_EXTERNAL_CALLERS_ONLY; + /* Framebuffer */ int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb, const libxl_asyncop_how *ao_how) diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 66c9444101..b7fa42fba0 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -963,6 +963,17 @@ libxl_vdisplinfo = Struct("vdisplinfo", [ ("connectors", Array(libxl_connectorinfo, "num_connectors")) ], dir=DIR_OUT) +libxl_vkbinfo = Struct("vkbinfo", [ + ("backend", string), + ("backend_id", uint32), + ("frontend", string), + ("frontend_id", uint32), + ("devid", libxl_devid), + ("state", integer), + ("evtch", integer), + ("rref", integer) + ], dir=DIR_OUT) + # NUMA node characteristics: size and free are how much memory it has, and how # much of it is free, respectively. dists is an array of distances from this # node to each other node. diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index 9e743dc598..91df06ec81 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -79,6 +79,9 @@ int libxl_devid_to_device_vtpm(libxl_ctx *ctx, uint32_t domid, int libxl_devid_to_device_usbctrl(libxl_ctx *ctx, uint32_t domid, int devid, libxl_device_usbctrl *usbctrl); +int libxl_devid_to_device_vkb(libxl_ctx *ctx, uint32_t domid, + int devid, libxl_device_vkb *vkb); + int libxl_devid_to_device_vdispl(libxl_ctx *ctx, uint32_t domid, int devid, libxl_device_vdispl *vdispl); diff --git a/tools/libxl/libxl_vkb.c b/tools/libxl/libxl_vkb.c index beaf17475d..d2ffc74c0d 100644 --- a/tools/libxl/libxl_vkb.c +++ b/tools/libxl/libxl_vkb.c @@ -50,6 +50,45 @@ static int libxl__set_xenstore_vkb(libxl__gc *gc, uint32_t domid, return 0; } +static int libxl__vkb_from_xenstore(libxl__gc *gc, const char *libxl_path, + libxl_devid devid, + libxl_device_vkb *vkb) +{ + const char *be_path, *be_type, *fe_path; + int rc; + + vkb->devid = devid; + + rc = libxl__xs_read_mandatory(gc, XBT_NULL, + GCSPRINTF("%s/backend", libxl_path), + &be_path); + if (rc) goto out; + + rc = libxl__xs_read_mandatory(gc, XBT_NULL, + GCSPRINTF("%s/frontend", libxl_path), + &fe_path); + if (rc) goto out; + + rc = libxl__backendpath_parse_domid(gc, be_path, &vkb->backend_domid); + if (rc) goto out; + + rc = libxl__xs_read_mandatory(gc, XBT_NULL, + GCSPRINTF("%s/backend-type", be_path), + &be_type); + if (rc) goto out; + + rc = libxl_vkb_backend_from_string(be_type, &vkb->backend_type); + if (rc) goto out; + + vkb->unique_id = xs_read(CTX->xsh, XBT_NULL, GCSPRINTF("%s/"XENKBD_FIELD_UNIQUE_ID, be_path), NULL); + + rc = 0; + +out: + + return rc; +} + int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb, const libxl_asyncop_how *ao_how) { @@ -67,20 +106,104 @@ out: return AO_INPROGRESS; } +int libxl_devid_to_device_vkb(libxl_ctx *ctx, uint32_t domid, + int devid, libxl_device_vkb *vkb) +{ + GC_INIT(ctx); + + libxl_device_vkb *vkbs = NULL; + int n, i; + int rc; + + libxl_device_vkb_init(vkb); + + vkbs = libxl__device_list(gc, &libxl__vkb_devtype, domid, &n); + + if (!vkbs) { rc = ERROR_NOTFOUND; goto out; } + + for (i = 0; i < n; ++i) { + if (devid == vkbs[i].devid) { + libxl_device_vkb_copy(ctx, vkb, &vkbs[i]); + rc = 0; + goto out; + } + } + + rc = ERROR_NOTFOUND; + +out: + + if (vkbs) + libxl__device_list_free(&libxl__vkb_devtype, vkbs, n); + + GC_FREE; + return rc; +} + +int libxl_device_vkb_getinfo(libxl_ctx *ctx, uint32_t domid, + libxl_device_vkb *vkb, + libxl_vkbinfo *info) +{ + GC_INIT(ctx); + char *libxl_path, *dompath, *devpath; + char *val; + int rc; + + libxl_vkbinfo_init(info); + dompath = libxl__xs_get_dompath(gc, domid); + info->devid = vkb->devid; + + devpath = libxl__domain_device_frontend_path(gc, domid, info->devid, + LIBXL__DEVICE_KIND_VKBD); + libxl_path = libxl__domain_device_libxl_path(gc, domid, info->devid, + LIBXL__DEVICE_KIND_VKBD); + + info->backend = xs_read(ctx->xsh, XBT_NULL, + GCSPRINTF("%s/backend", libxl_path), + NULL); + if (!info->backend) { rc = ERROR_FAIL; goto out; } + + rc = libxl__backendpath_parse_domid(gc, info->backend, &info->backend_id); + if (rc) goto out; + + val = libxl__xs_read(gc, XBT_NULL, GCSPRINTF("%s/state", devpath)); + info->state = val ? strtoul(val, NULL, 10) : -1; + + info->frontend = xs_read(ctx->xsh, XBT_NULL, + GCSPRINTF("%s/frontend", libxl_path), + NULL); + info->frontend_id = domid; + + val = libxl__xs_read(gc, XBT_NULL, + GCSPRINTF("%s/"XENKBD_FIELD_EVT_CHANNEL, devpath)); + info->evtch = val ? strtoul(val, NULL, 10) : -1; + + val = libxl__xs_read(gc, XBT_NULL, + GCSPRINTF("%s/"XENKBD_FIELD_RING_GREF, devpath)); + info->rref = val ? strtoul(val, NULL, 10) : -1; + + rc = 0; + +out: + GC_FREE; + return rc; +} + static LIBXL_DEFINE_DEVICE_FROM_TYPE(vkb) static LIBXL_DEFINE_UPDATE_DEVID(vkb) #define libxl__add_vkbs NULL -#define libxl_device_vkb_list NULL #define libxl_device_vkb_compare NULL +LIBXL_DEFINE_DEVICE_LIST(vkb) LIBXL_DEFINE_DEVICE_REMOVE(vkb) DEFINE_DEVICE_TYPE_STRUCT(vkb, VKBD, .skip_attach = 1, .dm_needed = (device_dm_needed_fn_t)libxl__device_vkb_dm_needed, .set_xenstore_config = (device_set_xenstore_config_fn_t) - libxl__set_xenstore_vkb + libxl__set_xenstore_vkb, + .from_xenstore = (device_from_xenstore_fn_t)libxl__vkb_from_xenstore ); /* -- 2.17.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |