Commit f9a535e0 authored by Xu Wang's avatar Xu Wang Committed by Christian Borntraeger
Browse files

nmi: Implement inject_nmi() for non-monitor context use



Let's introduce a general "inject_nmi()" function that doesn't rely on the cpu
index of the monitor, but uses cpu index 0 as default (except for x86).
This function can then later be used from a non-monitor context.

Signed-off-by: default avatarXu Wang <gesaint@linux.vnet.ibm.com>
Reviewed-by: default avatarDavid Hildenbrand <dahi@linux.vnet.ibm.com>
CC: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
parent d67f5fe6
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@

#include "hw/nmi.h"
#include "qapi/qmp/qerror.h"
#include "monitor/monitor.h"

struct do_nmi_s {
    int cpu_index;
@@ -70,6 +71,25 @@ void nmi_monitor_handle(int cpu_index, Error **errp)
    }
}

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
}

static const TypeInfo nmi_info = {
    .name          = TYPE_NMI,
    .parent        = TYPE_INTERFACE,
+1 −0
Original line number Diff line number Diff line
@@ -45,5 +45,6 @@ typedef struct NMIClass {
} NMIClass;

void nmi_monitor_handle(int cpu_index, Error **errp);
void inject_nmi(void);

#endif /* NMI_H */