125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Common core note type descriptions for Linux.
225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Copyright (C) 2007-2010 Red Hat, Inc.
303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   This file is part of elfutils.
425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   This file is free software; you can redistribute it and/or modify
603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   it under the terms of either
725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes     * the GNU Lesser General Public License as published by the Free
903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       Software Foundation; either version 3 of the License, or (at
1003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       your option) any later version
1103333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
1203333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   or
1303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
1403333823c75a1c1887e923828113a1b0fd12020cElliott Hughes     * the GNU General Public License as published by the Free
1503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       Software Foundation; either version 2 of the License, or (at
1603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       your option) any later version
1703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
1803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   or both in parallel, as here.
1903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
2003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   elfutils is distributed in the hope that it will be useful, but
2125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   General Public License for more details.
2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
2503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   You should have received copies of the GNU General Public License and
2603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   the GNU Lesser General Public License along with this program.  If
2703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   not, see <http://www.gnu.org/licenses/>.  */
2825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <string.h>
3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* The including CPU_corenote.c file provides prstatus_regs and
3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   defines macros ULONG, [PUG]ID_T, and ALIGN_*, TYPE_*.
3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Here we describe the common layout used in <linux/elfcore.h>.  */
3525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define	CHAR			int8_t
3725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define	ALIGN_CHAR		1
3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define	TYPE_CHAR		ELF_T_BYTE
3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define	SHORT			uint16_t
4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define ALIGN_SHORT		2
4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define TYPE_SHORT		ELF_T_HALF
4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define	INT			int32_t
4325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define ALIGN_INT		4
4425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define TYPE_INT		ELF_T_SWORD
4503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes#ifndef ALIGN_PR_REG
4603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes# define ALIGN_PR_REG		ALIGN_ULONG
4703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes#endif
4825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define FIELD(type, name) type name __attribute__ ((aligned (ALIGN_##type)))
5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5125b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct EBLHOOK(siginfo)
5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (INT, si_signo);
5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (INT, si_code);
5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (INT, si_errno);
5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng};
5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5825b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct EBLHOOK(timeval)
5925b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (ULONG, tv_sec);
6125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (ULONG, tv_usec);
6225b3c049e70834cf33790a28643ab058b507b35cBen Cheng};
6325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* On sparc64, tv_usec (suseconds_t) is actually 32 bits with 32 bits padding.
6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   The 'T'|0x80 value for .format indicates this as a special kludge.  */
6625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#if SUSECONDS_HALF
6725b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define TIMEVAL_FIELD(name)	FIELD (time, ULONG, name, 'T'|0x80, .count = 2)
6825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#else
6925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define TIMEVAL_FIELD(name)	FIELD (time, ULONG, name, 'T', .count = 2)
7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
7125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7325b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct EBLHOOK(prstatus)
7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
7525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  struct EBLHOOK(siginfo) pr_info;
7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (SHORT, pr_cursig);
7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (ULONG, pr_sigpend);
7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (ULONG, pr_sighold);
7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (PID_T, pr_pid);
8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (PID_T, pr_ppid);
8125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (PID_T, pr_pgrp);
8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (PID_T, pr_sid);
8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  struct EBLHOOK(timeval) pr_utime;
8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  struct EBLHOOK(timeval) pr_stime;
8525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  struct EBLHOOK(timeval) pr_cutime;
8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  struct EBLHOOK(timeval) pr_cstime;
8703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes  struct
8803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes  {
8903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes    FIELD (ULONG, pr_reg[PRSTATUS_REGS_SIZE / sizeof (ULONG)]);
9003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes  }
9103333823c75a1c1887e923828113a1b0fd12020cElliott Hughes#ifdef ALIGN_PR_REG
9203333823c75a1c1887e923828113a1b0fd12020cElliott Hughes    __attribute__ ((aligned (ALIGN_PR_REG)))
9303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes#endif
9403333823c75a1c1887e923828113a1b0fd12020cElliott Hughes    ;
9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (INT, pr_fpvalid);
9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng};
9725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define	FNAMESZ	16
9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define	PRARGSZ	80
10025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
10125b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct EBLHOOK(prpsinfo)
10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (CHAR, pr_state);
10425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (CHAR, pr_sname);
10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (CHAR, pr_zomb);
10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (CHAR, pr_nice);
10725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (ULONG, pr_flag);
10825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (UID_T, pr_uid);
10925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (GID_T, pr_gid);
11025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (PID_T, pr_pid);
11125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (PID_T, pr_ppid);
11225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (PID_T, pr_pgrp);
11325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (PID_T, pr_sid);
11425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (CHAR, pr_fname[FNAMESZ]);
11525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  FIELD (CHAR, pr_psargs[PRARGSZ]);
11625b3c049e70834cf33790a28643ab058b507b35cBen Cheng};
11725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
11825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef	FIELD
11925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
12025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define FIELD(igroup, itype, item, fmt, ...)			\
12125b3c049e70834cf33790a28643ab058b507b35cBen Cheng    {								\
12225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      .name = #item,						\
12325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      .group = #igroup,					\
12425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      .offset = offsetof (struct EBLHOOK(prstatus), pr_##item),	\
12525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      .type = TYPE_##itype,					\
12625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      .format = fmt,						\
12725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      __VA_ARGS__						\
12825b3c049e70834cf33790a28643ab058b507b35cBen Cheng    }
12925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
13025b3c049e70834cf33790a28643ab058b507b35cBen Chengstatic const Ebl_Core_Item prstatus_items[] =
13125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  {
13225b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (signal, INT, info.si_signo, 'd'),
13325b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (signal, INT, info.si_code, 'd'),
13425b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (signal, INT, info.si_errno, 'd'),
13525b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (signal, SHORT, cursig, 'd'),
13603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
13703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes    /* Use different group name for a newline delimiter.  */
13803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes    FIELD (signal2, ULONG, sigpend, 'B'),
13903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes    FIELD (signal3, ULONG, sighold, 'B'),
14025b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (identity, PID_T, pid, 'd', .thread_identifier = true),
14125b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (identity, PID_T, ppid, 'd'),
14225b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (identity, PID_T, pgrp, 'd'),
14325b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (identity, PID_T, sid, 'd'),
14425b3c049e70834cf33790a28643ab058b507b35cBen Cheng    TIMEVAL_FIELD (utime),
14525b3c049e70834cf33790a28643ab058b507b35cBen Cheng    TIMEVAL_FIELD (stime),
14625b3c049e70834cf33790a28643ab058b507b35cBen Cheng    TIMEVAL_FIELD (cutime),
14725b3c049e70834cf33790a28643ab058b507b35cBen Cheng    TIMEVAL_FIELD (cstime),
14825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef PRSTATUS_REGSET_ITEMS
14925b3c049e70834cf33790a28643ab058b507b35cBen Cheng    PRSTATUS_REGSET_ITEMS,
15025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
15125b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (register, INT, fpvalid, 'd'),
15225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  };
15325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
15425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef	FIELD
15525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
15625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define FIELD(igroup, itype, item, fmt, ...)			\
15725b3c049e70834cf33790a28643ab058b507b35cBen Cheng    {								\
15825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      .name = #item,						\
15925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      .group = #igroup,					\
16025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      .offset = offsetof (struct EBLHOOK(prpsinfo), pr_##item),	\
16125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      .type = TYPE_##itype,					\
16225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      .format = fmt,						\
16325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      __VA_ARGS__						\
16425b3c049e70834cf33790a28643ab058b507b35cBen Cheng    }
16525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
16625b3c049e70834cf33790a28643ab058b507b35cBen Chengstatic const Ebl_Core_Item prpsinfo_items[] =
16725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  {
16825b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (state, CHAR, state, 'd'),
16925b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (state, CHAR, sname, 'c'),
17025b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (state, CHAR, zomb, 'd'),
17125b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (state, CHAR, nice, 'd'),
17225b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (state, ULONG, flag, 'x'),
17325b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (identity, UID_T, uid, 'd'),
17425b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (identity, GID_T, gid, 'd'),
17525b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (identity, PID_T, pid, 'd'),
17625b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (identity, PID_T, ppid, 'd'),
17725b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (identity, PID_T, pgrp, 'd'),
17825b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (identity, PID_T, sid, 'd'),
17925b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (command, CHAR, fname, 's', .count = FNAMESZ),
18025b3c049e70834cf33790a28643ab058b507b35cBen Cheng    FIELD (command, CHAR, psargs, 's', .count = PRARGSZ),
18125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  };
18225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
18325b3c049e70834cf33790a28643ab058b507b35cBen Chengstatic const Ebl_Core_Item vmcoreinfo_items[] =
18425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  {
18525b3c049e70834cf33790a28643ab058b507b35cBen Cheng    {
18625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      .type = ELF_T_BYTE, .format = '\n'
18725b3c049e70834cf33790a28643ab058b507b35cBen Cheng    }
18825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  };
18925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
19025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef	FIELD
19125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
19225b3c049e70834cf33790a28643ab058b507b35cBen Chengint
19325b3c049e70834cf33790a28643ab058b507b35cBen ChengEBLHOOK(core_note) (nhdr, name, regs_offset, nregloc, reglocs, nitems, items)
19425b3c049e70834cf33790a28643ab058b507b35cBen Cheng     const GElf_Nhdr *nhdr;
19525b3c049e70834cf33790a28643ab058b507b35cBen Cheng     const char *name;
19625b3c049e70834cf33790a28643ab058b507b35cBen Cheng     GElf_Word *regs_offset;
19725b3c049e70834cf33790a28643ab058b507b35cBen Cheng     size_t *nregloc;
19825b3c049e70834cf33790a28643ab058b507b35cBen Cheng     const Ebl_Register_Location **reglocs;
19925b3c049e70834cf33790a28643ab058b507b35cBen Cheng     size_t *nitems;
20025b3c049e70834cf33790a28643ab058b507b35cBen Cheng     const Ebl_Core_Item **items;
20125b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
20225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  switch (nhdr->n_namesz)
20325b3c049e70834cf33790a28643ab058b507b35cBen Cheng    {
20425b3c049e70834cf33790a28643ab058b507b35cBen Cheng    case sizeof "CORE" - 1:	/* Buggy old Linux kernels.  */
20525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if (memcmp (name, "CORE", nhdr->n_namesz) == 0)
20625b3c049e70834cf33790a28643ab058b507b35cBen Cheng	break;
20725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      return 0;
20825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
20925b3c049e70834cf33790a28643ab058b507b35cBen Cheng    case sizeof "CORE":
21025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if (memcmp (name, "CORE", nhdr->n_namesz) == 0)
21125b3c049e70834cf33790a28643ab058b507b35cBen Cheng	break;
21225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      /* Buggy old Linux kernels didn't terminate "LINUX".
21325b3c049e70834cf33790a28643ab058b507b35cBen Cheng         Fall through.  */
21425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
21525b3c049e70834cf33790a28643ab058b507b35cBen Cheng    case sizeof "LINUX":
21625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if (memcmp (name, "LINUX", nhdr->n_namesz) == 0)
21725b3c049e70834cf33790a28643ab058b507b35cBen Cheng	break;
21825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      return 0;
21925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
22025b3c049e70834cf33790a28643ab058b507b35cBen Cheng    case sizeof "VMCOREINFO":
22125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if (nhdr->n_type != 0
22225b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  || memcmp (name, "VMCOREINFO", sizeof "VMCOREINFO") != 0)
22325b3c049e70834cf33790a28643ab058b507b35cBen Cheng	return 0;
22425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *regs_offset = 0;
22525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *nregloc = 0;
22625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *nitems = 1;
22725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *items = vmcoreinfo_items;
22825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      return 1;
22925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
23025b3c049e70834cf33790a28643ab058b507b35cBen Cheng    default:
23125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      return 0;
23225b3c049e70834cf33790a28643ab058b507b35cBen Cheng    }
23325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
23425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  switch (nhdr->n_type)
23525b3c049e70834cf33790a28643ab058b507b35cBen Cheng    {
23625b3c049e70834cf33790a28643ab058b507b35cBen Cheng    case NT_PRSTATUS:
23725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if (nhdr->n_descsz != sizeof (struct EBLHOOK(prstatus)))
23825b3c049e70834cf33790a28643ab058b507b35cBen Cheng	return 0;
23925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *regs_offset = offsetof (struct EBLHOOK(prstatus), pr_reg);
24025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *nregloc = sizeof prstatus_regs / sizeof prstatus_regs[0];
24125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *reglocs = prstatus_regs;
24225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *nitems = sizeof prstatus_items / sizeof prstatus_items[0];
24325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *items = prstatus_items;
24425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      return 1;
24525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
24625b3c049e70834cf33790a28643ab058b507b35cBen Cheng    case NT_PRPSINFO:
24725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if (nhdr->n_descsz != sizeof (struct EBLHOOK(prpsinfo)))
24825b3c049e70834cf33790a28643ab058b507b35cBen Cheng	return 0;
24925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *regs_offset = 0;
25025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *nregloc = 0;
25125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *reglocs = NULL;
25225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *nitems = sizeof prpsinfo_items / sizeof prpsinfo_items[0];
25325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *items = prpsinfo_items;
25425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      return 1;
25525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
25625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define EXTRA_REGSET(type, size, table)					      \
25725b3c049e70834cf33790a28643ab058b507b35cBen Cheng    case type:								      \
25825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if (nhdr->n_descsz != size)					      \
25925b3c049e70834cf33790a28643ab058b507b35cBen Cheng	return 0;							      \
26025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *regs_offset = 0;							      \
26125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *nregloc = sizeof table / sizeof table[0];			      \
26225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *reglocs = table;							      \
26325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *nitems = 0;							      \
26425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      *items = NULL;							      \
26525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      return 1;
26625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
26703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes#define EXTRA_REGSET_ITEMS(type, size, table, extra_items)		      \
26803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes    case type:								      \
26903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      if (nhdr->n_descsz != size)					      \
27003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes	return 0;							      \
27103333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      *regs_offset = 0;							      \
27203333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      *nregloc = sizeof table / sizeof table[0];			      \
27303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      *reglocs = table;							      \
27403333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      *nitems = sizeof extra_items / sizeof extra_items[0];		      \
27503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      *items = extra_items;						      \
27603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      return 1;
27703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
27803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes#define EXTRA_ITEMS(type, size, extra_items)				      \
27903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes    case type:								      \
28003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      if (nhdr->n_descsz != size)					      \
28103333823c75a1c1887e923828113a1b0fd12020cElliott Hughes	return 0;							      \
28203333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      *regs_offset = 0;							      \
28303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      *nregloc = 0;							      \
28403333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      *reglocs = NULL;							      \
28503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      *nitems = sizeof extra_items / sizeof extra_items[0];		      \
28603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      *items = extra_items;						      \
28703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes      return 1;
28803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
28925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef FPREGSET_SIZE
29025b3c049e70834cf33790a28643ab058b507b35cBen Cheng    EXTRA_REGSET (NT_FPREGSET, FPREGSET_SIZE, fpregset_regs)
29125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
29225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
29325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef EXTRA_NOTES
29425b3c049e70834cf33790a28643ab058b507b35cBen Cheng    EXTRA_NOTES
29525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
29625b3c049e70834cf33790a28643ab058b507b35cBen Cheng    }
29725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
29825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  return 0;
29925b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
300