Hi,
Whan an amd64 machine gets an NMI, the current process in user land
is signalled with SIGBUS. That does not make sense, the machine
should drop to ddb regardless wether a user process is currently
scheduled or not. NMI signals hardware failure or a debugging
button.
The code in i386 has always been that way.
Then the switch in db_ktrap() should also not depend on the fact
wether kernel or user land was runing.
ok?
bluhm
Index: arch/amd64/amd64/db_interface.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/amd64/amd64/db_interface.c,v
retrieving revision 1.25
diff -u -p -r1.25 db_interface.c
--- arch/amd64/amd64/db_interface.c 14 Mar 2016 23:08:05 -0000 1.25
+++ arch/amd64/amd64/db_interface.c 3 Mar 2017 19:37:40 -0000
@@ -118,6 +118,7 @@ db_ktrap(int type, int code, db_regs_t *
case T_BPTFLT: /* breakpoint */
case T_TRCTRAP: /* single_step */
case T_NMI: /* NMI */
+ case T_NMI|T_USER:
case -1: /* keyboard interrupt */
break;
default:
Index: arch/amd64/amd64/trap.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/amd64/amd64/trap.c,v
retrieving revision 1.52
diff -u -p -r1.52 trap.c
--- arch/amd64/amd64/trap.c 21 Jan 2017 05:42:03 -0000 1.52
+++ arch/amd64/amd64/trap.c 3 Mar 2017 19:37:40 -0000
@@ -242,7 +242,6 @@ copyfault:
case T_TSSFLT|T_USER:
case T_SEGNPFLT|T_USER:
case T_STKFLT|T_USER:
- case T_NMI|T_USER:
#ifdef TRAP_SIGDEBUG
printf("pid %d (%s): %s at rip %llx addr %llx\n",
p->p_p->ps_pid, p->p_p->ps_comm, "BUS",
@@ -425,8 +424,9 @@ faultcommon:
KERNEL_UNLOCK();
break;
-#if NISA > 0
+#if NISA > 0
case T_NMI:
+ case T_NMI|T_USER:
#if defined(KGDB) || defined(DDB)
/* NMI can be hooked up to a pushbutton for debugging */
printf ("NMI ... going to debugger\n");
Index: arch/i386/i386/db_interface.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/i386/i386/db_interface.c,v
retrieving revision 1.33
diff -u -p -r1.33 db_interface.c
--- arch/i386/i386/db_interface.c 14 Mar 2016 23:08:05 -0000 1.33
+++ arch/i386/i386/db_interface.c 3 Mar 2017 19:37:40 -0000
@@ -113,6 +113,7 @@ db_ktrap(int type, int code, db_regs_t *
case T_BPTFLT: /* breakpoint */
case T_TRCTRAP: /* single_step */
case T_NMI: /* NMI */
+ case T_NMI|T_USER:
case -1: /* keyboard interrupt */
break;
default:
Index: arch/i386/i386/trap.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/i386/i386/trap.c,v
retrieving revision 1.126
diff -u -p -r1.126 trap.c
--- arch/i386/i386/trap.c 8 Oct 2016 05:49:08 -0000 1.126
+++ arch/i386/i386/trap.c 3 Mar 2017 19:37:40 -0000
@@ -483,7 +483,7 @@ trap(struct trapframe *frame)
KERNEL_UNLOCK();
break;
-#if NISA > 0
+#if NISA > 0
case T_NMI:
case T_NMI|T_USER:
#if defined(DDB) || defined(KGDB)