[Crash-utility] crash gcore command, version 1.3.0-rc is released

HATAYAMA Daisuke d.hatayama at jp.fujitsu.com
Thu Oct 16 01:07:49 UTC 2014


From: Wei Shu <weishu at marvell.com>
Subject: RE: [Crash-utility] crash gcore command, version 1.3.0-rc is released
Date: Wed, 15 Oct 2014 02:55:43 -0700

> From 623038a48cded0d2b5ad804c78b92d6b7d979cac Mon Sep 17 00:00:00 2001
> From: Lei Wen <leiwen at marvell.com>
> Date: Mon, 28 Jul 2014 10:12:57 +0800
> Subject: [PATCH 1/4] gcore: fix build for arm64
> 

Could you write more patch description? At least I don't know arm
things. Please explain what this patch does in more detail.

> Change-Id: Ic075720ea7a0d3523cdde616772b3d75dd90f7ae
> Signed-off-by: Lei Wen <leiwen at marvell.com>
> ---
>  extensions/libgcore/gcore_arm64.c    |    4 +--
>  extensions/libgcore/gcore_coredump.c |    5 ---
>  extensions/libgcore/gcore_defs.h     |   58 +++++++++++++++++++++++++++-------
>  3 files changed, 49 insertions(+), 18 deletions(-)
> 
> diff --git a/extensions/libgcore/gcore_arm64.c b/extensions/libgcore/gcore_arm64.c
> index 8ea1994..5f05dd9 100644
> --- a/extensions/libgcore/gcore_arm64.c
> +++ b/extensions/libgcore/gcore_arm64.c
> @@ -24,12 +24,12 @@ static int gpr_get(struct task_context *target,
>  		   const struct user_regset *regset,
>  		   unsigned int size, void *buf)
>  {
> -	struct user_pt_regs *regs = (struct user_pt_regs *)buf;
> +	struct user_regs_struct *regs = (struct user_regs_struct *)buf;
>  
>  	BZERO(regs, sizeof(*regs));
>  
>  	readmem(machdep->get_stacktop(target->task) - 16 - SIZE(pt_regs), KVADDR,
> -		regs, sizeof(struct user_pt_regs), "gpr_get: user_pt_regs",
> +		regs, sizeof(struct user_regs_struct), "gpr_get: user_regs_struct",
>  		gcore_verbose_error_handle());
>  
>  	return 0;
> diff --git a/extensions/libgcore/gcore_coredump.c b/extensions/libgcore/gcore_coredump.c
> index fe6b46e..19156d0 100644
> --- a/extensions/libgcore/gcore_coredump.c
> +++ b/extensions/libgcore/gcore_coredump.c
> @@ -682,12 +682,7 @@ fill_prstatus_note(struct elf_note_info *info, struct task_context *tc,
>  		   struct memelfnote *memnote)
>  {
>  	struct elf_prstatus dummy, *prstatus = (struct elf_prstatus *)memnote->data;
> -#if defined(X86) || defined(X86_64) || defined(ARM)
>  	struct user_regs_struct *regs = (struct user_regs_struct *)memnote->data;
> -#endif
> -#ifdef ARM64
> -	struct user_pt_regs *regs = (struct user_pt_regs *)memnote->data;
> -#endif
>  	ulong pending_signal_sig0, blocked_sig0, real_parent, group_leader,
>  		signal, cutime,	cstime;
>  
> diff --git a/extensions/libgcore/gcore_defs.h b/extensions/libgcore/gcore_defs.h
> index a34ff98..ba7c1bd 100644
> --- a/extensions/libgcore/gcore_defs.h
> +++ b/extensions/libgcore/gcore_defs.h
> @@ -486,10 +486,54 @@ struct user_regs_struct{
>  #define ARM_VFPREGS_SIZE ( 32 * 8 /*fpregs*/ + 4 /*fpscr*/ )
>  #endif
>  
> +#ifdef ARM64
> +struct user_fpsimd_state {
> +	__uint128_t     vregs[32];
> +	uint32_t	fpsr;
> +	uint32_t	fpcr;
> +};
> +
> +struct user_regs_struct{
> +	unsigned long x0;
> +	unsigned long x1;
> +	unsigned long x2;
> +	unsigned long x3;
> +	unsigned long x4;
> +	unsigned long x5;
> +	unsigned long x6;
> +	unsigned long x7;
> +	unsigned long x8;
> +	unsigned long x9;
> +	unsigned long x10;
> +	unsigned long x11;
> +	unsigned long x12;
> +	unsigned long x13;
> +	unsigned long x14;
> +	unsigned long x15;
> +	unsigned long x16;
> +	unsigned long x17;
> +	unsigned long x18;
> +	unsigned long x19;
> +	unsigned long x20;
> +	unsigned long x21;
> +	unsigned long x22;
> +	unsigned long x23;
> +	unsigned long x24;
> +	unsigned long x25;
> +	unsigned long x26;
> +	unsigned long x27;
> +	unsigned long x28;
> +	unsigned long x29;
> +	unsigned long x30;
> +	unsigned long x31;
> +	unsigned long pc;
> +	unsigned long cpsr;
> +};

Where does this data structure come? It looks to me that the following
is used as NT_PRSTATUS at kernel ARM64 source code and current gcore
ARM64 source by Dave:

struct user_pt_regs {
        __u64           regs[31];
        __u64           sp;
        __u64           pc;
        __u64           pstate;
};

The binary layout is identical to the above structure but member names
are slightly differnet; in particular, cpsr v.s. pstate.

I think it better to use kernel's data structure for maintainance
purpose.

> +
> +#endif
> +
>  typedef ulong elf_greg_t;
> -#if defined(X86) || defined(X86_64) || defined(ARM)
>  #define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
> -#endif
>  typedef elf_greg_t elf_gregset_t[ELF_NGREG];
>  
>  #if defined(X86) || defined(ARM)
> @@ -534,14 +578,12 @@ enum pid_type
>          PIDTYPE_MAX
>  };
>  
> -#if defined(X86) || defined(X86_64) || defined(ARM)
>  struct elf_siginfo
>  {
>          int     si_signo;                       /* signal number */
>  	int     si_code;                        /* extra code */
>          int     si_errno;                       /* errno */
>  };
> -#endif
>  
>  /* Parameters used to convert the timespec values: */
>  #define NSEC_PER_USEC   1000L
> @@ -633,7 +675,6 @@ cputime_to_compat_timeval(const cputime_t cputime,
>  }
>  #endif
>  
> -#if defined(X86) || defined(X86_64) || defined(ARM)
>  struct elf_prstatus
>  {
>  	struct elf_siginfo pr_info;	/* Info associated with signal */
> @@ -651,17 +692,14 @@ struct elf_prstatus
>  	elf_gregset_t pr_reg;	/* GP registers */
>  	int pr_fpvalid;		/* True if math co-processor being used.  */
>  };
> -#endif
>  
> -#if defined(X86) || defined(X86_64) || defined(ARM)
>  typedef unsigned short __kernel_old_uid_t;
>  typedef unsigned short __kernel_old_gid_t;
> -#endif
>  
>  typedef __kernel_old_uid_t      old_uid_t;
>  typedef __kernel_old_gid_t      old_gid_t;
>  
> -#ifdef X86_64
> +#if defined(X86_64) || defined(ARM64)
>  typedef unsigned int __kernel_uid_t;
>  typedef unsigned int __kernel_gid_t;
>  #endif
> @@ -724,7 +762,6 @@ static inline ulong ffz(ulong word)
>  
>  #define ELF_PRARGSZ     (80)    /* Number of chars for args */
>  
> -#if defined(X86) || defined(X86_64) || defined(ARM)
>  struct elf_prpsinfo
>  {
>          char    pr_state;       /* numeric process state */
> @@ -739,7 +776,6 @@ struct elf_prpsinfo
>          char    pr_fname[16];   /* filename of executable */
>          char    pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
>  };
> -#endif
>  
>  #ifdef GCORE_ARCH_COMPAT
>  
> -- 
> 1.7.9.5
> 
--
Thanks.
HATAYAMA, Daisuke




More information about the Crash-utility mailing list