1*6635Sab196087 /*
2*6635Sab196087 * CDDL HEADER START
3*6635Sab196087 *
4*6635Sab196087 * The contents of this file are subject to the terms of the
5*6635Sab196087 * Common Development and Distribution License (the "License").
6*6635Sab196087 * You may not use this file except in compliance with the License.
7*6635Sab196087 *
8*6635Sab196087 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*6635Sab196087 * or http://www.opensolaris.org/os/licensing.
10*6635Sab196087 * See the License for the specific language governing permissions
11*6635Sab196087 * and limitations under the License.
12*6635Sab196087 *
13*6635Sab196087 * When distributing Covered Code, include this CDDL HEADER in each
14*6635Sab196087 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*6635Sab196087 * If applicable, add the following below this CDDL HEADER, with the
16*6635Sab196087 * fields enclosed by brackets "[]" replaced with your own identifying
17*6635Sab196087 * information: Portions Copyright [yyyy] [name of copyright owner]
18*6635Sab196087 *
19*6635Sab196087 * CDDL HEADER END
20*6635Sab196087 */
21*6635Sab196087
22*6635Sab196087 /*
23*6635Sab196087 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24*6635Sab196087 * Use is subject to license terms.
25*6635Sab196087 */
26*6635Sab196087 #pragma ident "%Z%%M% %I% %E% SMI"
27*6635Sab196087
28*6635Sab196087
29*6635Sab196087 #include <stdlib.h>
30*6635Sab196087 #include <stddef.h>
31*6635Sab196087 #include <stdio.h>
32*6635Sab196087 #include <string.h>
33*6635Sab196087 #include <fcntl.h>
34*6635Sab196087 #include <sys/types.h>
35*6635Sab196087 #include <sys/stat.h>
36*6635Sab196087 #include <unistd.h>
37*6635Sab196087 #include <sys/sysmacros.h>
38*6635Sab196087 #include <sys/corectl.h>
39*6635Sab196087 #include <procfs.h>
40*6635Sab196087 #include <sys/auxv.h>
41*6635Sab196087 #include <sys/old_procfs.h>
42*6635Sab196087 #include <sys/utsname.h>
43*6635Sab196087
44*6635Sab196087
45*6635Sab196087
46*6635Sab196087 /*
47*6635Sab196087 * This standalone program is used to generate the contents
48*6635Sab196087 * of the struct_layout_XXX.c files that contain per-archtecture
49*6635Sab196087 * structure layout information.
50*6635Sab196087 *
51*6635Sab196087 * Although not part of elfdump, it is built by the makefile
52*6635Sab196087 * along with it.
53*6635Sab196087 * To use it:
54*6635Sab196087 *
55*6635Sab196087 * 1) Run it, capturing the output in a file.
56*6635Sab196087 * 2) If this is a replacement for an existing file,
57*6635Sab196087 * diff the new and old copies to ensure only
58*6635Sab196087 * the changes you expected are present.
59*6635Sab196087 * 3) Put the new file in the common directory under the name
60*6635Sab196087 * struct_layout_XXX.c, where XXX is the name of
61*6635Sab196087 * the architecture (i386, amd64, sparc, sparcv9, etc).
62*6635Sab196087 * 2) Add any necessary header and copyright comments.
63*6635Sab196087 * 3) If this is a new architecture:
64*6635Sab196087 * - Add an extern statement for struct_layout_XXX()
65*6635Sab196087 * to struct_layout.h
66*6635Sab196087 * - Add a case for it to the function sl_struct_layout()
67*6635Sab196087 * in struct_layout.c.
68*6635Sab196087 */
69*6635Sab196087
70*6635Sab196087
71*6635Sab196087 /*
72*6635Sab196087 * Which machine is this build for?
73*6635Sab196087 */
74*6635Sab196087 #if defined(__i386)
75*6635Sab196087
76*6635Sab196087 #define MACH "i386"
77*6635Sab196087
78*6635Sab196087 #elif defined(__amd64)
79*6635Sab196087
80*6635Sab196087 #define MACH "amd64"
81*6635Sab196087
82*6635Sab196087 #elif defined(__sparcv9)
83*6635Sab196087
84*6635Sab196087 #define MACH "sparcv9"
85*6635Sab196087
86*6635Sab196087 #elif defined(__sparc)
87*6635Sab196087
88*6635Sab196087 #define MACH "sparc"
89*6635Sab196087
90*6635Sab196087 #else
91*6635Sab196087
92*6635Sab196087 #error "unrecognized build host type"
93*6635Sab196087
94*6635Sab196087 #endif
95*6635Sab196087
96*6635Sab196087
97*6635Sab196087 /*
98*6635Sab196087 * START and END bracket a struct layout definition. They issue
99*6635Sab196087 * the typedef boilerplate, and the standard first element (sizeof)
100*6635Sab196087 * which captures the overall size of the structure.
101*6635Sab196087 *
102*6635Sab196087 * SCALAR_FIELD is for scalar struct fields
103*6635Sab196087 *
104*6635Sab196087 * ARRAY_FIELD is for array struct fields
105*6635Sab196087 *
106*6635Sab196087 * ARRAY is for plain (non-struct) array types
107*6635Sab196087 */
108*6635Sab196087 #define START(_name, _type) \
109*6635Sab196087 (void) printf("\n\nstatic const sl_" #_name \
110*6635Sab196087 "_layout_t " #_name "_layout = {\n"); \
111*6635Sab196087 (void) printf("\t{ 0,\t%d,\t0,\t0 },\t\t/* sizeof (%s) */\n", \
112*6635Sab196087 sizeof (_type), #_type)
113*6635Sab196087 #define SCALAR_FIELD(_type, _field, _sign) \
114*6635Sab196087 (void) printf("\t{ %d,\t%d,\t0,\t%d },\t\t/* " #_field " */\n", \
115*6635Sab196087 offsetof(_type, _field), sizeof (((_type *)0)->_field), _sign)
116*6635Sab196087 #define ARRAY_FIELD(_type, _field, _sign) \
117*6635Sab196087 (void) printf("\t{ %d,\t%d,\t%d,\t%d },\t\t/* " #_field "[] */\n", \
118*6635Sab196087 offsetof(_type, _field), sizeof (((_type *)0)->_field[0]), \
119*6635Sab196087 sizeof (((_type *)0)->_field) / sizeof (((_type *)0)->_field[0]), \
120*6635Sab196087 _sign)
121*6635Sab196087 #define ARRAY(_type, _sign) \
122*6635Sab196087 (void) printf("\t{ 0,\t%d,\t%d,\t%d },\t\t/* elt0 */\n", \
123*6635Sab196087 sizeof (*((_type *)0)[0]), \
124*6635Sab196087 sizeof (_type) / sizeof (*((_type *)0)[0]), _sign)
125*6635Sab196087 #define END (void) printf("};\n")
126*6635Sab196087
127*6635Sab196087
128*6635Sab196087 /* auxv_t, <sys/auxv.h> */
129*6635Sab196087 static void
gen_auxv(void)130*6635Sab196087 gen_auxv(void)
131*6635Sab196087 {
132*6635Sab196087 START(auxv, auxv_t);
133*6635Sab196087
134*6635Sab196087 SCALAR_FIELD(auxv_t, a_type, 1);
135*6635Sab196087 SCALAR_FIELD(auxv_t, a_un.a_val, 1);
136*6635Sab196087 SCALAR_FIELD(auxv_t, a_un.a_ptr, 0);
137*6635Sab196087 SCALAR_FIELD(auxv_t, a_un.a_fcn, 0);
138*6635Sab196087
139*6635Sab196087 END;
140*6635Sab196087 }
141*6635Sab196087
142*6635Sab196087
143*6635Sab196087 /* prgregset_t, <sys/prgregset.h> */
144*6635Sab196087 static void
gen_prgregset(void)145*6635Sab196087 gen_prgregset(void)
146*6635Sab196087 {
147*6635Sab196087 START(prgregset, prgregset_t);
148*6635Sab196087
149*6635Sab196087 ARRAY(prgregset_t, 0);
150*6635Sab196087
151*6635Sab196087 END;
152*6635Sab196087 }
153*6635Sab196087
154*6635Sab196087
155*6635Sab196087 /* lwpstatus_t, <sys/procfs.h> */
156*6635Sab196087 static void
gen_lwpstatus(void)157*6635Sab196087 gen_lwpstatus(void)
158*6635Sab196087 {
159*6635Sab196087 START(lwpstatus, lwpstatus_t);
160*6635Sab196087
161*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_flags, 0);
162*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_lwpid, 0);
163*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_why, 0);
164*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_what, 0);
165*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_cursig, 0);
166*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_info, 0);
167*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_lwppend, 0);
168*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_lwphold, 0);
169*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_action, 0);
170*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_altstack, 0);
171*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_oldcontext, 0);
172*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_syscall, 0);
173*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_nsysarg, 0);
174*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_errno, 0);
175*6635Sab196087 ARRAY_FIELD(lwpstatus_t, pr_sysarg, 0);
176*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_rval1, 0);
177*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_rval2, 0);
178*6635Sab196087 ARRAY_FIELD(lwpstatus_t, pr_clname, 0);
179*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_tstamp, 0);
180*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_utime, 0);
181*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_stime, 0);
182*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_errpriv, 0);
183*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_ustack, 0);
184*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_instr, 0);
185*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_reg, 0);
186*6635Sab196087 SCALAR_FIELD(lwpstatus_t, pr_fpreg, 0);
187*6635Sab196087
188*6635Sab196087 END;
189*6635Sab196087 }
190*6635Sab196087
191*6635Sab196087
192*6635Sab196087 /* pstatus_t, <sys/procfs.h> */
193*6635Sab196087 static void
gen_pstatus(void)194*6635Sab196087 gen_pstatus(void)
195*6635Sab196087 {
196*6635Sab196087 START(pstatus, pstatus_t);
197*6635Sab196087
198*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_flags, 1);
199*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_nlwp, 1);
200*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_pid, 0);
201*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_ppid, 0);
202*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_pgid, 0);
203*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_sid, 0);
204*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_aslwpid, 1);
205*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_agentid, 1);
206*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_sigpend, 0);
207*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_brkbase, 0);
208*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_brksize, 0);
209*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_stkbase, 0);
210*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_stksize, 0);
211*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_utime, 0);
212*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_stime, 0);
213*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_cutime, 0);
214*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_cstime, 0);
215*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_sigtrace, 0);
216*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_flttrace, 0);
217*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_sysentry, 0);
218*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_sysexit, 0);
219*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_dmodel, 0);
220*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_taskid, 1);
221*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_projid, 1);
222*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_nzomb, 1);
223*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_zoneid, 1);
224*6635Sab196087 SCALAR_FIELD(pstatus_t, pr_lwp, 0);
225*6635Sab196087
226*6635Sab196087 END;
227*6635Sab196087 }
228*6635Sab196087
229*6635Sab196087
230*6635Sab196087 /* prstatus_t, <sys/old_procfs.h> */
231*6635Sab196087 static void
gen_prstatus(void)232*6635Sab196087 gen_prstatus(void)
233*6635Sab196087 {
234*6635Sab196087 START(prstatus, prstatus_t);
235*6635Sab196087
236*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_flags, 1);
237*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_why, 1);
238*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_what, 1);
239*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_info, 0);
240*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_cursig, 1);
241*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_nlwp, 0);
242*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_sigpend, 0);
243*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_sighold, 0);
244*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_altstack, 0);
245*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_action, 0);
246*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_pid, 0);
247*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_ppid, 0);
248*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_pgrp, 0);
249*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_sid, 0);
250*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_utime, 0);
251*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_stime, 0);
252*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_cutime, 0);
253*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_cstime, 0);
254*6635Sab196087 ARRAY_FIELD(prstatus_t, pr_clname, 0);
255*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_syscall, 1);
256*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_nsysarg, 1);
257*6635Sab196087 ARRAY_FIELD(prstatus_t, pr_sysarg, 1);
258*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_who, 0);
259*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_lwppend, 0);
260*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_oldcontext, 0);
261*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_brkbase, 0);
262*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_brksize, 0);
263*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_stkbase, 0);
264*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_stksize, 0);
265*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_processor, 1);
266*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_bind, 1);
267*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_instr, 1);
268*6635Sab196087 SCALAR_FIELD(prstatus_t, pr_reg, 0);
269*6635Sab196087
270*6635Sab196087 END;
271*6635Sab196087 }
272*6635Sab196087
273*6635Sab196087
274*6635Sab196087 /* psinfo_t, <sys/procfs.h> */
275*6635Sab196087 static void
gen_psinfo(void)276*6635Sab196087 gen_psinfo(void)
277*6635Sab196087 {
278*6635Sab196087 START(psinfo, psinfo_t);
279*6635Sab196087
280*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_flag, 1);
281*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_nlwp, 1);
282*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_pid, 0);
283*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_ppid, 0);
284*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_pgid, 0);
285*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_sid, 0);
286*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_uid, 0);
287*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_euid, 0);
288*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_gid, 0);
289*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_egid, 0);
290*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_addr, 0);
291*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_size, 0);
292*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_rssize, 0);
293*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_ttydev, 0);
294*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_pctcpu, 0);
295*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_pctmem, 0);
296*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_start, 0);
297*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_time, 0);
298*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_ctime, 0);
299*6635Sab196087 ARRAY_FIELD(psinfo_t, pr_fname, 0);
300*6635Sab196087 ARRAY_FIELD(psinfo_t, pr_psargs, 0);
301*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_wstat, 1);
302*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_argc, 1);
303*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_argv, 0);
304*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_envp, 0);
305*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_dmodel, 0);
306*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_taskid, 0);
307*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_projid, 0);
308*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_nzomb, 1);
309*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_poolid, 0);
310*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_zoneid, 0);
311*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_contract, 0);
312*6635Sab196087 SCALAR_FIELD(psinfo_t, pr_lwp, 0);
313*6635Sab196087
314*6635Sab196087 END;
315*6635Sab196087 }
316*6635Sab196087
317*6635Sab196087 /* prpsinfo_t, <sys/old_procfs.h> */
318*6635Sab196087 static void
gen_prpsinfo(void)319*6635Sab196087 gen_prpsinfo(void)
320*6635Sab196087 {
321*6635Sab196087 START(prpsinfo, prpsinfo_t);
322*6635Sab196087
323*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_state, 0);
324*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_sname, 0);
325*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_zomb, 0);
326*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_nice, 0);
327*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_flag, 0);
328*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_uid, 0);
329*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_gid, 0);
330*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_pid, 0);
331*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_ppid, 0);
332*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_pgrp, 0);
333*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_sid, 0);
334*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_addr, 0);
335*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_size, 0);
336*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_rssize, 0);
337*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_wchan, 0);
338*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_start, 0);
339*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_time, 0);
340*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_pri, 1);
341*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_oldpri, 0);
342*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_cpu, 0);
343*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_ottydev, 0);
344*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_lttydev, 0);
345*6635Sab196087 ARRAY_FIELD(prpsinfo_t, pr_clname, 0);
346*6635Sab196087 ARRAY_FIELD(prpsinfo_t, pr_fname, 0);
347*6635Sab196087 ARRAY_FIELD(prpsinfo_t, pr_psargs, 0);
348*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_syscall, 1);
349*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_ctime, 0);
350*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_bysize, 0);
351*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_byrssize, 0);
352*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_argc, 1);
353*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_argv, 0);
354*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_envp, 0);
355*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_wstat, 1);
356*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_pctcpu, 0);
357*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_pctmem, 0);
358*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_euid, 0);
359*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_egid, 0);
360*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_aslwpid, 0);
361*6635Sab196087 SCALAR_FIELD(prpsinfo_t, pr_dmodel, 0);
362*6635Sab196087
363*6635Sab196087 END;
364*6635Sab196087 }
365*6635Sab196087
366*6635Sab196087 /* lwpsinfo_t, <sys/procfs.h> */
367*6635Sab196087 static void
gen_lwpsinfo(void)368*6635Sab196087 gen_lwpsinfo(void)
369*6635Sab196087 {
370*6635Sab196087 START(lwpsinfo, lwpsinfo_t);
371*6635Sab196087
372*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_flag, 1);
373*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_lwpid, 0);
374*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_addr, 0);
375*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_wchan, 0);
376*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_stype, 0);
377*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_state, 0);
378*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_sname, 0);
379*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_nice, 0);
380*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_syscall, 0);
381*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_oldpri, 0);
382*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_cpu, 0);
383*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_pri, 1);
384*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_pctcpu, 0);
385*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_start, 0);
386*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_time, 0);
387*6635Sab196087 ARRAY_FIELD(lwpsinfo_t, pr_clname, 0);
388*6635Sab196087 ARRAY_FIELD(lwpsinfo_t, pr_name, 0);
389*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_onpro, 1);
390*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_bindpro, 1);
391*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_bindpset, 1);
392*6635Sab196087 SCALAR_FIELD(lwpsinfo_t, pr_lgrp, 1);
393*6635Sab196087
394*6635Sab196087 END;
395*6635Sab196087 }
396*6635Sab196087
397*6635Sab196087 /* prcred_t, <sys/procfs.h> */
398*6635Sab196087 static void
gen_prcred(void)399*6635Sab196087 gen_prcred(void)
400*6635Sab196087 {
401*6635Sab196087 START(prcred, prcred_t);
402*6635Sab196087
403*6635Sab196087 SCALAR_FIELD(prcred_t, pr_euid, 0);
404*6635Sab196087 SCALAR_FIELD(prcred_t, pr_ruid, 0);
405*6635Sab196087 SCALAR_FIELD(prcred_t, pr_suid, 0);
406*6635Sab196087 SCALAR_FIELD(prcred_t, pr_egid, 0);
407*6635Sab196087 SCALAR_FIELD(prcred_t, pr_rgid, 0);
408*6635Sab196087 SCALAR_FIELD(prcred_t, pr_sgid, 0);
409*6635Sab196087 SCALAR_FIELD(prcred_t, pr_ngroups, 1);
410*6635Sab196087 ARRAY_FIELD(prcred_t, pr_groups, 0);
411*6635Sab196087
412*6635Sab196087 END;
413*6635Sab196087 }
414*6635Sab196087
415*6635Sab196087 /* prpriv_t, <sys/procfs.h> */
416*6635Sab196087 static void
gen_prpriv(void)417*6635Sab196087 gen_prpriv(void)
418*6635Sab196087 {
419*6635Sab196087 START(prpriv, prpriv_t);
420*6635Sab196087
421*6635Sab196087 SCALAR_FIELD(prpriv_t, pr_nsets, 0);
422*6635Sab196087 SCALAR_FIELD(prpriv_t, pr_setsize, 0);
423*6635Sab196087 SCALAR_FIELD(prpriv_t, pr_infosize, 0);
424*6635Sab196087 ARRAY_FIELD(prpriv_t, pr_sets, 0);
425*6635Sab196087
426*6635Sab196087 END;
427*6635Sab196087 }
428*6635Sab196087
429*6635Sab196087
430*6635Sab196087 /* priv_impl_info_t, <sys/priv.h> */
431*6635Sab196087 static void
gen_priv_impl_info(void)432*6635Sab196087 gen_priv_impl_info(void)
433*6635Sab196087 {
434*6635Sab196087 START(priv_impl_info, priv_impl_info_t);
435*6635Sab196087
436*6635Sab196087 SCALAR_FIELD(priv_impl_info_t, priv_headersize, 0);
437*6635Sab196087 SCALAR_FIELD(priv_impl_info_t, priv_flags, 0);
438*6635Sab196087 SCALAR_FIELD(priv_impl_info_t, priv_nsets, 0);
439*6635Sab196087 SCALAR_FIELD(priv_impl_info_t, priv_setsize, 0);
440*6635Sab196087 SCALAR_FIELD(priv_impl_info_t, priv_max, 0);
441*6635Sab196087 SCALAR_FIELD(priv_impl_info_t, priv_infosize, 0);
442*6635Sab196087 SCALAR_FIELD(priv_impl_info_t, priv_globalinfosize, 0);
443*6635Sab196087
444*6635Sab196087 END;
445*6635Sab196087 }
446*6635Sab196087
447*6635Sab196087
448*6635Sab196087 /* fltset_t, <sys/fault.h> */
449*6635Sab196087 static void
gen_fltset(void)450*6635Sab196087 gen_fltset(void)
451*6635Sab196087 {
452*6635Sab196087 START(fltset, fltset_t);
453*6635Sab196087
454*6635Sab196087 ARRAY_FIELD(fltset_t, word, 0);
455*6635Sab196087
456*6635Sab196087 END;
457*6635Sab196087 }
458*6635Sab196087
459*6635Sab196087 /* Layout description of siginfo_t, <sys/siginfo.h> */
460*6635Sab196087 static void
gen_siginfo(void)461*6635Sab196087 gen_siginfo(void)
462*6635Sab196087 {
463*6635Sab196087 START(siginfo, siginfo_t);
464*6635Sab196087
465*6635Sab196087 SCALAR_FIELD(siginfo_t, si_signo, 0);
466*6635Sab196087 SCALAR_FIELD(siginfo_t, si_errno, 0);
467*6635Sab196087 SCALAR_FIELD(siginfo_t, si_code, 1);
468*6635Sab196087 SCALAR_FIELD(siginfo_t, si_value.sival_int, 0);
469*6635Sab196087 SCALAR_FIELD(siginfo_t, si_value.sival_ptr, 0);
470*6635Sab196087 SCALAR_FIELD(siginfo_t, si_pid, 0);
471*6635Sab196087 SCALAR_FIELD(siginfo_t, si_uid, 0);
472*6635Sab196087 SCALAR_FIELD(siginfo_t, si_ctid, 0);
473*6635Sab196087 SCALAR_FIELD(siginfo_t, si_zoneid, 0);
474*6635Sab196087 SCALAR_FIELD(siginfo_t, si_entity, 0);
475*6635Sab196087 SCALAR_FIELD(siginfo_t, si_addr, 0);
476*6635Sab196087 SCALAR_FIELD(siginfo_t, si_status, 0);
477*6635Sab196087 SCALAR_FIELD(siginfo_t, si_band, 0);
478*6635Sab196087
479*6635Sab196087 END;
480*6635Sab196087 }
481*6635Sab196087
482*6635Sab196087 /* sigset_t, <sys/signal.h> */
483*6635Sab196087 static void
gen_sigset(void)484*6635Sab196087 gen_sigset(void)
485*6635Sab196087 {
486*6635Sab196087 START(sigset, sigset_t);
487*6635Sab196087
488*6635Sab196087 ARRAY_FIELD(sigset_t, __sigbits, 0);
489*6635Sab196087
490*6635Sab196087 END;
491*6635Sab196087 }
492*6635Sab196087
493*6635Sab196087
494*6635Sab196087 /* struct sigaction, <sys/signal.h> */
495*6635Sab196087 static void
gen_sigaction(void)496*6635Sab196087 gen_sigaction(void)
497*6635Sab196087 {
498*6635Sab196087 START(sigaction, struct sigaction);
499*6635Sab196087
500*6635Sab196087 SCALAR_FIELD(struct sigaction, sa_flags, 0);
501*6635Sab196087 SCALAR_FIELD(struct sigaction, sa_handler, 0);
502*6635Sab196087 SCALAR_FIELD(struct sigaction, sa_sigaction, 0);
503*6635Sab196087 SCALAR_FIELD(struct sigaction, sa_mask, 0);
504*6635Sab196087
505*6635Sab196087 END;
506*6635Sab196087 }
507*6635Sab196087
508*6635Sab196087 /* stack_t, <sys/signal.h> */
509*6635Sab196087 static void
gen_stack(void)510*6635Sab196087 gen_stack(void)
511*6635Sab196087 {
512*6635Sab196087 START(stack, stack_t);
513*6635Sab196087
514*6635Sab196087 SCALAR_FIELD(stack_t, ss_sp, 0);
515*6635Sab196087 SCALAR_FIELD(stack_t, ss_size, 0);
516*6635Sab196087 SCALAR_FIELD(stack_t, ss_flags, 0);
517*6635Sab196087
518*6635Sab196087 END;
519*6635Sab196087 }
520*6635Sab196087
521*6635Sab196087 /* sysset_t, <sys/syscall.h> */
522*6635Sab196087 static void
gen_sysset(void)523*6635Sab196087 gen_sysset(void)
524*6635Sab196087 {
525*6635Sab196087 START(sysset, sysset_t);
526*6635Sab196087
527*6635Sab196087 ARRAY_FIELD(sysset_t, word, 0);
528*6635Sab196087
529*6635Sab196087 END;
530*6635Sab196087 }
531*6635Sab196087
532*6635Sab196087 /* timestruc_t, <sys/time_impl.h> */
533*6635Sab196087 static void
gen_timestruc(void)534*6635Sab196087 gen_timestruc(void)
535*6635Sab196087 {
536*6635Sab196087 START(timestruc, timestruc_t);
537*6635Sab196087
538*6635Sab196087 SCALAR_FIELD(timestruc_t, tv_sec, 0);
539*6635Sab196087 SCALAR_FIELD(timestruc_t, tv_nsec, 0);
540*6635Sab196087
541*6635Sab196087 END;
542*6635Sab196087 }
543*6635Sab196087
544*6635Sab196087 /* struct utsname, <sys/utsname.h> */
545*6635Sab196087 static void
gen_utsname(void)546*6635Sab196087 gen_utsname(void)
547*6635Sab196087 {
548*6635Sab196087 START(utsname, struct utsname);
549*6635Sab196087
550*6635Sab196087 ARRAY_FIELD(struct utsname, sysname, 0);
551*6635Sab196087 ARRAY_FIELD(struct utsname, nodename, 0);
552*6635Sab196087 ARRAY_FIELD(struct utsname, release, 0);
553*6635Sab196087 ARRAY_FIELD(struct utsname, version, 0);
554*6635Sab196087 ARRAY_FIELD(struct utsname, machine, 0);
555*6635Sab196087
556*6635Sab196087 END;
557*6635Sab196087 }
558*6635Sab196087
559*6635Sab196087
560*6635Sab196087 /*ARGSUSED*/
561*6635Sab196087 int
main(int argc,char * argv[])562*6635Sab196087 main(int argc, char *argv[])
563*6635Sab196087 {
564*6635Sab196087 const char *fmt = "\t&%s_layout,\n";
565*6635Sab196087
566*6635Sab196087 printf("#include <struct_layout.h>\n");
567*6635Sab196087
568*6635Sab196087 gen_auxv();
569*6635Sab196087 gen_prgregset();
570*6635Sab196087 gen_lwpstatus();
571*6635Sab196087 gen_pstatus();
572*6635Sab196087 gen_prstatus();
573*6635Sab196087 gen_psinfo();
574*6635Sab196087 gen_prpsinfo();
575*6635Sab196087 gen_lwpsinfo();
576*6635Sab196087 gen_prcred();
577*6635Sab196087 gen_prpriv();
578*6635Sab196087 gen_priv_impl_info();
579*6635Sab196087 gen_fltset();
580*6635Sab196087 gen_siginfo();
581*6635Sab196087 gen_sigset();
582*6635Sab196087 gen_sigaction();
583*6635Sab196087 gen_stack();
584*6635Sab196087 gen_sysset();
585*6635Sab196087 gen_timestruc();
586*6635Sab196087 gen_utsname();
587*6635Sab196087
588*6635Sab196087
589*6635Sab196087 /*
590*6635Sab196087 * Generate the full arch_layout description
591*6635Sab196087 */
592*6635Sab196087 (void) printf(
593*6635Sab196087 "\n\n\n\nstatic const sl_arch_layout_t layout_%s = {\n",
594*6635Sab196087 MACH);
595*6635Sab196087 (void) printf(fmt, "auxv");
596*6635Sab196087 (void) printf(fmt, "fltset");
597*6635Sab196087 (void) printf(fmt, "lwpsinfo");
598*6635Sab196087 (void) printf(fmt, "lwpstatus");
599*6635Sab196087 (void) printf(fmt, "prcred");
600*6635Sab196087 (void) printf(fmt, "priv_impl_info");
601*6635Sab196087 (void) printf(fmt, "prpriv");
602*6635Sab196087 (void) printf(fmt, "psinfo");
603*6635Sab196087 (void) printf(fmt, "pstatus");
604*6635Sab196087 (void) printf(fmt, "prgregset");
605*6635Sab196087 (void) printf(fmt, "prpsinfo");
606*6635Sab196087 (void) printf(fmt, "prstatus");
607*6635Sab196087 (void) printf(fmt, "sigaction");
608*6635Sab196087 (void) printf(fmt, "siginfo");
609*6635Sab196087 (void) printf(fmt, "sigset");
610*6635Sab196087 (void) printf(fmt, "stack");
611*6635Sab196087 (void) printf(fmt, "sysset");
612*6635Sab196087 (void) printf(fmt, "timestruc");
613*6635Sab196087 (void) printf(fmt, "utsname");
614*6635Sab196087 (void) printf("};\n");
615*6635Sab196087
616*6635Sab196087 /*
617*6635Sab196087 * A public function, to make the information available
618*6635Sab196087 */
619*6635Sab196087 (void) printf("\n\nconst sl_arch_layout_t *\n");
620*6635Sab196087 (void) printf("struct_layout_%s(void)\n", MACH);
621*6635Sab196087 (void) printf("{\n\treturn (&layout_%s);\n}\n", MACH);
622*6635Sab196087
623*6635Sab196087 return (0);
624*6635Sab196087 }
625