[Crash-utility] [PATCH 3/3] mips: use get_stackframe() implementation from ARM
Dave Anderson
anderson at redhat.com
Thu Oct 20 18:16:05 UTC 2016
----- Original Message -----
> On Wed, Oct 19, 2016 at 09:56:08AM -0400, Dave Anderson wrote:
> > But with the patch installed, both dumpfiles show the "WARNING: cannot
> > retrieve registers for active task" during initialization, and "bt" fails
> > as expected:
>
> Right, thanks for catching this. The code borrowed from ARM assumes
> that the kernel was built with core dump support, which is not
> necessarily the case if the dump was saved via some external means which
> creates ELF dumps (QEMU in the case of my example dumps).
>
> Folding in the following patch makes it work for both the example dumps
> you have and dumps with crash_notes. Thanks.
That works -- queued for crash-7.1.7:
https://github.com/crash-utility/crash/commit/5bca61c0eb44729b541da02bcc48b8b85d21358b
Thanks,
Dave
>
> 8<----
> >From fd9cec4ae5e5f310e3de073e66825b7b9df07573 Mon Sep 17 00:00:00 2001
> From: Rabin Vincent <rabinv at axis.com>
> Date: Wed, 19 Oct 2016 21:18:31 +0200
> Subject: [PATCH] mips: get regs from ELF notes if no crash_notes
>
> ---
> mips.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 49 insertions(+), 1 deletion(-)
>
> diff --git a/mips.c b/mips.c
> index e3f1569..4eeab55 100644
> --- a/mips.c
> +++ b/mips.c
> @@ -898,6 +898,54 @@ fail:
> return FALSE;
> }
>
> +static int mips_get_elf_notes(void)
> +{
> + struct machine_specific *ms = machdep->machspec;
> + int i;
> +
> + if (!DISKDUMP_DUMPFILE() && !KDUMP_DUMPFILE())
> + return FALSE;
> +
> + panic_task_regs = calloc(kt->cpus, sizeof(*panic_task_regs));
> + if (!panic_task_regs)
> + error(FATAL, "cannot calloc panic_task_regs space\n");
> +
> + for (i = 0; i < kt->cpus; i++) {
> + Elf32_Nhdr *note = NULL;
> + size_t len;
> +
> + if (DISKDUMP_DUMPFILE())
> + note = diskdump_get_prstatus_percpu(i);
> + else if (KDUMP_DUMPFILE())
> + note = netdump_get_prstatus_percpu(i);
> +
> + if (!note)
> + error(WARNING,
> + "cannot find NT_PRSTATUS note for cpu: %d\n", i);
> +
> + len = sizeof(Elf32_Nhdr);
> + len = roundup(len + note->n_namesz, 4);
> +
> + BCOPY((char *)note + len + OFFSET(elf_prstatus_pr_reg),
> + &panic_task_regs[i], sizeof(panic_task_regs[i]));
> + }
> +
> + ms->crash_task_regs = panic_task_regs;
> +
> + return TRUE;
> +}
> +
> +static int mips_init_active_task_regs(void)
> +{
> + int retval;
> +
> + retval = mips_get_crash_notes();
> + if (retval == TRUE)
> + return retval;
> +
> + return mips_get_elf_notes();
> +}
> +
> static int
> mips_verify_symbol(const char *name, ulong value, char type)
> {
> @@ -1075,7 +1123,7 @@ mips_init(int when)
> * of the crash. We need this information to extract correct
> * backtraces from the panic task.
> */
> - if (!ACTIVE() && !mips_get_crash_notes())
> + if (!ACTIVE() && !mips_init_active_task_regs())
> error(WARNING,
> "cannot retrieve registers for active task%s\n\n",
> kt->cpus > 1 ? "s" : "");
> --
> 2.1.4
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
>
More information about the Crash-utility
mailing list