Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 Dec 2020 19:42:08 GMT
From:      Mitchell Horne <mhorne@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 962c06c5a32d - gdb(4) fix x86 signal reporting
Message-ID:  <202012231942.0BNJg82S098818@gitrepo.freebsd.org>

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

URL: https://cgit.FreeBSD.org/src/commit/?id=962c06c5a32deb9357851d5aca060defc79e6e90

commit 962c06c5a32deb9357851d5aca060defc79e6e90
Author:     Mitchell Horne <mhorne@FreeBSD.org>
AuthorDate: 2020-12-23 19:36:17 +0000
Commit:     Mitchell Horne <mhorne@FreeBSD.org>
CommitDate: 2020-12-23 19:40:14 +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.
    
    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
---
 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 eda1ab72168d..610096e1355d 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?202012231942.0BNJg82S098818>