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