Patchwork [2/5] virtio-serial: Clean up virtconsole detection

login
register
mail settings
Submitter Markus Armbruster
Date May 25, 2011, 12:21 p.m.
Message ID <1306326074-22737-3-git-send-email-armbru@redhat.com>
Download mbox | patch
Permalink /patch/97370/
State New
Headers show

Comments

Markus Armbruster - May 25, 2011, 12:21 p.m.
virtio-serial-bus needs to treat "virtconsole" devices specially.  It
uses VirtIOSerialPort member is_console to recognize them.  It gets
its value via property initialization.  Cute hack, except it lets
users mess with it: "-device virtconsole,is_console=0" isn't plugged
into port 0 as it should.

Move the flag to VirtIOSerialPortInfo.  Keep the property for backward
compatibility; its value has no effect.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/virtio-console.c    |    5 +++--
 hw/virtio-serial-bus.c |    4 ++--
 hw/virtio-serial.h     |    8 ++++++--
 3 files changed, 11 insertions(+), 6 deletions(-)

Patch

diff --git a/hw/virtio-console.c b/hw/virtio-console.c
index de539c4..50b85f8 100644
--- a/hw/virtio-console.c
+++ b/hw/virtio-console.c
@@ -91,7 +91,7 @@  static int virtconsole_initfn(VirtIOSerialPort *port)
 {
     VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port);
 
-    port->is_console = true;
+    port->is_console_dummy = true;
     return generic_port_init(vcon, port);
 }
 
@@ -113,10 +113,11 @@  static int virtconsole_exitfn(VirtIOSerialPort *port)
 static VirtIOSerialPortInfo virtconsole_info = {
     .qdev.name     = "virtconsole",
     .qdev.size     = sizeof(VirtConsole),
+    .is_console    = true,
     .init          = virtconsole_initfn,
     .exit          = virtconsole_exitfn,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console, 1),
+        DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console_dummy, 1),
         DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID),
         DEFINE_PROP_CHR("chardev", VirtConsole, chr),
         DEFINE_PROP_STRING("name", VirtConsole, port.name),
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
index adbcf6a..d0a4ade 100644
--- a/hw/virtio-serial-bus.c
+++ b/hw/virtio-serial-bus.c
@@ -350,7 +350,7 @@  static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len)
          * this port is a console port so that the guest can hook it
          * up to hvc.
          */
-        if (port->is_console) {
+        if (port->info->is_console) {
             send_control_event(port, VIRTIO_CONSOLE_CONSOLE_PORT, 1);
         }
 
@@ -722,7 +722,7 @@  static int virtser_port_qdev_init(DeviceState *qdev, DeviceInfo *base)
      * location 0. This is done for backward compatibility (old
      * kernel, new qemu).
      */
-    plugging_port0 = port->is_console && !find_port_by_id(port->vser, 0);
+    plugging_port0 = info->is_console && !find_port_by_id(port->vser, 0);
 
     if (find_port_by_id(port->vser, port->id)) {
         error_report("virtio-serial-bus: A port already exists at id %u\n",
diff --git a/hw/virtio-serial.h b/hw/virtio-serial.h
index 5eb948e..c0d1717 100644
--- a/hw/virtio-serial.h
+++ b/hw/virtio-serial.h
@@ -119,8 +119,8 @@  struct VirtIOSerialPort {
     uint32_t iov_idx;
     uint64_t iov_offset;
 
-    /* Identify if this is a port that binds with hvc in the guest */
-    uint8_t is_console;
+    /* For property backward compatibility, not used otherwise */
+    uint8_t is_console_dummy;
 
     /* Is the corresponding guest device open? */
     bool guest_connected;
@@ -132,6 +132,10 @@  struct VirtIOSerialPort {
 
 struct VirtIOSerialPortInfo {
     DeviceInfo qdev;
+
+    /* Is this a device that binds with hvc in the guest? */
+    bool is_console;
+
     /*
      * The per-port (or per-app) init function that's called when a
      * new device is found on the bus.