xref: /illumos-gate/usr/src/cmd/sgs/elfdump/common/gen_struct_layout.c (revision f1cd2b6cd01a74ce00b051c8a3028a8d47c8e5ac)
1c6c9aed4Sab196087 /*
2c6c9aed4Sab196087  * CDDL HEADER START
3c6c9aed4Sab196087  *
4c6c9aed4Sab196087  * The contents of this file are subject to the terms of the
5c6c9aed4Sab196087  * Common Development and Distribution License (the "License").
6c6c9aed4Sab196087  * You may not use this file except in compliance with the License.
7c6c9aed4Sab196087  *
8c6c9aed4Sab196087  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9c6c9aed4Sab196087  * or http://www.opensolaris.org/os/licensing.
10c6c9aed4Sab196087  * See the License for the specific language governing permissions
11c6c9aed4Sab196087  * and limitations under the License.
12c6c9aed4Sab196087  *
13c6c9aed4Sab196087  * When distributing Covered Code, include this CDDL HEADER in each
14c6c9aed4Sab196087  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15c6c9aed4Sab196087  * If applicable, add the following below this CDDL HEADER, with the
16c6c9aed4Sab196087  * fields enclosed by brackets "[]" replaced with your own identifying
17c6c9aed4Sab196087  * information: Portions Copyright [yyyy] [name of copyright owner]
18c6c9aed4Sab196087  *
19c6c9aed4Sab196087  * CDDL HEADER END
20c6c9aed4Sab196087  */
21c6c9aed4Sab196087 
22c6c9aed4Sab196087 /*
23c6c9aed4Sab196087  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24c6c9aed4Sab196087  * Use is subject to license terms.
251886f67eSGordon Ross  *
261886f67eSGordon Ross  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
27ab618543SJohn Levon  * Copyright 2018 Joyent, Inc.
28a02120c4SAndy Fiddaman  * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
29c6c9aed4Sab196087  */
30c6c9aed4Sab196087 
31c6c9aed4Sab196087 /*
321886f67eSGordon Ross  * This program is used to generate the contents of the
33ab618543SJohn Levon  * struct_layout_XXX.c files that contain per-architecture
34c6c9aed4Sab196087  * structure layout information.
35c6c9aed4Sab196087  *
36c6c9aed4Sab196087  * Although not part of elfdump, it is built by the makefile
37*f1cd2b6cSRobert Mustacchi  * along with it. Note, the Makefile only builds versions that
38*f1cd2b6cSRobert Mustacchi  * are natively supported and therefore you must manually run
39*f1cd2b6cSRobert Mustacchi  * this for other architectures.
40*f1cd2b6cSRobert Mustacchi  *
41c6c9aed4Sab196087  * To use it:
42c6c9aed4Sab196087  *
43c6c9aed4Sab196087  *	1) Run it, capturing the output in a file.
44c6c9aed4Sab196087  *	2) If this is a replacement for an existing file,
45c6c9aed4Sab196087  *		diff the new and old copies to ensure only
46c6c9aed4Sab196087  *		the changes you expected are present.
47c6c9aed4Sab196087  *	3) Put the new file in the common directory under the name
48c6c9aed4Sab196087  *		struct_layout_XXX.c, where XXX is the name of
49c6c9aed4Sab196087  *		the architecture (i386, amd64, sparc, sparcv9, etc).
50c6c9aed4Sab196087  *	2) Add any necessary header and copyright comments.
51c6c9aed4Sab196087  *	3) If this is a new architecture:
52c6c9aed4Sab196087  *		- Add an extern statement for struct_layout_XXX()
53c6c9aed4Sab196087  *			to struct_layout.h
54c6c9aed4Sab196087  *		- Add a case for it to the function sl_struct_layout()
55c6c9aed4Sab196087  *			in struct_layout.c.
56c6c9aed4Sab196087  */
57c6c9aed4Sab196087 
581886f67eSGordon Ross #include <string.h>
591886f67eSGordon Ross #include <stdio.h>
601886f67eSGordon Ross #include <stdlib.h>
611886f67eSGordon Ross #include <ctype.h>
621886f67eSGordon Ross #include <err.h>
631886f67eSGordon Ross #include <sys/types.h>
641886f67eSGordon Ross #include <libctf.h>
65c6c9aed4Sab196087 
66c6c9aed4Sab196087 /*
671886f67eSGordon Ross  * This extracts CTF information from a temporary object file.
681886f67eSGordon Ross  *
69c6c9aed4Sab196087  * START and END bracket a struct layout definition. They issue
70c6c9aed4Sab196087  * the typedef boilerplate, and the standard first element (sizeof)
71c6c9aed4Sab196087  * which captures the overall size of the structure.
72c6c9aed4Sab196087  *
73c6c9aed4Sab196087  * SCALAR_FIELD is for scalar struct fields
74c6c9aed4Sab196087  *
75c6c9aed4Sab196087  * ARRAY_FIELD is for  array struct fields
76c6c9aed4Sab196087  *
771886f67eSGordon Ross  * ARRAY_TYPE is for plain (non-struct) array types
78c6c9aed4Sab196087  */
79c6c9aed4Sab196087 #define	START(_name, _type) \
801886f67eSGordon Ross 	do_start(#_name, #_type)
811886f67eSGordon Ross #define	END (void) \
821886f67eSGordon Ross 	do_end()
83c6c9aed4Sab196087 #define	SCALAR_FIELD(_type, _field, _sign) \
841886f67eSGordon Ross 	do_scalar_field(#_type, #_field, _sign, NULL)
851886f67eSGordon Ross #define	SCALAR_FIELD4(_type, _field, _sign, _rtype) \
861886f67eSGordon Ross 	do_scalar_field(#_type, #_field, _sign, _rtype)
87c6c9aed4Sab196087 #define	ARRAY_FIELD(_type, _field, _sign) \
881886f67eSGordon Ross 	do_array_field(#_type, #_field, _sign, NULL)
891886f67eSGordon Ross #define	ARRAY_TYPE(_type, _sign) \
901886f67eSGordon Ross 	do_array_type(#_type, "elt0", _sign)
91c6c9aed4Sab196087 
921886f67eSGordon Ross static void do_start(char *_name, char *_type);
931886f67eSGordon Ross static void do_end(void);
941886f67eSGordon Ross static void do_start_name(char *name);
951886f67eSGordon Ross static void do_start_sizeof(char *_type, char *realtype);
961886f67eSGordon Ross static void do_scalar_field(char *_type, char *_field,
971886f67eSGordon Ross 	int _sign, char *dotfield);
981886f67eSGordon Ross static void do_array_field(char *_type, char *_field,
991886f67eSGordon Ross 	int _sign, char *dotfield);
1001886f67eSGordon Ross static void do_array_type(char *_type, char *_field, int _sign);
1011886f67eSGordon Ross 
1021886f67eSGordon Ross static void get_ctf_file(char *fname);
1031886f67eSGordon Ross static int get_field_info(char *tname, char *fname, char *dotname,
1041886f67eSGordon Ross 	int *offp, int *sizep);
1051886f67eSGordon Ross 
1061886f67eSGordon Ross static ctf_file_t *ctf;
1071886f67eSGordon Ross static char *objfile;
1081886f67eSGordon Ross static char *machname;
109c6c9aed4Sab196087 
110c6c9aed4Sab196087 /* auxv_t, <sys/auxv.h> */
111c6c9aed4Sab196087 static void
gen_auxv(void)112c6c9aed4Sab196087 gen_auxv(void)
113c6c9aed4Sab196087 {
114c6c9aed4Sab196087 	START(auxv, auxv_t);
115c6c9aed4Sab196087 
116c6c9aed4Sab196087 	SCALAR_FIELD(auxv_t,	a_type,	1);
117c6c9aed4Sab196087 	SCALAR_FIELD(auxv_t,	a_un.a_val,	1);
118c6c9aed4Sab196087 	SCALAR_FIELD(auxv_t,	a_un.a_ptr,	0);
119c6c9aed4Sab196087 	SCALAR_FIELD(auxv_t,	a_un.a_fcn,	0);
120c6c9aed4Sab196087 
121c6c9aed4Sab196087 	END;
122c6c9aed4Sab196087 }
123c6c9aed4Sab196087 
124c6c9aed4Sab196087 
125c6c9aed4Sab196087 /* prgregset_t, <sys/prgregset.h> */
126c6c9aed4Sab196087 static void
gen_prgregset(void)127c6c9aed4Sab196087 gen_prgregset(void)
128c6c9aed4Sab196087 {
129c6c9aed4Sab196087 	START(prgregset, prgregset_t);
130c6c9aed4Sab196087 
1311886f67eSGordon Ross 	ARRAY_TYPE(prgregset_t,	0);
132c6c9aed4Sab196087 
133c6c9aed4Sab196087 	END;
134c6c9aed4Sab196087 }
135c6c9aed4Sab196087 
136c6c9aed4Sab196087 
137c6c9aed4Sab196087 /* lwpstatus_t, <sys/procfs.h> */
138c6c9aed4Sab196087 static void
gen_lwpstatus(void)139c6c9aed4Sab196087 gen_lwpstatus(void)
140c6c9aed4Sab196087 {
141c6c9aed4Sab196087 	START(lwpstatus, lwpstatus_t);
142c6c9aed4Sab196087 
143c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_flags,	0);
144c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_lwpid,	0);
145c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_why,		0);
146c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_what,	0);
147c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_cursig,	0);
148c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_info,	0);
149c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_lwppend,	0);
150c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_lwphold,	0);
151c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_action,	0);
152c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_altstack,	0);
153c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_oldcontext,	0);
154c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_syscall,	0);
155c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_nsysarg,	0);
156c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_errno,	0);
157c6c9aed4Sab196087 	ARRAY_FIELD(lwpstatus_t,	pr_sysarg,	0);
158c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_rval1,	0);
159c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_rval2,	0);
160c6c9aed4Sab196087 	ARRAY_FIELD(lwpstatus_t,	pr_clname,	0);
161c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_tstamp,	0);
162c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_utime,	0);
163c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_stime,	0);
164c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_errpriv,	0);
165c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_ustack,	0);
166c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_instr,	0);
167c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_reg,		0);
168c6c9aed4Sab196087 	SCALAR_FIELD(lwpstatus_t,	pr_fpreg,	0);
169c6c9aed4Sab196087 
170c6c9aed4Sab196087 	END;
171c6c9aed4Sab196087 }
172c6c9aed4Sab196087 
173c6c9aed4Sab196087 
174c6c9aed4Sab196087 /* pstatus_t, <sys/procfs.h> */
175c6c9aed4Sab196087 static void
gen_pstatus(void)176c6c9aed4Sab196087 gen_pstatus(void)
177c6c9aed4Sab196087 {
178c6c9aed4Sab196087 	START(pstatus, pstatus_t);
179c6c9aed4Sab196087 
180c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_flags,	1);
181c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_nlwp,	1);
182c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_pid,		0);
183c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_ppid,	0);
184c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_pgid,	0);
185c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_sid,		0);
186c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_aslwpid,	1);
187c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_agentid,	1);
188c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_sigpend,	0);
189c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_brkbase,	0);
190c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_brksize,	0);
191c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_stkbase,	0);
192c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_stksize,	0);
193c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_utime,	0);
194c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_stime,	0);
195c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_cutime,	0);
196c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_cstime,	0);
197c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_sigtrace,	0);
198c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_flttrace,	0);
199c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_sysentry,	0);
200c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_sysexit,	0);
201c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_dmodel,	0);
202c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_taskid,	1);
203c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_projid,	1);
204c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_nzomb,	1);
205c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_zoneid,	1);
206c6c9aed4Sab196087 	SCALAR_FIELD(pstatus_t,		pr_lwp,		0);
207c6c9aed4Sab196087 
208c6c9aed4Sab196087 	END;
209c6c9aed4Sab196087 }
210c6c9aed4Sab196087 
211c6c9aed4Sab196087 
212c6c9aed4Sab196087 /* prstatus_t, <sys/old_procfs.h> */
213c6c9aed4Sab196087 static void
gen_prstatus(void)214c6c9aed4Sab196087 gen_prstatus(void)
215c6c9aed4Sab196087 {
216c6c9aed4Sab196087 	START(prstatus, prstatus_t);
217c6c9aed4Sab196087 
218c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_flags,	1);
219c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_why,		1);
220c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_what,	1);
221c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_info,	0);
222c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_cursig,	1);
223c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_nlwp,	0);
224c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_sigpend,	0);
225c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_sighold,	0);
226c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_altstack,	0);
227c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_action,	0);
228c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_pid,		0);
229c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_ppid,	0);
230c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_pgrp,	0);
231c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_sid,		0);
232c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_utime,	0);
233c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_stime,	0);
234c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_cutime,	0);
235c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_cstime,	0);
236c6c9aed4Sab196087 	ARRAY_FIELD(prstatus_t,		pr_clname,	0);
237c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_syscall,	1);
238c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_nsysarg,	1);
239c6c9aed4Sab196087 	ARRAY_FIELD(prstatus_t,		pr_sysarg,	1);
240c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_who,		0);
241c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_lwppend,	0);
242c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_oldcontext,	0);
243c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_brkbase,	0);
244c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_brksize,	0);
245c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_stkbase,	0);
246c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_stksize,	0);
247c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_processor,	1);
248c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_bind,	1);
249c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_instr,	1);
250c6c9aed4Sab196087 	SCALAR_FIELD(prstatus_t,	pr_reg,		0);
251c6c9aed4Sab196087 
252c6c9aed4Sab196087 	END;
253c6c9aed4Sab196087 }
254c6c9aed4Sab196087 
255c6c9aed4Sab196087 
256c6c9aed4Sab196087 /* psinfo_t, <sys/procfs.h> */
257c6c9aed4Sab196087 static void
gen_psinfo(void)258c6c9aed4Sab196087 gen_psinfo(void)
259c6c9aed4Sab196087 {
260c6c9aed4Sab196087 	START(psinfo, psinfo_t);
261c6c9aed4Sab196087 
262c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_flag,	1);
263c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_nlwp,	1);
264c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_pid,		0);
265c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_ppid,	0);
266c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_pgid,	0);
267c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_sid,		0);
268c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_uid,		0);
269c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_euid,	0);
270c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_gid,		0);
271c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_egid,	0);
272c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_addr,	0);
273c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_size,	0);
274c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_rssize,	0);
275c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_ttydev,	0);
276c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_pctcpu,	0);
277c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_pctmem,	0);
278c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_start,	0);
279c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_time,	0);
280c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_ctime,	0);
281c6c9aed4Sab196087 	ARRAY_FIELD(psinfo_t,		pr_fname,	0);
282c6c9aed4Sab196087 	ARRAY_FIELD(psinfo_t,		pr_psargs,	0);
283c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_wstat,	1);
284c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_argc,	1);
285c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_argv,	0);
286c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_envp,	0);
287c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_dmodel,	0);
288c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_taskid,	0);
289c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_projid,	0);
290c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_nzomb,	1);
291c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_poolid,	0);
292c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_zoneid,	0);
293c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_contract,	0);
294c6c9aed4Sab196087 	SCALAR_FIELD(psinfo_t,		pr_lwp,		0);
295c6c9aed4Sab196087 
296c6c9aed4Sab196087 	END;
297c6c9aed4Sab196087 }
298c6c9aed4Sab196087 
299c6c9aed4Sab196087 /* prpsinfo_t, <sys/old_procfs.h> */
300c6c9aed4Sab196087 static void
gen_prpsinfo(void)301c6c9aed4Sab196087 gen_prpsinfo(void)
302c6c9aed4Sab196087 {
303c6c9aed4Sab196087 	START(prpsinfo, prpsinfo_t);
304c6c9aed4Sab196087 
305c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_state,	0);
306c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_sname,	0);
307c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_zomb,	0);
308c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_nice,	0);
309c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_flag,	0);
310c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_uid,		0);
311c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_gid,		0);
312c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_pid,		0);
313c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_ppid,	0);
314c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_pgrp,	0);
315c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_sid,		0);
316c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_addr,	0);
317c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_size,	0);
318c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_rssize,	0);
319c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_wchan,	0);
320c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_start,	0);
321c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_time,	0);
322c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_pri,		1);
323c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_oldpri,	0);
324c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_cpu,		0);
325c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_ottydev,	0);
326c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_lttydev,	0);
327c6c9aed4Sab196087 	ARRAY_FIELD(prpsinfo_t,		pr_clname,	0);
328c6c9aed4Sab196087 	ARRAY_FIELD(prpsinfo_t,		pr_fname,	0);
329c6c9aed4Sab196087 	ARRAY_FIELD(prpsinfo_t,		pr_psargs,	0);
330c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_syscall,	1);
331c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_ctime,	0);
332c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_bysize,	0);
333c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_byrssize,	0);
334c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_argc,	1);
335c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_argv,	0);
336c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_envp,	0);
337c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_wstat,	1);
338c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_pctcpu,	0);
339c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_pctmem,	0);
340c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_euid,	0);
341c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_egid,	0);
342c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_aslwpid,	0);
343c6c9aed4Sab196087 	SCALAR_FIELD(prpsinfo_t,	pr_dmodel,	0);
344c6c9aed4Sab196087 
345c6c9aed4Sab196087 	END;
346c6c9aed4Sab196087 }
347c6c9aed4Sab196087 
348c6c9aed4Sab196087 /* lwpsinfo_t, <sys/procfs.h> */
349c6c9aed4Sab196087 static void
gen_lwpsinfo(void)350c6c9aed4Sab196087 gen_lwpsinfo(void)
351c6c9aed4Sab196087 {
352c6c9aed4Sab196087 	START(lwpsinfo, lwpsinfo_t);
353c6c9aed4Sab196087 
354c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_flag,	1);
355c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_lwpid,	0);
356c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_addr,	0);
357c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_wchan,	0);
358c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_stype,	0);
359c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_state,	0);
360c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_sname,	0);
361c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_nice,	0);
362c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_syscall,	0);
363c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_oldpri,	0);
364c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_cpu,		0);
365c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_pri,		1);
366c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_pctcpu,	0);
367c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_start,	0);
368c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_time,	0);
369c6c9aed4Sab196087 	ARRAY_FIELD(lwpsinfo_t,		pr_clname,	0);
370c6c9aed4Sab196087 	ARRAY_FIELD(lwpsinfo_t,		pr_name,	0);
371c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_onpro,	1);
372c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_bindpro,	1);
373c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_bindpset,	1);
374c6c9aed4Sab196087 	SCALAR_FIELD(lwpsinfo_t,	pr_lgrp,	1);
375c6c9aed4Sab196087 
376c6c9aed4Sab196087 	END;
377c6c9aed4Sab196087 }
378c6c9aed4Sab196087 
379c6c9aed4Sab196087 /* prcred_t, <sys/procfs.h> */
380c6c9aed4Sab196087 static void
gen_prcred(void)381c6c9aed4Sab196087 gen_prcred(void)
382c6c9aed4Sab196087 {
383c6c9aed4Sab196087 	START(prcred, prcred_t);
384c6c9aed4Sab196087 
385c6c9aed4Sab196087 	SCALAR_FIELD(prcred_t,		pr_euid,	0);
386c6c9aed4Sab196087 	SCALAR_FIELD(prcred_t,		pr_ruid,	0);
387c6c9aed4Sab196087 	SCALAR_FIELD(prcred_t,		pr_suid,	0);
388c6c9aed4Sab196087 	SCALAR_FIELD(prcred_t,		pr_egid,	0);
389c6c9aed4Sab196087 	SCALAR_FIELD(prcred_t,		pr_rgid,	0);
390c6c9aed4Sab196087 	SCALAR_FIELD(prcred_t,		pr_sgid,	0);
391c6c9aed4Sab196087 	SCALAR_FIELD(prcred_t,		pr_ngroups,	1);
392c6c9aed4Sab196087 	ARRAY_FIELD(prcred_t,		pr_groups,	0);
393c6c9aed4Sab196087 
394c6c9aed4Sab196087 	END;
395c6c9aed4Sab196087 }
396c6c9aed4Sab196087 
397c6c9aed4Sab196087 /* prpriv_t, <sys/procfs.h> */
398c6c9aed4Sab196087 static void
gen_prpriv(void)399c6c9aed4Sab196087 gen_prpriv(void)
400c6c9aed4Sab196087 {
401c6c9aed4Sab196087 	START(prpriv, prpriv_t);
402c6c9aed4Sab196087 
403c6c9aed4Sab196087 	SCALAR_FIELD(prpriv_t,		pr_nsets,	0);
404c6c9aed4Sab196087 	SCALAR_FIELD(prpriv_t,		pr_setsize,	0);
405c6c9aed4Sab196087 	SCALAR_FIELD(prpriv_t,		pr_infosize,	0);
406c6c9aed4Sab196087 	ARRAY_FIELD(prpriv_t,		pr_sets,	0);
407c6c9aed4Sab196087 
408c6c9aed4Sab196087 	END;
409c6c9aed4Sab196087 }
410c6c9aed4Sab196087 
411c6c9aed4Sab196087 
412c6c9aed4Sab196087 /* priv_impl_info_t, <sys/priv.h> */
413c6c9aed4Sab196087 static void
gen_priv_impl_info(void)414c6c9aed4Sab196087 gen_priv_impl_info(void)
415c6c9aed4Sab196087 {
416c6c9aed4Sab196087 	START(priv_impl_info, priv_impl_info_t);
417c6c9aed4Sab196087 
418c6c9aed4Sab196087 	SCALAR_FIELD(priv_impl_info_t,	priv_headersize,	0);
419c6c9aed4Sab196087 	SCALAR_FIELD(priv_impl_info_t,	priv_flags,		0);
420c6c9aed4Sab196087 	SCALAR_FIELD(priv_impl_info_t,	priv_nsets,		0);
421c6c9aed4Sab196087 	SCALAR_FIELD(priv_impl_info_t,	priv_setsize,		0);
422c6c9aed4Sab196087 	SCALAR_FIELD(priv_impl_info_t,	priv_max,		0);
423c6c9aed4Sab196087 	SCALAR_FIELD(priv_impl_info_t,	priv_infosize,		0);
424c6c9aed4Sab196087 	SCALAR_FIELD(priv_impl_info_t,	priv_globalinfosize,	0);
425c6c9aed4Sab196087 
426c6c9aed4Sab196087 	END;
427c6c9aed4Sab196087 }
428c6c9aed4Sab196087 
429c6c9aed4Sab196087 
430c6c9aed4Sab196087 /* fltset_t, <sys/fault.h> */
431c6c9aed4Sab196087 static void
gen_fltset(void)432c6c9aed4Sab196087 gen_fltset(void)
433c6c9aed4Sab196087 {
434c6c9aed4Sab196087 	START(fltset, fltset_t);
435c6c9aed4Sab196087 
436c6c9aed4Sab196087 	ARRAY_FIELD(fltset_t,	word,	0);
437c6c9aed4Sab196087 
438c6c9aed4Sab196087 	END;
439c6c9aed4Sab196087 }
440c6c9aed4Sab196087 
4411886f67eSGordon Ross /*
4421886f67eSGordon Ross  * Layout description of siginfo_t, <sys/siginfo.h>
4431886f67eSGordon Ross  *
4441886f67eSGordon Ross  * Note: many siginfo_t members are #defines mapping to
4451886f67eSGordon Ross  * long dotted members of sub-structs or unions, and
4461886f67eSGordon Ross  * we need the full member spec (with dots) for those.
4471886f67eSGordon Ross  */
448c6c9aed4Sab196087 static void
gen_siginfo(void)449c6c9aed4Sab196087 gen_siginfo(void)
450c6c9aed4Sab196087 {
451c6c9aed4Sab196087 	START(siginfo, siginfo_t);
452c6c9aed4Sab196087 
453c6c9aed4Sab196087 	SCALAR_FIELD(siginfo_t,		si_signo,		0);
454c6c9aed4Sab196087 	SCALAR_FIELD(siginfo_t,		si_errno,		0);
455c6c9aed4Sab196087 	SCALAR_FIELD(siginfo_t,		si_code,		1);
4561886f67eSGordon Ross 
4571886f67eSGordon Ross 	SCALAR_FIELD4(siginfo_t,	si_value.sival_int,	0,
4581886f67eSGordon Ross 	    "__data.__proc.__pdata.__kill.__value.sival_int");
4591886f67eSGordon Ross 
4601886f67eSGordon Ross 	SCALAR_FIELD4(siginfo_t,	si_value.sival_ptr,	0,
4611886f67eSGordon Ross 	    "__data.__proc.__pdata.__kill.__value.sival_ptr");
4621886f67eSGordon Ross 
4631886f67eSGordon Ross 	SCALAR_FIELD4(siginfo_t,	si_pid,			0,
4641886f67eSGordon Ross 	    "__data.__proc.__pid");
4651886f67eSGordon Ross 
4661886f67eSGordon Ross 	SCALAR_FIELD4(siginfo_t,	si_uid,			0,
4671886f67eSGordon Ross 	    "__data.__proc.__pdata.__kill.__uid");
4681886f67eSGordon Ross 
4691886f67eSGordon Ross 	SCALAR_FIELD4(siginfo_t,	si_ctid,		0,
4701886f67eSGordon Ross 	    "__data.__proc.__ctid");
4711886f67eSGordon Ross 
4721886f67eSGordon Ross 	SCALAR_FIELD4(siginfo_t,	si_zoneid,		0,
4731886f67eSGordon Ross 	    "__data.__proc.__zoneid");
4741886f67eSGordon Ross 
4751886f67eSGordon Ross 	SCALAR_FIELD4(siginfo_t,	si_entity,		0,
4761886f67eSGordon Ross 	    "__data.__rctl.__entity");
4771886f67eSGordon Ross 
4781886f67eSGordon Ross 	SCALAR_FIELD4(siginfo_t,	si_addr,		0,
4791886f67eSGordon Ross 	    "__data.__fault.__addr");
4801886f67eSGordon Ross 
4811886f67eSGordon Ross 	SCALAR_FIELD4(siginfo_t,	si_status,		0,
4821886f67eSGordon Ross 	    "__data.__proc.__pdata.__cld.__status");
4831886f67eSGordon Ross 
4841886f67eSGordon Ross 	SCALAR_FIELD4(siginfo_t,	si_band,		0,
4851886f67eSGordon Ross 	    "__data.__file.__band");
486c6c9aed4Sab196087 
487c6c9aed4Sab196087 	END;
488c6c9aed4Sab196087 }
489c6c9aed4Sab196087 
490c6c9aed4Sab196087 /* sigset_t, <sys/signal.h> */
491c6c9aed4Sab196087 static void
gen_sigset(void)492c6c9aed4Sab196087 gen_sigset(void)
493c6c9aed4Sab196087 {
494c6c9aed4Sab196087 	START(sigset, sigset_t);
495c6c9aed4Sab196087 
496c6c9aed4Sab196087 	ARRAY_FIELD(sigset_t,	__sigbits,	0);
497c6c9aed4Sab196087 
498c6c9aed4Sab196087 	END;
499c6c9aed4Sab196087 }
500c6c9aed4Sab196087 
501c6c9aed4Sab196087 
502c6c9aed4Sab196087 /* struct sigaction, <sys/signal.h> */
503c6c9aed4Sab196087 static void
gen_sigaction(void)504c6c9aed4Sab196087 gen_sigaction(void)
505c6c9aed4Sab196087 {
506c6c9aed4Sab196087 	START(sigaction, struct sigaction);
507c6c9aed4Sab196087 
508c6c9aed4Sab196087 	SCALAR_FIELD(struct sigaction,	sa_flags,	0);
5091886f67eSGordon Ross 
5101886f67eSGordon Ross 	SCALAR_FIELD4(struct sigaction,	sa_handler,	0,
5111886f67eSGordon Ross 	    "_funcptr._handler");
5121886f67eSGordon Ross 
5131886f67eSGordon Ross 	SCALAR_FIELD4(struct sigaction,	sa_sigaction,	0,
5141886f67eSGordon Ross 	    "_funcptr._sigaction");
5151886f67eSGordon Ross 
516c6c9aed4Sab196087 	SCALAR_FIELD(struct sigaction,	sa_mask,	0);
517c6c9aed4Sab196087 
518c6c9aed4Sab196087 	END;
519c6c9aed4Sab196087 }
520c6c9aed4Sab196087 
521c6c9aed4Sab196087 /* stack_t, <sys/signal.h> */
522c6c9aed4Sab196087 static void
gen_stack(void)523c6c9aed4Sab196087 gen_stack(void)
524c6c9aed4Sab196087 {
525c6c9aed4Sab196087 	START(stack, stack_t);
526c6c9aed4Sab196087 
527c6c9aed4Sab196087 	SCALAR_FIELD(stack_t,	ss_sp,		0);
528c6c9aed4Sab196087 	SCALAR_FIELD(stack_t,	ss_size,	0);
529c6c9aed4Sab196087 	SCALAR_FIELD(stack_t,	ss_flags,	0);
530c6c9aed4Sab196087 
531c6c9aed4Sab196087 	END;
532c6c9aed4Sab196087 }
533c6c9aed4Sab196087 
534c6c9aed4Sab196087 /* sysset_t, <sys/syscall.h> */
535c6c9aed4Sab196087 static void
gen_sysset(void)536c6c9aed4Sab196087 gen_sysset(void)
537c6c9aed4Sab196087 {
538c6c9aed4Sab196087 	START(sysset, sysset_t);
539c6c9aed4Sab196087 
540c6c9aed4Sab196087 	ARRAY_FIELD(sysset_t,	word,	0);
541c6c9aed4Sab196087 
542c6c9aed4Sab196087 	END;
543c6c9aed4Sab196087 }
544c6c9aed4Sab196087 
545c6c9aed4Sab196087 /* timestruc_t, <sys/time_impl.h> */
546c6c9aed4Sab196087 static void
gen_timestruc(void)547c6c9aed4Sab196087 gen_timestruc(void)
548c6c9aed4Sab196087 {
549c6c9aed4Sab196087 	START(timestruc, timestruc_t);
550c6c9aed4Sab196087 
551c6c9aed4Sab196087 	SCALAR_FIELD(timestruc_t,	tv_sec,		0);
552c6c9aed4Sab196087 	SCALAR_FIELD(timestruc_t,	tv_nsec,	0);
553c6c9aed4Sab196087 
554c6c9aed4Sab196087 	END;
555c6c9aed4Sab196087 }
556c6c9aed4Sab196087 
557c6c9aed4Sab196087 /* struct utsname, <sys/utsname.h> */
558c6c9aed4Sab196087 static void
gen_utsname(void)559c6c9aed4Sab196087 gen_utsname(void)
560c6c9aed4Sab196087 {
561c6c9aed4Sab196087 	START(utsname, struct utsname);
562c6c9aed4Sab196087 
563c6c9aed4Sab196087 	ARRAY_FIELD(struct utsname,	sysname,	0);
564c6c9aed4Sab196087 	ARRAY_FIELD(struct utsname,	nodename,	0);
565c6c9aed4Sab196087 	ARRAY_FIELD(struct utsname,	release,	0);
566c6c9aed4Sab196087 	ARRAY_FIELD(struct utsname,	version,	0);
567c6c9aed4Sab196087 	ARRAY_FIELD(struct utsname,	machine,	0);
568c6c9aed4Sab196087 
569c6c9aed4Sab196087 	END;
570c6c9aed4Sab196087 }
571c6c9aed4Sab196087 
572894fa7baSRichard Lowe static void
gen_prfdinfo(void)573894fa7baSRichard Lowe gen_prfdinfo(void)
574894fa7baSRichard Lowe {
575a02120c4SAndy Fiddaman 	START(prfdinfo, prfdinfo_core_t);
576894fa7baSRichard Lowe 
577a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_fd,		0);
578a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_mode,	0);
579a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_uid,		0);
580a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_gid,		0);
581a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_major,	0);
582a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_minor,	0);
583a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_rmajor,	0);
584a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_rminor,	0);
585a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_ino,		0);
586a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_offset,	0);
587a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_size,	0);
588a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_fileflags,	0);
589a02120c4SAndy Fiddaman 	SCALAR_FIELD(prfdinfo_core_t,	pr_fdflags,	0);
590a02120c4SAndy Fiddaman 	ARRAY_FIELD(prfdinfo_core_t,	pr_path,	0);
591894fa7baSRichard Lowe 
592894fa7baSRichard Lowe 	END;
593894fa7baSRichard Lowe }
594894fa7baSRichard Lowe 
595d2a70789SRichard Lowe static void
gen_prsecflags(void)596d2a70789SRichard Lowe gen_prsecflags(void)
597d2a70789SRichard Lowe {
598d2a70789SRichard Lowe 	START(prsecflags, prsecflags_t);
599d2a70789SRichard Lowe 	SCALAR_FIELD(prsecflags_t, pr_version, 0);
600d2a70789SRichard Lowe 	SCALAR_FIELD(prsecflags_t, pr_effective, 0);
601d2a70789SRichard Lowe 	SCALAR_FIELD(prsecflags_t, pr_inherit, 0);
602d2a70789SRichard Lowe 	SCALAR_FIELD(prsecflags_t, pr_lower, 0);
603d2a70789SRichard Lowe 	SCALAR_FIELD(prsecflags_t, pr_upper, 0);
604d2a70789SRichard Lowe 	END;
605d2a70789SRichard Lowe }
606c6c9aed4Sab196087 
607ab618543SJohn Levon static void
gen_prlwpname(void)608ab618543SJohn Levon gen_prlwpname(void)
609ab618543SJohn Levon {
610ab618543SJohn Levon 	START(prlwpname, prlwpname_t);
611ab618543SJohn Levon 	SCALAR_FIELD(prlwpname_t, pr_lwpid, 0);
612ab618543SJohn Levon 	ARRAY_FIELD(prlwpname_t, pr_lwpname, 0);
613ab618543SJohn Levon 	END;
614ab618543SJohn Levon }
615ab618543SJohn Levon 
616350ffdd5SRobert Mustacchi static void
gen_prupanic(void)617350ffdd5SRobert Mustacchi gen_prupanic(void)
618350ffdd5SRobert Mustacchi {
619350ffdd5SRobert Mustacchi 	START(prupanic, prupanic_t);
620350ffdd5SRobert Mustacchi 	SCALAR_FIELD(prupanic_t, pru_version, 0);
621350ffdd5SRobert Mustacchi 	SCALAR_FIELD(prupanic_t, pru_flags, 0);
622350ffdd5SRobert Mustacchi 	ARRAY_FIELD(prupanic_t, pru_data, 0);
623350ffdd5SRobert Mustacchi 	END;
624350ffdd5SRobert Mustacchi }
625350ffdd5SRobert Mustacchi 
626*f1cd2b6cSRobert Mustacchi static void
gen_prcwd(void)627*f1cd2b6cSRobert Mustacchi gen_prcwd(void)
628*f1cd2b6cSRobert Mustacchi {
629*f1cd2b6cSRobert Mustacchi 	START(prcwd, prcwd_t);
630*f1cd2b6cSRobert Mustacchi 	SCALAR_FIELD(prcwd_t, prcwd_fsid, 0);
631*f1cd2b6cSRobert Mustacchi 	ARRAY_FIELD(prcwd_t, prcwd_fsname, 0);
632*f1cd2b6cSRobert Mustacchi 	ARRAY_FIELD(prcwd_t, prcwd_mntpt, 0);
633*f1cd2b6cSRobert Mustacchi 	ARRAY_FIELD(prcwd_t, prcwd_mntspec, 0);
634*f1cd2b6cSRobert Mustacchi 	ARRAY_FIELD(prcwd_t, prcwd_cwd, 0);
635*f1cd2b6cSRobert Mustacchi 	END;
636*f1cd2b6cSRobert Mustacchi }
637*f1cd2b6cSRobert Mustacchi 
638c6c9aed4Sab196087 /*ARGSUSED*/
639c6c9aed4Sab196087 int
main(int argc,char * argv[])640c6c9aed4Sab196087 main(int argc, char *argv[])
641c6c9aed4Sab196087 {
642c6c9aed4Sab196087 	const char *fmt = "\t&%s_layout,\n";
643c6c9aed4Sab196087 
6441886f67eSGordon Ross 	/* get obj file for input */
6451886f67eSGordon Ross 	if (argc < 3) {
6461886f67eSGordon Ross 		(void) fprintf(stderr,
6471886f67eSGordon Ross 		    "usage: %s {object_file} {MACH}\n", argv[0]);
6481886f67eSGordon Ross 		exit(1);
6491886f67eSGordon Ross 	}
6501886f67eSGordon Ross 
6511886f67eSGordon Ross 	objfile = argv[1];
6521886f67eSGordon Ross 	machname = argv[2];
6531886f67eSGordon Ross 
6541886f67eSGordon Ross 	get_ctf_file(objfile);
6551886f67eSGordon Ross 
6561886f67eSGordon Ross 	(void) printf("#include <struct_layout.h>\n");
657c6c9aed4Sab196087 
658c6c9aed4Sab196087 	gen_auxv();
659c6c9aed4Sab196087 	gen_prgregset();
660c6c9aed4Sab196087 	gen_lwpstatus();
661c6c9aed4Sab196087 	gen_pstatus();
662c6c9aed4Sab196087 	gen_prstatus();
663c6c9aed4Sab196087 	gen_psinfo();
664c6c9aed4Sab196087 	gen_prpsinfo();
665c6c9aed4Sab196087 	gen_lwpsinfo();
666c6c9aed4Sab196087 	gen_prcred();
667c6c9aed4Sab196087 	gen_prpriv();
668c6c9aed4Sab196087 	gen_priv_impl_info();
669c6c9aed4Sab196087 	gen_fltset();
670c6c9aed4Sab196087 	gen_siginfo();
671c6c9aed4Sab196087 	gen_sigset();
672c6c9aed4Sab196087 	gen_sigaction();
673c6c9aed4Sab196087 	gen_stack();
674c6c9aed4Sab196087 	gen_sysset();
675c6c9aed4Sab196087 	gen_timestruc();
676c6c9aed4Sab196087 	gen_utsname();
677894fa7baSRichard Lowe 	gen_prfdinfo();
678d2a70789SRichard Lowe 	gen_prsecflags();
679ab618543SJohn Levon 	gen_prlwpname();
680350ffdd5SRobert Mustacchi 	gen_prupanic();
681*f1cd2b6cSRobert Mustacchi 	gen_prcwd();
682c6c9aed4Sab196087 
683c6c9aed4Sab196087 	/*
684c6c9aed4Sab196087 	 * Generate the full arch_layout description
685c6c9aed4Sab196087 	 */
686c6c9aed4Sab196087 	(void) printf(
687c6c9aed4Sab196087 	    "\n\n\n\nstatic const sl_arch_layout_t layout_%s = {\n",
6881886f67eSGordon Ross 	    machname);
689c6c9aed4Sab196087 	(void) printf(fmt, "auxv");
690c6c9aed4Sab196087 	(void) printf(fmt, "fltset");
691c6c9aed4Sab196087 	(void) printf(fmt, "lwpsinfo");
692c6c9aed4Sab196087 	(void) printf(fmt, "lwpstatus");
693c6c9aed4Sab196087 	(void) printf(fmt, "prcred");
694c6c9aed4Sab196087 	(void) printf(fmt, "priv_impl_info");
695c6c9aed4Sab196087 	(void) printf(fmt, "prpriv");
696c6c9aed4Sab196087 	(void) printf(fmt, "psinfo");
697c6c9aed4Sab196087 	(void) printf(fmt, "pstatus");
698c6c9aed4Sab196087 	(void) printf(fmt, "prgregset");
699c6c9aed4Sab196087 	(void) printf(fmt, "prpsinfo");
700c6c9aed4Sab196087 	(void) printf(fmt, "prstatus");
701c6c9aed4Sab196087 	(void) printf(fmt, "sigaction");
702c6c9aed4Sab196087 	(void) printf(fmt, "siginfo");
703c6c9aed4Sab196087 	(void) printf(fmt, "sigset");
704c6c9aed4Sab196087 	(void) printf(fmt, "stack");
705c6c9aed4Sab196087 	(void) printf(fmt, "sysset");
706c6c9aed4Sab196087 	(void) printf(fmt, "timestruc");
707c6c9aed4Sab196087 	(void) printf(fmt, "utsname");
708894fa7baSRichard Lowe 	(void) printf(fmt, "prfdinfo");
709d2a70789SRichard Lowe 	(void) printf(fmt, "prsecflags");
710ab618543SJohn Levon 	(void) printf(fmt, "prlwpname");
711350ffdd5SRobert Mustacchi 	(void) printf(fmt, "prupanic");
712*f1cd2b6cSRobert Mustacchi 	(void) printf(fmt, "prcwd");
713c6c9aed4Sab196087 	(void) printf("};\n");
714c6c9aed4Sab196087 
715c6c9aed4Sab196087 	/*
716c6c9aed4Sab196087 	 * A public function, to make the information available
717c6c9aed4Sab196087 	 */
718c6c9aed4Sab196087 	(void) printf("\n\nconst sl_arch_layout_t *\n");
7191886f67eSGordon Ross 	(void) printf("struct_layout_%s(void)\n", machname);
7201886f67eSGordon Ross 	(void) printf("{\n\treturn (&layout_%s);\n}\n", machname);
721c6c9aed4Sab196087 
722c6c9aed4Sab196087 	return (0);
723c6c9aed4Sab196087 }
7241886f67eSGordon Ross 
7251886f67eSGordon Ross /*
7261886f67eSGordon Ross  * Helper functions using the CTF library to get type info.
7271886f67eSGordon Ross  */
7281886f67eSGordon Ross 
7291886f67eSGordon Ross static void
get_ctf_file(char * fname)7301886f67eSGordon Ross get_ctf_file(char *fname)
7311886f67eSGordon Ross {
7321886f67eSGordon Ross 	int ctferr;
7331886f67eSGordon Ross 
7341886f67eSGordon Ross 	objfile = fname;
7351886f67eSGordon Ross 	if ((ctf = ctf_open(objfile, &ctferr)) == NULL) {
7361886f67eSGordon Ross 		errx(1, "Couldn't open object file %s: %s\n", objfile,
7371886f67eSGordon Ross 		    ctf_errmsg(ctferr));
7381886f67eSGordon Ross 	}
7391886f67eSGordon Ross }
7401886f67eSGordon Ross 
7411886f67eSGordon Ross static void
print_row(int boff,int eltlen,int nelts,int issigned,char * comment)7421886f67eSGordon Ross print_row(int boff, int eltlen, int nelts, int issigned, char *comment)
7431886f67eSGordon Ross {
7441886f67eSGordon Ross 	(void) printf("\t{ %d,\t%d,\t%d,\t%d },\t\t/* %s */\n",
7451886f67eSGordon Ross 	    boff, eltlen, nelts, issigned, comment);
7461886f67eSGordon Ross }
7471886f67eSGordon Ross 
7481886f67eSGordon Ross static void
do_start(char * sname,char * tname)7491886f67eSGordon Ross do_start(char *sname, char *tname)
7501886f67eSGordon Ross {
7511886f67eSGordon Ross 	do_start_name(sname);
7521886f67eSGordon Ross 	do_start_sizeof(tname, NULL);
7531886f67eSGordon Ross }
7541886f67eSGordon Ross 
7551886f67eSGordon Ross static void
do_start_name(char * sname)7561886f67eSGordon Ross do_start_name(char *sname)
7571886f67eSGordon Ross {
7581886f67eSGordon Ross 	(void) printf("\n\nstatic const sl_%s_layout_t %s_layout = {\n",
7591886f67eSGordon Ross 	    sname, sname);
7601886f67eSGordon Ross }
7611886f67eSGordon Ross 
7621886f67eSGordon Ross static void
do_end(void)7631886f67eSGordon Ross do_end(void)
7641886f67eSGordon Ross {
7651886f67eSGordon Ross 	(void) printf("};\n");
7661886f67eSGordon Ross }
7671886f67eSGordon Ross 
7681886f67eSGordon Ross static void
do_start_sizeof(char * tname,char * rtname)7691886f67eSGordon Ross do_start_sizeof(char *tname, char *rtname)
7701886f67eSGordon Ross {
7711886f67eSGordon Ross 	char comment[100];
7721886f67eSGordon Ross 	ctf_id_t stype;
7731886f67eSGordon Ross 	int sz;
7741886f67eSGordon Ross 
7751886f67eSGordon Ross 	if (rtname == NULL)
7761886f67eSGordon Ross 		rtname = tname;
7771886f67eSGordon Ross 
7781886f67eSGordon Ross 	if ((stype = ctf_lookup_by_name(ctf, rtname)) == CTF_ERR)
7791886f67eSGordon Ross 		errx(1, "Couldn't find type %s", rtname);
7801886f67eSGordon Ross 	if ((stype = ctf_type_resolve(ctf, stype)) == CTF_ERR)
7811886f67eSGordon Ross 		errx(1, "Couldn't resolve type %s", tname);
7821886f67eSGordon Ross 
7831886f67eSGordon Ross 	if ((sz = (int)ctf_type_size(ctf, stype)) < 0) {
7841886f67eSGordon Ross 		errx(1, "Couldn't get size for type %s", tname);
7851886f67eSGordon Ross 	} else if (sz == 0) {
7861886f67eSGordon Ross 		errx(1, "Invalid type size 0 for %s", tname);
7871886f67eSGordon Ross 	}
7881886f67eSGordon Ross 
7891886f67eSGordon Ross 	(void) snprintf(comment, sizeof (comment), "sizeof (%s)", tname);
7901886f67eSGordon Ross 	print_row(0, sz, 0, 0, comment);
7911886f67eSGordon Ross }
7921886f67eSGordon Ross 
7931886f67eSGordon Ross static void
do_scalar_field(char * tname,char * fname,int _sign,char * dotfield)7941886f67eSGordon Ross do_scalar_field(char *tname, char *fname, int _sign, char *dotfield)
7951886f67eSGordon Ross {
7961886f67eSGordon Ross 	int rc, off, sz, ftype;
7971886f67eSGordon Ross 
7981886f67eSGordon Ross 	rc = get_field_info(tname, fname, dotfield, &off, &ftype);
7991886f67eSGordon Ross 	if (rc < 0)
8001886f67eSGordon Ross 		errx(1, "Can't get field info for %s->%s", tname, fname);
8011886f67eSGordon Ross 
8021886f67eSGordon Ross 	if ((ftype = ctf_type_resolve(ctf, ftype)) == CTF_ERR)
8031886f67eSGordon Ross 		errx(1, "Couldn't resolve type of %s->%s", tname, fname);
8041886f67eSGordon Ross 
8051886f67eSGordon Ross 	if ((sz = (int)ctf_type_size(ctf, ftype)) < 0) {
8061886f67eSGordon Ross 		errx(1, "Couldn't get size for type ID %d", ftype);
8071886f67eSGordon Ross 	} else if (sz == 0) {
8081886f67eSGordon Ross 		errx(1, "Invalid type size 0 for type ID %d", ftype);
8091886f67eSGordon Ross 	}
8101886f67eSGordon Ross 
8111886f67eSGordon Ross 	print_row(off, sz, 0, _sign, fname);
8121886f67eSGordon Ross }
8131886f67eSGordon Ross 
8141886f67eSGordon Ross static void
do_array_field(char * tname,char * fname,int _sign,char * dotfield)8151886f67eSGordon Ross do_array_field(char *tname, char *fname,
8161886f67eSGordon Ross     int _sign, char *dotfield)
8171886f67eSGordon Ross {
8181886f67eSGordon Ross 	char comment[100];
8191886f67eSGordon Ross 	ctf_arinfo_t ai;
8201886f67eSGordon Ross 	int typekind;
8211886f67eSGordon Ross 	int esz, rc, off, ftype;
8221886f67eSGordon Ross 
8231886f67eSGordon Ross 	rc = get_field_info(tname, fname, dotfield, &off, &ftype);
8241886f67eSGordon Ross 	if (rc < 0)
8251886f67eSGordon Ross 		errx(1, "Can't get field info for %s->%s", tname, fname);
8261886f67eSGordon Ross 
8271886f67eSGordon Ross 	if ((ftype = ctf_type_resolve(ctf, ftype)) == CTF_ERR)
8281886f67eSGordon Ross 		errx(1, "Couldn't resolve type of %s->%s", tname, fname);
8291886f67eSGordon Ross 
8301886f67eSGordon Ross 	typekind = ctf_type_kind(ctf, ftype);
8311886f67eSGordon Ross 	if (typekind != CTF_K_ARRAY)
8321886f67eSGordon Ross 		errx(1, "Wrong type for %s->%s", tname, fname);
8331886f67eSGordon Ross 
8341886f67eSGordon Ross 	rc = ctf_array_info(ctf, ftype, &ai);
8351886f67eSGordon Ross 	if (rc != 0)
8361886f67eSGordon Ross 		errx(1, "Can't get array info for %s->%s\n", tname, fname);
8371886f67eSGordon Ross 	esz = ctf_type_size(ctf, ai.ctr_contents);
8381886f67eSGordon Ross 	if (esz < 0)
8391886f67eSGordon Ross 		errx(1, "Can't get element size for %s->%s\n", tname, fname);
8401886f67eSGordon Ross 
8411886f67eSGordon Ross 	(void) snprintf(comment, sizeof (comment), "%s[]", fname);
8421886f67eSGordon Ross 	print_row(off, esz, ai.ctr_nelems, _sign, comment);
8431886f67eSGordon Ross }
8441886f67eSGordon Ross 
8451886f67eSGordon Ross static void
do_array_type(char * tname,char * fname,int _sign)8461886f67eSGordon Ross do_array_type(char *tname, char *fname,	int _sign)
8471886f67eSGordon Ross {
8481886f67eSGordon Ross 	ctf_arinfo_t ai;
8491886f67eSGordon Ross 	int stype, typekind;
8501886f67eSGordon Ross 	int esz, rc;
8511886f67eSGordon Ross 
8521886f67eSGordon Ross 	if ((stype = ctf_lookup_by_name(ctf, tname)) == CTF_ERR)
8531886f67eSGordon Ross 		errx(1, "Couldn't find type %s", tname);
8541886f67eSGordon Ross 	if ((stype = ctf_type_resolve(ctf, stype)) == CTF_ERR)
8551886f67eSGordon Ross 		errx(1, "Couldn't resolve type %s", tname);
8561886f67eSGordon Ross 
8571886f67eSGordon Ross 	typekind = ctf_type_kind(ctf, stype);
8581886f67eSGordon Ross 	if (typekind != CTF_K_ARRAY)
8591886f67eSGordon Ross 		errx(1, "Wrong type for %s->%s", tname, fname);
8601886f67eSGordon Ross 
8611886f67eSGordon Ross 	rc = ctf_array_info(ctf, stype, &ai);
8621886f67eSGordon Ross 	if (rc != 0)
8631886f67eSGordon Ross 		errx(1, "Can't get array info for %s->%s\n", tname, fname);
8641886f67eSGordon Ross 	esz = ctf_type_size(ctf, ai.ctr_contents);
8651886f67eSGordon Ross 	if (esz < 0)
8661886f67eSGordon Ross 		errx(1, "Can't get element size for %s->%s\n", tname, fname);
8671886f67eSGordon Ross 
8681886f67eSGordon Ross 	print_row(0, esz, ai.ctr_nelems, _sign, fname);
8691886f67eSGordon Ross }
8701886f67eSGordon Ross 
8711886f67eSGordon Ross 
8721886f67eSGordon Ross struct gfinfo {
8731886f67eSGordon Ross 	char *tname;	/* top type name, i.e. the struct */
8741886f67eSGordon Ross 	char *fname;	/* field name */
8751886f67eSGordon Ross 	char *dotname;	/* full field name with dots (optional) */
8761886f67eSGordon Ross 	char *prefix;	/* current field search prefix */
8771886f67eSGordon Ross 	int base_off;
8781886f67eSGordon Ross 	int fld_off;
8791886f67eSGordon Ross 	int fld_type;
8801886f67eSGordon Ross };
8811886f67eSGordon Ross 
8821886f67eSGordon Ross static int gfi_iter(const char *fname, ctf_id_t mbrtid,
8831886f67eSGordon Ross 	ulong_t off, void *varg);
8841886f67eSGordon Ross 
8851886f67eSGordon Ross /*
8861886f67eSGordon Ross  * Lookup field "fname" in type "tname".  If "dotname" is non-NULL,
8871886f67eSGordon Ross  * that's the full field name with dots, i.e. a_un.un_foo, which
8881886f67eSGordon Ross  * we must search for by walking the struct CTF recursively.
8891886f67eSGordon Ross  */
8901886f67eSGordon Ross static int
get_field_info(char * tname,char * fname,char * dotname,int * offp,int * tidp)8911886f67eSGordon Ross get_field_info(char *tname, char *fname, char *dotname,
8921886f67eSGordon Ross     int *offp, int *tidp)
8931886f67eSGordon Ross {
8941886f67eSGordon Ross 	struct gfinfo gfi;
8951886f67eSGordon Ross 	ctf_id_t stype;
8961886f67eSGordon Ross 	int typekind;
8971886f67eSGordon Ross 	int rc;
8981886f67eSGordon Ross 
8991886f67eSGordon Ross 	if ((stype = ctf_lookup_by_name(ctf, tname)) == CTF_ERR)
9001886f67eSGordon Ross 		errx(1, "Couldn't find type %s", tname);
9011886f67eSGordon Ross 	if ((stype = ctf_type_resolve(ctf, stype)) == CTF_ERR)
9021886f67eSGordon Ross 		errx(1, "Couldn't resolve type %s", tname);
9031886f67eSGordon Ross 
9041886f67eSGordon Ross 	/* If fname has a dot, use it as dotname too. */
9051886f67eSGordon Ross 	if (dotname == NULL && strchr(fname, '.') != NULL)
9061886f67eSGordon Ross 		dotname = fname;
9071886f67eSGordon Ross 
9081886f67eSGordon Ross 	gfi.tname = tname;
9091886f67eSGordon Ross 	gfi.fname = fname;
9101886f67eSGordon Ross 	gfi.dotname = dotname;
9111886f67eSGordon Ross 	gfi.prefix = "";
9121886f67eSGordon Ross 	gfi.base_off = 0;
9131886f67eSGordon Ross 	gfi.fld_off = 0;
9141886f67eSGordon Ross 	gfi.fld_type = 0;
9151886f67eSGordon Ross 
9161886f67eSGordon Ross 	typekind = ctf_type_kind(ctf, stype);
9171886f67eSGordon Ross 	switch (typekind) {
9181886f67eSGordon Ross 
9191886f67eSGordon Ross 	case CTF_K_STRUCT:
9201886f67eSGordon Ross 	case CTF_K_UNION:
9211886f67eSGordon Ross 		rc = ctf_member_iter(ctf, stype, gfi_iter, &gfi);
9221886f67eSGordon Ross 		break;
9231886f67eSGordon Ross 
9241886f67eSGordon Ross 	default:
9251886f67eSGordon Ross 		errx(1, "Unexpected top-level type for %s", tname);
9261886f67eSGordon Ross 		break;
9271886f67eSGordon Ross 	}
9281886f67eSGordon Ross 
9291886f67eSGordon Ross 	if (rc < 0)
9306b1325cfSRobert Mustacchi 		errx(1, "Error getting info for %s.%s", tname, fname);
9311886f67eSGordon Ross 	if (rc == 0)
9321886f67eSGordon Ross 		errx(1, "Did not find %s.%s", tname, fname);
9331886f67eSGordon Ross 
9341886f67eSGordon Ross 	*offp = gfi.fld_off;
9351886f67eSGordon Ross 	*tidp = gfi.fld_type;
9361886f67eSGordon Ross 
9371886f67eSGordon Ross 	return (0);
9381886f67eSGordon Ross }
9391886f67eSGordon Ross 
9401886f67eSGordon Ross /*
9411886f67eSGordon Ross  * Iteration callback for ctf_member_iter
9421886f67eSGordon Ross  * Return <0 on error, 0 to keep looking, >0 for found.
9431886f67eSGordon Ross  *
9441886f67eSGordon Ross  * If no dotname, simple search for fieldname.
9451886f67eSGordon Ross  * If we're asked to search with dotname, we need to do a full
9461886f67eSGordon Ross  * recursive walk of the types under the dotname.
9471886f67eSGordon Ross  */
9481886f67eSGordon Ross int
gfi_iter(const char * fieldname,ctf_id_t mbrtid,ulong_t off,void * varg)9491886f67eSGordon Ross gfi_iter(const char *fieldname, ctf_id_t mbrtid, ulong_t off, void *varg)
9501886f67eSGordon Ross {
9511886f67eSGordon Ross 	char namebuf[100];
9521886f67eSGordon Ross 	struct gfinfo *gfi = varg;
9531886f67eSGordon Ross 	char *saveprefix;
9541886f67eSGordon Ross 	int saveoff;
9551886f67eSGordon Ross 	int typekind;
9561886f67eSGordon Ross 	int byteoff;
9571886f67eSGordon Ross 	int len, rc;
9581886f67eSGordon Ross 
9591886f67eSGordon Ross 	byteoff = gfi->base_off + (int)(off >> 3);
9601886f67eSGordon Ross 
9611886f67eSGordon Ross 	/* Easy cases first: no dotname */
9621886f67eSGordon Ross 	if (gfi->dotname == NULL) {
9631886f67eSGordon Ross 		if (strcmp(gfi->fname, fieldname) == 0) {
9641886f67eSGordon Ross 			gfi->fld_off = byteoff;
9651886f67eSGordon Ross 			gfi->fld_type = mbrtid;
9661886f67eSGordon Ross 			return (1);
9671886f67eSGordon Ross 		}
9681886f67eSGordon Ross 		return (0);
9691886f67eSGordon Ross 	}
9701886f67eSGordon Ross 
9711886f67eSGordon Ross 	/* Exact match on the dotname? */
9721886f67eSGordon Ross 	(void) snprintf(namebuf, sizeof (namebuf), "%s%s",
9731886f67eSGordon Ross 	    gfi->prefix, fieldname);
9741886f67eSGordon Ross 	if (strcmp(gfi->dotname, namebuf) == 0) {
9751886f67eSGordon Ross 		gfi->fld_off = byteoff;
9761886f67eSGordon Ross 		gfi->fld_type = mbrtid;
9771886f67eSGordon Ross 		return (1);
9781886f67eSGordon Ross 	}
9791886f67eSGordon Ross 
9801886f67eSGordon Ross 	/*
9811886f67eSGordon Ross 	 * May need to recurse under this field, but
9821886f67eSGordon Ross 	 * only if there's a match through '.'
9831886f67eSGordon Ross 	 */
9841886f67eSGordon Ross 	(void) strlcat(namebuf, ".", sizeof (namebuf));
9851886f67eSGordon Ross 	len = strlen(namebuf);
9861886f67eSGordon Ross 	if (strncmp(gfi->dotname, namebuf, len) != 0)
9871886f67eSGordon Ross 		return (0);
9881886f67eSGordon Ross 
9891886f67eSGordon Ross 	typekind = ctf_type_kind(ctf, mbrtid);
9901886f67eSGordon Ross 	switch (typekind) {
9911886f67eSGordon Ross 	case CTF_K_STRUCT:
9921886f67eSGordon Ross 	case CTF_K_UNION:
9931886f67eSGordon Ross 		break;
9941886f67eSGordon Ross 	default:
9951886f67eSGordon Ross 		return (0);
9961886f67eSGordon Ross 	}
9971886f67eSGordon Ross 
9981886f67eSGordon Ross 	/* Recursively walk members */
9991886f67eSGordon Ross 	saveprefix = gfi->prefix;
10001886f67eSGordon Ross 	saveoff = gfi->base_off;
10011886f67eSGordon Ross 	gfi->prefix = namebuf;
10021886f67eSGordon Ross 	gfi->base_off = byteoff;
10031886f67eSGordon Ross 	rc = ctf_member_iter(ctf, mbrtid, gfi_iter, gfi);
10041886f67eSGordon Ross 	gfi->prefix = saveprefix;
10051886f67eSGordon Ross 	gfi->base_off = saveoff;
10061886f67eSGordon Ross 
10071886f67eSGordon Ross 	return (rc);
10081886f67eSGordon Ross }
1009