Print this page
10597 would like a way to set NMI behavior at boot
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Andy Fiddaman <andy@omniosce.org>

*** 21,31 **** /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. */ /* ! * Copyright 2018 Joyent, Inc. * Copyright (c) 2016, 2017 by Delphix. All rights reserved. */ /* * PSMI 1.1 extensions are supported only in 2.6 and later versions. --- 21,31 ---- /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. */ /* ! * Copyright 2019, Joyent, Inc. * Copyright (c) 2016, 2017 by Delphix. All rights reserved. */ /* * PSMI 1.1 extensions are supported only in 2.6 and later versions.
*** 806,815 **** --- 806,817 ---- /* apic NMI handler */ /*ARGSUSED*/ void apic_nmi_intr(caddr_t arg, struct regs *rp) { + nmi_action_t action = nmi_action; + if (apic_shutdown_processors) { apic_disable_local_apic(); return; }
*** 817,838 **** if (!lock_try(&apic_nmi_lock)) return; apic_num_nmis++; - if (apic_kmdb_on_nmi && psm_debugger()) { - debug_enter("NMI received: entering kmdb\n"); - } else if (apic_panic_on_nmi) { - /* Keep panic from entering kmdb. */ - nopanicdebug = 1; - panic("NMI received\n"); - } else { /* * prom_printf is the best shot we have of something which is * problem free from high level/NMI type of interrupts */ prom_printf("NMI received\n"); } lock_clear(&apic_nmi_lock); } --- 819,863 ---- if (!lock_try(&apic_nmi_lock)) return; apic_num_nmis++; /* + * "nmi_action" always over-rides the older way of doing this, unless we + * can't actually drop into kmdb when requested. + */ + if (action == NMI_ACTION_KMDB && !psm_debugger()) + action = NMI_ACTION_UNSET; + + if (action == NMI_ACTION_UNSET) { + if (apic_kmdb_on_nmi && psm_debugger()) + action = NMI_ACTION_KMDB; + else if (apic_panic_on_nmi) + action = NMI_ACTION_PANIC; + else + action = NMI_ACTION_IGNORE; + } + + switch (action) { + case NMI_ACTION_IGNORE: + /* * prom_printf is the best shot we have of something which is * problem free from high level/NMI type of interrupts */ prom_printf("NMI received\n"); + break; + + case NMI_ACTION_PANIC: + /* Keep panic from entering kmdb. */ + nopanicdebug = 1; + panic("NMI received\n"); + break; + + case NMI_ACTION_KMDB: + default: + debug_enter("NMI received: entering kmdb\n"); + break; } lock_clear(&apic_nmi_lock); }