[Crash-utility] [PATCH 11/11] bt: Display register set in ELF note on kdump-compressed format generated from sadump format
HATAYAMA Daisuke
d.hatayama at jp.fujitsu.com
Thu Oct 20 10:43:12 UTC 2011
Now we're developping the feature of makedumpfile producing vmcore in
kdump-compressed format from sadump-related formats. The vmcores
generated from the sadump-related formats have register set collected
by sadump as ELF note, meaning that the registers could be the values
collected during execution in kernel text or user space; of course,
they could also be broken just as register set collected by kdump for
non-panic tasks.
Currently, on sadump-related formats, bt command displays register set
at top level, but doesn't on kdump-compressed format. This patch
changes the logic on kdump-compressed format so that bt displays the
register set in the same way as on sadump-related formats. If they are
not useful--that is, they don't belong to neither kernel text nor user
space--, the current logic remains.
Example:
[Before]
crash> bt
PID: 0 TASK: ffffffff80314b60 CPU: 0 COMMAND: "swapper"
#0 [ffffffff8045bf88] mwait_idle at ffffffff80056ca4
#1 [ffffffff8045bf90] cpu_idle at ffffffff80048fc5
[After]
crash> bt
PID: 0 TASK: ffffffff80314b60 CPU: 0 COMMAND: "swapper"
[exception RIP: mwait_idle_with_hints+102]
RIP: ffffffff8006b9bf RSP: ffffffff8045bf88 RFLAGS: 00000246
RAX: 0000000000000000 RBX: ffffffff80056c98 RCX: 0000000000000000
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000
RBP: 000000000008fc00 R8: ffffffff8045a000 R9: ffff81047e4f6340
R10: 0000000000000002 R11: 0000000000000246 R12: 0000000000000018
R13: 0000000000000018 R14: 0000000000000018 R15: 0000000076c18a58
CS: 0010 SS: 0018
#0 [ffffffff8045bf88] mwait_idle at ffffffff80056ca4
#1 [ffffffff8045bf90] cpu_idle at ffffffff80048fc5
Signed-off-by: HATAYAMA Daisuke <d.hatayama at jp.fujitsu.com>
---
netdump.c | 17 +++++++++++++++++
x86.c | 2 ++
x86_64.c | 6 +++++-
3 files changed, 24 insertions(+), 1 deletions(-)
-------------- next part --------------
diff --git a/netdump.c b/netdump.c
index f8da284..1c141d5 100644
--- a/netdump.c
+++ b/netdump.c
@@ -2297,6 +2297,22 @@ get_netdump_regs_x86_64(struct bt_info *bt, ulong *ripp, ulong *rspp)
netdump_print("ELF prstatus rsp: %lx rip: %lx\n",
rsp, rip);
+ if (is_kernel_text(rip) &&
+ (((rsp >= GET_STACKBASE(bt->task)) &&
+ (rsp < GET_STACKTOP(bt->task))) ||
+ in_alternate_stack(bt->tc->processor, rsp))) {
+ *ripp = rip;
+ *rspp = rsp;
+ bt->flags |= BT_KERNEL_SPACE;
+ return;
+ }
+
+ if (!is_kernel_text(rip) &&
+ in_user_stack(bt->tc->task, rsp)) {
+ bt->flags |= BT_USER_SPACE;
+ return;
+ }
+
*rspp = rsp;
*ripp = rip;
@@ -2508,6 +2524,7 @@ next_sysrq:
(((sp >= GET_STACKBASE(bt->task)) &&
(sp < GET_STACKTOP(bt->task))) ||
in_alternate_stack(bt->tc->processor, sp))) {
+ bt->flags |= BT_KERNEL_SPACE;
*eip = ip;
*esp = sp;
return;
diff --git a/x86.c b/x86.c
index b69adb2..df91110 100755
--- a/x86.c
+++ b/x86.c
@@ -699,6 +699,8 @@ db_stack_trace_cmd(addr, have_addr, count, modif, task, flags)
} else if ((bt->flags & BT_KERNEL_SPACE)) {
if (KVMDUMP_DUMPFILE())
kvmdump_display_regs(bt->tc->processor, fp);
+ else if (ELF_NOTES_VALID() && DISKDUMP_DUMPFILE())
+ diskdump_display_regs(bt->tc->processor, fp);
else if (SADUMP_DUMPFILE())
sadump_display_regs(bt->tc->processor, fp);
}
diff --git a/x86_64.c b/x86_64.c
index 7a7de3c..2379f44 100755
--- a/x86_64.c
+++ b/x86_64.c
@@ -2880,7 +2880,9 @@ x86_64_low_budget_back_trace_cmd(struct bt_info *bt_in)
sadump_display_regs(bt->tc->processor, ofp);
return;
} else if ((bt->flags & BT_KERNEL_SPACE) &&
- (KVMDUMP_DUMPFILE() || SADUMP_DUMPFILE())) {
+ (KVMDUMP_DUMPFILE() ||
+ (ELF_NOTES_VALID() && DISKDUMP_DUMPFILE()) ||
+ SADUMP_DUMPFILE())) {
fprintf(ofp, " [exception RIP: ");
if ((sp = value_search(bt->instptr, &offset))) {
fprintf(ofp, "%s", sp->name);
@@ -2892,6 +2894,8 @@ x86_64_low_budget_back_trace_cmd(struct bt_info *bt_in)
fprintf(ofp, "]\n");
if (KVMDUMP_DUMPFILE())
kvmdump_display_regs(bt->tc->processor, ofp);
+ else if (ELF_NOTES_VALID() && DISKDUMP_DUMPFILE())
+ diskdump_display_regs(bt->tc->processor, ofp);
else if (SADUMP_DUMPFILE())
sadump_display_regs(bt->tc->processor, ofp);
} else if (bt->flags & BT_START) {
More information about the Crash-utility
mailing list