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