Revision 7f7f9752
b/cpus.c | ||
---|---|---|
1401 | 1401 |
apic_deliver_nmi(env->apic_state); |
1402 | 1402 |
} |
1403 | 1403 |
} |
1404 |
#elif defined(TARGET_S390X) |
|
1405 |
CPUState *cs; |
|
1406 |
S390CPU *cpu; |
|
1407 |
|
|
1408 |
for (cs = first_cpu; cs != NULL; cs = cs->next_cpu) { |
|
1409 |
cpu = S390_CPU(cs); |
|
1410 |
if (cpu->env.cpu_num == monitor_get_cpu_index()) { |
|
1411 |
if (s390_cpu_restart(S390_CPU(cs)) == -1) { |
|
1412 |
error_set(errp, QERR_UNSUPPORTED); |
|
1413 |
return; |
|
1414 |
} |
|
1415 |
break; |
|
1416 |
} |
|
1417 |
} |
|
1404 | 1418 |
#else |
1405 | 1419 |
error_set(errp, QERR_UNSUPPORTED); |
1406 | 1420 |
#endif |
b/hmp-commands.hx | ||
---|---|---|
822 | 822 |
the same that can be specified in the @code{-boot} command line option. |
823 | 823 |
ETEXI |
824 | 824 |
|
825 |
#if defined(TARGET_I386) |
|
825 |
#if defined(TARGET_I386) || defined(TARGET_S390X)
|
|
826 | 826 |
{ |
827 | 827 |
.name = "nmi", |
828 | 828 |
.args_type = "", |
... | ... | |
834 | 834 |
STEXI |
835 | 835 |
@item nmi @var{cpu} |
836 | 836 |
@findex nmi |
837 |
Inject an NMI on the given CPU (x86 only).
|
|
837 |
Inject an NMI (x86) or RESTART (s390x) on the given CPU.
|
|
838 | 838 |
|
839 | 839 |
ETEXI |
840 | 840 |
|
b/qmp-commands.hx | ||
---|---|---|
487 | 487 |
<- { "return": {} } |
488 | 488 |
|
489 | 489 |
Note: inject-nmi fails when the guest doesn't support injecting. |
490 |
Currently, only x86 guests do. |
|
490 |
Currently, only x86 (NMI) and s390x (RESTART) guests do.
|
|
491 | 491 |
|
492 | 492 |
EQMP |
493 | 493 |
|
b/target-s390x/cpu.h | ||
---|---|---|
1069 | 1069 |
int kvm_s390_get_registers_partial(CPUState *cpu); |
1070 | 1070 |
int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch, |
1071 | 1071 |
int vq, bool assign); |
1072 |
int kvm_s390_cpu_restart(S390CPU *cpu); |
|
1072 | 1073 |
#else |
1073 | 1074 |
static inline void kvm_s390_io_interrupt(S390CPU *cpu, |
1074 | 1075 |
uint16_t subchannel_id, |
... | ... | |
1093 | 1094 |
{ |
1094 | 1095 |
return -ENOSYS; |
1095 | 1096 |
} |
1097 |
static inline int kvm_s390_cpu_restart(S390CPU *cpu) |
|
1098 |
{ |
|
1099 |
return -ENOSYS; |
|
1100 |
} |
|
1096 | 1101 |
#endif |
1097 | 1102 |
|
1103 |
static inline int s390_cpu_restart(S390CPU *cpu) |
|
1104 |
{ |
|
1105 |
if (kvm_enabled()) { |
|
1106 |
return kvm_s390_cpu_restart(cpu); |
|
1107 |
} |
|
1108 |
return -ENOSYS; |
|
1109 |
} |
|
1110 |
|
|
1098 | 1111 |
static inline void s390_io_interrupt(S390CPU *cpu, |
1099 | 1112 |
uint16_t subchannel_id, |
1100 | 1113 |
uint16_t subchannel_nr, |
b/target-s390x/kvm.c | ||
---|---|---|
612 | 612 |
return r; |
613 | 613 |
} |
614 | 614 |
|
615 |
static int s390_cpu_restart(S390CPU *cpu)
|
|
615 |
int kvm_s390_cpu_restart(S390CPU *cpu)
|
|
616 | 616 |
{ |
617 | 617 |
kvm_s390_interrupt(cpu, KVM_S390_RESTART, 0); |
618 | 618 |
s390_add_running_cpu(cpu); |
619 | 619 |
qemu_cpu_kick(CPU(cpu)); |
620 |
DPRINTF("DONE: SIGP cpu restart: %p\n", &cpu->env);
|
|
620 |
DPRINTF("DONE: KVM cpu restart: %p\n", &cpu->env);
|
|
621 | 621 |
return 0; |
622 | 622 |
} |
623 | 623 |
|
... | ... | |
686 | 686 |
|
687 | 687 |
switch (order_code) { |
688 | 688 |
case SIGP_RESTART: |
689 |
r = s390_cpu_restart(target_cpu); |
|
689 |
r = kvm_s390_cpu_restart(target_cpu);
|
|
690 | 690 |
break; |
691 | 691 |
case SIGP_STORE_STATUS_ADDR: |
692 | 692 |
r = s390_store_status(target_env, parameter); |
Also available in: Unified diff