Date: Mon, 29 Dec 2003 03:27:30 -0800 (PST) From: Juli Mallett <jmallett@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 44509 for review Message-ID: <200312291127.hBTBRU4t059678@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=44509 Change 44509 by jmallett@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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200312291127.hBTBRU4t059678>