[Crash-utility] Question for ARM developers/users w/respect to makedumpfile [PROBLEM SOLVED]

Mika Westerberg mika.westerberg at iki.fi
Wed Mar 6 07:24:17 UTC 2013


On Tue, Mar 05, 2013 at 10:32:26AM -0500, Dave Anderson wrote:
> 
> 
> With respect to this long-running thread:
> 
>  [Crash-utility] Question for ARM developers/users w/respect to makedumpfile
>  https://www.redhat.com/archives/crash-utility/2013-January/msg00049.html
> 
> and the kludge/patch that went into crash-6.1.3:
> 
>     - Workaround for the "crash --osrelease dumpfile" option to be able
>       to work with malformed ARM compressed kdump headers.  ARM compressed
>       kdumps that indicate header version 3 may contain a malformed
>       kdump_sub_header structure with offset_vmcoreinfo and size_vmcoreinfo
>       fields offset by 4 bytes, and the actual vmcoreinfo data is not
>       preceded by its ELF note header and its "VMCOREINFO" string.  This
>       workaround finds the vmcoreinfo data and patches the stored header's
>       offset_vmcoreinfo and size_vmcoreinfo values.  Without the patch, the
>       "--osrelease dumpfile" command line option fails with the message
>       "crash: compressed kdump: cannot lseek dump vmcoreinfo", followed by
>       "unknown".
>       (anderson at redhat.com)
> 
> Luc Chouinard has come to the rescue and figured out what was going on.

Thanks a lot Luc!

> It is not a matter of a "malformed" ARM compressed kdump header, but rather
> a result of using a 32-bit x86 crash binary created with "make target=ARM"
> to analyze ARM compressed kdumps.
> 
> The ARM guys on the list can confirm this, but Luc debugged this issue
> with a natively-built crash utility, and determined:
> 
>   Seems like the off_t members of the kdump_sub_header struct are being
>   aligned on 8 byte boundaries. Which would explain the problem you are
>   pointing out. This can be a normal compiler behavior for the arm processor,
>   which will generate exceptions for unaligned memory accesses. This is 
>   something we had to chase down and fix for some of our cross platform 
>   code base (i386 and arm). The Arm experts may have to confirm, but I'd 
>   think that all 'long long' members of structs may cause problem when 
>   cross interpreted by a ARM crash. 
> 
> Now AFAICT, I believe that the only "cross interpreted" items that would 
> come into play would be the kdump_sub_header:
> 
> struct kdump_sub_header {
>         unsigned long   phys_base;
>         int             dump_level;         /* header_version 1 and later */
>         int             split;              /* header_version 2 and later */
>         unsigned long   start_pfn;          /* header_version 2 and later */
>         unsigned long   end_pfn;            /* header_version 2 and later */
>         off_t           offset_vmcoreinfo;  /* header_version 3 and later */
>         unsigned long   size_vmcoreinfo;    /* header_version 3 and later */
>         off_t           offset_note;        /* header_version 4 and later */
>         unsigned long   size_note;          /* header_version 4 and later */
>         off_t           offset_eraseinfo;   /* header_version 5 and later */
>         unsigned long   size_eraseinfo;     /* header_version 5 and later */
> };
> 
> The header is originally created on the crashing ARM host, and written
> by an ARM makedumpfile binary into the dumpfile header.  But when crash
> is build on an x86/x86_64 host with "make target=ARM", but resultant
> binary is a 32-bit x86 binary:
> 
> $ make target=ARM
> ...
> $ file crash
> crash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x0459d34779357928839cd4d05f04517a441dc555, not stripped
> 
> And when compiled as an x86 binary, the structure's offsets would be:
> 
> struct kdump_sub_header {
> [0]     unsigned long   phys_base;
> [4]     int             dump_level;         /* header_version 1 and later */
> [8]     int             split;              /* header_version 2 and later */
> [12]    unsigned long   start_pfn;          /* header_version 2 and later */
> [16]    unsigned long   end_pfn;            /* header_version 2 and later */
> [20]    off_t           offset_vmcoreinfo;  /* header_version 3 and later */
> [28]    unsigned long   size_vmcoreinfo;    /* header_version 3 and later */
> [32]    off_t           offset_note;        /* header_version 4 and later */
> [40]    unsigned long   size_note;          /* header_version 4 and later */
> [44]    off_t           offset_eraseinfo;   /* header_version 5 and later */
> [52]    unsigned long   size_eraseinfo;     /* header_version 5 and later */
> };
> 
> But when compiled on an ARM processor, each 64-bit "off_t" would be pushed
> up to an 8-byte boundary:
> 
> struct kdump_sub_header {
> [0]     unsigned long   phys_base;
> [4]     int             dump_level;         /* header_version 1 and later */
> [8]     int             split;              /* header_version 2 and later */
> [12]    unsigned long   start_pfn;          /* header_version 2 and later */
> [16]    unsigned long   end_pfn;            /* header_version 2 and later */
> [24]    off_t           offset_vmcoreinfo;  /* header_version 3 and later */
> [32]    unsigned long   size_vmcoreinfo;    /* header_version 3 and later */
> [40]    off_t           offset_note;        /* header_version 4 and later */
> [48]    unsigned long   size_note;          /* header_version 4 and later */
> [56]    off_t           offset_eraseinfo;   /* header_version 5 and later */
> [62]    unsigned long   size_eraseinfo;     /* header_version 5 and later */
> };

It just occured to me that we compile makedumpfile for ARM with following
flags:

	-D_FILE_OFFSET_BITS=64
	-D_LARGEFILE_SOURCE
	-D_LARGEFILE64_SOURCE

and looks like crash doesn't have such flags set. Do you think setting those
might help here?




More information about the Crash-utility mailing list