From owner-p4-projects@FreeBSD.ORG Mon Dec 29 03:27:32 2003 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 62F2216A4D0; Mon, 29 Dec 2003 03:27:32 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3DF9216A4CE for ; Mon, 29 Dec 2003 03:27:32 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 0CA6943D45 for ; Mon, 29 Dec 2003 03:27:31 -0800 (PST) (envelope-from jmallett@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.10/8.12.10) with ESMTP id hBTBRU0B059681 for ; Mon, 29 Dec 2003 03:27:30 -0800 (PST) (envelope-from jmallett@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id hBTBRU4t059678 for perforce@freebsd.org; Mon, 29 Dec 2003 03:27:30 -0800 (PST) (envelope-from jmallett@freebsd.org) Date: Mon, 29 Dec 2003 03:27:30 -0800 (PST) Message-Id: <200312291127.hBTBRU4t059678@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jmallett@freebsd.org using -f From: Juli Mallett To: Perforce Change Reviews Subject: PERFORCE change 44509 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Dec 2003 11:27:33 -0000 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;