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