diff options
author | Alon Levy <alevy@redhat.com> | 2010-08-25 13:52:07 +0300 |
---|---|---|
committer | Alon Levy <alevy@redhat.com> | 2010-08-25 19:53:14 +0300 |
commit | 7b8fef6b34611f0d3af55756d024eb1828e4b90a (patch) | |
tree | d0a2d9baaf50608bc1d7fac9bce3fea55560d5ee | |
parent | 1801b2418108b795467ef6d5f7fd10849ba23a20 (diff) |
spice-vmc,vdi: update to use SpiceCharDevice* instead of SpiceVDIPort*spice.kvm.v14.usb_ccid.spicevmc_chardev.refactor_vdiport_interface
-rw-r--r-- | hw/spice-vdi.c | 22 | ||||
-rw-r--r-- | hw/spice-vmc.c | 56 |
2 files changed, 59 insertions, 19 deletions
diff --git a/hw/spice-vdi.c b/hw/spice-vdi.c index 23cbbe16e..f5fda4d06 100644 --- a/hw/spice-vdi.c +++ b/hw/spice-vdi.c @@ -104,7 +104,7 @@ typedef struct PCIVDIPortDevice { int running; int new_gen_on_resume; int active_interface; - SpiceVDIPortInstance sin; + SpiceCharDeviceInstance sin; int plug_read_pos; } PCIVDIPortDevice; @@ -178,7 +178,7 @@ static void vdi_port_notify_guest(PCIVDIPortDevice *d) vdi_port_set_dirty(d, &d->ram->int_pending, sizeof(d->ram->int_pending)); } -static int vdi_port_interface_write(SpiceVDIPortInstance *sin, +static int vdi_port_interface_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len) { PCIVDIPortDevice *d = container_of(sin, PCIVDIPortDevice, sin); @@ -224,7 +224,7 @@ static int vdi_port_interface_write(SpiceVDIPortInstance *sin, return actual_write; } -static int vdi_port_interface_read(SpiceVDIPortInstance *sin, +static int vdi_port_interface_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len) { PCIVDIPortDevice *d = container_of(sin, PCIVDIPortDevice, sin); @@ -290,12 +290,18 @@ static int vdi_port_interface_read(SpiceVDIPortInstance *sin, return actual_read; } -static SpiceVDIPortInterface vdi_port_interface = { - .base.type = SPICE_INTERFACE_VDI_PORT, +static const char* vdi_port_subtype(SpiceCharDeviceInstance* sin) +{ + return "vdagent"; +} + +static SpiceCharDeviceInterface vdi_port_interface = { + .base.type = SPICE_INTERFACE_CHAR_DEVICE, .base.description = "vdi port", - .base.major_version = SPICE_INTERFACE_VDI_PORT_MAJOR, - .base.minor_version = SPICE_INTERFACE_VDI_PORT_MINOR, + .base.major_version = SPICE_INTERFACE_CHAR_DEVICE_MAJOR, + .base.minor_version = SPICE_INTERFACE_CHAR_DEVICE_MINOR, + .subtype = vdi_port_subtype, .write = vdi_port_interface_write, .read = vdi_port_interface_read, }; @@ -354,7 +360,7 @@ static void vdi_port_dev_disconnect(PCIVDIPortDevice *d) static void vdi_port_dev_notify(PCIVDIPortDevice *d) { - spice_server_vdi_port_wakeup(&d->sin); + spice_server_char_device_wakeup(&d->sin); } static void vdi_port_write_dword(void *opaque, uint32_t addr, uint32_t val) diff --git a/hw/spice-vmc.c b/hw/spice-vmc.c index f52ed1943..0199450da 100644 --- a/hw/spice-vmc.c +++ b/hw/spice-vmc.c @@ -35,7 +35,8 @@ typedef struct SpiceVirtualChannel { VirtIOSerialPort port; VMChangeStateEntry *vmstate; - SpiceVDIPortInstance sin; + SpiceCharDeviceInstance sin; + char *subtype; bool active; uint8_t *buffer; uint8_t *datapos; @@ -43,7 +44,7 @@ typedef struct SpiceVirtualChannel { uint32_t debug; } SpiceVirtualChannel; -static int vmc_write(SpiceVDIPortInstance *sin, const uint8_t *buf, int len) +static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len) { SpiceVirtualChannel *svc = container_of(sin, SpiceVirtualChannel, sin); ssize_t out = 0; @@ -66,7 +67,7 @@ static int vmc_write(SpiceVDIPortInstance *sin, const uint8_t *buf, int len) return out; } -static int vmc_read(SpiceVDIPortInstance *sin, uint8_t *buf, int len) +static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len) { SpiceVirtualChannel *svc = container_of(sin, SpiceVirtualChannel, sin); int bytes = MIN(len, svc->datalen); @@ -86,11 +87,20 @@ static int vmc_read(SpiceVDIPortInstance *sin, uint8_t *buf, int len) return bytes; } -static SpiceVDIPortInterface vmc_interface = { - .base.type = SPICE_INTERFACE_VDI_PORT, - .base.description = "spice virtual channel vdi port", - .base.major_version = SPICE_INTERFACE_VDI_PORT_MAJOR, - .base.minor_version = SPICE_INTERFACE_VDI_PORT_MINOR, +static const char* vmc_subtype(SpiceCharDeviceInstance* sin) +{ + SpiceVirtualChannel *scd = container_of(sin, SpiceVirtualChannel, sin); + + dprintf(scd, 2, "%s\n", __func__); + return scd->subtype; +} + +static SpiceCharDeviceInterface vmc_interface = { + .base.type = SPICE_INTERFACE_CHAR_DEVICE, + .base.description = "spice virtual channel char device", + .base.major_version = SPICE_INTERFACE_CHAR_DEVICE_MAJOR, + .base.minor_version = SPICE_INTERFACE_CHAR_DEVICE_MINOR, + .subtype = vmc_subtype, .write = vmc_write, .read = vmc_read, }; @@ -122,7 +132,7 @@ static void vmc_change_state_handler(void *opaque, int running, int reason) SpiceVirtualChannel *svc = opaque; if (running && svc->active) { - spice_server_vdi_port_wakeup(&svc->sin); + spice_server_char_device_wakeup(&svc->sin); } } @@ -152,7 +162,7 @@ static void vmc_guest_ready(VirtIOSerialPort *port) dprintf(svc, 1, "%s\n", __func__); if (svc->active) - spice_server_vdi_port_wakeup(&svc->sin); + spice_server_char_device_wakeup(&svc->sin); } static void vmc_have_data(VirtIOSerialPort *port, const uint8_t *buf, size_t len) @@ -169,7 +179,7 @@ static void vmc_have_data(VirtIOSerialPort *port, const uint8_t *buf, size_t len svc->datapos = svc->buffer; svc->datalen = len; virtio_serial_throttle_port(&svc->port, true); - spice_server_vdi_port_wakeup(&svc->sin); + spice_server_char_device_wakeup(&svc->sin); } static void vmc_reset(DeviceState *opaque) @@ -185,11 +195,34 @@ static int vmc_initfn(VirtIOSerialDevice *dev) { VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev); SpiceVirtualChannel *svc = DO_UPCAST(SpiceVirtualChannel, port, port); + const char** psubtype = spice_server_char_device_recognized_subtypes(); + const char *subtype = NULL; + int i; if (!using_spice) return -1; dprintf(svc, 1, "%s\n", __func__); + + for(;*psubtype != NULL; ++psubtype) { + if (strcmp(svc->subtype, *psubtype) == 0) { + subtype = *psubtype; + break; + } + } + if (subtype == NULL) { + fprintf(stderr, "spice-vmc: unsupported subtype\n"); + fprintf(stderr, "supported subtypes: "); + for(i=0, psubtype = spice_server_char_device_recognized_subtypes(); + *psubtype != NULL; ++psubtype, ++i) { + if (i == 0) { + fprintf(stderr, *psubtype); + } else { + fprintf(stderr, ", %s", *psubtype); + } + } + return -1; + } port->name = qemu_strdup(VMC_GUEST_DEVICE_NAME); svc->vmstate = qemu_add_vm_change_state_handler( vmc_change_state_handler, svc); @@ -222,6 +255,7 @@ static VirtIOSerialPortInfo vmc_info = { .qdev.props = (Property[]) { DEFINE_PROP_UINT32("nr", SpiceVirtualChannel, port.id, VIRTIO_CONSOLE_BAD_ID), DEFINE_PROP_UINT32("debug", SpiceVirtualChannel, debug, 1), + DEFINE_PROP_STRING("subtype", SpiceVirtualChannel, subtype), DEFINE_PROP_END_OF_LIST(), } }; |