Page MenuHomeFreeBSD

D6907.id17836.diff
No OneTemporary

D6907.id17836.diff

Index: sys/mips/mips/db_trace.c
===================================================================
--- sys/mips/mips/db_trace.c
+++ sys/mips/mips/db_trace.c
@@ -144,6 +144,7 @@
unsigned instr, mask;
unsigned int frames = 0;
int more, stksize, j;
+ register_t next_ra;
/* Jump here when done with a frame, to start a new one */
loop:
@@ -155,6 +156,7 @@
valid_args[1] = 0;
valid_args[2] = 0;
valid_args[3] = 0;
+ next_ra = 0;
/* Jump here after a nonstandard (interrupt handler) frame */
stksize = 0;
subr = 0;
@@ -288,9 +290,17 @@
/* look for saved registers on the stack */
if (i.IType.rs != 29)
break;
- /* only restore the first one */
- if (mask & (1 << i.IType.rt))
+ /*
+ * only restore the first one except RA for
+ * MipsKernGenException case
+ */
+ if (mask & (1 << i.IType.rt)) {
+ if(subr == (uintptr_t)MipsKernGenException &&
+ i.IType.rt == 31)
+ next_ra = kdbpeek((int *)(sp +
+ (short)i.IType.imm));
break;
+ }
mask |= (1 << i.IType.rt);
switch (i.IType.rt) {
case 4:/* a0 */
@@ -374,7 +384,10 @@
(*printfn)("?");
}
- (*printfn) (") ra %jx sp %jx sz %d\n", ra, sp, stksize);
+ (*printfn) (") ra %jx sp %jx sz %d\n",
+ (uintmax_t)(u_register_t) ra,
+ (uintmax_t)(u_register_t) sp,
+ stksize);
if (ra) {
if (pc == ra && stksize == 0)
@@ -382,7 +395,7 @@
else {
pc = ra;
sp += stksize;
- ra = 0;
+ ra = next_ra;
goto loop;
}
} else {

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 2, 2:06 AM (9 h, 17 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29135210
Default Alt Text
D6907.id17836.diff (1 KB)

Event Timeline