sim-card
/
qemu
Archived
10
0
Fork 0

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
This commit is contained in:
Aurelien Jarno 2012-01-10 18:24:11 +01:00
commit 14763ec873
9 changed files with 87 additions and 32 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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,

View File

@ -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);

View File

@ -35,6 +35,11 @@
#define VIRTIO_RING_LEN (TARGET_PAGE_SIZE * 3)
#define S390_DEVICE_PAGES 512
#define VIRTIO_PARAM_MASK 0xff
#define VIRTIO_PARAM_VRING_INTERRUPT 0x0
#define VIRTIO_PARAM_CONFIG_CHANGED 0x1
#define VIRTIO_PARAM_DEV_ADD 0x2
typedef struct VirtIOS390Device {
DeviceState qdev;
ram_addr_t dev_offs;

View File

@ -143,9 +143,13 @@ extern unsigned int nb_prom_envs;
/* pci-hotplug */
void pci_device_hot_add(Monitor *mon, const QDict *qdict);
void drive_hot_add(Monitor *mon, const QDict *qdict);
int pci_drive_hot_add(Monitor *mon, const QDict *qdict,
DriveInfo *dinfo, int type);
void do_pci_device_hot_remove(Monitor *mon, const QDict *qdict);
/* generic hotplug */
void drive_hot_add(Monitor *mon, const QDict *qdict);
/* pcie aer error injection */
void pcie_aer_inject_error_print(Monitor *mon, const QObject *data);
int do_pcie_aer_inject_error(Monitor *mon,

View File

@ -185,9 +185,6 @@ void kvm_s390_interrupt_internal(CPUState *env, int type, uint32_t parm,
return;
}
s390_add_running_cpu(env);
qemu_cpu_kick(env);
kvmint.type = type;
kvmint.parm = parm;
kvmint.parm64 = parm64;

View File

@ -636,6 +636,9 @@ uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret)
case 0x700:
cc = helper_xc(l, get_address(0, b1, d1), get_address(0, b2, d2));
break;
case 0xc00:
helper_tr(l, get_address(0, b1, d1), get_address(0, b2, d2));
break;
default:
goto abort;
break;