Skip site navigation (1)Skip section navigation (2)
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>