Index: sys/arm64/arm64/trap.c =================================================================== --- sys/arm64/arm64/trap.c +++ sys/arm64/arm64/trap.c @@ -25,6 +25,8 @@ * */ +#include "opt_acpi.h" + #include __FBSDID("$FreeBSD$"); @@ -71,6 +73,10 @@ #include #endif +#ifdef DEV_ACPI +#include +#endif + /* Called from exception.S */ void do_el1h_sync(struct thread *, struct trapframe *); void do_el0_sync(struct thread *, struct trapframe *); @@ -232,6 +238,13 @@ return; } +#ifdef DEV_ACPI + /* Handle a APEI error with the existing NMI code */ + if (apei_nmi != NULL && (*apei_nmi)()) { + return; + } +#endif + print_registers(frame); printf(" far: %16lx\n", far); panic("Unhandled EL%d external data abort", lower ? 0: 1); Index: sys/dev/acpica/acpi_apei.c =================================================================== --- sys/dev/acpica/acpi_apei.c +++ sys/dev/acpica/acpi_apei.c @@ -646,7 +646,8 @@ callout_reset(&ge->poll, ge->v1.Notify.PollInterval * hz / 1000, apei_callout_handler, ge); - } else if (ge->v1.Notify.Type == ACPI_HEST_NOTIFY_NMI) { + } else if (ge->v1.Notify.Type == ACPI_HEST_NOTIFY_NMI || + ge->v1.Notify.Type == ACPI_HEST_NOTIFY_SEA) { ge->copybuf = malloc(ge->v1.ErrorBlockLength, M_DEVBUF, M_WAITOK | M_ZERO); swi_add(&clk_intr_event, "apei", apei_nmi_swi, ge, @@ -688,7 +689,8 @@ } if (ge->v1.Notify.Type == ACPI_HEST_NOTIFY_POLLED) { callout_drain(&ge->poll); - } else if (ge->v1.Notify.Type == ACPI_HEST_NOTIFY_NMI) { + } else if (ge->v1.Notify.Type == ACPI_HEST_NOTIFY_NMI || + ge->v1.Notify.Type == ACPI_HEST_NOTIFY_SEA) { swi_remove(&ge->swi_ih); free(ge->copybuf, M_DEVBUF); }