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: Xu Wang <gesaint@linux.vnet.ibm.com> Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com> CC: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
This commit is contained in:
parent
d67f5fe63c
commit
f9a535e089
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#include "hw/nmi.h"
|
#include "hw/nmi.h"
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
|
#include "monitor/monitor.h"
|
||||||
|
|
||||||
struct do_nmi_s {
|
struct do_nmi_s {
|
||||||
int cpu_index;
|
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 = {
|
static const TypeInfo nmi_info = {
|
||||||
.name = TYPE_NMI,
|
.name = TYPE_NMI,
|
||||||
.parent = TYPE_INTERFACE,
|
.parent = TYPE_INTERFACE,
|
||||||
|
|
|
@ -45,5 +45,6 @@ typedef struct NMIClass {
|
||||||
} NMIClass;
|
} NMIClass;
|
||||||
|
|
||||||
void nmi_monitor_handle(int cpu_index, Error **errp);
|
void nmi_monitor_handle(int cpu_index, Error **errp);
|
||||||
|
void inject_nmi(void);
|
||||||
|
|
||||||
#endif /* NMI_H */
|
#endif /* NMI_H */
|
||||||
|
|
Loading…
Reference in New Issue