diff options
author | Alexey Kardashevskiy <aik@ozlabs.ru> | 2014-08-20 22:16:35 +1000 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-08-25 13:25:16 +0200 |
commit | 3dd7852f1925ec1b3eca32c894e1a84882e145f1 (patch) | |
tree | 0378cac36b7527ee99bac686b5065deb5b7ac3ec /hw | |
parent | d07aa7c7bb06fdc9973059889b33dfca1d2efe55 (diff) |
s390x: Migrate to new NMI interface
This implements an NMI interface for s390 and s390-ccw machines.
This removes #ifdef s390 branch in qmp_inject_nmi so new s390's
nmi_monitor_handler() callback is going to be used for NMI.
Since nmi_monitor_handler()-calling code is platform independent,
CPUState::cpu_index is used instead of S390CPU::env.cpu_num.
There should not be any change in behaviour as both @cpu_index and
@cpu_num are global CPU numbers.
Note that s390_cpu_restart() already takes care of the specified cpu,
so we don't need to schedule via async_run_on_cpu().
Since the only error s390_cpu_restart() can return is ENOSYS, convert
it to QERR_UNSUPPORTED.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: Alexander Graf <agraf@suse.de>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/s390x/s390-virtio-ccw.c | 6 | ||||
-rw-r--r-- | hw/s390x/s390-virtio.c | 15 | ||||
-rw-r--r-- | hw/s390x/s390-virtio.h | 3 |
3 files changed, 24 insertions, 0 deletions
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index 05311b861d..004b2c20c5 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -139,6 +139,7 @@ static void ccw_init(MachineState *machine) static void ccw_machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + NMIClass *nc = NMI_CLASS(oc); mc->name = "s390-ccw-virtio"; mc->alias = "s390-ccw"; @@ -152,12 +153,17 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data) mc->no_sdcard = 1; mc->use_sclp = 1, mc->max_cpus = 255; + nc->nmi_monitor_handler = s390_nmi; } static const TypeInfo ccw_machine_info = { .name = TYPE_S390_CCW_MACHINE, .parent = TYPE_MACHINE, .class_init = ccw_machine_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_NMI }, + { } + }, }; static void ccw_machine_register_types(void) diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c index f1e0dbc91b..1a75a1cf81 100644 --- a/hw/s390x/s390-virtio.c +++ b/hw/s390x/s390-virtio.c @@ -280,9 +280,19 @@ static void s390_init(MachineState *machine) s390_create_virtio_net((BusState *)s390_bus, "virtio-net-s390"); } +void s390_nmi(NMIState *n, int cpu_index, Error **errp) +{ + CPUState *cs = qemu_get_cpu(cpu_index); + + if (s390_cpu_restart(S390_CPU(cs))) { + error_set(errp, QERR_UNSUPPORTED); + } +} + static void s390_machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + NMIClass *nc = NMI_CLASS(oc); mc->name = "s390-virtio"; mc->alias = "s390"; @@ -297,12 +307,17 @@ static void s390_machine_class_init(ObjectClass *oc, void *data) mc->no_cdrom = 1; mc->no_sdcard = 1; mc->is_default = 1; + nc->nmi_monitor_handler = s390_nmi; } static const TypeInfo s390_machine_info = { .name = TYPE_S390_MACHINE, .parent = TYPE_MACHINE, .class_init = s390_machine_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_NMI }, + { } + }, }; static void s390_machine_register_types(void) diff --git a/hw/s390x/s390-virtio.h b/hw/s390x/s390-virtio.h index 5c405e7755..33847aefcf 100644 --- a/hw/s390x/s390-virtio.h +++ b/hw/s390x/s390-virtio.h @@ -12,6 +12,8 @@ #ifndef HW_S390_VIRTIO_H #define HW_S390_VIRTIO_H 1 +#include "hw/nmi.h" + #define KVM_S390_VIRTIO_NOTIFY 0 #define KVM_S390_VIRTIO_RESET 1 #define KVM_S390_VIRTIO_SET_STATUS 2 @@ -26,4 +28,5 @@ void s390_init_ipl_dev(const char *kernel_filename, const char *initrd_filename, const char *firmware); void s390_create_virtio_net(BusState *bus, const char *name); +void s390_nmi(NMIState *n, int cpu_index, Error **errp); #endif |