summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2012-09-22 12:40:00 +0000
committerjilles <jilles@FreeBSD.org>2012-09-22 12:40:00 +0000
commit2bd19142c72490861d85f528bba65fd8e8e97847 (patch)
tree4df38b8d993915b3d7d0e277a64274c7add8058c /usr.bin
parenta46afff790054d383552fef4f8494908ff05d504 (diff)
downloadFreeBSD-src-2bd19142c72490861d85f528bba65fd8e8e97847.zip
FreeBSD-src-2bd19142c72490861d85f528bba65fd8e8e97847.tar.gz
kdump: Pretty-print signal codes.
MFC after: 1 week
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/kdump/kdump.c14
-rw-r--r--usr.bin/kdump/mksubr48
2 files changed, 57 insertions, 5 deletions
diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c
index 44ee14e..73fef94 100644
--- a/usr.bin/kdump/kdump.c
+++ b/usr.bin/kdump/kdump.c
@@ -1242,11 +1242,15 @@ ktrpsig(struct ktr_psig *psig)
printf("SIG%s ", signames[psig->signo]);
else
printf("SIG %d ", psig->signo);
- if (psig->action == SIG_DFL)
- printf("SIG_DFL code=0x%x\n", psig->code);
- else {
- printf("caught handler=0x%lx mask=0x%x code=0x%x\n",
- (u_long)psig->action, psig->mask.__bits[0], psig->code);
+ if (psig->action == SIG_DFL) {
+ printf("SIG_DFL code=");
+ sigcodename(psig->signo, psig->code);
+ putchar('\n');
+ } else {
+ printf("caught handler=0x%lx mask=0x%x code=",
+ (u_long)psig->action, psig->mask.__bits[0]);
+ sigcodename(psig->signo, psig->code);
+ putchar('\n');
}
}
diff --git a/usr.bin/kdump/mksubr b/usr.bin/kdump/mksubr
index bc466d5..2397812 100644
--- a/usr.bin/kdump/mksubr
+++ b/usr.bin/kdump/mksubr
@@ -388,7 +388,13 @@ auto_switch_type "schedpolicyname" "SCHED_[A-Z]+[[:space:]]+[0-9]+"
auto_switch_type "sendfileflagsname" "SF_[A-Z]+[[:space:]]+[0-9]+" "sys/socket.h"
auto_or_type "shmatname" "SHM_[A-Z]+[[:space:]]+[0-9]{6}+" "sys/shm.h"
auto_switch_type "shutdownhowname" "SHUT_[A-Z]+[[:space:]]+[0-9]+" "sys/socket.h"
+auto_switch_type "sigbuscodename" "BUS_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+auto_switch_type "sigchldcodename" "CLD_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+auto_switch_type "sigfpecodename" "FPE_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
auto_switch_type "sigprocmaskhowname" "SIG_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+auto_switch_type "sigillcodename" "ILL_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+auto_switch_type "sigsegvcodename" "SEGV_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+auto_switch_type "sigtrapcodename" "TRAP_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
auto_if_type "sockdomainname" "PF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
auto_if_type "sockfamilyname" "AF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
auto_if_type "sockipprotoname" "IPPROTO_[[:alnum:]]+[[:space:]]+" "netinet/in.h"
@@ -501,4 +507,46 @@ cat <<_EOF_
printf(">");
}
+/*
+ * AUTO - Special
+ *
+ * Check general codes first, then defer to signal-specific codes.
+ */
+void
+sigcodename(int sig, int code)
+{
+ switch (code) {
_EOF_
+egrep "^#[[:space:]]*define[[:space:]]+SI_[A-Z]+[[:space:]]+0(x[0-9abcdef]+)?[[:space:]]*" \
+ $include_dir/sys/signal.h | grep -v SI_UNDEFINED | \
+ awk '{ for (i = 1; i <= NF; i++) \
+ if ($i ~ /define/) \
+ break; \
+ ++i; \
+ printf "\tcase %s:\n\t\tprintf(\"%s\");\n\t\tbreak;\n", $i, $i }'
+cat <<_EOF_
+ default:
+ switch (sig) {
+ case SIGILL:
+ sigillcodename(code);
+ break;
+ case SIGBUS:
+ sigbuscodename(code);
+ break;
+ case SIGSEGV:
+ sigsegvcodename(code);
+ break;
+ case SIGFPE:
+ sigfpecodename(code);
+ break;
+ case SIGTRAP:
+ sigtrapcodename(code);
+ break;
+ case SIGCHLD:
+ sigchldcodename(code);
+ break;
+ default:
+ printf("<invalid=%#x>", code);
+ }
+ }
+}
OpenPOWER on IntegriCloud