Module Name: src
Committed By: matt
Date: Wed Aug 1 21:30:25 UTC 2012
Modified Files:
src/sys/arch/powerpc/booke: booke_machdep.c e500_intr.c trap.c
src/sys/arch/powerpc/include/booke: cpuvar.h
src/sys/arch/powerpc/powerpc: db_interface.c
Log Message:
Add a machine splhist command to give (a incomplete) spl history.
(only the most recent are going to be accurate).
splraise(6) from 0 at 549214603
splraise(7) from 6 at 549214643 (+40)
splx(6) from 7 at 549214691 (+48)
splx(0) from 6 at 549214730 (+39)
To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/powerpc/booke/booke_machdep.c
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/powerpc/booke/e500_intr.c
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/powerpc/booke/trap.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/powerpc/include/booke/cpuvar.h
cvs rdiff -u -r1.50 -r1.51 src/sys/arch/powerpc/powerpc/db_interface.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/powerpc/booke/booke_machdep.c
diff -u src/sys/arch/powerpc/booke/booke_machdep.c:1.15 src/sys/arch/powerpc/booke/booke_machdep.c:1.16
--- src/sys/arch/powerpc/booke/booke_machdep.c:1.15 Wed Jul 18 18:51:59 2012
+++ src/sys/arch/powerpc/booke/booke_machdep.c Wed Aug 1 21:30:21 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: booke_machdep.c,v 1.15 2012/07/18 18:51:59 matt Exp $ */
+/* $NetBSD: booke_machdep.c,v 1.16 2012/08/01 21:30:21 matt Exp $ */
/*-
* Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -38,7 +38,7 @@
#define _POWERPC_BUS_DMA_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: booke_machdep.c,v 1.15 2012/07/18 18:51:59 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: booke_machdep.c,v 1.16 2012/08/01 21:30:21 matt Exp $");
#include "opt_modular.h"
@@ -570,3 +570,102 @@ booke_sstep(struct trapframe *tf)
mtspr(SPR_DBCR1, dbcr1);
mtspr(SPR_DBCR0, dbcr0);
}
+
+#ifdef DIAGNOSTIC
+static inline void
+swap_data(uint64_t *data, size_t a, size_t b)
+{
+ uint64_t swap = data[a];
+ data[a] = data[b];
+ data[b] = swap;
+}
+
+static void
+sort_data(uint64_t *data, size_t count)
+{
+#if 0
+ /*
+ * Mostly classic bubble sort
+ */
+ do {
+ size_t new_count = 0;
+ for (size_t i = 1; i < count; i++) {
+ if (tbs[i - 1] > tbs[i]) {
+ swap_tbs(tbs, i - 1, i);
+ new_count = i;
+ }
+ }
+ count = new_count;
+ } while (count > 0);
+#else
+ /*
+ * Comb sort
+ */
+ size_t gap = count;
+ bool swapped = false;
+ while (gap > 1 || swapped) {
+ if (gap > 1) {
+ /*
+ * phi = (1 + sqrt(5)) / 2 [golden ratio]
+ * N = 1 / (1 - e^-phi)) = 1.247330950103979
+ *
+ * We want to but can't use floating point to calculate
+ * gap = (size_t)((double)gap / N)
+ *
+ * So we will use the multicative inverse of N
+ * (module 65536) to achieve the division.
+ *
+ * iN = 2^16 / 1.24733... = 52540
+ * x / N == (x * iN) / 65536
+ */
+ gap = (gap * 52540) / 65536;
+ }
+
+ swapped = false;
+
+ for (size_t i = 0; gap + i < count; i++) {
+ if (data[i] > data[i + gap]) {
+ swap_data(data, i, i + gap);
+ swapped = true;
+ }
+ }
+ }
+#endif
+}
+#endif
+
+void
+dump_splhist(struct cpu_info *ci, void (*pr)(const char *, ...))
+{
+#ifdef DIAGNOSTIC
+ struct cpu_softc * const cpu = ci->ci_softc;
+ uint64_t tbs[NIPL*NIPL];
+ size_t ntbs = 0;
+ for (size_t to = 0; to < NIPL; to++) {
+ for (size_t from = 0; from < NIPL; from++) {
+ uint64_t tb = cpu->cpu_spl_tb[to][from];
+ if (tb == 0)
+ continue;
+ tbs[ntbs++] = (tb << 8) | (to << 4) | from;
+ }
+ }
+ sort_data(tbs, ntbs);
+
+ if (pr == NULL)
+ pr = printf;
+ uint64_t last_tb = 0;
+ for (size_t i = 0; i < ntbs; i++) {
+ uint64_t tb = tbs[i];
+ size_t from = tb & 15;
+ size_t to = (tb >> 4) & 15;
+ tb >>= 8;
+ (*pr)("%s(%zu) from %zu at %"PRId64"",
+ from < to ? "splraise" : "splx",
+ to, from, tb);
+ if (last_tb && from != IPL_NONE)
+ (*pr)(" (+%"PRId64")", tb - last_tb);
+ (*pr)("\n");
+ last_tb = tb;
+ }
+#endif
+}
Index: src/sys/arch/powerpc/booke/e500_intr.c
diff -u src/sys/arch/powerpc/booke/e500_intr.c:1.20 src/sys/arch/powerpc/booke/e500_intr.c:1.21
--- src/sys/arch/powerpc/booke/e500_intr.c:1.20 Wed Jul 18 16:45:33 2012
+++ src/sys/arch/powerpc/booke/e500_intr.c Wed Aug 1 21:30:22 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: e500_intr.c,v 1.20 2012/07/18 16:45:33 matt Exp $ */
+/* $NetBSD: e500_intr.c,v 1.21 2012/08/01 21:30:22 matt Exp $ */
/*-
* Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -39,7 +39,7 @@
#define __INTR_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: e500_intr.c,v 1.20 2012/07/18 16:45:33 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: e500_intr.c,v 1.21 2012/08/01 21:30:22 matt Exp $");
#include <sys/param.h>
#include <sys/proc.h>
@@ -419,6 +419,8 @@ const struct intrsw e500_intrsw = {
#endif
};
+static bool wdog_barked;
+
static inline uint32_t
openpic_read(struct cpu_softc *cpu, bus_size_t offset)
{
@@ -474,21 +476,14 @@ e500_splset(struct cpu_info *ci, int ipl
{
struct cpu_softc * const cpu = ci->ci_softc;
- //KASSERT(!cpu_intr_p() || ipl >= IPL_VM);
KASSERT((curlwp->l_pflag & LP_INTR) == 0 || ipl != IPL_NONE);
-#if 0
- u_int ctpr = ipl;
- KASSERT(openpic_read(cpu, OPENPIC_CTPR) == ci->ci_cpl);
-#elif 0
- u_int old_ctpr = (ci->ci_cpl >= IPL_VM ? 15 : ci->ci_cpl);
- u_int ctpr = (ipl >= IPL_VM ? 15 : ipl);
- KASSERT(openpic_read(cpu, OPENPIC_CTPR) == old_ctpr);
-#else
const u_int ctpr = IPL2CTPR(ipl);
KASSERT(openpic_read(cpu, OPENPIC_CTPR) == IPL2CTPR(ci->ci_cpl));
-#endif
openpic_write(cpu, OPENPIC_CTPR, ctpr);
KASSERT(openpic_read(cpu, OPENPIC_CTPR) == ctpr);
+#ifdef DIAGNOSTIC
+ cpu->cpu_spl_tb[ipl][ci->ci_cpl] = mftb();
+#endif
ci->ci_cpl = ipl;
}
@@ -502,8 +497,10 @@ e500_spl0(void)
#ifdef __HAVE_FAST_SOFTINTS
if (__predict_false(ci->ci_data.cpu_softints != 0)) {
e500_splset(ci, IPL_HIGH);
+ wrtee(PSL_EE);
powerpc_softint(ci, IPL_NONE,
(vaddr_t)__builtin_return_address(0));
+ wrtee(0);
}
#endif /* __HAVE_FAST_SOFTINTS */
e500_splset(ci, IPL_NONE);
@@ -518,7 +515,7 @@ e500_splx(int ipl)
const int old_ipl = ci->ci_cpl;
/* if we paniced because of watchdog, PSL_CE will be clear. */
- KASSERT(panicstr != NULL || (mfmsr() & PSL_CE));
+ KASSERT(wdog_barked || (mfmsr() & PSL_CE));
if (ipl == old_ipl)
return;
@@ -536,8 +533,10 @@ e500_splx(int ipl)
const u_int softints = ci->ci_data.cpu_softints & (IPL_SOFTMASK << ipl);
if (__predict_false(softints != 0)) {
e500_splset(ci, IPL_HIGH);
+ wrtee(msr);
powerpc_softint(ci, ipl,
(vaddr_t)__builtin_return_address(0));
+ wrtee(0);
}
#endif /* __HAVE_FAST_SOFTINTS */
e500_splset(ci, ipl);
@@ -555,13 +554,13 @@ e500_splraise(int ipl)
const int old_ipl = ci->ci_cpl;
/* if we paniced because of watchdog, PSL_CE will be clear. */
- KASSERT(panicstr != NULL || (mfmsr() & PSL_CE));
+ KASSERT(wdog_barked || (mfmsr() & PSL_CE));
if (old_ipl < ipl) {
//const
register_t msr = wrtee(0);
e500_splset(ci, ipl);
-#if 1
+#if 0
if (old_ipl < IPL_VM && ipl >= IPL_VM)
msr = 0;
#endif
@@ -830,9 +829,15 @@ e500_fitintr(struct trapframe *tf)
static void
e500_wdogintr(struct trapframe *tf)
{
+ struct cpu_info * const ci = curcpu();
mtspr(SPR_TSR, TSR_ENW|TSR_WIS);
- panic("%s: tf=%p tb=%"PRId64" srr0/srr1=%#lx/%#lx", __func__, tf,
- mftb(), tf->tf_srr0, tf->tf_srr1);
+ wdog_barked = true;
+ dump_splhist(ci, NULL);
+ dump_trapframe(tf, NULL);
+ panic("%s: tf=%p tb=%"PRId64" srr0/srr1=%#lx/%#lx"
+ " cpl=%d idepth=%d, mtxcount=%d",
+ __func__, tf, mftb(), tf->tf_srr0, tf->tf_srr1,
+ ci->ci_cpl, ci->ci_idepth, ci->ci_mtx_count);
}
static void
@@ -843,7 +848,7 @@ e500_extintr(struct trapframe *tf)
const int old_ipl = ci->ci_cpl;
/* if we paniced because of watchdog, PSL_CE will be clear. */
- KASSERT(panicstr != NULL || (mfmsr() & PSL_CE));
+ KASSERT(wdog_barked || (mfmsr() & PSL_CE));
#if 0
// printf("%s(%p): idepth=%d enter\n", __func__, tf, ci->ci_idepth);
@@ -878,8 +883,8 @@ e500_extintr(struct trapframe *tf)
/*
* Find out the pending interrupt.
*/
- if (mfmsr() & PSL_EE)
- panic("%s(%p): MSR[EE] turned on (%#lx)!", __func__, tf, mfmsr());
+ KASSERTMSG((mfmsr() & PSL_EE) == 0,
+ "%s(%p): MSR[EE] left on (%#lx)!", __func__, tf, mfmsr());
if (IPL2CTPR(old_ipl) != openpic_read(cpu, OPENPIC_CTPR))
panic("%s(%p): %d: old_ipl(%u) + %u != OPENPIC_CTPR (%u)",
__func__, tf, __LINE__, old_ipl,
@@ -947,8 +952,8 @@ e500_extintr(struct trapframe *tf)
* because the loop we interrupted will complete looking
* for interrupts.
*/
- if (mfmsr() & PSL_EE)
- panic("%s(%p): MSR[EE] left on (%#lx)!", __func__, tf, mfmsr());
+ KASSERTMSG((mfmsr() & PSL_EE) == 0,
+ "%s(%p): MSR[EE] left on (%#lx)!", __func__, tf, mfmsr());
if (IPL2CTPR(old_ipl) != openpic_read(cpu, OPENPIC_CTPR))
panic("%s(%p): %d: old_ipl(%u) + %u != OPENPIC_CTPR (%u)",
__func__, tf, __LINE__, old_ipl,
@@ -973,16 +978,14 @@ e500_extintr(struct trapframe *tf)
if (__predict_false(softints != 0)) {
KASSERT(old_ipl < IPL_VM);
e500_splset(ci, IPL_HIGH); /* pop to high */
+ wrtee(PSL_EE); /* reenable interrupts */
powerpc_softint(ci, old_ipl, /* deal with them */
tf->tf_srr0);
+ wrtee(0); /* disable interrupts */
e500_splset(ci, old_ipl); /* and drop back */
}
#endif /* __HAVE_FAST_SOFTINTS */
-#if 1
KASSERT(ci->ci_cpl == old_ipl);
-#else
- e500_splset(ci, old_ipl); /* and drop back */
-#endif
/*
* If we interrupted while power-saving and we need to exit idle,
Index: src/sys/arch/powerpc/booke/trap.c
diff -u src/sys/arch/powerpc/booke/trap.c:1.19 src/sys/arch/powerpc/booke/trap.c:1.20
--- src/sys/arch/powerpc/booke/trap.c:1.19 Wed Aug 1 16:35:50 2012
+++ src/sys/arch/powerpc/booke/trap.c Wed Aug 1 21:30:22 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.19 2012/08/01 16:35:50 matt Exp $ */
+/* $NetBSD: trap.c,v 1.20 2012/08/01 21:30:22 matt Exp $ */
/*-
* Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.19 2012/08/01 16:35:50 matt Exp $");
+__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.20 2012/08/01 21:30:22 matt Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -270,7 +270,7 @@ isi_exception(struct trapframe *tf, ksig
pt_entry_t * const ptep = trap_pte_lookup(tf, trunc_page(faultva),
PSL_IS);
if (ptep == NULL)
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
KASSERT(ptep != NULL);
pt_entry_t pte = *ptep;
@@ -620,18 +620,21 @@ embedded_fp_round_exception(struct trapf
}
void
-dump_trapframe(const struct trapframe *tf)
+dump_trapframe(const struct trapframe *tf, void (*pr)(const char *, ...))
{
- printf("trapframe %p (exc=%x srr0/1=%#lx/%#lx esr/dear=%#x/%#lx)\n",
+ if (pr == NULL)
+ pr = printf;
+ (*pr)("trapframe %p (exc=%x srr0/1=%#lx/%#lx esr/dear=%#x/%#lx)\n",
tf, tf->tf_exc, tf->tf_srr0, tf->tf_srr1, tf->tf_esr, tf->tf_dear);
- printf("lr =%08lx ctr=%08lx cr =%08x xer=%08x\n",
+ (*pr)("lr =%08lx ctr=%08lx cr =%08x xer=%08x\n",
tf->tf_lr, tf->tf_ctr, tf->tf_cr, tf->tf_xer);
for (u_int r = 0; r < 32; r += 4) {
- printf("r%02u=%08lx r%02u=%08lx r%02u=%08lx r%02u=%08lx\n",
+ (*pr)("r%02u=%08lx r%02u=%08lx r%02u=%08lx r%02u=%08lx\n",
r+0, tf->tf_fixreg[r+0], r+1, tf->tf_fixreg[r+1],
r+2, tf->tf_fixreg[r+2], r+3, tf->tf_fixreg[r+3]);
}
}
+
static bool
ddb_exception(struct trapframe *tf)
{
@@ -659,7 +662,7 @@ ddb_exception(struct trapframe *tf)
}
}
printf(" %u\n", ci->ci_cpl);
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
#endif
if (kdb_trap(tf->tf_exc, tf)) {
tf->tf_srr0 += 4;
@@ -714,7 +717,7 @@ trap(enum ppc_booke_exceptions trap_code
|| (register_t)tf < (register_t)l->l_addr + PAGE_SIZE) {
printf("%s(entry): pid %d.%d (%s): invalid tf addr %p\n",
__func__, p->p_pid, l->l_lid, p->p_comm, tf);
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
Debugger();
}
#endif
@@ -723,7 +726,7 @@ trap(enum ppc_booke_exceptions trap_code
printf("%s(entry): pid %d.%d (%s): %s: PSL_CE (%#lx) not set\n",
__func__, p->p_pid, l->l_lid, p->p_comm,
trap_names[trap_code], mfmsr());
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
}
#endif
@@ -732,7 +735,7 @@ trap(enum ppc_booke_exceptions trap_code
printf("%s(entry): pid %d.%d (%s): %s invalid sp %#lx (sprg1=%#lx)\n",
__func__, p->p_pid, l->l_lid, p->p_comm,
trap_names[trap_code], tf->tf_fixreg[1], mfspr(SPR_SPRG1));
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
Debugger();
}
@@ -740,7 +743,7 @@ trap(enum ppc_booke_exceptions trap_code
printf("%s(entry): pid %d.%d (%s): %s invalid PSL %#lx\n",
__func__, p->p_pid, l->l_lid, p->p_comm,
trap_names[trap_code], tf->tf_srr1);
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
Debugger();
}
@@ -801,7 +804,7 @@ trap(enum ppc_booke_exceptions trap_code
break;
case T_EMBEDDED_PERF_MONITOR:
//db_stack_trace_print(tf->tf_fixreg[1], true, 40, "", printf);
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
rv = EPERM;
break;
case T_AST:
@@ -812,14 +815,14 @@ trap(enum ppc_booke_exceptions trap_code
printf("%s(ast-exit): pid %d.%d (%s): invalid sp %#lx\n",
__func__, p->p_pid, l->l_lid, p->p_comm,
tf->tf_fixreg[1]);
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
Debugger();
}
if ((tf->tf_srr1 & (PSL_DS|PSL_IS)) != (PSL_DS|PSL_IS)) {
printf("%s(entry): pid %d.%d (%s): %s invalid PSL %#lx\n",
__func__, p->p_pid, l->l_lid, p->p_comm,
trap_names[trap_code], tf->tf_srr1);
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
Debugger();
}
#if 0
@@ -827,7 +830,7 @@ trap(enum ppc_booke_exceptions trap_code
printf("%s(exit): pid %d.%d (%s): %s: PSL_CE (%#lx) not set\n",
__func__, p->p_pid, l->l_lid, p->p_comm,
trap_names[trap_code], mfmsr());
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
}
#endif
userret(l, tf);
@@ -837,7 +840,7 @@ trap(enum ppc_booke_exceptions trap_code
if (rv != 0) {
if (!onfaulted(tf, rv)) {
db_stack_trace_print(tf->tf_fixreg[1], true, 40, "", printf);
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
panic("%s: pid %d.%d (%s): %s exception in kernel mode"
" (tf=%p, dear=%#lx, esr=%#x,"
" srr0/1=%#lx/%#lx)",
@@ -852,7 +855,7 @@ trap(enum ppc_booke_exceptions trap_code
printf("%s(exit): pid %d.%d (%s): invalid kern sp %#lx\n",
__func__, p->p_pid, l->l_lid, p->p_comm,
tf->tf_fixreg[1]);
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
Debugger();
}
#endif
@@ -862,7 +865,7 @@ trap(enum ppc_booke_exceptions trap_code
__func__, p->p_pid, l->l_lid, p->p_comm,
trap_names[trap_code], mfmsr());
mtmsr(mfmsr()|PSL_CE);
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
}
#endif
} else {
@@ -880,7 +883,7 @@ trap(enum ppc_booke_exceptions trap_code
__func__, p->p_pid, l->l_lid, p->p_comm,
trap_names[trap_code]);
if (cpu_printfataltraps > 1)
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
}
(*p->p_emul->e_trapsignal)(l, &ksi);
}
@@ -889,7 +892,7 @@ trap(enum ppc_booke_exceptions trap_code
printf("%s(exit): pid %d.%d (%s): %s invalid PSL %#lx\n",
__func__, p->p_pid, l->l_lid, p->p_comm,
trap_names[trap_code], tf->tf_srr1);
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
Debugger();
}
#endif
@@ -898,7 +901,7 @@ trap(enum ppc_booke_exceptions trap_code
printf("%s(exit): pid %d.%d (%s): %s: PSL_CE (%#lx) not set\n",
__func__, p->p_pid, l->l_lid, p->p_comm,
trap_names[trap_code], mfmsr());
- dump_trapframe(tf);
+ dump_trapframe(tf, NULL);
}
#endif
userret(l, tf);
Index: src/sys/arch/powerpc/include/booke/cpuvar.h
diff -u src/sys/arch/powerpc/include/booke/cpuvar.h:1.15 src/sys/arch/powerpc/include/booke/cpuvar.h:1.16
--- src/sys/arch/powerpc/include/booke/cpuvar.h:1.15 Wed Aug 1 16:35:50 2012
+++ src/sys/arch/powerpc/include/booke/cpuvar.h Wed Aug 1 21:30:24 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: cpuvar.h,v 1.15 2012/08/01 16:35:50 matt Exp $ */
+/* $NetBSD: cpuvar.h,v 1.16 2012/08/01 21:30:24 matt Exp $ */
/*-
* Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -172,6 +172,7 @@ uint8_t cpu_read_1(bus_size_t);
void cpu_write_4(bus_size_t, uint32_t);
void cpu_write_1(bus_size_t, uint8_t);
+void dump_splhist(struct cpu_info *, void (*)(const char *, ...));
void calc_delayconst(void);
struct intrsw;
@@ -197,7 +198,7 @@ const void *
board_info_get_data(const char *, size_t *);
/* trap.c */
-void dump_trapframe(const struct trapframe *);
+void dump_trapframe(const struct trapframe *, void (*)(const char *, ...));
extern char root_string[];
extern paddr_t msgbuf_paddr;
Index: src/sys/arch/powerpc/powerpc/db_interface.c
diff -u src/sys/arch/powerpc/powerpc/db_interface.c:1.50 src/sys/arch/powerpc/powerpc/db_interface.c:1.51
--- src/sys/arch/powerpc/powerpc/db_interface.c:1.50 Wed Feb 1 09:51:00 2012
+++ src/sys/arch/powerpc/powerpc/db_interface.c Wed Aug 1 21:30:24 2012
@@ -1,8 +1,8 @@
-/* $NetBSD: db_interface.c,v 1.50 2012/02/01 09:51:00 matt Exp $ */
+/* $NetBSD: db_interface.c,v 1.51 2012/08/01 21:30:24 matt Exp $ */
/* $OpenBSD: db_interface.c,v 1.2 1996/12/28 06:21:50 rahnds Exp $ */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.50 2012/02/01 09:51:00 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.51 2012/08/01 21:30:24 matt Exp $");
#define USERACC
@@ -84,6 +84,7 @@ static void db_ppc4xx_useracc(db_expr_t,
#ifdef PPC_BOOKE
static void db_ppcbooke_reset(db_expr_t, bool, db_expr_t, const char *);
+static void db_ppcbooke_splhist(db_expr_t, bool, db_expr_t, const char *);
static void db_ppcbooke_tf(db_expr_t, bool, db_expr_t, const char *);
static void db_ppcbooke_dumptlb(db_expr_t, bool, db_expr_t, const char *);
#endif
@@ -130,6 +131,9 @@ const struct db_command db_machine_comma
"Display the contents of the trapframe",
"address",
" address:\tthe struct trapframe to print") },
+ { DDB_ADD_CMD("splhist", db_ppcbooke_splhist, 0,
+ "Display the splraise/splx splx",
+ NULL, NULL) },
{ DDB_ADD_CMD("tlb", db_ppcbooke_dumptlb, 0,
"Display instruction translation storage buffer information.",
NULL,NULL) },
@@ -762,22 +766,20 @@ db_ppcbooke_reset(db_expr_t addr, bool h
}
static void
-db_ppcbooke_tf(db_expr_t addr, bool have_addr, db_expr_t count, const char *modif)
+db_ppcbooke_splhist(db_expr_t addr, bool have_addr, db_expr_t count,
+ const char *modif)
+{
+ dump_splhist(curcpu(), db_printf);
+}
+
+static void
+db_ppcbooke_tf(db_expr_t addr, bool have_addr, db_expr_t count,
+ const char *modif)
{
if (!have_addr)
return;
- const struct trapframe * const tf = (const struct trapframe *)addr;
-
- db_printf("trapframe %p (exc=%x srr0/1=%#lx/%#lx esr/dear=%#x/%#lx)\n",
- tf, tf->tf_exc, tf->tf_srr0, tf->tf_srr1, tf->tf_esr, tf->tf_dear);
- db_printf("lr =%08lx ctr=%08lx cr =%08x xer=%08x\n",
- tf->tf_lr, tf->tf_ctr, tf->tf_cr, tf->tf_xer);
- for (u_int r = 0; r < 32; r += 4) {
- db_printf("r%02u=%08lx r%02u=%08lx r%02u=%08lx r%02u=%08lx\n",
- r+0, tf->tf_fixreg[r+0], r+1, tf->tf_fixreg[r+1],
- r+2, tf->tf_fixreg[r+2], r+3, tf->tf_fixreg[r+3]);
- }
+ dump_trapframe((const struct trapframe *)addr, db_printf);
}
static void