Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/kdump Provide hooks for signal number to name transl...



details:   https://anonhg.NetBSD.org/src/rev/a942db084e2b
branches:  trunk
changeset: 524857:a942db084e2b
user:      christos <christos%NetBSD.org@localhost>
date:      Sun Mar 31 22:44:03 2002 +0000

description:
Provide hooks for signal number to name translation, and use them for kill
and PSIG.

XXX[1]: This shows that signal emulation ktrace is slightly busted: posted
        signals should really be translated to the emulated ones instead of
        producing ktrace records with the signal numbers of the native
        emulation.
XXX[2]: There are other places where signal names can be displayed, but this
        is not done yet.

diffstat:

 usr.bin/kdump/kdump.c   |   52 +++++++++++++++++++----
 usr.bin/kdump/setemul.c |  108 ++++++++++++++++++++++++++++++++---------------
 usr.bin/kdump/setemul.h |    8 ++-
 3 files changed, 122 insertions(+), 46 deletions(-)

diffs (267 lines):

diff -r 2d62e6636d0b -r a942db084e2b usr.bin/kdump/kdump.c
--- a/usr.bin/kdump/kdump.c     Sun Mar 31 22:40:16 2002 +0000
+++ b/usr.bin/kdump/kdump.c     Sun Mar 31 22:44:03 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: kdump.c,v 1.36 2002/02/12 22:22:37 christos Exp $      */
+/*     $NetBSD: kdump.c,v 1.37 2002/03/31 22:44:03 christos Exp $      */
 
 /*-
  * Copyright (c) 1988, 1993
@@ -43,7 +43,7 @@
 #if 0
 static char sccsid[] = "@(#)kdump.c    8.4 (Berkeley) 4/28/95";
 #else
-__RCSID("$NetBSD: kdump.c,v 1.36 2002/02/12 22:22:37 christos Exp $");
+__RCSID("$NetBSD: kdump.c,v 1.37 2002/03/31 22:44:03 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -109,6 +109,7 @@
 void   usage __P((void));
 void   eprint __P((int));
 char   *ioctlname __P((long));
+static const char *signame __P((long, int));
 
 int
 main(argc, argv)
@@ -318,8 +319,10 @@
        if (argsize) {
                char c = '(';
                if (!plain) {
-                       if (ktr->ktr_code == SYS_ioctl) {
-                               char *cp;
+                       char *cp;
+
+                       switch (ktr->ktr_code) {
+                       case SYS_ioctl:
                                if (decimal)
                                        (void)printf("(%ld", (long)*ap);
                                else
@@ -333,11 +336,15 @@
                                c = ',';
                                ap++;
                                argsize -= sizeof(register_t);
-                       } else if (ktr->ktr_code == SYS_ptrace) {
+                               break;
+                       
+                       case SYS_ptrace:
                                if (strcmp(current->name, "linux") == 0) {
-                                 if (*ap >= 0 && *ap <=
-                                   sizeof(linux_ptrace_ops) / sizeof(linux_ptrace_ops[0]))
-                                       (void)printf("(%s", linux_ptrace_ops[*ap]);
+                                 if (*ap >= 0 && *ap <= 
+                                     sizeof(linux_ptrace_ops) /
+                                     sizeof(linux_ptrace_ops[0]))
+                                       (void)printf("(%s",
+                                           linux_ptrace_ops[*ap]);
                                  else
                                        (void)printf("(%ld", (long)*ap);
                                } else {
@@ -350,6 +357,22 @@
                                c = ',';
                                ap++;
                                argsize -= sizeof(register_t);
+                               break;
+
+                       case SYS_kill:
+                               if (decimal)
+                                       (void)printf("(%ld, SIG%s",
+                                           (long)ap[0], signame(ap[1], 1));
+                               else
+                                       (void)printf("(%#lx, SIG%s",
+                                           (long)ap[0], signame(ap[1], 1));
+                               ap += 2;
+                               argsize -= 2 * sizeof(register_t);
+                               break;
+
+                       default:
+                               /* No special handling */
+                               break;
                        }
                }
                while (argsize) {
@@ -546,7 +569,7 @@
 {
        int signo, first;
 
-       (void)printf("SIG%s ", sys_signame[psig->signo]);
+       (void)printf("SIG%s ", signame(psig->signo, 0));
        if (psig->action == SIG_DFL)
                (void)printf("SIG_DFL\n");
        else {
@@ -590,6 +613,17 @@
        printf("\"\n");
 }
 
+static const char *
+signame(long sig, int xlat)
+{
+       static char buf[64];
+       if (sig <= 0 || sig >= NSIG) {
+               (void)snprintf(buf, sizeof(buf), "*unknown %ld*", sig);
+               return buf;
+       } else
+               return sys_signame[xlat ? current->signalmap[sig] : sig];
+}
+
 void
 usage()
 {
diff -r 2d62e6636d0b -r a942db084e2b usr.bin/kdump/setemul.c
--- a/usr.bin/kdump/setemul.c   Sun Mar 31 22:40:16 2002 +0000
+++ b/usr.bin/kdump/setemul.c   Sun Mar 31 22:44:03 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: setemul.c,v 1.11 2002/01/07 23:45:10 manu Exp $        */
+/*     $NetBSD: setemul.c,v 1.12 2002/03/31 22:44:03 christos Exp $    */
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -73,7 +73,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: setemul.c,v 1.11 2002/01/07 23:45:10 manu Exp $");
+__RCSID("$NetBSD: setemul.c,v 1.12 2002/03/31 22:44:03 christos Exp $");
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -124,44 +124,84 @@
 #include "../../sys/compat/svr4/svr4_errno.c"
 #include "../../sys/compat/ibcs2/ibcs2_errno.c"
 #include "../../sys/compat/irix/irix_errno.c"
+#include "../../sys/compat/osf1/osf1_errno.c"
 #include "../../sys/compat/linux/common/linux_errno.c"
 #undef KTRACE
 
+#define SIGRTMIN       33      /* XXX */
+#include "../../sys/compat/hpux/hpux_signo.c"
+#include "../../sys/compat/svr4/svr4_signo.c"
+#include "../../sys/compat/ibcs2/ibcs2_signo.c"
+/* irix uses svr4 */
+#include "../../sys/compat/osf1/osf1_signo.c"
+#include "../../sys/compat/linux/common/linux_signo.c"
+
 #define NELEM(a) (sizeof(a) / sizeof(a[0]))
 
 static const struct emulation emulations[] = {
-       {   "netbsd",          syscallnames,         SYS_MAXSYSCALL,
-               NULL,                   0 },
-       {   "netbsd32", netbsd32_syscallnames,       SYS_MAXSYSCALL,
-               NULL,                   0 },
-       {  "freebsd",  freebsd_syscallnames, FREEBSD_SYS_MAXSYSCALL,
-               NULL,                   0 },
-       {     "hpux",     hpux_syscallnames,    HPUX_SYS_MAXSYSCALL,
-         native_to_hpux_errno,  NELEM(native_to_hpux_errno)  },
-       {    "ibcs2",    ibcs2_syscallnames,   IBCS2_SYS_MAXSYSCALL,
-        native_to_ibcs2_errno,  NELEM(native_to_ibcs2_errno) },
-       {    "irix o32",    irix_syscallnames,   IRIX_SYS_MAXSYSCALL,
-        native_to_irix_errno,  NELEM(native_to_irix_errno) },
-       {    "irix n32",    irix_syscallnames,   IRIX_SYS_MAXSYSCALL,
-        native_to_irix_errno,  NELEM(native_to_irix_errno) },
-       {    "linux",    linux_syscallnames,   LINUX_SYS_MAXSYSCALL,
-        native_to_linux_errno,  NELEM(native_to_linux_errno) },
-       {     "osf1",     osf1_syscallnames,    OSF1_SYS_MAXSYSCALL,
-               NULL,                   0 },
-       {    "sunos32",sunos32_syscallnames, SUNOS32_SYS_MAXSYSCALL,
-               NULL,                   0 },
-       {    "sunos",    sunos_syscallnames,   SUNOS_SYS_MAXSYSCALL,
-               NULL,                   0 },
-       {     "svr4",     svr4_syscallnames,    SVR4_SYS_MAXSYSCALL,
-         native_to_svr4_errno,  NELEM(native_to_svr4_errno)  },
-       {     "svr4_32",     svr4_syscallnames,    SVR4_SYS_MAXSYSCALL,
-         native_to_svr4_errno,  NELEM(native_to_svr4_errno)  },
-       {   "ultrix",   ultrix_syscallnames,  ULTRIX_SYS_MAXSYSCALL,
-               NULL,                   0 },
-       {   "pecoff",          syscallnames,         SYS_MAXSYSCALL,
-               NULL,                   0 },
-       {       NULL,                  NULL,                      0,
-               NULL,                   0 }
+       { "netbsd",     syscallnames,           SYS_MAXSYSCALL,
+         NULL,                         0,
+         NULL,                         0 },
+
+       { "netbsd32",   netbsd32_syscallnames,  SYS_MAXSYSCALL,
+         NULL,                         0,
+         NULL,                         0 },
+
+       { "freebsd",    freebsd_syscallnames,   FREEBSD_SYS_MAXSYSCALL,
+         NULL,                         0,
+         NULL,                         0 },
+
+       { "hpux",       hpux_syscallnames,      HPUX_SYS_MAXSYSCALL,
+         native_to_hpux_errno,         NELEM(native_to_hpux_errno),
+         hpux_to_native_signo,         NSIG },
+
+       { "ibcs2",      ibcs2_syscallnames,     IBCS2_SYS_MAXSYSCALL,
+         native_to_ibcs2_errno,        NELEM(native_to_ibcs2_errno),
+         ibcs2_to_native_signo,        NSIG },
+
+       { "irix o32",   irix_syscallnames,      IRIX_SYS_MAXSYSCALL,
+         native_to_irix_errno,         NELEM(native_to_irix_errno),
+         svr4_to_native_signo,         NSIG },
+
+       { "irix n32",   irix_syscallnames,      IRIX_SYS_MAXSYSCALL,
+         native_to_irix_errno,         NELEM(native_to_irix_errno),
+         svr4_to_native_signo,         NSIG },
+
+       { "linux",      linux_syscallnames,     LINUX_SYS_MAXSYSCALL,
+         native_to_linux_errno,        NELEM(native_to_linux_errno),
+         linux_to_native_signo,        NSIG },
+
+       { "osf1",       osf1_syscallnames,      OSF1_SYS_MAXSYSCALL,
+         native_to_osf1_errno,         NELEM(native_to_osf1_errno),
+         osf1_to_native_signo,         NSIG },
+
+       { "sunos32",    sunos32_syscallnames,   SUNOS32_SYS_MAXSYSCALL,
+         NULL,                         0,
+         NULL,                         0 },
+
+       { "sunos",      sunos_syscallnames,     SUNOS_SYS_MAXSYSCALL,
+         NULL,                         0,
+         NULL,                         0 },
+
+       { "svr4",       svr4_syscallnames,      SVR4_SYS_MAXSYSCALL,
+         native_to_svr4_errno,         NELEM(native_to_svr4_errno),
+         svr4_to_native_signo,         NSIG },
+
+       { "svr4_32",    svr4_syscallnames,      SVR4_SYS_MAXSYSCALL,
+         native_to_svr4_errno,         NELEM(native_to_svr4_errno),
+         svr4_to_native_signo,         NSIG },
+
+       { "ultrix",     ultrix_syscallnames,    ULTRIX_SYS_MAXSYSCALL,
+         NULL,                         0,
+         NULL,                         0 },
+
+       { "pecoff",     syscallnames,           SYS_MAXSYSCALL,
+         NULL,                         0,
+         NULL,                         0 },
+
+       { NULL,         NULL,                   0,
+         NULL,                         0,
+         NULL,                         0 }
 };
 
 struct emulation_ctx {
diff -r 2d62e6636d0b -r a942db084e2b usr.bin/kdump/setemul.h
--- a/usr.bin/kdump/setemul.h   Sun Mar 31 22:40:16 2002 +0000
+++ b/usr.bin/kdump/setemul.h   Sun Mar 31 22:44:03 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: setemul.h,v 1.5 2001/02/16 23:28:44 manu Exp $ */
+/*     $NetBSD: setemul.h,v 1.6 2002/03/31 22:44:03 christos Exp $     */
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -76,9 +76,11 @@
 struct emulation {
        const char *name;       /* Emulation name */
        const char * const *sysnames;   /* Array of system call names */
-       int  nsysnames;         /* Number of */
+       int nsysnames;          /* Number of */
        const int  *errnomap;   /* Array of error number mapping */
-       int  nerrnomap;         /* number of elements in array */
+       int nerrnomap;          /* number of elements in array */
+       const int  *signalmap;  /* Array of signal number mapping */
+       int nsignalmap;         /* number of elements in array */
 };
 
 extern const struct emulation *current;



Home | Main Index | Thread Index | Old Index