From e5b756632330492cb09e2caeae68cc442e0e1a84 Mon Sep 17 00:00:00 2001 From: dim Date: Wed, 4 Jan 2017 22:06:14 +0000 Subject: [PATCH] Merge ^/head r311306 through r311313. --- sys/mips/mips/db_trace.c | 37 +++++++++++++++--------- tools/build/mk/OptionalObsoleteFiles.inc | 1 + 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/sys/mips/mips/db_trace.c b/sys/mips/mips/db_trace.c index d18f0793426..9a3b7308b01 100644 --- a/sys/mips/mips/db_trace.c +++ b/sys/mips/mips/db_trace.c @@ -141,11 +141,12 @@ stacktrace_subr(register_t pc, register_t sp, register_t ra, */ int valid_args[4]; register_t args[4]; - register_t va, subr; + register_t va, subr, cause, badvaddr; unsigned instr, mask; unsigned int frames = 0; int more, stksize, j; register_t next_ra; + bool trapframe; /* Jump here when done with a frame, to start a new one */ loop: @@ -160,6 +161,7 @@ stacktrace_subr(register_t pc, register_t sp, register_t ra, next_ra = 0; stksize = 0; subr = 0; + trapframe = false; if (frames++ > 100) { (*printfn) ("\nstackframe count exceeded\n"); /* return breaks stackframe-size heuristics with gcc -O2 */ @@ -183,17 +185,21 @@ stacktrace_subr(register_t pc, register_t sp, register_t ra, * preceding "j ra" at the tail of the preceding function. Depends * on relative ordering of functions in exception.S, swtch.S. */ - if (pcBetween(MipsKernGenException, MipsUserGenException)) + if (pcBetween(MipsKernGenException, MipsUserGenException)) { subr = (uintptr_t)MipsKernGenException; - else if (pcBetween(MipsUserGenException, MipsKernIntr)) + trapframe = true; + } else if (pcBetween(MipsUserGenException, MipsKernIntr)) subr = (uintptr_t)MipsUserGenException; - else if (pcBetween(MipsKernIntr, MipsUserIntr)) + else if (pcBetween(MipsKernIntr, MipsUserIntr)) { subr = (uintptr_t)MipsKernIntr; - else if (pcBetween(MipsUserIntr, MipsTLBInvalidException)) + trapframe = true; + } else if (pcBetween(MipsUserIntr, MipsTLBInvalidException)) subr = (uintptr_t)MipsUserIntr; - else if (pcBetween(MipsTLBInvalidException, MipsTLBMissException)) + else if (pcBetween(MipsTLBInvalidException, MipsTLBMissException)) { subr = (uintptr_t)MipsTLBInvalidException; - else if (pcBetween(fork_trampoline, savectx)) + if (pc == (uintptr_t)MipsKStackOverflow) + trapframe = true; + } else if (pcBetween(fork_trampoline, savectx)) subr = (uintptr_t)fork_trampoline; else if (pcBetween(savectx, cpu_throw)) subr = (uintptr_t)savectx; @@ -215,11 +221,11 @@ stacktrace_subr(register_t pc, register_t sp, register_t ra, } /* - * For a kernel stack overflow, skip to the output and - * afterwards pull the previous registers out of the trapframe - * instead of decoding the function prologue. + * For a trapframe, skip to the output and afterwards pull the + * previous registers out of the trapframe instead of decoding + * the function prologue. */ - if (pc == (uintptr_t)MipsKStackOverflow) + if (trapframe) goto done; /* @@ -398,19 +404,24 @@ stacktrace_subr(register_t pc, register_t sp, register_t ra, (uintmax_t)(u_register_t) sp, stksize); - if (pc == (uintptr_t)MipsKStackOverflow) { + if (trapframe) { #define TF_REG(base, reg) ((base) + CALLFRAME_SIZ + ((reg) * SZREG)) #if defined(__mips_n64) || defined(__mips_n32) pc = kdbpeekd((int *)TF_REG(sp, PC)); ra = kdbpeekd((int *)TF_REG(sp, RA)); sp = kdbpeekd((int *)TF_REG(sp, SP)); + cause = kdbpeekd((int *)TF_REG(sp, CAUSE)); + badvaddr = kdbpeekd((int *)TF_REG(sp, BADVADDR)); #else pc = kdbpeek((int *)TF_REG(sp, PC)); ra = kdbpeek((int *)TF_REG(sp, RA)); sp = kdbpeek((int *)TF_REG(sp, SP)); + cause = kdbpeek((int *)TF_REG(sp, CAUSE)); + badvaddr = kdbpeek((int *)TF_REG(sp, BADVADDR)); #endif #undef TF_REG - (*printfn) ("--- Kernel Stack Overflow ---\n"); + (*printfn) ("--- exception, cause %jx badvaddr %jx ---\n", + (uintmax_t)cause, (uintmax_t)badvaddr); goto loop; } else if (ra) { if (pc == ra && stksize == 0) diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc index d81de2803e3..f668a49a2ef 100644 --- a/tools/build/mk/OptionalObsoleteFiles.inc +++ b/tools/build/mk/OptionalObsoleteFiles.inc @@ -1348,6 +1348,7 @@ OLD_FILES+=usr/bin/clang OLD_FILES+=usr/bin/clang++ OLD_FILES+=usr/bin/clang-cpp OLD_FILES+=usr/bin/clang-tblgen +OLD_FILES+=usr/bin/llvm-objdump OLD_FILES+=usr/bin/llvm-tblgen OLD_FILES+=usr/lib/clang/4.0.0/include/sanitizer/allocator_interface.h OLD_FILES+=usr/lib/clang/4.0.0/include/sanitizer/asan_interface.h -- 2.45.0