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 "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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,5 +45,6 @@ typedef struct NMIClass {
 | 
			
		|||
} NMIClass;
 | 
			
		||||
 | 
			
		||||
void nmi_monitor_handle(int cpu_index, Error **errp);
 | 
			
		||||
void inject_nmi(void);
 | 
			
		||||
 | 
			
		||||
#endif /* NMI_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue