aboutsummaryrefslogtreecommitdiff
path: root/hw/core/nmi.c
diff options
context:
space:
mode:
authorXu Wang <gesaint@linux.vnet.ibm.com>2015-02-05 18:28:35 +0800
committerChristian Borntraeger <borntraeger@de.ibm.com>2015-06-11 17:45:50 +0200
commitf9a535e089abcbc7ac99db83c8c6e4644e395b12 (patch)
treec1f4d6ede264a3fffa4dbff4d13c98364b08de2f /hw/core/nmi.c
parentd67f5fe63caa0f707fa91c760508c340e050b6f0 (diff)
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>
Diffstat (limited to 'hw/core/nmi.c')
-rw-r--r--hw/core/nmi.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/hw/core/nmi.c b/hw/core/nmi.c
index 3dff020659..5260d6c1ec 100644
--- a/hw/core/nmi.c
+++ b/hw/core/nmi.c
@@ -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,