void qmp_inject_nmi(Error **errp) { #if defined(TARGET_I386) CPUState *cs; for (cs = first_cpu; cs != NULL; cs = cs->next_cpu) { X86CPU *cpu = X86_CPU(cs); CPUX86State *env = &cpu->env; if (!env->apic_state) { cpu_interrupt(cs, CPU_INTERRUPT_NMI); } else { apic_deliver_nmi(env->apic_state); } } #elif defined(TARGET_S390X) CPUState *cs; S390CPU *cpu; for (cs = first_cpu; cs != NULL; cs = cs->next_cpu) { 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 error_set(errp, QERR_UNSUPPORTED); #endif }
void nmi_monitor_handle(int cpu_index, Error **errp) { struct do_nmi_s ns = { .cpu_index = cpu_index, .err = NULL, .handled = false }; nmi_children(object_get_root(), &ns); if (ns.handled) { error_propagate(errp, ns.err); } else { error_setg(errp, QERR_UNSUPPORTED); } } void inject_nmi(void) { #if defined(TARGET_I386) CPUState *cs; CPU_FOREACH(cs) { X86CPU *cpu = X86_CPU(cs); if (!cpu->apic_state) { cpu_interrupt(cs, CPU_INTERRUPT_NMI); } else { apic_deliver_nmi(cpu->apic_state); } } #else nmi_monitor_handle(0, NULL); #endif }
void qmp_inject_nmi(Error **errp) { #if defined(TARGET_I386) CPUArchState *env; for (env = first_cpu; env != NULL; env = env->next_cpu) { if (!env->apic_state) { cpu_interrupt(env, CPU_INTERRUPT_NMI); } else { apic_deliver_nmi(env->apic_state); } } #else error_set(errp, QERR_UNSUPPORTED); #endif }