[Pdbg] [PATCH] stack: unwinder fix endian heuristic at top of stack

Nicholas Piggin npiggin at gmail.com
Fri Jun 28 14:20:38 AEST 2019


When the stack is followed to the top and the next backpointer is
zero, the endian guess for the frame does not work properly. This
changes it to remember the previous endianness and use that.

Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
---
This stack unwinder is becoming a proper Rube Goldberg machine, it
can probably be rewritten sanely and more reliably, but here's one
last little fix I've been carrying around for a while that helps
things.

 src/thread.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/thread.c b/src/thread.c
index 8f34233..ede797a 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -57,6 +57,7 @@ static int dump_stack(struct thread_regs *regs, struct pdbg_target *adu)
 	uint64_t next_sp = regs->gprs[1];
 	uint64_t pc;
 	bool finished = false;
+	bool prev_flip = false;
 
 	printf("STACK:           SP                NIA\n");
 	if (!(next_sp && is_real_address(regs, next_sp))) {
@@ -82,13 +83,17 @@ static int dump_stack(struct thread_regs *regs, struct pdbg_target *adu)
 		if (!load8(adu, sp + 16, &pc))
 			return 1;
 
-		tmp2 = flip_endian(tmp);
-
 		if (!tmp) {
 			finished = true;
-			goto no_flip;
+			flip = prev_flip;
+			if (flip)
+				be = !be;
+			next_sp = 0;
+			goto do_pc;
 		}
 
+		tmp2 = flip_endian(tmp);
+
 		/*
 		 * Basic endian detection.
 		 * Stack grows down, so as we unwind it we expect to see
@@ -130,11 +135,14 @@ no_flip:
 			next_sp = tmp;
 		}
 
+do_pc:
 		if (flip)
 			pc = flip_endian(pc);
 
 		printf(" 0x%016" PRIx64 " 0x%016" PRIx64 " (%s)\n",
 			sp, pc, be ? "big-endian" : "little-endian");
+
+		prev_flip = flip;
 	}
 	printf(" 0x%016" PRIx64 "\n", next_sp);
 
-- 
2.20.1



More information about the Pdbg mailing list