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