Re: arm64: "bt -f" output

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Takahiro,

To address my concerns about your patch, I added a few additional changes and attached
it to this email.  The changes are:

(1) Prevent the stack dump "below" the #0 level.  Yes, the stack data region is contained within
    the incoming frame parameters, but it's ugly and we really don't care to see what's before
    the #0 crash_kexec and crash_save_cpu #0 frames.
(2) Fill in the missing stack dump at the top of the process stack, up to, but not including
    the user-space exception frame.
(3) Instead of showing the fp of 0 in the top-most frame's stack address, fill it in with the 
    address of the user-space exception frame.

Note that there is no dump of the stack containing the user-space exception frame, but the
register dump itself should suffice.

If you can live with the display, I'll clean up the patch, and maybe add the stack-layout diagram
from your last post into a comment.  It was quite helpful, especially in comparison to the
x86_64 model, which is what I was mistakenly using as a guide.

Thanks,
  Dave



diff --git a/arm64.c b/arm64.c
index 86ec348..3b29ef4 100644
--- a/arm64.c
+++ b/arm64.c
@@ -1407,13 +1407,14 @@ arm64_print_stackframe_entry(struct bt_info *bt, int level, struct arm64_stackfr
                                 value_to_symstr(frame->pc, buf, bt->radix);
         }
 
-	if (bt->flags & BT_FULL) {
-		arm64_display_full_frame(bt, frame->sp);
-		bt->frameptr = frame->sp;
+	if ((bt->flags & BT_FULL) && level) {
+		arm64_display_full_frame(bt, frame->fp);
+		bt->frameptr = frame->fp;
 	}
 
         fprintf(ofp, "%s#%d [%8lx] %s at %lx", level < 10 ? " " : "", level,
-                frame->sp, name_plus_offset ? name_plus_offset : name, frame->pc);
+//              frame->fp, name_plus_offset ? name_plus_offset : name, frame->pc);
+                frame->fp ? frame->fp : bt->stacktop - USER_EFRAME_OFFSET, name_plus_offset ? name_plus_offset : name, frame->pc);
 
 	if (BT_REFERENCE_CHECK(bt))
 		arm64_do_bt_reference_check(bt, frame->pc, name);
@@ -1447,8 +1448,12 @@ arm64_display_full_frame(struct bt_info *bt, ulong sp)
 	if (bt->frameptr == sp)
 		return;
 
-	if (!INSTACK(sp, bt) || !INSTACK(bt->frameptr, bt))
-		return;
+	if (!INSTACK(sp, bt) || !INSTACK(bt->frameptr, bt)) {
+		if (sp == 0)
+			sp = bt->stacktop - USER_EFRAME_OFFSET;
+		else
+			return;
+	}
 
 	words = (sp - bt->frameptr) / sizeof(ulong);
 
@@ -1471,12 +1476,10 @@ arm64_unwind_frame(struct bt_info *bt, struct arm64_stackframe *frame)
 {
 	unsigned long high, low, fp;
 	unsigned long stack_mask;
-	unsigned long irq_stack_ptr, orig_sp, sp_in;
+	unsigned long irq_stack_ptr, orig_sp;
 	struct arm64_pt_regs *ptregs;
 	struct machine_specific *ms;
 
-	sp_in = frame->sp;
-
 	stack_mask = (unsigned long)(ARM64_STACK_SIZE) - 1;
 	fp = frame->fp;
 
@@ -1513,7 +1516,7 @@ arm64_unwind_frame(struct bt_info *bt, struct arm64_stackframe *frame)
 				ptregs = (struct arm64_pt_regs *)&bt->stackbuf[(ulong)(STACK_OFFSET_TYPE(orig_sp))];
 				frame->sp = orig_sp;
 				frame->pc = ptregs->pc;
-				bt->bptr = sp_in;
+				bt->bptr = fp;
 				if (CRASHDEBUG(1))
 					error(INFO, 
 					    "arm64_unwind_frame: switch stacks: fp: %lx sp: %lx  pc: %lx\n",
@@ -1904,8 +1907,10 @@ arm64_print_exception_frame(struct bt_info *bt, ulong pt_regs, int mode, FILE *o
 	ulong LR, SP, offset;
 	char buf[BUFSIZE];
 
+#if 0 /* FIXME? */
 	if (bt->flags & BT_FULL)
 		arm64_display_full_frame(bt, pt_regs);
+#endif
 
 	if (CRASHDEBUG(1)) 
 		fprintf(ofp, "pt_regs: %lx\n", pt_regs);
--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility

[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux