svn commit: r311341 - in head/sys/mips: include mips
John Baldwin
jhb at FreeBSD.org
Thu Jan 5 00:08:06 UTC 2017
Author: jhb
Date: Thu Jan 5 00:08:04 2017
New Revision: 311341
URL: https://svnweb.freebsd.org/changeset/base/311341
Log:
Only call stacktrace_subr() from DDB.
There was a single call to stacktrace() under an #ifdef DEBUG to obtain
a stack trace during a fault that resulted in a function pointer to a
printf function being passed to stacktrace_subr() in db_trace.c. The
kernel now has existing interfaces for obtaining a stack trace outside
of DDB (kdb_backtrace(), or the stack_*() API) that should be used instead.
Rather than fix the one call however, remove it since the kernel will
dump a trace anyway once it panics.
Make stacktrace_subr() static, remove the function pointer and change it
to use db_printf() explicitly.
Discussed with: kan
Sponsored by: DARPA / AFRL
Modified:
head/sys/mips/include/db_machdep.h
head/sys/mips/mips/db_trace.c
head/sys/mips/mips/trap.c
Modified: head/sys/mips/include/db_machdep.h
==============================================================================
--- head/sys/mips/include/db_machdep.h Wed Jan 4 23:22:34 2017 (r311340)
+++ head/sys/mips/include/db_machdep.h Thu Jan 5 00:08:04 2017 (r311341)
@@ -92,7 +92,6 @@ db_addr_t next_instr_address(db_addr_t,
int db_inst_type(int);
db_addr_t branch_taken(int inst, db_addr_t pc);
-void stacktrace_subr(register_t pc, register_t sp, register_t ra, int (*)(const char *, ...));
int32_t kdbpeek(int *);
int64_t kdbpeekd(int *);
Modified: head/sys/mips/mips/db_trace.c
==============================================================================
--- head/sys/mips/mips/db_trace.c Wed Jan 4 23:22:34 2017 (r311340)
+++ head/sys/mips/mips/db_trace.c Thu Jan 5 00:08:04 2017 (r311341)
@@ -130,9 +130,8 @@ fn_name(uintptr_t addr)
return (buf);
}
-void
-stacktrace_subr(register_t pc, register_t sp, register_t ra,
- int (*printfn) (const char *,...))
+static void
+stacktrace_subr(register_t pc, register_t sp, register_t ra)
{
InstFmt i;
/*
@@ -163,14 +162,14 @@ loop:
subr = 0;
trapframe = false;
if (frames++ > 100) {
- (*printfn) ("\nstackframe count exceeded\n");
+ db_printf("\nstackframe count exceeded\n");
/* return breaks stackframe-size heuristics with gcc -O2 */
goto finish; /* XXX */
}
/* check for bad SP: could foul up next frame */
/*XXX MIPS64 bad: this hard-coded SP is lame */
if (!MIPS_IS_VALID_KERNELADDR(sp)) {
- (*printfn) ("SP 0x%jx: not in kernel\n", sp);
+ db_printf("SP 0x%jx: not in kernel\n", sp);
ra = 0;
subr = 0;
goto done;
@@ -215,7 +214,7 @@ loop:
/* check for bad PC */
/*XXX MIPS64 bad: These hard coded constants are lame */
if (!MIPS_IS_VALID_KERNELADDR(pc)) {
- (*printfn) ("PC 0x%jx: not in kernel\n", pc);
+ db_printf("PC 0x%jx: not in kernel\n", pc);
ra = 0;
goto done;
}
@@ -389,17 +388,17 @@ loop:
}
done:
- (*printfn) ("%s+%x (", fn_name(subr), pc - subr);
+ db_printf("%s+%jx (", fn_name(subr), (uintmax_t)(pc - subr));
for (j = 0; j < 4; j ++) {
if (j > 0)
- (*printfn)(",");
+ db_printf(",");
if (valid_args[j])
- (*printfn)("%jx", (uintmax_t)(u_register_t)args[j]);
+ db_printf("%jx", (uintmax_t)(u_register_t)args[j]);
else
- (*printfn)("?");
+ db_printf("?");
}
- (*printfn) (") ra %jx sp %jx sz %d\n",
+ db_printf(") ra %jx sp %jx sz %d\n",
(uintmax_t)(u_register_t) ra,
(uintmax_t)(u_register_t) sp,
stksize);
@@ -420,12 +419,12 @@ done:
badvaddr = kdbpeek((int *)TF_REG(sp, BADVADDR));
#endif
#undef TF_REG
- (*printfn) ("--- exception, cause %jx badvaddr %jx ---\n",
+ db_printf("--- exception, cause %jx badvaddr %jx ---\n",
(uintmax_t)cause, (uintmax_t)badvaddr);
goto loop;
} else if (ra) {
if (pc == ra && stksize == 0)
- (*printfn) ("stacktrace: loop!\n");
+ db_printf("stacktrace: loop!\n");
else {
pc = ra;
sp += stksize;
@@ -435,9 +434,9 @@ done:
} else {
finish:
if (curproc)
- (*printfn) ("pid %d\n", curproc->p_pid);
+ db_printf("pid %d\n", curproc->p_pid);
else
- (*printfn) ("curproc NULL\n");
+ db_printf("curproc NULL\n");
}
}
@@ -479,7 +478,7 @@ db_trace_self(void)
"move $31, %1\n" /* restore ra */
: "=r" (pc)
: "r" (ra));
- stacktrace_subr(pc, sp, ra, db_printf);
+ stacktrace_subr(pc, sp, ra);
return;
}
@@ -493,7 +492,7 @@ db_trace_thread(struct thread *thr, int
sp = (register_t)ctx->pcb_context[PCB_REG_SP];
pc = (register_t)ctx->pcb_context[PCB_REG_PC];
ra = (register_t)ctx->pcb_context[PCB_REG_RA];
- stacktrace_subr(pc, sp, ra, db_printf);
+ stacktrace_subr(pc, sp, ra);
return (0);
}
Modified: head/sys/mips/mips/trap.c
==============================================================================
--- head/sys/mips/mips/trap.c Wed Jan 4 23:22:34 2017 (r311340)
+++ head/sys/mips/mips/trap.c Thu Jan 5 00:08:04 2017 (r311341)
@@ -278,11 +278,6 @@ char *trap_type[] = {
struct trapdebug trapdebug[TRAPSIZE], *trp = trapdebug;
#endif
-#if defined(DDB) || defined(DEBUG)
-void stacktrace(struct trapframe *);
-void logstacktrace(struct trapframe *);
-#endif
-
#define KERNLAND(x) ((vm_offset_t)(x) >= VM_MIN_KERNEL_ADDRESS && (vm_offset_t)(x) < VM_MAX_KERNEL_ADDRESS)
#define DELAYBRANCH(x) ((int)(x) < 0)
@@ -1082,7 +1077,6 @@ dofault:
err:
#if !defined(SMP) && defined(DEBUG)
- stacktrace(!usermode ? trapframe : td->td_frame);
trapDump("trap");
#endif
#ifdef SMP
@@ -1302,18 +1296,6 @@ MipsEmulateBranch(struct trapframe *fram
return (retAddr);
}
-
-#if defined(DDB) || defined(DEBUG)
-/*
- * Print a stack backtrace.
- */
-void
-stacktrace(struct trapframe *regs)
-{
- stacktrace_subr(regs->pc, regs->sp, regs->ra, printf);
-}
-#endif
-
static void
log_frame_dump(struct trapframe *frame)
{
More information about the svn-src-all
mailing list