PERFORCE change 44509 for review
Juli Mallett
jmallett at FreeBSD.org
Mon Dec 29 03:27:33 PST 2003
http://perforce.freebsd.org/chv.cgi?CH=44509
Change 44509 by jmallett at jmallett_oingo on 2003/12/29 03:26:32
Use unsigned register_t where that's what I meant... How did I
think register_t was unsigned for *so long*?! :(
Fail if we can't read the return address from stack.
Find the top of the function based on operating on sp, not on
doing any *addi*. I think those lines got deleted accidentally
on the way to the submit :(
Affected files ...
.. //depot/projects/mips/sys/mips/mips/db_trace.c#7 edit
Differences ...
==== //depot/projects/mips/sys/mips/mips/db_trace.c#7 (text+ko) ====
@@ -84,8 +84,8 @@
extern char btext[];
-static register_t
-db_stack_register_fetch(register_t sp, register_t stacksize, register_t r)
+static u_register_t
+db_stack_register_fetch(u_register_t sp, u_register_t stacksize, u_register_t r)
{
if (sp == ddb_regs.f_regs[SP]) {
return (ddb_regs.f_regs[r]);
@@ -99,7 +99,7 @@
db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count,
char *modif)
{
- register_t sp, ra, pc, i, stacksize, func;
+ u_register_t sp, ra, pc, i, stacksize, func;
InstFmt insn;
sp = ddb_regs.f_regs[SP];
@@ -108,16 +108,18 @@
for (;;) {
stacksize = 0;
- if (pc <= (register_t)btext)
+ if (pc <= (u_register_t)btext)
break;
db_printf("%p", (void *)pc);
- for (i = pc; i >= (register_t)btext; i -= sizeof (insn)) {
+ for (i = pc; i >= (u_register_t)btext; i -= sizeof (insn)) {
bcopy((void *)i, &insn, sizeof insn);
switch (insn.IType.op) {
case OP_ADDI:
case OP_ADDIU:
case OP_DADDI:
case OP_DADDIU:
+ if (insn.IType.rs != SP || insn.IType.rt != SP)
+ break;
stacksize = -(short)insn.IType.imm;
break;
default:
@@ -138,9 +140,11 @@
switch (insn.IType.op) {
case OP_JR:
case OP_JALR:
- if (ra <= (register_t)btext)
+ if (ra >= (u_register_t)btext)
break;
ra = db_stack_register_fetch(sp, stacksize, insn.RType.rs);
+ if (!ra)
+ goto done;
break;
default:
break;
More information about the p4-projects
mailing list