[2/2] xen: add vkbd support for PV on HVM guests

Submitted by Stefano Stabellini on June 24, 2011, 2:54 p.m.

Details

Message ID 1308927289-10474-2-git-send-email-stefano.stabellini@eu.citrix.com
State New
Headers show

Commit Message

Stefano Stabellini June 24, 2011, 2:54 p.m.
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

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.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 hw/xenfb.c |   19 ++++++++++++-------
 xen-all.c  |    1 +
 2 files changed, 13 insertions(+), 7 deletions(-)

Comments

Peter Maydell June 24, 2011, 3:19 p.m.
On 24 June 2011 15:54,  <stefano.stabellini@eu.citrix.com> wrote:

> +    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 {
> +            free(vfb);

xenstore_read_str() returns a pointer from a qemu_strdup()
so strictly this should be a qemu_free(), I think?

-- PMM
Stefano Stabellini June 24, 2011, 4:34 p.m.
On Fri, 24 Jun 2011, Peter Maydell wrote:
> On 24 June 2011 15:54,  <stefano.stabellini@eu.citrix.com> wrote:
> 
> > +    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 {
> > +            free(vfb);
> 
> xenstore_read_str() returns a pointer from a qemu_strdup()
> so strictly this should be a qemu_free(), I think?
 
Yes, it should be, I'll send a second version of the patch.

Patch hide | download patch | download mbox

diff --git a/hw/xenfb.c b/hw/xenfb.c
index a3301ac..13b9b1b 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;
 }
@@ -363,6 +356,18 @@  static int input_initialise(struct XenDevice *xendev)
     struct XenInput *in = container_of(xendev, struct XenInput, c.xendev);
     int rc;
 
+    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 {
+            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 93fa2ee..6099bff 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;