Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 Jan 2021 21:11:17 GMT
From:      Mitchell Horne <mhorne@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 6a45b9926f2e - stable/12 - gdb(4) fix x86 signal reporting
Message-ID:  <202101042111.104LBHu4010995@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/12 has been updated by mhorne:

URL: https://cgit.FreeBSD.org/src/commit/?id=6a45b9926f2ecd90b1948ae469652a0a42071e86

commit 6a45b9926f2ecd90b1948ae469652a0a42071e86
Author:     Mitchell Horne <mhorne@FreeBSD.org>
AuthorDate: 2020-12-23 19:36:17 +0000
Commit:     Mitchell Horne <mhorne@FreeBSD.org>
CommitDate: 2021-01-04 21:01:09 +0000

    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.
    
    Sponsored by:   NetApp, Inc.
    Sponsored by:   Klara, Inc.
    
    (cherry picked from commit 962c06c5a32deb9357851d5aca060defc79e6e90)
---
 sys/amd64/amd64/gdb_machdep.c | 27 ++++++++++++---------------
 sys/i386/i386/gdb_machdep.c   | 27 ++++++++++++---------------
 2 files changed, 24 insertions(+), 30 deletions(-)

diff --git a/sys/amd64/amd64/gdb_machdep.c b/sys/amd64/amd64/gdb_machdep.c
index 73022bee7674..8b391bb63dcf 100644
--- a/sys/amd64/amd64/gdb_machdep.c
+++ b/sys/amd64/amd64/gdb_machdep.c
@@ -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);
 }
diff --git a/sys/i386/i386/gdb_machdep.c b/sys/i386/i386/gdb_machdep.c
index d501b847fda9..fd522309dbb2 100644
--- a/sys/i386/i386/gdb_machdep.c
+++ b/sys/i386/i386/gdb_machdep.c
@@ -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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202101042111.104LBHu4010995>