From: Christian Borntraeger <borntraeger@de.ibm.com>
To: Cornelia Huck <cornelia.huck@de.ibm.com>, qemu-devel@nongnu.org
Cc: jfrei@linux.vnet.ibm.com,
Pierre Morel <pmorel@linux.vnet.ibm.com>,
agraf@suse.de
Subject: Re: [Qemu-devel] [PATCH v2 3/9] s390x: remove s390-virtio devices
Date: Fri, 8 Jan 2016 13:23:33 +0100 [thread overview]
Message-ID: <568FAA45.8060407@de.ibm.com> (raw)
In-Reply-To: <1452173818-13661-4-git-send-email-cornelia.huck@de.ibm.com>
On 01/07/2016 02:36 PM, Cornelia Huck wrote:
> From: Pierre Morel <pmorel@linux.vnet.ibm.com>
>
> The s390-virtio machine has been removed; remove the associated devices
> as well.
>
> hw/s390x/s390-virtio-bus.c and hw/s390x/s390-virtio-bus.h
> have been deleted and removed from hw/s390x/Makefile.objs
>
> virtio-size has no more meaning for the modern machine
> and has been removed from helper.c and cpu.h
>
> virtio-serial-s390 belonging to the old machine is
> being removed from vl.c
>
> Signed-off-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
> Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
> ---
> hw/s390x/Makefile.objs | 2 +-
> hw/s390x/s390-virtio-bus.c | 758 ---------------------------------------------
> hw/s390x/s390-virtio-bus.h | 186 -----------
> hw/s390x/s390-virtio.c | 1 -
> target-s390x/cpu.h | 3 -
> target-s390x/helper.c | 2 +-
> vl.c | 7 +-
> 7 files changed, 3 insertions(+), 956 deletions(-)
> delete mode 100644 hw/s390x/s390-virtio-bus.c
> delete mode 100644 hw/s390x/s390-virtio-bus.h
>
> diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs
> index 527d754..2203617 100644
> --- a/hw/s390x/Makefile.objs
> +++ b/hw/s390x/Makefile.objs
> @@ -1,4 +1,4 @@
> -obj-y = s390-virtio-bus.o s390-virtio.o
> +obj-y += s390-virtio.o
> obj-y += s390-virtio-hcall.o
> obj-y += sclp.o
> obj-y += event-facility.o
> diff --git a/hw/s390x/s390-virtio-bus.c b/hw/s390x/s390-virtio-bus.c
> deleted file mode 100644
> index 98cb129..0000000
> --- a/hw/s390x/s390-virtio-bus.c
> +++ /dev/null
> @@ -1,758 +0,0 @@
> -/*
> - * QEMU S390 virtio target
> - *
> - * Copyright (c) 2009 Alexander Graf <agraf@suse.de>
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> - */
> -
> -#include "hw/hw.h"
> -#include "sysemu/block-backend.h"
> -#include "sysemu/sysemu.h"
> -#include "hw/boards.h"
> -#include "hw/loader.h"
> -#include "elf.h"
> -#include "hw/virtio/virtio.h"
> -#include "hw/virtio/virtio-rng.h"
> -#include "hw/virtio/virtio-serial.h"
> -#include "hw/virtio/virtio-net.h"
> -#include "hw/virtio/vhost-scsi.h"
> -#include "hw/sysbus.h"
> -#include "sysemu/kvm.h"
> -
> -#include "hw/s390x/s390-virtio-bus.h"
> -#include "hw/virtio/virtio-bus.h"
> -
> -/* #define DEBUG_S390 */
> -
> -#ifdef DEBUG_S390
> -#define DPRINTF(fmt, ...) \
> - do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
> -#else
> -#define DPRINTF(fmt, ...) \
> - do { } while (0)
> -#endif
> -
> -#define VIRTIO_S390_QUEUE_MAX 64
> -
> -static void virtio_s390_bus_new(VirtioBusState *bus, size_t bus_size,
> - VirtIOS390Device *dev);
> -
> -static const TypeInfo s390_virtio_bus_info = {
> - .name = TYPE_S390_VIRTIO_BUS,
> - .parent = TYPE_BUS,
> - .instance_size = sizeof(VirtIOS390Bus),
> -};
> -
> -static ram_addr_t s390_virtio_device_num_vq(VirtIOS390Device *dev);
> -
> -/* length of VirtIO device pages */
> -const hwaddr virtio_size = S390_DEVICE_PAGES * TARGET_PAGE_SIZE;
> -
> -static void s390_virtio_bus_reset(void *opaque)
> -{
> - VirtIOS390Bus *bus = opaque;
> - bus->next_ring = bus->dev_page + TARGET_PAGE_SIZE;
> -}
> -
> -void s390_virtio_reset_idx(VirtIOS390Device *dev)
> -{
> - int i;
> - hwaddr idx_addr;
> - uint8_t num_vq;
> -
> - num_vq = s390_virtio_device_num_vq(dev);
> - for (i = 0; i < num_vq; i++) {
> - idx_addr = virtio_queue_get_avail_addr(dev->vdev, i) +
> - VIRTIO_VRING_AVAIL_IDX_OFFS;
> - address_space_stw(&address_space_memory, idx_addr, 0,
> - MEMTXATTRS_UNSPECIFIED, NULL);
> - idx_addr = virtio_queue_get_avail_addr(dev->vdev, i) +
> - virtio_queue_get_avail_size(dev->vdev, i);
> - address_space_stw(&address_space_memory, idx_addr, 0,
> - MEMTXATTRS_UNSPECIFIED, NULL);
> - idx_addr = virtio_queue_get_used_addr(dev->vdev, i) +
> - VIRTIO_VRING_USED_IDX_OFFS;
> - address_space_stw(&address_space_memory, idx_addr, 0,
> - MEMTXATTRS_UNSPECIFIED, NULL);
> - idx_addr = virtio_queue_get_used_addr(dev->vdev, i) +
> - virtio_queue_get_used_size(dev->vdev, i);
> - address_space_stw(&address_space_memory, idx_addr, 0,
> - MEMTXATTRS_UNSPECIFIED, NULL);
> - }
> -}
> -
> -VirtIOS390Bus *s390_virtio_bus_init(ram_addr_t *ram_size)
> -{
> - VirtIOS390Bus *bus;
> - BusState *_bus;
> - DeviceState *dev;
> -
> - /* Create bridge device */
> - dev = qdev_create(NULL, "s390-virtio-bridge");
> - qdev_init_nofail(dev);
> -
> - /* Create bus on bridge device */
> -
> - _bus = qbus_create(TYPE_S390_VIRTIO_BUS, dev, "s390-virtio");
> - bus = DO_UPCAST(VirtIOS390Bus, bus, _bus);
> -
> - bus->dev_page = *ram_size;
> - bus->dev_offs = bus->dev_page;
> - bus->next_ring = bus->dev_page + TARGET_PAGE_SIZE;
> -
> - /* Enable hotplugging */
> - qbus_set_hotplug_handler(_bus, dev, &error_abort);
> -
> - /* Allocate RAM for VirtIO device pages (descriptors, queues, rings) */
> - *ram_size += S390_DEVICE_PAGES * TARGET_PAGE_SIZE;
> -
> - qemu_register_reset(s390_virtio_bus_reset, bus);
> - return bus;
> -}
> -
> -static void s390_virtio_device_init(VirtIOS390Device *dev,
> - VirtIODevice *vdev)
> -{
> - VirtIOS390Bus *bus;
> - int dev_len;
> -
> - bus = DO_UPCAST(VirtIOS390Bus, bus, dev->qdev.parent_bus);
> - dev->vdev = vdev;
> - dev->dev_offs = bus->dev_offs;
> - dev->feat_len = sizeof(uint32_t); /* always keep 32 bits features */
> -
> - dev_len = VIRTIO_DEV_OFFS_CONFIG;
> - dev_len += s390_virtio_device_num_vq(dev) * VIRTIO_VQCONFIG_LEN;
> - dev_len += dev->feat_len * 2;
> - dev_len += virtio_bus_get_vdev_config_len(&dev->bus);
> -
> - bus->dev_offs += dev_len;
> -
> - s390_virtio_device_sync(dev);
> - s390_virtio_reset_idx(dev);
> - if (dev->qdev.hotplugged) {
> - s390_virtio_irq(VIRTIO_PARAM_DEV_ADD, dev->dev_offs);
> - }
> -}
> -
> -static void s390_virtio_net_realize(VirtIOS390Device *s390_dev, Error **errp)
> -{
> - DeviceState *qdev = DEVICE(s390_dev);
> - VirtIONetS390 *dev = VIRTIO_NET_S390(s390_dev);
> - DeviceState *vdev = DEVICE(&dev->vdev);
> - Error *err = NULL;
> -
> - virtio_net_set_netclient_name(&dev->vdev, qdev->id,
> - object_get_typename(OBJECT(qdev)));
> - qdev_set_parent_bus(vdev, BUS(&s390_dev->bus));
> - object_property_set_bool(OBJECT(vdev), true, "realized", &err);
> - if (err) {
> - error_propagate(errp, err);
> - return;
> - }
> -
> - s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev));
> -}
> -
> -static void s390_virtio_net_instance_init(Object *obj)
> -{
> - VirtIONetS390 *dev = VIRTIO_NET_S390(obj);
> -
> - virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
> - TYPE_VIRTIO_NET);
> - object_property_add_alias(obj, "bootindex", OBJECT(&dev->vdev),
> - "bootindex", &error_abort);
> -}
> -
> -static void s390_virtio_blk_realize(VirtIOS390Device *s390_dev, Error **errp)
> -{
> - VirtIOBlkS390 *dev = VIRTIO_BLK_S390(s390_dev);
> - DeviceState *vdev = DEVICE(&dev->vdev);
> - Error *err = NULL;
> -
> - qdev_set_parent_bus(vdev, BUS(&s390_dev->bus));
> - object_property_set_bool(OBJECT(vdev), true, "realized", &err);
> - if (err) {
> - error_propagate(errp, err);
> - return;
> - }
> - s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev));
> -}
> -
> -static void s390_virtio_blk_instance_init(Object *obj)
> -{
> - VirtIOBlkS390 *dev = VIRTIO_BLK_S390(obj);
> -
> - virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
> - TYPE_VIRTIO_BLK);
> - object_property_add_alias(obj, "iothread", OBJECT(&dev->vdev),"iothread",
> - &error_abort);
> - object_property_add_alias(obj, "bootindex", OBJECT(&dev->vdev),
> - "bootindex", &error_abort);
> -}
> -
> -static void s390_virtio_serial_realize(VirtIOS390Device *s390_dev, Error **errp)
> -{
> - VirtIOSerialS390 *dev = VIRTIO_SERIAL_S390(s390_dev);
> - DeviceState *vdev = DEVICE(&dev->vdev);
> - DeviceState *qdev = DEVICE(s390_dev);
> - Error *err = NULL;
> - VirtIOS390Bus *bus;
> - char *bus_name;
> -
> - bus = DO_UPCAST(VirtIOS390Bus, bus, qdev->parent_bus);
> -
> - /*
> - * For command line compatibility, this sets the virtio-serial-device bus
> - * name as before.
> - */
> - if (qdev->id) {
> - bus_name = g_strdup_printf("%s.0", qdev->id);
> - virtio_device_set_child_bus_name(VIRTIO_DEVICE(vdev), bus_name);
> - g_free(bus_name);
> - }
> -
> - qdev_set_parent_bus(vdev, BUS(&s390_dev->bus));
> - object_property_set_bool(OBJECT(vdev), true, "realized", &err);
> - if (err) {
> - error_propagate(errp, err);
> - return;
> - }
> -
> - s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev));
> - bus->console = s390_dev;
> -}
> -
> -static void s390_virtio_serial_instance_init(Object *obj)
> -{
> - VirtIOSerialS390 *dev = VIRTIO_SERIAL_S390(obj);
> -
> - virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
> - TYPE_VIRTIO_SERIAL);
> -}
> -
> -static void s390_virtio_scsi_realize(VirtIOS390Device *s390_dev, Error **errp)
> -{
> - VirtIOSCSIS390 *dev = VIRTIO_SCSI_S390(s390_dev);
> - DeviceState *vdev = DEVICE(&dev->vdev);
> - DeviceState *qdev = DEVICE(s390_dev);
> - Error *err = NULL;
> - char *bus_name;
> -
> - /*
> - * For command line compatibility, this sets the virtio-scsi-device bus
> - * name as before.
> - */
> - if (qdev->id) {
> - bus_name = g_strdup_printf("%s.0", qdev->id);
> - virtio_device_set_child_bus_name(VIRTIO_DEVICE(vdev), bus_name);
> - g_free(bus_name);
> - }
> -
> - qdev_set_parent_bus(vdev, BUS(&s390_dev->bus));
> - object_property_set_bool(OBJECT(vdev), true, "realized", &err);
> - if (err) {
> - error_propagate(errp, err);
> - return;
> - }
> -
> - s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev));
> -}
> -
> -static void s390_virtio_scsi_instance_init(Object *obj)
> -{
> - VirtIOSCSIS390 *dev = VIRTIO_SCSI_S390(obj);
> -
> - virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
> - TYPE_VIRTIO_SCSI);
> -}
> -
> -#ifdef CONFIG_VHOST_SCSI
> -static void s390_vhost_scsi_realize(VirtIOS390Device *s390_dev, Error **errp)
> -{
> - VHostSCSIS390 *dev = VHOST_SCSI_S390(s390_dev);
> - DeviceState *vdev = DEVICE(&dev->vdev);
> - Error *err = NULL;
> -
> - qdev_set_parent_bus(vdev, BUS(&s390_dev->bus));
> - object_property_set_bool(OBJECT(vdev), true, "realized", &err);
> - if (err) {
> - error_propagate(errp, err);
> - return;
> - }
> -
> - s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev));
> -}
> -
> -static void s390_vhost_scsi_instance_init(Object *obj)
> -{
> - VHostSCSIS390 *dev = VHOST_SCSI_S390(obj);
> -
> - virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
> - TYPE_VHOST_SCSI);
> -}
> -#endif
> -
> -
> -static void s390_virtio_rng_realize(VirtIOS390Device *s390_dev, Error **errp)
> -{
> - VirtIORNGS390 *dev = VIRTIO_RNG_S390(s390_dev);
> - DeviceState *vdev = DEVICE(&dev->vdev);
> - Error *err = NULL;
> -
> - qdev_set_parent_bus(vdev, BUS(&s390_dev->bus));
> - object_property_set_bool(OBJECT(vdev), true, "realized", &err);
> - if (err) {
> - error_propagate(errp, err);
> - return;
> - }
> -
> - object_property_set_link(OBJECT(dev),
> - OBJECT(dev->vdev.conf.rng), "rng",
> - NULL);
> -
> - s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev));
> -}
> -
> -static void s390_virtio_rng_instance_init(Object *obj)
> -{
> - VirtIORNGS390 *dev = VIRTIO_RNG_S390(obj);
> -
> - virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
> - TYPE_VIRTIO_RNG);
> - object_property_add_alias(obj, "rng", OBJECT(&dev->vdev),
> - "rng", &error_abort);
> -}
> -
> -static uint64_t s390_virtio_device_vq_token(VirtIOS390Device *dev, int vq)
> -{
> - ram_addr_t token_off;
> -
> - token_off = (dev->dev_offs + VIRTIO_DEV_OFFS_CONFIG) +
> - (vq * VIRTIO_VQCONFIG_LEN) +
> - VIRTIO_VQCONFIG_OFFS_TOKEN;
> -
> - return address_space_ldq_be(&address_space_memory, token_off,
> - MEMTXATTRS_UNSPECIFIED, NULL);
> -}
> -
> -static ram_addr_t s390_virtio_device_num_vq(VirtIOS390Device *dev)
> -{
> - VirtIODevice *vdev = dev->vdev;
> - int num_vq;
> -
> - for (num_vq = 0; num_vq < VIRTIO_S390_QUEUE_MAX; num_vq++) {
> - if (!virtio_queue_get_num(vdev, num_vq)) {
> - break;
> - }
> - }
> -
> - return num_vq;
> -}
> -
> -static ram_addr_t s390_virtio_next_ring(VirtIOS390Bus *bus)
> -{
> - ram_addr_t r = bus->next_ring;
> -
> - bus->next_ring += VIRTIO_RING_LEN;
> - return r;
> -}
> -
> -void s390_virtio_device_sync(VirtIOS390Device *dev)
> -{
> - VirtIOS390Bus *bus = DO_UPCAST(VirtIOS390Bus, bus, dev->qdev.parent_bus);
> - ram_addr_t cur_offs;
> - uint8_t num_vq;
> - int i;
> -
> - virtio_reset(dev->vdev);
> -
> - /* Sync dev space */
> - address_space_stb(&address_space_memory,
> - dev->dev_offs + VIRTIO_DEV_OFFS_TYPE,
> - dev->vdev->device_id,
> - MEMTXATTRS_UNSPECIFIED,
> - NULL);
> -
> - address_space_stb(&address_space_memory,
> - dev->dev_offs + VIRTIO_DEV_OFFS_NUM_VQ,
> - s390_virtio_device_num_vq(dev),
> - MEMTXATTRS_UNSPECIFIED,
> - NULL);
> - address_space_stb(&address_space_memory,
> - dev->dev_offs + VIRTIO_DEV_OFFS_FEATURE_LEN,
> - dev->feat_len,
> - MEMTXATTRS_UNSPECIFIED,
> - NULL);
> -
> - address_space_stb(&address_space_memory,
> - dev->dev_offs + VIRTIO_DEV_OFFS_CONFIG_LEN,
> - dev->vdev->config_len,
> - MEMTXATTRS_UNSPECIFIED,
> - NULL);
> -
> - num_vq = s390_virtio_device_num_vq(dev);
> - address_space_stb(&address_space_memory,
> - dev->dev_offs + VIRTIO_DEV_OFFS_NUM_VQ, num_vq,
> - MEMTXATTRS_UNSPECIFIED, NULL);
> -
> - /* Sync virtqueues */
> - for (i = 0; i < num_vq; i++) {
> - ram_addr_t vq = (dev->dev_offs + VIRTIO_DEV_OFFS_CONFIG) +
> - (i * VIRTIO_VQCONFIG_LEN);
> - ram_addr_t vring;
> -
> - vring = s390_virtio_next_ring(bus);
> - virtio_queue_set_addr(dev->vdev, i, vring);
> - virtio_queue_set_vector(dev->vdev, i, i);
> - address_space_stq_be(&address_space_memory,
> - vq + VIRTIO_VQCONFIG_OFFS_ADDRESS, vring,
> - MEMTXATTRS_UNSPECIFIED, NULL);
> - address_space_stw_be(&address_space_memory,
> - vq + VIRTIO_VQCONFIG_OFFS_NUM,
> - virtio_queue_get_num(dev->vdev, i),
> - MEMTXATTRS_UNSPECIFIED,
> - NULL);
> - }
> -
> - cur_offs = dev->dev_offs;
> - cur_offs += VIRTIO_DEV_OFFS_CONFIG;
> - cur_offs += num_vq * VIRTIO_VQCONFIG_LEN;
> -
> - /* Sync feature bitmap */
> - address_space_stl_le(&address_space_memory, cur_offs,
> - dev->vdev->host_features,
> - MEMTXATTRS_UNSPECIFIED, NULL);
> -
> - dev->feat_offs = cur_offs + dev->feat_len;
> - cur_offs += dev->feat_len * 2;
> -
> - /* Sync config space */
> - virtio_bus_get_vdev_config(&dev->bus, dev->vdev->config);
> -
> - cpu_physical_memory_write(cur_offs,
> - dev->vdev->config, dev->vdev->config_len);
> - cur_offs += dev->vdev->config_len;
> -}
> -
> -void s390_virtio_device_update_status(VirtIOS390Device *dev)
> -{
> - VirtIODevice *vdev = dev->vdev;
> - uint32_t features;
> -
> - virtio_set_status(vdev,
> - address_space_ldub(&address_space_memory,
> - dev->dev_offs + VIRTIO_DEV_OFFS_STATUS,
> - MEMTXATTRS_UNSPECIFIED, NULL));
> -
> - /* Update guest supported feature bitmap */
> -
> - features = bswap32(address_space_ldl_be(&address_space_memory,
> - dev->feat_offs,
> - MEMTXATTRS_UNSPECIFIED, NULL));
> - virtio_set_features(vdev, features);
> -}
> -
> -/* Find a device by vring address */
> -VirtIOS390Device *s390_virtio_bus_find_vring(VirtIOS390Bus *bus,
> - ram_addr_t mem,
> - int *vq_num)
> -{
> - BusChild *kid;
> - int i;
> -
> - QTAILQ_FOREACH(kid, &bus->bus.children, sibling) {
> - VirtIOS390Device *dev = (VirtIOS390Device *)kid->child;
> -
> - for (i = 0; i < VIRTIO_S390_QUEUE_MAX; i++) {
> - if (!virtio_queue_get_addr(dev->vdev, i))
> - break;
> - if (virtio_queue_get_addr(dev->vdev, i) == mem) {
> - if (vq_num) {
> - *vq_num = i;
> - }
> - return dev;
> - }
> - }
> - }
> -
> - return NULL;
> -}
> -
> -/* Find a device by device descriptor location */
> -VirtIOS390Device *s390_virtio_bus_find_mem(VirtIOS390Bus *bus, ram_addr_t mem)
> -{
> - BusChild *kid;
> -
> - QTAILQ_FOREACH(kid, &bus->bus.children, sibling) {
> - VirtIOS390Device *dev = (VirtIOS390Device *)kid->child;
> - if (dev->dev_offs == mem) {
> - return dev;
> - }
> - }
> -
> - return NULL;
> -}
> -
> -/* DeviceState to VirtIOS390Device. Note: used on datapath,
> - * be careful and test performance if you change this.
> - */
> -static inline VirtIOS390Device *to_virtio_s390_device_fast(DeviceState *d)
> -{
> - return container_of(d, VirtIOS390Device, qdev);
> -}
> -
> -/* DeviceState to VirtIOS390Device. TODO: use QOM. */
> -static inline VirtIOS390Device *to_virtio_s390_device(DeviceState *d)
> -{
> - return container_of(d, VirtIOS390Device, qdev);
> -}
> -
> -static void virtio_s390_notify(DeviceState *d, uint16_t vector)
> -{
> - VirtIOS390Device *dev = to_virtio_s390_device_fast(d);
> - uint64_t token = s390_virtio_device_vq_token(dev, vector);
> -
> - s390_virtio_irq(0, token);
> -}
> -
> -static void virtio_s390_device_plugged(DeviceState *d, Error **errp)
> -{
> - VirtIOS390Device *dev = to_virtio_s390_device(d);
> - VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
> - int n = virtio_get_num_queues(vdev);
> -
> - if (n > VIRTIO_S390_QUEUE_MAX) {
> - error_setg(errp, "The nubmer of virtqueues %d "
> - "exceeds s390 limit %d", n,
> - VIRTIO_S390_QUEUE_MAX);
> - }
> -}
> -
> -/**************** S390 Virtio Bus Device Descriptions *******************/
> -
> -static void s390_virtio_net_class_init(ObjectClass *klass, void *data)
> -{
> - DeviceClass *dc = DEVICE_CLASS(klass);
> - VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);
> -
> - k->realize = s390_virtio_net_realize;
> - set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
> -}
> -
> -static const TypeInfo s390_virtio_net = {
> - .name = TYPE_VIRTIO_NET_S390,
> - .parent = TYPE_VIRTIO_S390_DEVICE,
> - .instance_size = sizeof(VirtIONetS390),
> - .instance_init = s390_virtio_net_instance_init,
> - .class_init = s390_virtio_net_class_init,
> -};
> -
> -static void s390_virtio_blk_class_init(ObjectClass *klass, void *data)
> -{
> - VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);
> - DeviceClass *dc = DEVICE_CLASS(klass);
> -
> - k->realize = s390_virtio_blk_realize;
> - set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
> -}
> -
> -static const TypeInfo s390_virtio_blk = {
> - .name = "virtio-blk-s390",
> - .parent = TYPE_VIRTIO_S390_DEVICE,
> - .instance_size = sizeof(VirtIOBlkS390),
> - .instance_init = s390_virtio_blk_instance_init,
> - .class_init = s390_virtio_blk_class_init,
> -};
> -
> -static void s390_virtio_serial_class_init(ObjectClass *klass, void *data)
> -{
> - DeviceClass *dc = DEVICE_CLASS(klass);
> - VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);
> -
> - k->realize = s390_virtio_serial_realize;
> - set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
> -}
> -
> -static const TypeInfo s390_virtio_serial = {
> - .name = TYPE_VIRTIO_SERIAL_S390,
> - .parent = TYPE_VIRTIO_S390_DEVICE,
> - .instance_size = sizeof(VirtIOSerialS390),
> - .instance_init = s390_virtio_serial_instance_init,
> - .class_init = s390_virtio_serial_class_init,
> -};
> -
> -static void s390_virtio_rng_class_init(ObjectClass *klass, void *data)
> -{
> - DeviceClass *dc = DEVICE_CLASS(klass);
> - VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);
> -
> - k->realize = s390_virtio_rng_realize;
> - set_bit(DEVICE_CATEGORY_MISC, dc->categories);
> -}
> -
> -static const TypeInfo s390_virtio_rng = {
> - .name = TYPE_VIRTIO_RNG_S390,
> - .parent = TYPE_VIRTIO_S390_DEVICE,
> - .instance_size = sizeof(VirtIORNGS390),
> - .instance_init = s390_virtio_rng_instance_init,
> - .class_init = s390_virtio_rng_class_init,
> -};
> -
> -static void s390_virtio_busdev_realize(DeviceState *dev, Error **errp)
> -{
> - VirtIOS390Device *_dev = (VirtIOS390Device *)dev;
> - VirtIOS390DeviceClass *_info = VIRTIO_S390_DEVICE_GET_CLASS(dev);
> -
> - virtio_s390_bus_new(&_dev->bus, sizeof(_dev->bus), _dev);
> -
> - _info->realize(_dev, errp);
> -}
> -
> -static void s390_virtio_busdev_reset(DeviceState *dev)
> -{
> - VirtIOS390Device *_dev = (VirtIOS390Device *)dev;
> -
> - virtio_reset(_dev->vdev);
> -}
> -
> -static void virtio_s390_device_class_init(ObjectClass *klass, void *data)
> -{
> - DeviceClass *dc = DEVICE_CLASS(klass);
> -
> - dc->realize = s390_virtio_busdev_realize;
> - dc->bus_type = TYPE_S390_VIRTIO_BUS;
> - dc->reset = s390_virtio_busdev_reset;
> -}
> -
> -static const TypeInfo virtio_s390_device_info = {
> - .name = TYPE_VIRTIO_S390_DEVICE,
> - .parent = TYPE_DEVICE,
> - .instance_size = sizeof(VirtIOS390Device),
> - .class_init = virtio_s390_device_class_init,
> - .class_size = sizeof(VirtIOS390DeviceClass),
> - .abstract = true,
> -};
> -
> -static void s390_virtio_scsi_class_init(ObjectClass *klass, void *data)
> -{
> - DeviceClass *dc = DEVICE_CLASS(klass);
> - VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);
> -
> - k->realize = s390_virtio_scsi_realize;
> - set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
> -}
> -
> -static const TypeInfo s390_virtio_scsi = {
> - .name = TYPE_VIRTIO_SCSI_S390,
> - .parent = TYPE_VIRTIO_S390_DEVICE,
> - .instance_size = sizeof(VirtIOSCSIS390),
> - .instance_init = s390_virtio_scsi_instance_init,
> - .class_init = s390_virtio_scsi_class_init,
> -};
> -
> -#ifdef CONFIG_VHOST_SCSI
> -static void s390_vhost_scsi_class_init(ObjectClass *klass, void *data)
> -{
> - DeviceClass *dc = DEVICE_CLASS(klass);
> - VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);
> -
> - k->realize = s390_vhost_scsi_realize;
> - set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
> -}
> -
> -static const TypeInfo s390_vhost_scsi = {
> - .name = TYPE_VHOST_SCSI_S390,
> - .parent = TYPE_VIRTIO_S390_DEVICE,
> - .instance_size = sizeof(VHostSCSIS390),
> - .instance_init = s390_vhost_scsi_instance_init,
> - .class_init = s390_vhost_scsi_class_init,
> -};
> -#endif
> -
> -/***************** S390 Virtio Bus Bridge Device *******************/
> -/* Only required to have the virtio bus as child in the system bus */
> -
> -static int s390_virtio_bridge_init(SysBusDevice *dev)
> -{
> - /* nothing */
> - return 0;
> -}
> -
> -static void s390_virtio_bridge_class_init(ObjectClass *klass, void *data)
> -{
> - SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
> - DeviceClass *dc = DEVICE_CLASS(klass);
> -
> - k->init = s390_virtio_bridge_init;
> - set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
> -}
> -
> -static const TypeInfo s390_virtio_bridge_info = {
> - .name = "s390-virtio-bridge",
> - .parent = TYPE_SYS_BUS_DEVICE,
> - .instance_size = sizeof(SysBusDevice),
> - .class_init = s390_virtio_bridge_class_init,
> - .interfaces = (InterfaceInfo[]) {
> - { TYPE_HOTPLUG_HANDLER },
> - { }
> - }
> -};
> -
> -/* virtio-s390-bus */
> -
> -static void virtio_s390_bus_new(VirtioBusState *bus, size_t bus_size,
> - VirtIOS390Device *dev)
> -{
> - DeviceState *qdev = DEVICE(dev);
> - char virtio_bus_name[] = "virtio-bus";
> -
> - qbus_create_inplace(bus, bus_size, TYPE_VIRTIO_S390_BUS,
> - qdev, virtio_bus_name);
> -}
> -
> -static void virtio_s390_bus_class_init(ObjectClass *klass, void *data)
> -{
> - VirtioBusClass *k = VIRTIO_BUS_CLASS(klass);
> - BusClass *bus_class = BUS_CLASS(klass);
> - bus_class->max_dev = 1;
> - k->notify = virtio_s390_notify;
> - k->device_plugged = virtio_s390_device_plugged;
> -}
> -
> -static const TypeInfo virtio_s390_bus_info = {
> - .name = TYPE_VIRTIO_S390_BUS,
> - .parent = TYPE_VIRTIO_BUS,
> - .instance_size = sizeof(VirtioS390BusState),
> - .class_init = virtio_s390_bus_class_init,
> -};
> -
> -static void s390_virtio_register_types(void)
> -{
> - type_register_static(&virtio_s390_bus_info);
> - type_register_static(&s390_virtio_bus_info);
> - type_register_static(&virtio_s390_device_info);
> - type_register_static(&s390_virtio_serial);
> - type_register_static(&s390_virtio_blk);
> - type_register_static(&s390_virtio_net);
> - type_register_static(&s390_virtio_scsi);
> -#ifdef CONFIG_VHOST_SCSI
> - type_register_static(&s390_vhost_scsi);
> -#endif
> - type_register_static(&s390_virtio_rng);
> - type_register_static(&s390_virtio_bridge_info);
> -}
> -
> -type_init(s390_virtio_register_types)
> diff --git a/hw/s390x/s390-virtio-bus.h b/hw/s390x/s390-virtio-bus.h
> deleted file mode 100644
> index 7ad295e..0000000
> --- a/hw/s390x/s390-virtio-bus.h
> +++ /dev/null
> @@ -1,186 +0,0 @@
> -/*
> - * QEMU S390x VirtIO BUS definitions
> - *
> - * Copyright (c) 2009 Alexander Graf <agraf@suse.de>
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> - */
> -#ifndef HW_S390_VIRTIO_BUS_H
> -#define HW_S390_VIRTIO_BUS_H 1
> -
> -#include <stddef.h>
> -
> -#include "standard-headers/asm-s390/kvm_virtio.h"
> -#include "standard-headers/linux/virtio_ring.h"
> -#include "hw/virtio/virtio-blk.h"
> -#include "hw/virtio/virtio-net.h"
> -#include "hw/virtio/virtio-rng.h"
> -#include "hw/virtio/virtio-serial.h"
> -#include "hw/virtio/virtio-scsi.h"
> -#include "hw/virtio/virtio-bus.h"
> -#ifdef CONFIG_VHOST_SCSI
> -#include "hw/virtio/vhost-scsi.h"
> -#endif
> -
> -typedef struct kvm_device_desc KvmDeviceDesc;
> -
> -#define VIRTIO_DEV_OFFS_TYPE offsetof(KvmDeviceDesc, type)
> -#define VIRTIO_DEV_OFFS_NUM_VQ offsetof(KvmDeviceDesc, num_vq)
> -#define VIRTIO_DEV_OFFS_FEATURE_LEN offsetof(KvmDeviceDesc, feature_len)
> -#define VIRTIO_DEV_OFFS_CONFIG_LEN offsetof(KvmDeviceDesc, config_len)
> -#define VIRTIO_DEV_OFFS_STATUS offsetof(KvmDeviceDesc, status)
> -#define VIRTIO_DEV_OFFS_CONFIG offsetof(KvmDeviceDesc, config)
> -
> -typedef struct kvm_vqconfig KvmVqConfig;
> -#define VIRTIO_VQCONFIG_OFFS_TOKEN offsetof(KvmVqConfig,token) /* 64 bit */
> -#define VIRTIO_VQCONFIG_OFFS_ADDRESS offsetof(KvmVqConfig, address) /* 64 bit */
> -#define VIRTIO_VQCONFIG_OFFS_NUM offsetof(KvmVqConfig, num) /* 16 bit */
> -#define VIRTIO_VQCONFIG_LEN sizeof(KvmVqConfig)
> -
> -#define VIRTIO_RING_LEN (TARGET_PAGE_SIZE * 3)
> -#define VIRTIO_VRING_AVAIL_IDX_OFFS offsetof(struct vring_avail, idx)
> -#define VIRTIO_VRING_USED_IDX_OFFS offsetof(struct vring_used, idx)
> -#define S390_DEVICE_PAGES 512
> -
> -#define TYPE_VIRTIO_S390_DEVICE "virtio-s390-device"
> -#define VIRTIO_S390_DEVICE(obj) \
> - OBJECT_CHECK(VirtIOS390Device, (obj), TYPE_VIRTIO_S390_DEVICE)
> -#define VIRTIO_S390_DEVICE_CLASS(klass) \
> - OBJECT_CLASS_CHECK(VirtIOS390DeviceClass, (klass), TYPE_VIRTIO_S390_DEVICE)
> -#define VIRTIO_S390_DEVICE_GET_CLASS(obj) \
> - OBJECT_GET_CLASS(VirtIOS390DeviceClass, (obj), TYPE_VIRTIO_S390_DEVICE)
> -
> -#define TYPE_S390_VIRTIO_BUS "s390-virtio-bus"
> -#define S390_VIRTIO_BUS(obj) \
> - OBJECT_CHECK(VirtIOS390Bus, (obj), TYPE_S390_VIRTIO_BUS)
> -
> -/* virtio-s390-bus */
> -
> -typedef struct VirtioBusState VirtioS390BusState;
> -typedef struct VirtioBusClass VirtioS390BusClass;
> -
> -#define TYPE_VIRTIO_S390_BUS "virtio-s390-bus"
> -#define VIRTIO_S390_BUS(obj) \
> - OBJECT_CHECK(VirtioS390BusState, (obj), TYPE_VIRTIO_S390_BUS)
> -#define VIRTIO_S390_BUS_GET_CLASS(obj) \
> - OBJECT_GET_CLASS(VirtioS390BusClass, obj, TYPE_VIRTIO_S390_BUS)
> -#define VIRTIO_S390_BUS_CLASS(klass) \
> - OBJECT_CLASS_CHECK(VirtioS390BusClass, klass, TYPE_VIRTIO_S390_BUS)
> -
> -
> -typedef struct VirtIOS390Device VirtIOS390Device;
> -
> -typedef struct VirtIOS390DeviceClass {
> - DeviceClass qdev;
> - void (*realize)(VirtIOS390Device *dev, Error **errp);
> -} VirtIOS390DeviceClass;
> -
> -struct VirtIOS390Device {
> - DeviceState qdev;
> - ram_addr_t dev_offs;
> - ram_addr_t feat_offs;
> - uint8_t feat_len;
> - VirtIODevice *vdev;
> - VirtioBusState bus;
> -};
> -
> -typedef struct VirtIOS390Bus {
> - BusState bus;
> -
> - VirtIOS390Device *console;
> - ram_addr_t dev_page;
> - ram_addr_t dev_offs;
> - ram_addr_t next_ring;
> -} VirtIOS390Bus;
> -
> -
> -void s390_virtio_device_update_status(VirtIOS390Device *dev);
> -
> -VirtIOS390Bus *s390_virtio_bus_init(ram_addr_t *ram_size);
> -
> -VirtIOS390Device *s390_virtio_bus_find_vring(VirtIOS390Bus *bus,
> - ram_addr_t mem, int *vq_num);
> -VirtIOS390Device *s390_virtio_bus_find_mem(VirtIOS390Bus *bus, ram_addr_t mem);
> -void s390_virtio_device_sync(VirtIOS390Device *dev);
> -void s390_virtio_reset_idx(VirtIOS390Device *dev);
> -
> -/* virtio-blk-s390 */
> -
> -#define TYPE_VIRTIO_BLK_S390 "virtio-blk-s390"
> -#define VIRTIO_BLK_S390(obj) \
> - OBJECT_CHECK(VirtIOBlkS390, (obj), TYPE_VIRTIO_BLK_S390)
> -
> -typedef struct VirtIOBlkS390 {
> - VirtIOS390Device parent_obj;
> - VirtIOBlock vdev;
> -} VirtIOBlkS390;
> -
> -/* virtio-scsi-s390 */
> -
> -#define TYPE_VIRTIO_SCSI_S390 "virtio-scsi-s390"
> -#define VIRTIO_SCSI_S390(obj) \
> - OBJECT_CHECK(VirtIOSCSIS390, (obj), TYPE_VIRTIO_SCSI_S390)
> -
> -typedef struct VirtIOSCSIS390 {
> - VirtIOS390Device parent_obj;
> - VirtIOSCSI vdev;
> -} VirtIOSCSIS390;
> -
> -/* virtio-serial-s390 */
> -
> -#define TYPE_VIRTIO_SERIAL_S390 "virtio-serial-s390"
> -#define VIRTIO_SERIAL_S390(obj) \
> - OBJECT_CHECK(VirtIOSerialS390, (obj), TYPE_VIRTIO_SERIAL_S390)
> -
> -typedef struct VirtIOSerialS390 {
> - VirtIOS390Device parent_obj;
> - VirtIOSerial vdev;
> -} VirtIOSerialS390;
> -
> -/* virtio-net-s390 */
> -
> -#define TYPE_VIRTIO_NET_S390 "virtio-net-s390"
> -#define VIRTIO_NET_S390(obj) \
> - OBJECT_CHECK(VirtIONetS390, (obj), TYPE_VIRTIO_NET_S390)
> -
> -typedef struct VirtIONetS390 {
> - VirtIOS390Device parent_obj;
> - VirtIONet vdev;
> -} VirtIONetS390;
> -
> -/* vhost-scsi-s390 */
> -
> -#ifdef CONFIG_VHOST_SCSI
> -#define TYPE_VHOST_SCSI_S390 "vhost-scsi-s390"
> -#define VHOST_SCSI_S390(obj) \
> - OBJECT_CHECK(VHostSCSIS390, (obj), TYPE_VHOST_SCSI_S390)
> -
> -typedef struct VHostSCSIS390 {
> - VirtIOS390Device parent_obj;
> - VHostSCSI vdev;
> -} VHostSCSIS390;
> -#endif
> -
> -/* virtio-rng-s390 */
> -
> -#define TYPE_VIRTIO_RNG_S390 "virtio-rng-s390"
> -#define VIRTIO_RNG_S390(obj) \
> - OBJECT_CHECK(VirtIORNGS390, (obj), TYPE_VIRTIO_RNG_S390)
> -
> -typedef struct VirtIORNGS390 {
> - VirtIOS390Device parent_obj;
> - VirtIORNG vdev;
> -} VirtIORNGS390;
> -
> -#endif
> diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
> index e4ecf0d..5dbb815 100644
> --- a/hw/s390x/s390-virtio.c
> +++ b/hw/s390x/s390-virtio.c
> @@ -35,7 +35,6 @@
> #include "exec/address-spaces.h"
> #include "sysemu/qtest.h"
>
> -#include "hw/s390x/s390-virtio-bus.h"
> #include "hw/s390x/sclp.h"
> #include "hw/s390x/s390_flic.h"
> #include "hw/s390x/s390-virtio.h"
> diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
> index 658cd9d..06ca60b 100644
> --- a/target-s390x/cpu.h
> +++ b/target-s390x/cpu.h
> @@ -545,9 +545,6 @@ int gtod_load(QEMUFile *f, void *opaque, int version_id);
> /* service interrupts are floating therefore we must not pass an cpustate */
> void s390_sclp_extint(uint32_t parm);
>
> -/* from s390-virtio-bus */
> -extern const hwaddr virtio_size;
> -
> #else
> static inline unsigned int s390_cpu_halt(S390CPU *cpu)
> {
> diff --git a/target-s390x/helper.c b/target-s390x/helper.c
> index aa58f39..e23fdeb 100644
> --- a/target-s390x/helper.c
> +++ b/target-s390x/helper.c
> @@ -133,7 +133,7 @@ int s390_cpu_handle_mmu_fault(CPUState *cs, vaddr orig_vaddr,
> }
>
> /* check out of RAM access */
> - if (raddr > (ram_size + virtio_size)) {
> + if (raddr > (ram_size)) {
> DPRINTF("%s: raddr %" PRIx64 " > ram_size %" PRIx64 "\n", __func__,
> (uint64_t)raddr, (uint64_t)ram_size);
> trigger_pgm_exception(env, PGM_ADDRESSING, ILEN_LATER);
> diff --git a/vl.c b/vl.c
> index 5aaea77..0c69d94 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -227,7 +227,6 @@ static struct {
> { .driver = "ide-drive", .flag = &default_cdrom },
> { .driver = "scsi-cd", .flag = &default_cdrom },
> { .driver = "virtio-serial-pci", .flag = &default_virtcon },
> - { .driver = "virtio-serial-s390", .flag = &default_virtcon },
> { .driver = "virtio-serial", .flag = &default_virtcon },
> { .driver = "VGA", .flag = &default_vga },
> { .driver = "isa-vga", .flag = &default_vga },
> @@ -2548,11 +2547,7 @@ static int virtcon_parse(const char *devname)
> }
>
> bus_opts = qemu_opts_create(device, NULL, 0, &error_abort);
> - if (arch_type == QEMU_ARCH_S390X) {
> - qemu_opt_set(bus_opts, "driver", "virtio-serial-s390", &error_abort);
> - } else {
> - qemu_opt_set(bus_opts, "driver", "virtio-serial-pci", &error_abort);
> - }
> + qemu_opt_set(bus_opts, "driver", "virtio-serial", &error_abort);
>
> dev_opts = qemu_opts_create(device, NULL, 0, &error_abort);
> qemu_opt_set(dev_opts, "driver", "virtconsole", &error_abort);
>
next prev parent reply other threads:[~2016-01-08 12:23 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-07 13:36 [Qemu-devel] [PATCH v2 0/9] First set of s390x patches for 2.6 Cornelia Huck
2016-01-07 13:36 ` [Qemu-devel] [PATCH v2 1/9] s390x: add 2.6 compat machine Cornelia Huck
2016-01-08 12:22 ` Christian Borntraeger
2016-01-07 13:36 ` [Qemu-devel] [PATCH v2 2/9] s390x: remove s390-virtio machine Cornelia Huck
2016-01-08 12:22 ` Christian Borntraeger
2016-01-07 13:36 ` [Qemu-devel] [PATCH v2 3/9] s390x: remove s390-virtio devices Cornelia Huck
2016-01-08 12:23 ` Christian Borntraeger [this message]
2016-01-11 17:12 ` Thomas Huth
2016-01-11 18:45 ` Cornelia Huck
2016-01-12 13:26 ` Pierre Morel
2016-01-07 13:36 ` [Qemu-devel] [PATCH v2 4/9] s390x/pci: reject some operations to disabled PCI function Cornelia Huck
2016-01-07 13:36 ` [Qemu-devel] [PATCH v2 5/9] s390x/pci: code cleanup Cornelia Huck
2016-01-07 13:36 ` [Qemu-devel] [PATCH v2 6/9] s390x/virtio: use qemu_check_nic_model() Cornelia Huck
2016-01-07 13:36 ` [Qemu-devel] [PATCH v2 7/9] s390: Introduce CCW_COMPAT_2_5 Cornelia Huck
2016-01-08 12:24 ` Christian Borntraeger
2016-01-07 13:36 ` [Qemu-devel] [PATCH v2 8/9] virtio-ccw: fix sanity check for vector Cornelia Huck
2016-01-07 13:36 ` [Qemu-devel] [PATCH v2 9/9] s390x/pci: return real state during listing PCI Cornelia Huck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=568FAA45.8060407@de.ibm.com \
--to=borntraeger@de.ibm.com \
--cc=agraf@suse.de \
--cc=cornelia.huck@de.ibm.com \
--cc=jfrei@linux.vnet.ibm.com \
--cc=pmorel@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.