mirror of
https://github.com/qemu/qemu.git
synced 2024-11-23 19:03:38 +08:00
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>
This commit is contained in:
parent
d07aa7c7bb
commit
3dd7852f19
14
cpus.c
14
cpus.c
@ -1537,20 +1537,6 @@ void qmp_inject_nmi(Error **errp)
|
||||
apic_deliver_nmi(cpu->apic_state);
|
||||
}
|
||||
}
|
||||
#elif defined(TARGET_S390X)
|
||||
CPUState *cs;
|
||||
S390CPU *cpu;
|
||||
|
||||
CPU_FOREACH(cs) {
|
||||
cpu = S390_CPU(cs);
|
||||
if (cpu->env.cpu_num == monitor_get_cpu_index()) {
|
||||
if (s390_cpu_restart(S390_CPU(cs)) == -1) {
|
||||
error_set(errp, QERR_UNSUPPORTED);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
nmi_monitor_handle(monitor_get_cpu_index(), errp);
|
||||
#endif
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user