99a9ef9
From fcb66d7ac2271bcf0b46d6b1ae2d3db38e78bf2b Mon Sep 17 00:00:00 2001
99a9ef9
From: Amit Shah <amit.shah@redhat.com>
99a9ef9
Date: Wed, 20 Jan 2010 00:36:56 +0530
99a9ef9
Subject: [PATCH 6/9] virtio-serial: Add a 'virtserialport' device for generic serial port support
99a9ef9
99a9ef9
This commit adds a simple chardev-based serial port. Any data the guest
99a9ef9
sends is forwarded to the chardev and vice-versa.
99a9ef9
99a9ef9
Sample uses for such a device can be obtaining info from the guest like
99a9ef9
the file systems used, apps installed, etc. for offline usage and
99a9ef9
logged-in users, clipboard copy-paste, etc. for online usage.
99a9ef9
99a9ef9
Signed-off-by: Amit Shah <amit.shah@redhat.com>
99a9ef9
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
99a9ef9
---
99a9ef9
 hw/virtio-serial.c |   34 ++++++++++++++++++++++++++++++++++
99a9ef9
 1 files changed, 34 insertions(+), 0 deletions(-)
99a9ef9
99a9ef9
diff --git a/hw/virtio-serial.c b/hw/virtio-serial.c
99a9ef9
index 9c2c93c..bd44ec6 100644
99a9ef9
--- a/hw/virtio-serial.c
99a9ef9
+++ b/hw/virtio-serial.c
99a9ef9
@@ -110,3 +110,37 @@ static void virtconsole_register(void)
99a9ef9
     virtio_serial_port_qdev_register(&virtconsole_info);
99a9ef9
 }
99a9ef9
 device_init(virtconsole_register)
99a9ef9
+
99a9ef9
+/* Generic Virtio Serial Ports */
99a9ef9
+static int virtserialport_initfn(VirtIOSerialDevice *dev)
99a9ef9
+{
99a9ef9
+    VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev);
99a9ef9
+    VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port);
99a9ef9
+
99a9ef9
+    port->info = dev->info;
99a9ef9
+
99a9ef9
+    if (vcon->chr) {
99a9ef9
+        qemu_chr_add_handlers(vcon->chr, chr_can_read, chr_read, chr_event,
99a9ef9
+                              vcon);
99a9ef9
+        port->info->have_data = flush_buf;
99a9ef9
+    }
99a9ef9
+    return 0;
99a9ef9
+}
99a9ef9
+
99a9ef9
+static VirtIOSerialPortInfo virtserialport_info = {
99a9ef9
+    .qdev.name     = "virtserialport",
99a9ef9
+    .qdev.size     = sizeof(VirtConsole),
99a9ef9
+    .init          = virtserialport_initfn,
99a9ef9
+    .exit          = virtconsole_exitfn,
99a9ef9
+    .qdev.props = (Property[]) {
99a9ef9
+        DEFINE_PROP_CHR("chardev", VirtConsole, chr),
99a9ef9
+        DEFINE_PROP_STRING("name", VirtConsole, port.name),
99a9ef9
+        DEFINE_PROP_END_OF_LIST(),
99a9ef9
+    },
99a9ef9
+};
99a9ef9
+
99a9ef9
+static void virtserialport_register(void)
99a9ef9
+{
99a9ef9
+    virtio_serial_port_qdev_register(&virtserialport_info);
99a9ef9
+}
99a9ef9
+device_init(virtserialport_register)
99a9ef9
-- 
99a9ef9
1.6.2.5
99a9ef9