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 }