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 }