Anyone interested in the patch of adding show kernhist to crash(8)?



--- src/sys/sys/kernhist.h.orig 2014-03-31 16:25:43.000000000 +0900
+++ src/sys/sys/kernhist.h      2015-05-09 22:32:06.000000000 +0900
@@ -86,7 +86,7 @@ LIST_HEAD(kern_history_head, kern_histor
 #define        KERNHIST_UVMUBCHIST     0x00000004      /* ubchist */
 #define        KERNHIST_UVMLOANHIST    0x00000008      /* loanhist */
-#ifdef _KERNEL
+#if defined(_KERNEL) || defined(_KMEMUSER)
/*
  * macros to use the history/tracing code.  note that KERNHIST_LOG
@@ -216,6 +216,10 @@ do { \
 #endif
+#ifdef _KMEMUSER
+#include <stdio.h>       /* for printf */
+#endif
+
 static inline void kernhist_entry_print(const struct kern_history_ent *);
static inline void
--- src/usr.sbin/crash/Makefile.orig    2015-02-10 18:49:36.000000000 +0900
+++ src/usr.sbin/crash/Makefile 2015-05-09 22:35:11.000000000 +0900
@@ -35,6 +35,7 @@ S=            ${.CURDIR}/../../sys
 CPPFLAGS+=     -I${.CURDIR} -I${.OBJDIR} -I${S} -fno-strict-aliasing
 CPPFLAGS+=     -DDDB_VERBOSE_HELP -DDB_MAX_LINE=10000000 -D_KMEMUSER
 CPPFLAGS+=     -UDB_MACHINE_COMMANDS
+CPPFLAGS+=     -DKERNHIST -DDDB -Wno-format-nonliteral
# ddb files from kernel
 .PATH: $S/ddb
@@ -42,6 +43,7 @@ SRCS+=        db_command.c db_lwp.c db_proc.c d
 SRCS+= db_access.c db_elf.c db_examine.c
 SRCS+= db_expr.c db_lex.c db_output.c db_print.c
 SRCS+= db_sym.c db_variables.c db_write_cmd.c
+CPPFLAGS.db_command.c += -DKERNHIST -DDDB -Wno-format-nonliteral
.PATH: ${S}/arch/${MACHINE}/${MACHINE}
 .PATH: ${S}/arch/${MACHINE_ARCH}/${MACHINE_ARCH}
--- src/usr.sbin/crash/crash.c.orig     2014-10-06 22:57:38.000000000 +0900
+++ src/usr.sbin/crash/crash.c  2015-05-09 23:10:13.000000000 +0900
@@ -53,6 +53,7 @@ __RCSID("$NetBSD: crash.c,v 1.8 2014/10/
 #include <err.h>
 #include <ctype.h>
 #include <util.h>
+#include <sys/kernhist.h>
#include "extern.h" @@ -72,6 +73,8 @@ static struct nlist nl[] = {
        { .n_name = "_osrelease" },
 #define        X_PANICSTR      1
        { .n_name = "_panicstr" },
+#define        X_KERN_HISTORIES        2
+       { .n_name = "_kern_histories" },
        { .n_name = NULL },
 };
@@ -301,6 +304,50 @@ cnputc(int c)
        putc(c, ofp);
 }
+#define FMTLEN 1024
+#define FNLEN 128
+
+void
+kernhist_dump(struct kern_history *l)
+{
+       unsigned int lcv;
+       struct kern_history kh;
+       struct kern_history_ent ke;
+       char fmt[FMTLEN];
+       char fn[FNLEN];
+
+       db_read_bytes((db_addr_t)l, sizeof(kh), (char *)&kh);
+       lcv = kh.f;
+       do {
+               db_read_bytes((db_addr_t)&kh.e[lcv], sizeof(ke), (char *)&ke);
+               if (ke.fmt) {
+                       db_read_bytes((db_addr_t)ke.fmt, sizeof(fmt), fmt);
+                       db_read_bytes((db_addr_t)ke.fn, sizeof(fn), fn);
+                       fmt[FMTLEN-1] = '\0';
+                       fn[FNLEN-1] = '\0';
+                       ke.fmt = fmt;
+                       ke.fn = fn;
+                       kernhist_entry_print(&ke);
+               }
+               lcv = (lcv + 1) % kh.n;
+       } while (lcv != kh.f);
+}
+
+void
+kernhist_print(void (*pr)(const char *, ...))
+{
+       struct kern_history_head khh;
+
+       if (nl[X_KERN_HISTORIES].n_value == 0) {
+               warnx("kernhist is not available");
+               return;
+       }
+
+       db_read_bytes(nl[X_KERN_HISTORIES].n_value, sizeof(khh), (char *)&khh);
+
+       kernhist_dump(LIST_FIRST(&khh));
+}
+
 __dead static void
 usage(void)
 {


--
t-hash

Reply via email to