Merge ^/head r311306 through r311313.

This commit is contained in:
Dimitry Andric 2017-01-04 22:06:14 +00:00
commit d8c03e73dc
2 changed files with 25 additions and 13 deletions

View file

@ -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 @@ loop:
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 @@ loop:
* 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 @@ loop:
}
/*
* 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 @@ done:
(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)

View file

@ -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