From: Dave Anderson <anderson(a)redhat.com>
Subject: [PATCH] crash-gcore-command extension module: ARM64 support
Date: Thu, 17 Jul 2014 12:04:45 -0400
Hello Daisuke,
Hello Dave,
Sorry for very late responce....
Attached is a patch to introduce support for the ARM64 architecture
for the gcore extension module.
The patch is fairly straight-forward other than the fact that on
ARM64 machines, the chain of headers included from the crash utility's
"defs.h" looks like this:
/usr/include/crash/defs.h
/usr/include/signal.h
/usr/include/sys/ucontext.h
/usr/include/sys/procfs.h
The <sys/procfs.h> file defines several of the ELF-related structures that
are hard-coded in gcore_defs.h, causing compile failures due to duplicate
structure declarations.
Note that the <sys/ucontext.h> file on the other three architectures does
not #include <sys/procfs.h> so there are no conflicts. It would be possible
to move all architectures to include <sys/procfs.h>, but for example, that
would also bring in the <sys/user.h> definition of the user_regs_struct,
which in turn causes a myriad of register name mismatches in gcore_x86.c.
So for the sake of simplicity, wherever there is an ARM64-only duplicate
structure or definition in gcore_defs.h, I've encapsulated them by:
#if defined(X86) || defined(X86_64) || defined(ARM)
Thanks for this explanation. I'll also try to investigate this.
Also, there are two generic fixes, one where the gcore module fails
on
Linux 3.11 and later kernels due to a structure member name change,
and another that changes the getopt() return variable to an "int" instead
of a "char".
Here are the details:
gcore.mk:
- Introduce ARM64 as a supported architecture
- Add libgcore/gcore_arm64 to GCORE_CFILES
gcore.c:
- In cmd_gcore() change "c" type to "int" to correctly match
the return type of getopt(); without it, the while loop
spins indefinitely on ARM64.
- In gcore_offset_table_init(), account for the Linux 3.11
structure member name-change from ns_proxy.pid_ns to
ns_proxy.pid_ns_for_children; without it, the gcore command
fails during initialization.
I've already dealt with this locally, but thanks.
libgcore/gcore_defs.h:
- Add ARM64 ELF- and REGSET_VIEW-related #defines required for
each architecture.
- Account for variable page sizes in ARM64.
- Restrict the hard-coded ELF_NGREG, elf_siginfo, elf_prstatus,
__kernel_old_uid_t and __kernel_old_gid_t, and elf_prsinfo
definitions to X86, X86_64 and ARM architectures.
- Add ARM64 thread_struct_fpsmid_state and thread_struct_tp_value
offsets to gcore_offset_table.
libgcore/gcore_coredump.c:
- In fill_prstatus_note(), account for the ARM64 usage of
"user_pt_regs" structure instead of the "user_regs_struct"
used by the other architectures.
libgcore/gcore_arm64.c:
- Implement ARM64-specific user_regset and user_regset_view
structures and all required support functions.
Please accept these changes into an new package version.
I'll commit these into my local repository with some changes for ease
of my maintainance purpose. Maybe, I'll ask you to review the changed
version.
--
Thanks.
HATAYAMA, Daisuke