From 8cdea9ccc7d931c3c8ba63ad236cec424215d95c Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Fri, 24 Jun 2011 17:36:11 +0100 Subject: [PATCH] xen: add vkbd support for PV on HVM guests Register the vkbd backend even when running as device emulator for HVM guests: it is useful because it doesn't need a frequent timer like usb. Check whether the XenInput DisplayState has been set in the initialise state, rather than the input state. In case the DisplayState hasn't been set and there is no vfb for this domain, then set the XenInput DisplayState to the default one. Changed in v2: - use qemu_free instead of free; Signed-off-by: Stefano Stabellini Signed-off-by: Alexander Graf --- hw/xenfb.c | 19 ++++++++++++------- xen-all.c | 1 + 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/hw/xenfb.c b/hw/xenfb.c index 1db75fb..0a01ae3 100644 --- a/hw/xenfb.c +++ b/hw/xenfb.c @@ -347,13 +347,6 @@ static void xenfb_mouse_event(void *opaque, static int input_init(struct XenDevice *xendev) { - struct XenInput *in = container_of(xendev, struct XenInput, c.xendev); - - if (!in->c.ds) { - xen_be_printf(xendev, 1, "ds not set (yet)\n"); - return -1; - } - xenstore_write_be_int(xendev, "feature-abs-pointer", 1); return 0; } @@ -367,6 +360,18 @@ static int input_connect(struct XenDevice *xendev) &in->abs_pointer_wanted) == -1) in->abs_pointer_wanted = 0; + if (!in->c.ds) { + char *vfb = xenstore_read_str(NULL, "device/vfb"); + if (vfb == NULL) { + /* there is no vfb, run vkbd on its own */ + in->c.ds = get_displaystate(); + } else { + qemu_free(vfb); + xen_be_printf(xendev, 1, "ds not set (yet)\n"); + return -1; + } + } + rc = common_bind(&in->c); if (rc != 0) return rc; diff --git a/xen-all.c b/xen-all.c index 3d40ab0..fb9bcc8 100644 --- a/xen-all.c +++ b/xen-all.c @@ -868,6 +868,7 @@ int xen_hvm_init(void) exit(1); } xen_be_register("console", &xen_console_ops); + xen_be_register("vkbd", &xen_kbdmouse_ops); xen_be_register("qdisk", &xen_blkdev_ops); return 0; -- 2.7.4