xref: /aosp_15_r20/external/elfutils/backends/linux-core-note.c (revision 7304104da70ce23c86437a01be71edd1a2d7f37e)
1*7304104dSAndroid Build Coastguard Worker /* Common core note type descriptions for Linux.
2*7304104dSAndroid Build Coastguard Worker    Copyright (C) 2007-2010 Red Hat, Inc.
3*7304104dSAndroid Build Coastguard Worker    Copyright (C) H.J. Lu <[email protected]>, 2015.
4*7304104dSAndroid Build Coastguard Worker    This file is part of elfutils.
5*7304104dSAndroid Build Coastguard Worker 
6*7304104dSAndroid Build Coastguard Worker    This file is free software; you can redistribute it and/or modify
7*7304104dSAndroid Build Coastguard Worker    it under the terms of either
8*7304104dSAndroid Build Coastguard Worker 
9*7304104dSAndroid Build Coastguard Worker      * the GNU Lesser General Public License as published by the Free
10*7304104dSAndroid Build Coastguard Worker        Software Foundation; either version 3 of the License, or (at
11*7304104dSAndroid Build Coastguard Worker        your option) any later version
12*7304104dSAndroid Build Coastguard Worker 
13*7304104dSAndroid Build Coastguard Worker    or
14*7304104dSAndroid Build Coastguard Worker 
15*7304104dSAndroid Build Coastguard Worker      * the GNU General Public License as published by the Free
16*7304104dSAndroid Build Coastguard Worker        Software Foundation; either version 2 of the License, or (at
17*7304104dSAndroid Build Coastguard Worker        your option) any later version
18*7304104dSAndroid Build Coastguard Worker 
19*7304104dSAndroid Build Coastguard Worker    or both in parallel, as here.
20*7304104dSAndroid Build Coastguard Worker 
21*7304104dSAndroid Build Coastguard Worker    elfutils is distributed in the hope that it will be useful, but
22*7304104dSAndroid Build Coastguard Worker    WITHOUT ANY WARRANTY; without even the implied warranty of
23*7304104dSAndroid Build Coastguard Worker    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24*7304104dSAndroid Build Coastguard Worker    General Public License for more details.
25*7304104dSAndroid Build Coastguard Worker 
26*7304104dSAndroid Build Coastguard Worker    You should have received copies of the GNU General Public License and
27*7304104dSAndroid Build Coastguard Worker    the GNU Lesser General Public License along with this program.  If
28*7304104dSAndroid Build Coastguard Worker    not, see <http://www.gnu.org/licenses/>.  */
29*7304104dSAndroid Build Coastguard Worker 
30*7304104dSAndroid Build Coastguard Worker #include <string.h>
31*7304104dSAndroid Build Coastguard Worker 
32*7304104dSAndroid Build Coastguard Worker /* The including CPU_corenote.c file provides prstatus_regs and
33*7304104dSAndroid Build Coastguard Worker    defines macros ULONG, [PUG]ID_T, and ALIGN_*, TYPE_*.
34*7304104dSAndroid Build Coastguard Worker 
35*7304104dSAndroid Build Coastguard Worker    Here we describe the common layout used in <linux/elfcore.h>.  */
36*7304104dSAndroid Build Coastguard Worker 
37*7304104dSAndroid Build Coastguard Worker #define	CHAR			int8_t
38*7304104dSAndroid Build Coastguard Worker #define	ALIGN_CHAR		1
39*7304104dSAndroid Build Coastguard Worker #define	TYPE_CHAR		ELF_T_BYTE
40*7304104dSAndroid Build Coastguard Worker #define	SHORT			uint16_t
41*7304104dSAndroid Build Coastguard Worker #define ALIGN_SHORT		2
42*7304104dSAndroid Build Coastguard Worker #define TYPE_SHORT		ELF_T_HALF
43*7304104dSAndroid Build Coastguard Worker #define	INT			int32_t
44*7304104dSAndroid Build Coastguard Worker #ifndef ALIGN_INT
45*7304104dSAndroid Build Coastguard Worker # define ALIGN_INT		4
46*7304104dSAndroid Build Coastguard Worker #endif
47*7304104dSAndroid Build Coastguard Worker #define TYPE_INT		ELF_T_SWORD
48*7304104dSAndroid Build Coastguard Worker #ifndef PR_REG
49*7304104dSAndroid Build Coastguard Worker # define PR_REG			ULONG
50*7304104dSAndroid Build Coastguard Worker #endif
51*7304104dSAndroid Build Coastguard Worker #ifndef ALIGN_PR_REG
52*7304104dSAndroid Build Coastguard Worker # define ALIGN_PR_REG		ALIGN_ULONG
53*7304104dSAndroid Build Coastguard Worker #endif
54*7304104dSAndroid Build Coastguard Worker #ifndef PRPSINFO_UID_T
55*7304104dSAndroid Build Coastguard Worker # define PRPSINFO_UID_T		UID_T
56*7304104dSAndroid Build Coastguard Worker # define ALIGN_PRPSINFO_UID_T	ALIGN_UID_T
57*7304104dSAndroid Build Coastguard Worker # define TYPE_PRPSINFO_UID_T	TYPE_UID_T
58*7304104dSAndroid Build Coastguard Worker #endif
59*7304104dSAndroid Build Coastguard Worker #ifndef PRPSINFO_GID_T
60*7304104dSAndroid Build Coastguard Worker # define PRPSINFO_GID_T		GID_T
61*7304104dSAndroid Build Coastguard Worker # define ALIGN_PRPSINFO_GID_T	ALIGN_GID_T
62*7304104dSAndroid Build Coastguard Worker # define TYPE_PRPSINFO_GID_T	TYPE_GID_T
63*7304104dSAndroid Build Coastguard Worker #endif
64*7304104dSAndroid Build Coastguard Worker 
65*7304104dSAndroid Build Coastguard Worker #define FIELD(type, name) type name __attribute__ ((aligned (ALIGN_##type)))
66*7304104dSAndroid Build Coastguard Worker 
EBLHOOK(siginfo)67*7304104dSAndroid Build Coastguard Worker struct EBLHOOK(siginfo)
68*7304104dSAndroid Build Coastguard Worker {
69*7304104dSAndroid Build Coastguard Worker   FIELD (INT, si_signo);
70*7304104dSAndroid Build Coastguard Worker   FIELD (INT, si_code);
71*7304104dSAndroid Build Coastguard Worker   FIELD (INT, si_errno);
72*7304104dSAndroid Build Coastguard Worker };
73*7304104dSAndroid Build Coastguard Worker 
EBLHOOK(timeval)74*7304104dSAndroid Build Coastguard Worker struct EBLHOOK(timeval)
75*7304104dSAndroid Build Coastguard Worker {
76*7304104dSAndroid Build Coastguard Worker   FIELD (ULONG, tv_sec);
77*7304104dSAndroid Build Coastguard Worker   FIELD (ULONG, tv_usec);
78*7304104dSAndroid Build Coastguard Worker };
79*7304104dSAndroid Build Coastguard Worker 
80*7304104dSAndroid Build Coastguard Worker /* On sparc64, tv_usec (suseconds_t) is actually 32 bits with 32 bits padding.
81*7304104dSAndroid Build Coastguard Worker    The 'T'|0x80 value for .format indicates this as a special kludge.  */
82*7304104dSAndroid Build Coastguard Worker #if SUSECONDS_HALF
83*7304104dSAndroid Build Coastguard Worker # define TIMEVAL_FIELD(name)	FIELD (time, ULONG, name, 'T'|0x80, .count = 2)
84*7304104dSAndroid Build Coastguard Worker #else
85*7304104dSAndroid Build Coastguard Worker # define TIMEVAL_FIELD(name)	FIELD (time, ULONG, name, 'T', .count = 2)
86*7304104dSAndroid Build Coastguard Worker #endif
87*7304104dSAndroid Build Coastguard Worker 
88*7304104dSAndroid Build Coastguard Worker 
EBLHOOK(prstatus)89*7304104dSAndroid Build Coastguard Worker struct EBLHOOK(prstatus)
90*7304104dSAndroid Build Coastguard Worker {
91*7304104dSAndroid Build Coastguard Worker   struct EBLHOOK(siginfo) pr_info;
92*7304104dSAndroid Build Coastguard Worker   FIELD (SHORT, pr_cursig);
93*7304104dSAndroid Build Coastguard Worker   FIELD (ULONG, pr_sigpend);
94*7304104dSAndroid Build Coastguard Worker   FIELD (ULONG, pr_sighold);
95*7304104dSAndroid Build Coastguard Worker   FIELD (PID_T, pr_pid);
96*7304104dSAndroid Build Coastguard Worker   FIELD (PID_T, pr_ppid);
97*7304104dSAndroid Build Coastguard Worker   FIELD (PID_T, pr_pgrp);
98*7304104dSAndroid Build Coastguard Worker   FIELD (PID_T, pr_sid);
99*7304104dSAndroid Build Coastguard Worker   struct EBLHOOK(timeval) pr_utime;
100*7304104dSAndroid Build Coastguard Worker   struct EBLHOOK(timeval) pr_stime;
101*7304104dSAndroid Build Coastguard Worker   struct EBLHOOK(timeval) pr_cutime;
102*7304104dSAndroid Build Coastguard Worker   struct EBLHOOK(timeval) pr_cstime;
103*7304104dSAndroid Build Coastguard Worker   struct
104*7304104dSAndroid Build Coastguard Worker   {
105*7304104dSAndroid Build Coastguard Worker     FIELD (PR_REG, pr_reg[PRSTATUS_REGS_SIZE / sizeof (PR_REG)]);
106*7304104dSAndroid Build Coastguard Worker   }
107*7304104dSAndroid Build Coastguard Worker #ifdef ALIGN_PR_REG
108*7304104dSAndroid Build Coastguard Worker     __attribute__ ((aligned (ALIGN_PR_REG)))
109*7304104dSAndroid Build Coastguard Worker #endif
110*7304104dSAndroid Build Coastguard Worker     ;
111*7304104dSAndroid Build Coastguard Worker   FIELD (INT, pr_fpvalid);
112*7304104dSAndroid Build Coastguard Worker }
113*7304104dSAndroid Build Coastguard Worker #ifdef ALIGN_PRSTATUS
114*7304104dSAndroid Build Coastguard Worker   attribute_packed __attribute__ ((aligned (ALIGN_PRSTATUS)))
115*7304104dSAndroid Build Coastguard Worker #endif
116*7304104dSAndroid Build Coastguard Worker ;
117*7304104dSAndroid Build Coastguard Worker 
118*7304104dSAndroid Build Coastguard Worker #define	FNAMESZ	16
119*7304104dSAndroid Build Coastguard Worker #define	PRARGSZ	80
120*7304104dSAndroid Build Coastguard Worker 
EBLHOOK(prpsinfo)121*7304104dSAndroid Build Coastguard Worker struct EBLHOOK(prpsinfo)
122*7304104dSAndroid Build Coastguard Worker {
123*7304104dSAndroid Build Coastguard Worker   FIELD (CHAR, pr_state);
124*7304104dSAndroid Build Coastguard Worker   FIELD (CHAR, pr_sname);
125*7304104dSAndroid Build Coastguard Worker   FIELD (CHAR, pr_zomb);
126*7304104dSAndroid Build Coastguard Worker   FIELD (CHAR, pr_nice);
127*7304104dSAndroid Build Coastguard Worker   FIELD (ULONG, pr_flag);
128*7304104dSAndroid Build Coastguard Worker   FIELD (PRPSINFO_UID_T, pr_uid);
129*7304104dSAndroid Build Coastguard Worker   FIELD (PRPSINFO_GID_T, pr_gid);
130*7304104dSAndroid Build Coastguard Worker   FIELD (PID_T, pr_pid);
131*7304104dSAndroid Build Coastguard Worker   FIELD (PID_T, pr_ppid);
132*7304104dSAndroid Build Coastguard Worker   FIELD (PID_T, pr_pgrp);
133*7304104dSAndroid Build Coastguard Worker   FIELD (PID_T, pr_sid);
134*7304104dSAndroid Build Coastguard Worker   FIELD (CHAR, pr_fname[FNAMESZ]);
135*7304104dSAndroid Build Coastguard Worker   FIELD (CHAR, pr_psargs[PRARGSZ]);
136*7304104dSAndroid Build Coastguard Worker };
137*7304104dSAndroid Build Coastguard Worker 
138*7304104dSAndroid Build Coastguard Worker #undef	FIELD
139*7304104dSAndroid Build Coastguard Worker 
140*7304104dSAndroid Build Coastguard Worker #define FIELD(igroup, itype, item, fmt, ...)			\
141*7304104dSAndroid Build Coastguard Worker     {								\
142*7304104dSAndroid Build Coastguard Worker       .name = #item,						\
143*7304104dSAndroid Build Coastguard Worker       .group = #igroup,					\
144*7304104dSAndroid Build Coastguard Worker       .offset = offsetof (struct EBLHOOK(prstatus), pr_##item),	\
145*7304104dSAndroid Build Coastguard Worker       .type = TYPE_##itype,					\
146*7304104dSAndroid Build Coastguard Worker       .format = fmt,						\
147*7304104dSAndroid Build Coastguard Worker       __VA_ARGS__						\
148*7304104dSAndroid Build Coastguard Worker     }
149*7304104dSAndroid Build Coastguard Worker 
150*7304104dSAndroid Build Coastguard Worker static const Ebl_Core_Item prstatus_items[] =
151*7304104dSAndroid Build Coastguard Worker   {
152*7304104dSAndroid Build Coastguard Worker     FIELD (signal, INT, info.si_signo, 'd'),
153*7304104dSAndroid Build Coastguard Worker     FIELD (signal, INT, info.si_code, 'd'),
154*7304104dSAndroid Build Coastguard Worker     FIELD (signal, INT, info.si_errno, 'd'),
155*7304104dSAndroid Build Coastguard Worker     FIELD (signal, SHORT, cursig, 'd'),
156*7304104dSAndroid Build Coastguard Worker 
157*7304104dSAndroid Build Coastguard Worker     /* Use different group name for a newline delimiter.  */
158*7304104dSAndroid Build Coastguard Worker     FIELD (signal2, ULONG, sigpend, 'B'),
159*7304104dSAndroid Build Coastguard Worker     FIELD (signal3, ULONG, sighold, 'B'),
160*7304104dSAndroid Build Coastguard Worker     FIELD (identity, PID_T, pid, 'd', .thread_identifier = true),
161*7304104dSAndroid Build Coastguard Worker     FIELD (identity, PID_T, ppid, 'd'),
162*7304104dSAndroid Build Coastguard Worker     FIELD (identity, PID_T, pgrp, 'd'),
163*7304104dSAndroid Build Coastguard Worker     FIELD (identity, PID_T, sid, 'd'),
164*7304104dSAndroid Build Coastguard Worker     TIMEVAL_FIELD (utime),
165*7304104dSAndroid Build Coastguard Worker     TIMEVAL_FIELD (stime),
166*7304104dSAndroid Build Coastguard Worker     TIMEVAL_FIELD (cutime),
167*7304104dSAndroid Build Coastguard Worker     TIMEVAL_FIELD (cstime),
168*7304104dSAndroid Build Coastguard Worker #ifdef PRSTATUS_REGSET_ITEMS
169*7304104dSAndroid Build Coastguard Worker     PRSTATUS_REGSET_ITEMS,
170*7304104dSAndroid Build Coastguard Worker #endif
171*7304104dSAndroid Build Coastguard Worker     FIELD (register, INT, fpvalid, 'd'),
172*7304104dSAndroid Build Coastguard Worker   };
173*7304104dSAndroid Build Coastguard Worker 
174*7304104dSAndroid Build Coastguard Worker #undef	FIELD
175*7304104dSAndroid Build Coastguard Worker 
176*7304104dSAndroid Build Coastguard Worker #define FIELD(igroup, itype, item, fmt, ...)			\
177*7304104dSAndroid Build Coastguard Worker     {								\
178*7304104dSAndroid Build Coastguard Worker       .name = #item,						\
179*7304104dSAndroid Build Coastguard Worker       .group = #igroup,					\
180*7304104dSAndroid Build Coastguard Worker       .offset = offsetof (struct EBLHOOK(prpsinfo), pr_##item),	\
181*7304104dSAndroid Build Coastguard Worker       .type = TYPE_##itype,					\
182*7304104dSAndroid Build Coastguard Worker       .format = fmt,						\
183*7304104dSAndroid Build Coastguard Worker       __VA_ARGS__						\
184*7304104dSAndroid Build Coastguard Worker     }
185*7304104dSAndroid Build Coastguard Worker 
186*7304104dSAndroid Build Coastguard Worker static const Ebl_Core_Item prpsinfo_items[] =
187*7304104dSAndroid Build Coastguard Worker   {
188*7304104dSAndroid Build Coastguard Worker     FIELD (state, CHAR, state, 'd'),
189*7304104dSAndroid Build Coastguard Worker     FIELD (state, CHAR, sname, 'c'),
190*7304104dSAndroid Build Coastguard Worker     FIELD (state, CHAR, zomb, 'd'),
191*7304104dSAndroid Build Coastguard Worker     FIELD (state, CHAR, nice, 'd'),
192*7304104dSAndroid Build Coastguard Worker     FIELD (state, ULONG, flag, 'x'),
193*7304104dSAndroid Build Coastguard Worker     FIELD (identity, PRPSINFO_UID_T, uid, 'd'),
194*7304104dSAndroid Build Coastguard Worker     FIELD (identity, PRPSINFO_GID_T, gid, 'd'),
195*7304104dSAndroid Build Coastguard Worker     FIELD (identity, PID_T, pid, 'd'),
196*7304104dSAndroid Build Coastguard Worker     FIELD (identity, PID_T, ppid, 'd'),
197*7304104dSAndroid Build Coastguard Worker     FIELD (identity, PID_T, pgrp, 'd'),
198*7304104dSAndroid Build Coastguard Worker     FIELD (identity, PID_T, sid, 'd'),
199*7304104dSAndroid Build Coastguard Worker     FIELD (command, CHAR, fname, 's', .count = FNAMESZ),
200*7304104dSAndroid Build Coastguard Worker     FIELD (command, CHAR, psargs, 's', .count = PRARGSZ),
201*7304104dSAndroid Build Coastguard Worker   };
202*7304104dSAndroid Build Coastguard Worker 
203*7304104dSAndroid Build Coastguard Worker static const Ebl_Core_Item vmcoreinfo_items[] =
204*7304104dSAndroid Build Coastguard Worker   {
205*7304104dSAndroid Build Coastguard Worker     {
206*7304104dSAndroid Build Coastguard Worker       .type = ELF_T_BYTE, .format = '\n'
207*7304104dSAndroid Build Coastguard Worker     }
208*7304104dSAndroid Build Coastguard Worker   };
209*7304104dSAndroid Build Coastguard Worker 
210*7304104dSAndroid Build Coastguard Worker #undef	FIELD
211*7304104dSAndroid Build Coastguard Worker 
212*7304104dSAndroid Build Coastguard Worker int
EBLHOOK(core_note)213*7304104dSAndroid Build Coastguard Worker EBLHOOK(core_note) (const GElf_Nhdr *nhdr, const char *name,
214*7304104dSAndroid Build Coastguard Worker 		    GElf_Word *regs_offset, size_t *nregloc,
215*7304104dSAndroid Build Coastguard Worker 		    const Ebl_Register_Location **reglocs,
216*7304104dSAndroid Build Coastguard Worker 		    size_t *nitems, const Ebl_Core_Item **items)
217*7304104dSAndroid Build Coastguard Worker {
218*7304104dSAndroid Build Coastguard Worker   switch (nhdr->n_namesz)
219*7304104dSAndroid Build Coastguard Worker     {
220*7304104dSAndroid Build Coastguard Worker     case sizeof "CORE" - 1:	/* Buggy old Linux kernels.  */
221*7304104dSAndroid Build Coastguard Worker       if (memcmp (name, "CORE", nhdr->n_namesz) == 0)
222*7304104dSAndroid Build Coastguard Worker 	break;
223*7304104dSAndroid Build Coastguard Worker       return 0;
224*7304104dSAndroid Build Coastguard Worker 
225*7304104dSAndroid Build Coastguard Worker     case sizeof "CORE":
226*7304104dSAndroid Build Coastguard Worker       if (memcmp (name, "CORE", nhdr->n_namesz) == 0)
227*7304104dSAndroid Build Coastguard Worker 	break;
228*7304104dSAndroid Build Coastguard Worker       /* Buggy old Linux kernels didn't terminate "LINUX".  */
229*7304104dSAndroid Build Coastguard Worker       FALLTHROUGH;
230*7304104dSAndroid Build Coastguard Worker 
231*7304104dSAndroid Build Coastguard Worker     case sizeof "LINUX":
232*7304104dSAndroid Build Coastguard Worker       if (memcmp (name, "LINUX", nhdr->n_namesz) == 0)
233*7304104dSAndroid Build Coastguard Worker 	break;
234*7304104dSAndroid Build Coastguard Worker       return 0;
235*7304104dSAndroid Build Coastguard Worker 
236*7304104dSAndroid Build Coastguard Worker     case sizeof "VMCOREINFO":
237*7304104dSAndroid Build Coastguard Worker       if (nhdr->n_type != 0
238*7304104dSAndroid Build Coastguard Worker 	  || memcmp (name, "VMCOREINFO", sizeof "VMCOREINFO") != 0)
239*7304104dSAndroid Build Coastguard Worker 	return 0;
240*7304104dSAndroid Build Coastguard Worker       *regs_offset = 0;
241*7304104dSAndroid Build Coastguard Worker       *nregloc = 0;
242*7304104dSAndroid Build Coastguard Worker       *reglocs = NULL;
243*7304104dSAndroid Build Coastguard Worker       *nitems = 1;
244*7304104dSAndroid Build Coastguard Worker       *items = vmcoreinfo_items;
245*7304104dSAndroid Build Coastguard Worker       return 1;
246*7304104dSAndroid Build Coastguard Worker 
247*7304104dSAndroid Build Coastguard Worker     default:
248*7304104dSAndroid Build Coastguard Worker       return 0;
249*7304104dSAndroid Build Coastguard Worker     }
250*7304104dSAndroid Build Coastguard Worker 
251*7304104dSAndroid Build Coastguard Worker   switch (nhdr->n_type)
252*7304104dSAndroid Build Coastguard Worker     {
253*7304104dSAndroid Build Coastguard Worker     case NT_PRSTATUS:
254*7304104dSAndroid Build Coastguard Worker       if (nhdr->n_descsz != sizeof (struct EBLHOOK(prstatus)))
255*7304104dSAndroid Build Coastguard Worker 	return 0;
256*7304104dSAndroid Build Coastguard Worker       *regs_offset = offsetof (struct EBLHOOK(prstatus), pr_reg);
257*7304104dSAndroid Build Coastguard Worker       *nregloc = sizeof prstatus_regs / sizeof prstatus_regs[0];
258*7304104dSAndroid Build Coastguard Worker       *reglocs = prstatus_regs;
259*7304104dSAndroid Build Coastguard Worker       *nitems = sizeof prstatus_items / sizeof prstatus_items[0];
260*7304104dSAndroid Build Coastguard Worker       *items = prstatus_items;
261*7304104dSAndroid Build Coastguard Worker       return 1;
262*7304104dSAndroid Build Coastguard Worker 
263*7304104dSAndroid Build Coastguard Worker     case NT_PRPSINFO:
264*7304104dSAndroid Build Coastguard Worker       if (nhdr->n_descsz != sizeof (struct EBLHOOK(prpsinfo)))
265*7304104dSAndroid Build Coastguard Worker 	return 0;
266*7304104dSAndroid Build Coastguard Worker       *regs_offset = 0;
267*7304104dSAndroid Build Coastguard Worker       *nregloc = 0;
268*7304104dSAndroid Build Coastguard Worker       *reglocs = NULL;
269*7304104dSAndroid Build Coastguard Worker       *nitems = sizeof prpsinfo_items / sizeof prpsinfo_items[0];
270*7304104dSAndroid Build Coastguard Worker       *items = prpsinfo_items;
271*7304104dSAndroid Build Coastguard Worker       return 1;
272*7304104dSAndroid Build Coastguard Worker 
273*7304104dSAndroid Build Coastguard Worker #define EXTRA_REGSET(type, size, table)					      \
274*7304104dSAndroid Build Coastguard Worker     case type:								      \
275*7304104dSAndroid Build Coastguard Worker       if (nhdr->n_descsz != size)					      \
276*7304104dSAndroid Build Coastguard Worker 	return 0;							      \
277*7304104dSAndroid Build Coastguard Worker       *regs_offset = 0;							      \
278*7304104dSAndroid Build Coastguard Worker       *nregloc = sizeof table / sizeof table[0];			      \
279*7304104dSAndroid Build Coastguard Worker       *reglocs = table;							      \
280*7304104dSAndroid Build Coastguard Worker       *nitems = 0;							      \
281*7304104dSAndroid Build Coastguard Worker       *items = NULL;							      \
282*7304104dSAndroid Build Coastguard Worker       return 1;
283*7304104dSAndroid Build Coastguard Worker 
284*7304104dSAndroid Build Coastguard Worker #define EXTRA_REGSET_ITEMS(type, size, table, extra_items)		      \
285*7304104dSAndroid Build Coastguard Worker     case type:								      \
286*7304104dSAndroid Build Coastguard Worker       if (nhdr->n_descsz != size)					      \
287*7304104dSAndroid Build Coastguard Worker 	return 0;							      \
288*7304104dSAndroid Build Coastguard Worker       *regs_offset = 0;							      \
289*7304104dSAndroid Build Coastguard Worker       *nregloc = sizeof table / sizeof table[0];			      \
290*7304104dSAndroid Build Coastguard Worker       *reglocs = table;							      \
291*7304104dSAndroid Build Coastguard Worker       *nitems = sizeof extra_items / sizeof extra_items[0];		      \
292*7304104dSAndroid Build Coastguard Worker       *items = extra_items;						      \
293*7304104dSAndroid Build Coastguard Worker       return 1;
294*7304104dSAndroid Build Coastguard Worker 
295*7304104dSAndroid Build Coastguard Worker #define EXTRA_ITEMS(type, size, extra_items)				      \
296*7304104dSAndroid Build Coastguard Worker     case type:								      \
297*7304104dSAndroid Build Coastguard Worker       if (nhdr->n_descsz != size)					      \
298*7304104dSAndroid Build Coastguard Worker 	return 0;							      \
299*7304104dSAndroid Build Coastguard Worker       *regs_offset = 0;							      \
300*7304104dSAndroid Build Coastguard Worker       *nregloc = 0;							      \
301*7304104dSAndroid Build Coastguard Worker       *reglocs = NULL;							      \
302*7304104dSAndroid Build Coastguard Worker       *nitems = sizeof extra_items / sizeof extra_items[0];		      \
303*7304104dSAndroid Build Coastguard Worker       *items = extra_items;						      \
304*7304104dSAndroid Build Coastguard Worker       return 1;
305*7304104dSAndroid Build Coastguard Worker 
306*7304104dSAndroid Build Coastguard Worker #ifdef FPREGSET_SIZE
307*7304104dSAndroid Build Coastguard Worker     EXTRA_REGSET (NT_FPREGSET, FPREGSET_SIZE, fpregset_regs)
308*7304104dSAndroid Build Coastguard Worker #endif
309*7304104dSAndroid Build Coastguard Worker 
310*7304104dSAndroid Build Coastguard Worker #ifdef EXTRA_NOTES
311*7304104dSAndroid Build Coastguard Worker     EXTRA_NOTES
312*7304104dSAndroid Build Coastguard Worker #endif
313*7304104dSAndroid Build Coastguard Worker     }
314*7304104dSAndroid Build Coastguard Worker 
315*7304104dSAndroid Build Coastguard Worker   return 0;
316*7304104dSAndroid Build Coastguard Worker }
317