for (i = 0; i < d_config->num_vfbs; i++) {
libxl__device_add(gc, domid, &libxl__vfb_devtype,
&d_config->vfbs[i]);
+ }
+
+ for (i = 0; i < d_config->num_vkbs; i++) {
libxl__device_add(gc, domid, &libxl__vkb_devtype,
&d_config->vkbs[i]);
}
(1, "sbsa_uart"),
])
+libxl_vkb_backend = Enumeration("vkb_backend", [
+ (0, "UNKNOWN"),
+ (1, "QEMU"),
+ (2, "LINUX")
+ ])
+
#
# Complex libxl types
#
("backend_domid", libxl_domid),
("backend_domname", string),
("devid", libxl_devid),
+ ("backend_type", libxl_vkb_backend),
+ ("unique_id", string)
])
libxl_device_disk = Struct("device_disk", [
#include "libxl_internal.h"
+#include <xen/io/kbdif.h>
+
static int libxl__device_vkb_setdefault(libxl__gc *gc, uint32_t domid,
libxl_device_vkb *vkb, bool hotplug)
{
+ if (vkb->backend_type == LIBXL_VKB_BACKEND_UNKNOWN) {
+ vkb->backend_type = LIBXL_VKB_BACKEND_QEMU;
+ }
+
return libxl__resolve_domid(gc, vkb->backend_domname, &vkb->backend_domid);
}
+static int libxl__device_vkb_dm_needed(libxl_device_vkb *vkb, uint32_t domid)
+{
+ return vkb->backend_type == LIBXL_VKB_BACKEND_QEMU;
+}
+
+static int libxl__set_xenstore_vkb(libxl__gc *gc, uint32_t domid,
+ libxl_device_vkb *vkb,
+ flexarray_t *back, flexarray_t *front,
+ flexarray_t *ro_front)
+{
+ flexarray_append_pair(back, "backend-type",
+ (char *)libxl_vkb_backend_to_string(vkb->backend_type));
+
+ if (vkb->unique_id) {
+ flexarray_append_pair(back, XENKBD_FIELD_UNIQUE_ID, vkb->unique_id);
+ }
+
+ return 0;
+}
+
int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb,
const libxl_asyncop_how *ao_how)
{
LIBXL_DEFINE_DEVICE_REMOVE(vkb)
DEFINE_DEVICE_TYPE_STRUCT(vkb, VKBD,
- .skip_attach = 1
+ .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
);
/*