gdb(4) fix x86 signal reporting

The existing values correspond to x86 exception vector numbers, but the
trap numbers used in the kernel do not match these 1-to-1. Prefer the
definitions from x86/trap.h, as they are what actually get passed to
kdb_trap(). This is of little consequence, as gdb_cpu_signal() only
reports the trap reason (signal number) to the gdb client.

This is limited to the subset of trap values for which kdb_trap() is
reachable.

Reviewed by:	kib
Discussed with:	jhb
MFC after:	1 week
Sponsored by:	NetApp, Inc.
Sponsored by:	Klara, Inc.
Differential Revision:	https://reviews.freebsd.org/D27645
This commit is contained in:
Mitchell Horne 2020-12-23 15:36:17 -04:00
parent 3f3cc995a3
commit 962c06c5a3
2 changed files with 24 additions and 30 deletions

View File

@ -136,21 +136,18 @@ gdb_cpu_signal(int type, int code)
{
switch (type & ~T_USER) {
case 0: return (SIGFPE); /* Divide by zero. */
case 1: return (SIGTRAP); /* Debug exception. */
case 3: return (SIGTRAP); /* Breakpoint. */
case 4: return (SIGSEGV); /* into instr. (overflow). */
case 5: return (SIGURG); /* bound instruction. */
case 6: return (SIGILL); /* Invalid opcode. */
case 7: return (SIGFPE); /* Coprocessor not present. */
case 8: return (SIGEMT); /* Double fault. */
case 9: return (SIGSEGV); /* Coprocessor segment overrun. */
case 10: return (SIGTRAP); /* Invalid TSS (also single-step). */
case 11: return (SIGSEGV); /* Segment not present. */
case 12: return (SIGSEGV); /* Stack exception. */
case 13: return (SIGSEGV); /* General protection. */
case 14: return (SIGSEGV); /* Page fault. */
case 16: return (SIGEMT); /* Coprocessor error. */
case T_BPTFLT: return (SIGTRAP);
case T_ARITHTRAP: return (SIGFPE);
case T_PROTFLT: return (SIGSEGV);
case T_TRCTRAP: return (SIGTRAP);
case T_PAGEFLT: return (SIGSEGV);
case T_DIVIDE: return (SIGFPE);
case T_NMI: return (SIGTRAP);
case T_FPOPFLT: return (SIGILL);
case T_TSSFLT: return (SIGSEGV);
case T_SEGNPFLT: return (SIGSEGV);
case T_STKFLT: return (SIGSEGV);
case T_XMMFLT: return (SIGFPE);
}
return (SIGEMT);
}

View File

@ -99,21 +99,18 @@ gdb_cpu_signal(int type, int code)
{
switch (type & ~T_USER) {
case 0: return (SIGFPE); /* Divide by zero. */
case 1: return (SIGTRAP); /* Debug exception. */
case 3: return (SIGTRAP); /* Breakpoint. */
case 4: return (SIGURG); /* into instr. (overflow). */
case 5: return (SIGURG); /* bound instruction. */
case 6: return (SIGILL); /* Invalid opcode. */
case 7: return (SIGFPE); /* Coprocessor not present. */
case 8: return (SIGEMT); /* Double fault. */
case 9: return (SIGSEGV); /* Coprocessor segment overrun. */
case 10: return (SIGTRAP); /* Invalid TSS (also single-step). */
case 11: return (SIGSEGV); /* Segment not present. */
case 12: return (SIGSEGV); /* Stack exception. */
case 13: return (SIGSEGV); /* General protection. */
case 14: return (SIGSEGV); /* Page fault. */
case 16: return (SIGEMT); /* Coprocessor error. */
case T_BPTFLT: return (SIGTRAP);
case T_ARITHTRAP: return (SIGFPE);
case T_PROTFLT: return (SIGSEGV);
case T_TRCTRAP: return (SIGTRAP);
case T_PAGEFLT: return (SIGSEGV);
case T_DIVIDE: return (SIGFPE);
case T_NMI: return (SIGTRAP);
case T_FPOPFLT: return (SIGILL);
case T_TSSFLT: return (SIGSEGV);
case T_SEGNPFLT: return (SIGSEGV);
case T_STKFLT: return (SIGSEGV);
case T_XMMFLT: return (SIGFPE);
}
return (SIGEMT);
}