diff --git a/hypervisor/arch/x86/lapic.c b/hypervisor/arch/x86/lapic.c index 200833cc0..732036ecd 100644 --- a/hypervisor/arch/x86/lapic.c +++ b/hypervisor/arch/x86/lapic.c @@ -288,3 +288,18 @@ void send_single_init(uint16_t pcpu_id) msr_write(MSR_IA32_EXT_APIC_ICR, icr.value); } + +/** + * @pre pcpu_id < CONFIG_MAX_PCPU_NUM + * + * @return None + */ +void send_single_nmi(uint16_t pcpu_id) +{ + union apic_icr icr; + + icr.value_32.hi_32 = per_cpu(lapic_id, pcpu_id); + icr.value_32.lo_32 = (INTR_LAPIC_ICR_PHYSICAL << 11U) | (INTR_LAPIC_ICR_NMI << 8U); + + msr_write(MSR_IA32_EXT_APIC_ICR, icr.value); +} diff --git a/hypervisor/include/arch/x86/lapic.h b/hypervisor/include/arch/x86/lapic.h index 5e490b8c4..9b59c21d4 100644 --- a/hypervisor/include/arch/x86/lapic.h +++ b/hypervisor/include/arch/x86/lapic.h @@ -183,4 +183,13 @@ void send_single_ipi(uint16_t pcpu_id, uint32_t vector); */ void send_single_init(uint16_t pcpu_id); +/** + * @brief Send an NMI signal to a single pCPU + * + * @param[in] pcpu_id The id of destination physical cpu + * + * @return None + */ +void send_single_nmi(uint16_t pcpu_id); + #endif /* INTR_LAPIC_H */