Commit 14763ec8 authored by Aurelien Jarno's avatar Aurelien Jarno
Browse files

Merge branch 's390-next' of git://repo.or.cz/qemu/agraf

* 's390-next' of git://repo.or.cz/qemu/agraf:
  s390: fix cpu hotplug / cpu activity on interrupts
  s390x: add TR function for EXECUTE
  Expose drive_add on all architectures
  Add generic drive hotplugging
  Compile device-hotplug on all targets
  [S390] Add hotplug support
parents 665a04ae 93116ac0
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -220,12 +220,15 @@ ifeq ($(CONFIG_KVM), y)
endif
obj-$(CONFIG_IVSHMEM) += ivshmem.o

# Generic hotplugging
obj-y += device-hotplug.o

# Hardware support
obj-i386-y += vga.o
obj-i386-y += mc146818rtc.o pc.o
obj-i386-y += cirrus_vga.o sga.o apic.o ioapic.o piix_pci.o
obj-i386-y += vmport.o
obj-i386-y += device-hotplug.o pci-hotplug.o smbios.o wdt_ib700.o
obj-i386-y += pci-hotplug.o smbios.o wdt_ib700.o
obj-i386-y += debugcon.o multiboot.o
obj-i386-y += pc_piix.o
obj-i386-$(CONFIG_KVM) += kvmclock.o
+0 −2
Original line number Diff line number Diff line
@@ -846,7 +846,6 @@ STEXI
Snapshot device, using snapshot file as target if provided
ETEXI

#if defined(TARGET_I386)
    {
        .name       = "drive_add",
        .args_type  = "pci_addr:s,opts:s",
@@ -859,7 +858,6 @@ ETEXI
        .help       = "add drive to PCI storage controller",
        .mhandler.cmd = drive_hot_add,
    },
#endif

STEXI
@item drive_add
+47 −0
Original line number Diff line number Diff line
@@ -26,6 +26,9 @@
#include "boards.h"
#include "net.h"
#include "blockdev.h"
#include "qemu-config.h"
#include "sysemu.h"
#include "monitor.h"

DriveInfo *add_init_drive(const char *optstr)
{
@@ -44,3 +47,47 @@ DriveInfo *add_init_drive(const char *optstr)

    return dinfo;
}

#if !defined(TARGET_I386)
int pci_drive_hot_add(Monitor *mon, const QDict *qdict,
                      DriveInfo *dinfo, int type)
{
    /* On non-x86 we don't do PCI hotplug */
    monitor_printf(mon, "Can't hot-add drive to type %d\n", type);
    return -1;
}
#endif

void drive_hot_add(Monitor *mon, const QDict *qdict)
{
    int type;
    DriveInfo *dinfo = NULL;
    const char *opts = qdict_get_str(qdict, "opts");

    dinfo = add_init_drive(opts);
    if (!dinfo) {
        goto err;
    }
    if (dinfo->devaddr) {
        monitor_printf(mon, "Parameter addr not supported\n");
        goto err;
    }
    type = dinfo->type;

    switch (type) {
    case IF_NONE:
        monitor_printf(mon, "OK\n");
        break;
    default:
        if (pci_drive_hot_add(mon, qdict, dinfo, type)) {
            goto err;
        }
    }
    return;

err:
    if (dinfo) {
        drive_put_ref(dinfo);
    }
    return;
}
+4 −20
Original line number Diff line number Diff line
@@ -104,24 +104,13 @@ static int scsi_hot_add(Monitor *mon, DeviceState *adapter,
    return 0;
}

void drive_hot_add(Monitor *mon, const QDict *qdict)
int pci_drive_hot_add(Monitor *mon, const QDict *qdict,
                      DriveInfo *dinfo, int type)
{
    int dom, pci_bus;
    unsigned slot;
    int type;
    PCIDevice *dev;
    DriveInfo *dinfo = NULL;
    const char *pci_addr = qdict_get_str(qdict, "pci_addr");
    const char *opts = qdict_get_str(qdict, "opts");

    dinfo = add_init_drive(opts);
    if (!dinfo)
        goto err;
    if (dinfo->devaddr) {
        monitor_printf(mon, "Parameter addr not supported\n");
        goto err;
    }
    type = dinfo->type;

    switch (type) {
    case IF_SCSI:
@@ -138,19 +127,14 @@ void drive_hot_add(Monitor *mon, const QDict *qdict)
            goto err;
        }
        break;
    case IF_NONE:
        monitor_printf(mon, "OK\n");
        break;
    default:
        monitor_printf(mon, "Can't hot-add drive to type %d\n", type);
        goto err;
    }
    return;

    return 0;
err:
    if (dinfo)
        drive_put_ref(dinfo);
    return;
    return -1;
}

static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
+19 −5
Original line number Diff line number Diff line
@@ -82,12 +82,24 @@ VirtIOS390Bus *s390_virtio_bus_init(ram_addr_t *ram_size)
    bus->dev_offs = bus->dev_page;
    bus->next_ring = bus->dev_page + TARGET_PAGE_SIZE;

    /* Enable hotplugging */
    _bus->allow_hotplug = 1;

    /* Allocate RAM for VirtIO device pages (descriptors, queues, rings) */
    *ram_size += S390_DEVICE_PAGES * TARGET_PAGE_SIZE;

    return bus;
}

static void s390_virtio_irq(CPUState *env, int config_change, uint64_t token)
{
    if (kvm_enabled()) {
        kvm_s390_virtio_irq(env, config_change, token);
    } else {
        cpu_inject_ext(env, VIRTIO_EXT_CODE, config_change, token);
    }
}

static int s390_virtio_device_init(VirtIOS390Device *dev, VirtIODevice *vdev)
{
    VirtIOS390Bus *bus;
@@ -109,6 +121,11 @@ static int s390_virtio_device_init(VirtIOS390Device *dev, VirtIODevice *vdev)
    dev->host_features = vdev->get_features(vdev, dev->host_features);
    s390_virtio_device_sync(dev);

    if (dev->qdev.hotplugged) {
        CPUState *env = s390_cpu_addr2state(0);
        s390_virtio_irq(env, VIRTIO_PARAM_DEV_ADD, dev->dev_offs);
    }

    return 0;
}

@@ -310,11 +327,7 @@ static void virtio_s390_notify(void *opaque, uint16_t vector)
    uint64_t token = s390_virtio_device_vq_token(dev, vector);
    CPUState *env = s390_cpu_addr2state(0);

    if (kvm_enabled()) {
        kvm_s390_virtio_irq(env, 0, token);
    } else {
        cpu_inject_ext(env, VIRTIO_EXT_CODE, 0, token);
    }
    s390_virtio_irq(env, 0, token);
}

static unsigned virtio_s390_get_features(void *opaque)
@@ -382,6 +395,7 @@ static void s390_virtio_bus_register_withprop(VirtIOS390DeviceInfo *info)
{
    info->qdev.init = s390_virtio_busdev_init;
    info->qdev.bus_info = &s390_virtio_bus_info;
    info->qdev.unplug = qdev_simple_unplug_cb;

    assert(info->qdev.size >= sizeof(VirtIOS390Device));
    qdev_register(&info->qdev);
Loading