Annotation of qemu/hw/virtio-console.c, revision 1.1.1.5

1.1       root        1: /*
1.1.1.4   root        2:  * Virtio Console and Generic Serial Port Devices
1.1       root        3:  *
1.1.1.4   root        4:  * Copyright Red Hat, Inc. 2009, 2010
1.1       root        5:  *
                      6:  * Authors:
1.1.1.4   root        7:  *  Amit Shah <amit.shah@redhat.com>
1.1       root        8:  *
                      9:  * This work is licensed under the terms of the GNU GPL, version 2.  See
                     10:  * the COPYING file in the top-level directory.
                     11:  */
                     12: 
                     13: #include "qemu-char.h"
1.1.1.4   root       14: #include "virtio-serial.h"
1.1       root       15: 
1.1.1.4   root       16: typedef struct VirtConsole {
                     17:     VirtIOSerialPort port;
1.1       root       18:     CharDriverState *chr;
1.1.1.4   root       19: } VirtConsole;
1.1       root       20: 
                     21: 
1.1.1.4   root       22: /* Callback function that's called when the guest sends us data */
1.1.1.5 ! root       23: static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
1.1       root       24: {
1.1.1.4   root       25:     VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port);
1.1       root       26: 
1.1.1.5 ! root       27:     return qemu_chr_write(vcon->chr, buf, len);
1.1       root       28: }
                     29: 
1.1.1.4   root       30: /* Readiness of the guest to accept data on a port */
                     31: static int chr_can_read(void *opaque)
1.1       root       32: {
1.1.1.4   root       33:     VirtConsole *vcon = opaque;
1.1       root       34: 
1.1.1.4   root       35:     return virtio_serial_guest_ready(&vcon->port);
1.1       root       36: }
                     37: 
1.1.1.4   root       38: /* Send data from a char device over to the guest */
                     39: static void chr_read(void *opaque, const uint8_t *buf, int size)
1.1       root       40: {
1.1.1.4   root       41:     VirtConsole *vcon = opaque;
1.1       root       42: 
1.1.1.4   root       43:     virtio_serial_write(&vcon->port, buf, size);
1.1       root       44: }
                     45: 
1.1.1.4   root       46: static void chr_event(void *opaque, int event)
1.1       root       47: {
1.1.1.4   root       48:     VirtConsole *vcon = opaque;
                     49: 
                     50:     switch (event) {
1.1.1.5 ! root       51:     case CHR_EVENT_OPENED:
1.1.1.4   root       52:         virtio_serial_open(&vcon->port);
                     53:         break;
                     54:     case CHR_EVENT_CLOSED:
                     55:         virtio_serial_close(&vcon->port);
                     56:         break;
1.1       root       57:     }
                     58: }
                     59: 
1.1.1.5 ! root       60: static int generic_port_init(VirtConsole *vcon, VirtIOSerialDevice *dev)
1.1       root       61: {
1.1.1.5 ! root       62:     vcon->port.info = dev->info;
1.1.1.4   root       63: 
                     64:     if (vcon->chr) {
                     65:         qemu_chr_add_handlers(vcon->chr, chr_can_read, chr_read, chr_event,
                     66:                               vcon);
1.1.1.5 ! root       67:         vcon->port.info->have_data = flush_buf;
1.1.1.4   root       68:     }
                     69:     return 0;
1.1       root       70: }
                     71: 
1.1.1.5 ! root       72: /* Virtio Console Ports */
        !            73: static int virtconsole_initfn(VirtIOSerialDevice *dev)
        !            74: {
        !            75:     VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev);
        !            76:     VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port);
        !            77: 
        !            78:     port->is_console = true;
        !            79:     return generic_port_init(vcon, dev);
        !            80: }
        !            81: 
1.1.1.4   root       82: static int virtconsole_exitfn(VirtIOSerialDevice *dev)
1.1       root       83: {
1.1.1.4   root       84:     VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev);
                     85:     VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port);
1.1       root       86: 
1.1.1.4   root       87:     if (vcon->chr) {
                     88:         port->info->have_data = NULL;
                     89:         qemu_chr_close(vcon->chr);
                     90:     }
1.1       root       91: 
                     92:     return 0;
                     93: }
                     94: 
1.1.1.4   root       95: static VirtIOSerialPortInfo virtconsole_info = {
                     96:     .qdev.name     = "virtconsole",
                     97:     .qdev.size     = sizeof(VirtConsole),
                     98:     .init          = virtconsole_initfn,
                     99:     .exit          = virtconsole_exitfn,
                    100:     .qdev.props = (Property[]) {
                    101:         DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console, 1),
                    102:         DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID),
                    103:         DEFINE_PROP_CHR("chardev", VirtConsole, chr),
                    104:         DEFINE_PROP_STRING("name", VirtConsole, port.name),
                    105:         DEFINE_PROP_END_OF_LIST(),
                    106:     },
                    107: };
                    108: 
                    109: static void virtconsole_register(void)
                    110: {
                    111:     virtio_serial_port_qdev_register(&virtconsole_info);
                    112: }
                    113: device_init(virtconsole_register)
                    114: 
                    115: /* Generic Virtio Serial Ports */
                    116: static int virtserialport_initfn(VirtIOSerialDevice *dev)
                    117: {
                    118:     VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev);
                    119:     VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port);
                    120: 
1.1.1.5 ! root      121:     return generic_port_init(vcon, dev);
1.1.1.4   root      122: }
1.1       root      123: 
1.1.1.4   root      124: static VirtIOSerialPortInfo virtserialport_info = {
                    125:     .qdev.name     = "virtserialport",
                    126:     .qdev.size     = sizeof(VirtConsole),
                    127:     .init          = virtserialport_initfn,
                    128:     .exit          = virtconsole_exitfn,
                    129:     .qdev.props = (Property[]) {
                    130:         DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID),
                    131:         DEFINE_PROP_CHR("chardev", VirtConsole, chr),
                    132:         DEFINE_PROP_STRING("name", VirtConsole, port.name),
                    133:         DEFINE_PROP_END_OF_LIST(),
                    134:     },
                    135: };
1.1       root      136: 
1.1.1.4   root      137: static void virtserialport_register(void)
                    138: {
                    139:     virtio_serial_port_qdev_register(&virtserialport_info);
1.1       root      140: }
1.1.1.4   root      141: device_init(virtserialport_register)

unix.superglobalmegacorp.com