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