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) {