This defines a nmi_monitor_handler() callback for POWERPC CPU class so the "nmi" HMP/QMP command gets supported for POWERPC machines.
This calls POWERPC_EXCP_RESET (vector 0x100) in the guest to deliver NMI. The expected result is XMON (in-kernel debugger) invocation. Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> --- Changes: v4: * s/\<nmi\>/nmi_monitor_handler/ * added note about XMON into commit log v3: * ppc_cpu_do_nmi() is exported from excp_helper.c instead of powerpc_excp() --- target-ppc/cpu-qom.h | 1 + target-ppc/excp_helper.c | 8 ++++++++ target-ppc/translate_init.c | 17 +++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/target-ppc/cpu-qom.h b/target-ppc/cpu-qom.h index 47dc8e6..fe7d602 100644 --- a/target-ppc/cpu-qom.h +++ b/target-ppc/cpu-qom.h @@ -119,6 +119,7 @@ int ppc64_cpu_write_elf64_qemunote(WriteCoreDumpFunction f, int ppc64_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs, int cpuid, void *opaque); #ifndef CONFIG_USER_ONLY +void ppc_cpu_do_nmi(CPUState *cs); extern const struct VMStateDescription vmstate_ppc_cpu; #endif diff --git a/target-ppc/excp_helper.c b/target-ppc/excp_helper.c index a0c9fdc..11c23e7 100644 --- a/target-ppc/excp_helper.c +++ b/target-ppc/excp_helper.c @@ -801,6 +801,14 @@ void ppc_hw_interrupt(CPUPPCState *env) } } } + +void ppc_cpu_do_nmi(CPUState *cs) +{ + PowerPCCPU *cpu = POWERPC_CPU(cs); + CPUPPCState *env = &cpu->env; + + powerpc_excp(cpu, env->excp_model, POWERPC_EXCP_RESET); +} #endif /* !CONFIG_USER_ONLY */ #if defined(DEBUG_OP) diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c index 4d94015..72bdce3 100644 --- a/target-ppc/translate_init.c +++ b/target-ppc/translate_init.c @@ -8510,6 +8510,22 @@ static void ppc_cpu_initfn(Object *obj) } } +#ifndef CONFIG_USER_ONLY +static void ppc_cpu_do_nmi_on_cpu(void *arg) +{ + CPUState *cs = arg; + + cpu_synchronize_state(cs); + ppc_cpu_do_nmi(cs); +} + +static int ppc_cpu_nmi_monitor_handler(CPUState *cs) +{ + async_run_on_cpu(cs, ppc_cpu_do_nmi_on_cpu, cs); + return 0; +} +#endif + static void ppc_cpu_class_init(ObjectClass *oc, void *data) { PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); @@ -8536,6 +8552,7 @@ static void ppc_cpu_class_init(ObjectClass *oc, void *data) #ifdef CONFIG_USER_ONLY cc->handle_mmu_fault = ppc_cpu_handle_mmu_fault; #else + cc->nmi_monitor_handler = ppc_cpu_nmi_monitor_handler; cc->get_phys_page_debug = ppc_cpu_get_phys_page_debug; cc->vmsd = &vmstate_ppc_cpu; #if defined(TARGET_PPC64) -- 2.0.0