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