version 1.1.1.7, 2018/04/24 19:29:31
|
version 1.1.1.8, 2018/04/24 19:49:49
|
Line 27 static ssize_t flush_buf(VirtIOSerialPor
|
Line 27 static ssize_t flush_buf(VirtIOSerialPor
|
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
ssize_t ret; |
ssize_t ret; |
|
|
|
if (!vcon->chr) { |
|
/* If there's no backend, we can just say we consumed all data. */ |
|
return len; |
|
} |
|
|
ret = qemu_chr_fe_write(vcon->chr, buf, len); |
ret = qemu_chr_fe_write(vcon->chr, buf, len); |
trace_virtio_console_flush_buf(port->id, len, ret); |
trace_virtio_console_flush_buf(port->id, len, ret); |
|
|
Line 52 static void guest_open(VirtIOSerialPort
|
Line 57 static void guest_open(VirtIOSerialPort
|
{ |
{ |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
|
|
|
if (!vcon->chr) { |
|
return; |
|
} |
qemu_chr_fe_open(vcon->chr); |
qemu_chr_fe_open(vcon->chr); |
} |
} |
|
|
Line 60 static void guest_close(VirtIOSerialPort
|
Line 68 static void guest_close(VirtIOSerialPort
|
{ |
{ |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
|
|
|
if (!vcon->chr) { |
|
return; |
|
} |
qemu_chr_fe_close(vcon->chr); |
qemu_chr_fe_close(vcon->chr); |
} |
} |
|
|
Line 98 static void chr_event(void *opaque, int
|
Line 109 static void chr_event(void *opaque, int
|
static int virtconsole_initfn(VirtIOSerialPort *port) |
static int virtconsole_initfn(VirtIOSerialPort *port) |
{ |
{ |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
VirtIOSerialPortInfo *info = DO_UPCAST(VirtIOSerialPortInfo, qdev, |
VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port); |
vcon->port.dev.info); |
|
|
|
if (port->id == 0 && !info->is_console) { |
if (port->id == 0 && !k->is_console) { |
error_report("Port number 0 on virtio-serial devices reserved for virtconsole devices for backward compatibility."); |
error_report("Port number 0 on virtio-serial devices reserved for virtconsole devices for backward compatibility."); |
return -1; |
return -1; |
} |
} |
Line 109 static int virtconsole_initfn(VirtIOSeri
|
Line 119 static int virtconsole_initfn(VirtIOSeri
|
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); |
info->have_data = flush_buf; |
|
info->guest_open = guest_open; |
|
info->guest_close = guest_close; |
|
} |
} |
|
|
return 0; |
return 0; |
} |
} |
|
|
static int virtconsole_exitfn(VirtIOSerialPort *port) |
static Property virtconsole_properties[] = { |
{ |
DEFINE_PROP_CHR("chardev", VirtConsole, chr), |
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); |
DEFINE_PROP_END_OF_LIST(), |
|
}; |
|
|
if (vcon->chr) { |
static void virtconsole_class_init(ObjectClass *klass, void *data) |
/* |
{ |
* Instead of closing the chardev, free it so it can be used |
DeviceClass *dc = DEVICE_CLASS(klass); |
* for other purposes. |
VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_CLASS(klass); |
*/ |
|
qemu_chr_add_handlers(vcon->chr, NULL, NULL, NULL, NULL); |
|
} |
|
|
|
return 0; |
k->is_console = true; |
} |
k->init = virtconsole_initfn; |
|
k->have_data = flush_buf; |
|
k->guest_open = guest_open; |
|
k->guest_close = guest_close; |
|
dc->props = virtconsole_properties; |
|
} |
|
|
|
static TypeInfo virtconsole_info = { |
|
.name = "virtconsole", |
|
.parent = TYPE_VIRTIO_SERIAL_PORT, |
|
.instance_size = sizeof(VirtConsole), |
|
.class_init = virtconsole_class_init, |
|
}; |
|
|
static VirtIOSerialPortInfo virtconsole_info = { |
static Property virtserialport_properties[] = { |
.qdev.name = "virtconsole", |
DEFINE_PROP_CHR("chardev", VirtConsole, chr), |
.qdev.size = sizeof(VirtConsole), |
DEFINE_PROP_END_OF_LIST(), |
.is_console = true, |
|
.init = virtconsole_initfn, |
|
.exit = virtconsole_exitfn, |
|
.qdev.props = (Property[]) { |
|
DEFINE_PROP_CHR("chardev", VirtConsole, chr), |
|
DEFINE_PROP_END_OF_LIST(), |
|
}, |
|
}; |
}; |
|
|
static void virtconsole_register(void) |
static void virtserialport_class_init(ObjectClass *klass, void *data) |
{ |
{ |
virtio_serial_port_qdev_register(&virtconsole_info); |
DeviceClass *dc = DEVICE_CLASS(klass); |
} |
VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_CLASS(klass); |
device_init(virtconsole_register) |
|
|
|
static VirtIOSerialPortInfo virtserialport_info = { |
k->init = virtconsole_initfn; |
.qdev.name = "virtserialport", |
k->have_data = flush_buf; |
.qdev.size = sizeof(VirtConsole), |
k->guest_open = guest_open; |
.init = virtconsole_initfn, |
k->guest_close = guest_close; |
.exit = virtconsole_exitfn, |
dc->props = virtserialport_properties; |
.qdev.props = (Property[]) { |
} |
DEFINE_PROP_CHR("chardev", VirtConsole, chr), |
|
DEFINE_PROP_END_OF_LIST(), |
static TypeInfo virtserialport_info = { |
}, |
.name = "virtserialport", |
|
.parent = TYPE_VIRTIO_SERIAL_PORT, |
|
.instance_size = sizeof(VirtConsole), |
|
.class_init = virtserialport_class_init, |
}; |
}; |
|
|
static void virtserialport_register(void) |
static void virtconsole_register_types(void) |
{ |
{ |
virtio_serial_port_qdev_register(&virtserialport_info); |
type_register_static(&virtconsole_info); |
|
type_register_static(&virtserialport_info); |
} |
} |
device_init(virtserialport_register) |
|
|
type_init(virtconsole_register_types) |