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