version 1.1.1.4, 2018/04/24 18:30:11
|
version 1.1.1.5, 2018/04/24 18:39:37
|
Line 20 typedef struct VirtConsole {
|
Line 20 typedef struct VirtConsole {
|
|
|
|
|
/* Callback function that's called when the guest sends us data */ |
/* Callback function that's called when the guest sends us data */ |
static void flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len) |
static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len) |
{ |
{ |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
|
|
qemu_chr_write(vcon->chr, buf, len); |
return qemu_chr_write(vcon->chr, buf, len); |
} |
} |
|
|
/* Readiness of the guest to accept data on a port */ |
/* Readiness of the guest to accept data on a port */ |
Line 48 static void chr_event(void *opaque, int
|
Line 48 static void chr_event(void *opaque, int
|
VirtConsole *vcon = opaque; |
VirtConsole *vcon = opaque; |
|
|
switch (event) { |
switch (event) { |
case CHR_EVENT_OPENED: { |
case CHR_EVENT_OPENED: |
virtio_serial_open(&vcon->port); |
virtio_serial_open(&vcon->port); |
break; |
break; |
} |
|
case CHR_EVENT_CLOSED: |
case CHR_EVENT_CLOSED: |
virtio_serial_close(&vcon->port); |
virtio_serial_close(&vcon->port); |
break; |
break; |
} |
} |
} |
} |
|
|
/* Virtio Console Ports */ |
static int generic_port_init(VirtConsole *vcon, VirtIOSerialDevice *dev) |
static int virtconsole_initfn(VirtIOSerialDevice *dev) |
|
{ |
{ |
VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev); |
vcon->port.info = dev->info; |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
|
|
|
port->info = dev->info; |
|
|
|
port->is_console = true; |
|
|
|
if (vcon->chr) { |
if (vcon->chr) { |
qemu_chr_add_handlers(vcon->chr, chr_can_read, chr_read, chr_event, |
qemu_chr_add_handlers(vcon->chr, chr_can_read, chr_read, chr_event, |
vcon); |
vcon); |
port->info->have_data = flush_buf; |
vcon->port.info->have_data = flush_buf; |
} |
} |
return 0; |
return 0; |
} |
} |
|
|
|
/* Virtio Console Ports */ |
|
static int virtconsole_initfn(VirtIOSerialDevice *dev) |
|
{ |
|
VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev); |
|
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
|
|
|
port->is_console = true; |
|
return generic_port_init(vcon, dev); |
|
} |
|
|
static int virtconsole_exitfn(VirtIOSerialDevice *dev) |
static int virtconsole_exitfn(VirtIOSerialDevice *dev) |
{ |
{ |
VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev); |
VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev); |
Line 115 static int virtserialport_initfn(VirtIOS
|
Line 118 static int virtserialport_initfn(VirtIOS
|
VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev); |
VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev); |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
|
|
port->info = dev->info; |
return generic_port_init(vcon, dev); |
|
|
if (vcon->chr) { |
|
qemu_chr_add_handlers(vcon->chr, chr_can_read, chr_read, chr_event, |
|
vcon); |
|
port->info->have_data = flush_buf; |
|
} |
|
return 0; |
|
} |
} |
|
|
static VirtIOSerialPortInfo virtserialport_info = { |
static VirtIOSerialPortInfo virtserialport_info = { |