xref: /onnv-gate/usr/src/cmd/sgs/elfdump/common/gen_struct_layout.c (revision 6635:8de60a34b2e5)
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