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 * Copyright 2012 DEY Storage Systems, Inc. All rights reserved. 28 * Copyright 2018 Joyent, Inc. 29 * Copyright 2020 OmniOS Community Edition (OmniOSce) Association. 30 */ 31 32 #include <struct_layout.h> 33 34 35 static const sl_auxv_layout_t auxv_layout = { 36 { 0, 16, 0, 0 }, /* sizeof (auxv_t) */ 37 { 0, 4, 0, 1 }, /* a_type */ 38 { 8, 8, 0, 1 }, /* a_un.a_val */ 39 { 8, 8, 0, 0 }, /* a_un.a_ptr */ 40 { 8, 8, 0, 0 }, /* a_un.a_fcn */ 41 }; 42 43 44 static const sl_prgregset_layout_t prgregset_layout = { 45 { 0, 224, 0, 0 }, /* sizeof (prgregset_t) */ 46 { 0, 8, 28, 0 }, /* elt0 */ 47 }; 48 49 50 static const sl_lwpstatus_layout_t lwpstatus_layout = { 51 { 0, 1296, 0, 0 }, /* sizeof (lwpstatus_t) */ 52 { 0, 4, 0, 0 }, /* pr_flags */ 53 { 4, 4, 0, 0 }, /* pr_lwpid */ 54 { 8, 2, 0, 0 }, /* pr_why */ 55 { 10, 2, 0, 0 }, /* pr_what */ 56 { 12, 2, 0, 0 }, /* pr_cursig */ 57 { 16, 256, 0, 0 }, /* pr_info */ 58 { 272, 16, 0, 0 }, /* pr_lwppend */ 59 { 288, 16, 0, 0 }, /* pr_lwphold */ 60 { 304, 32, 0, 0 }, /* pr_action */ 61 { 336, 24, 0, 0 }, /* pr_altstack */ 62 { 360, 8, 0, 0 }, /* pr_oldcontext */ 63 { 368, 2, 0, 0 }, /* pr_syscall */ 64 { 370, 2, 0, 0 }, /* pr_nsysarg */ 65 { 372, 4, 0, 0 }, /* pr_errno */ 66 { 376, 8, 8, 0 }, /* pr_sysarg[] */ 67 { 440, 8, 0, 0 }, /* pr_rval1 */ 68 { 448, 8, 0, 0 }, /* pr_rval2 */ 69 { 456, 1, 8, 0 }, /* pr_clname[] */ 70 { 464, 16, 0, 0 }, /* pr_tstamp */ 71 { 480, 16, 0, 0 }, /* pr_utime */ 72 { 496, 16, 0, 0 }, /* pr_stime */ 73 { 524, 4, 0, 0 }, /* pr_errpriv */ 74 { 528, 8, 0, 0 }, /* pr_ustack */ 75 { 536, 8, 0, 0 }, /* pr_instr */ 76 { 544, 224, 0, 0 }, /* pr_reg */ 77 { 768, 528, 0, 0 }, /* pr_fpreg */ 78 }; 79 80 81 static const sl_pstatus_layout_t pstatus_layout = { 82 { 0, 1680, 0, 0 }, /* sizeof (pstatus_t) */ 83 { 0, 4, 0, 1 }, /* pr_flags */ 84 { 4, 4, 0, 1 }, /* pr_nlwp */ 85 { 8, 4, 0, 0 }, /* pr_pid */ 86 { 12, 4, 0, 0 }, /* pr_ppid */ 87 { 16, 4, 0, 0 }, /* pr_pgid */ 88 { 20, 4, 0, 0 }, /* pr_sid */ 89 { 24, 4, 0, 1 }, /* pr_aslwpid */ 90 { 28, 4, 0, 1 }, /* pr_agentid */ 91 { 32, 16, 0, 0 }, /* pr_sigpend */ 92 { 48, 8, 0, 0 }, /* pr_brkbase */ 93 { 56, 8, 0, 0 }, /* pr_brksize */ 94 { 64, 8, 0, 0 }, /* pr_stkbase */ 95 { 72, 8, 0, 0 }, /* pr_stksize */ 96 { 80, 16, 0, 0 }, /* pr_utime */ 97 { 96, 16, 0, 0 }, /* pr_stime */ 98 { 112, 16, 0, 0 }, /* pr_cutime */ 99 { 128, 16, 0, 0 }, /* pr_cstime */ 100 { 144, 16, 0, 0 }, /* pr_sigtrace */ 101 { 160, 16, 0, 0 }, /* pr_flttrace */ 102 { 176, 64, 0, 0 }, /* pr_sysentry */ 103 { 240, 64, 0, 0 }, /* pr_sysexit */ 104 { 304, 1, 0, 0 }, /* pr_dmodel */ 105 { 308, 4, 0, 1 }, /* pr_taskid */ 106 { 312, 4, 0, 1 }, /* pr_projid */ 107 { 316, 4, 0, 1 }, /* pr_nzomb */ 108 { 320, 4, 0, 1 }, /* pr_zoneid */ 109 { 384, 1296, 0, 0 }, /* pr_lwp */ 110 }; 111 112 113 static const sl_prstatus_layout_t prstatus_layout = { 114 { 0, 824, 0, 0 }, /* sizeof (prstatus_t) */ 115 { 0, 4, 0, 1 }, /* pr_flags */ 116 { 4, 2, 0, 1 }, /* pr_why */ 117 { 6, 2, 0, 1 }, /* pr_what */ 118 { 8, 256, 0, 0 }, /* pr_info */ 119 { 264, 2, 0, 1 }, /* pr_cursig */ 120 { 266, 2, 0, 0 }, /* pr_nlwp */ 121 { 268, 16, 0, 0 }, /* pr_sigpend */ 122 { 284, 16, 0, 0 }, /* pr_sighold */ 123 { 304, 24, 0, 0 }, /* pr_altstack */ 124 { 328, 32, 0, 0 }, /* pr_action */ 125 { 360, 4, 0, 0 }, /* pr_pid */ 126 { 364, 4, 0, 0 }, /* pr_ppid */ 127 { 368, 4, 0, 0 }, /* pr_pgrp */ 128 { 372, 4, 0, 0 }, /* pr_sid */ 129 { 376, 16, 0, 0 }, /* pr_utime */ 130 { 392, 16, 0, 0 }, /* pr_stime */ 131 { 408, 16, 0, 0 }, /* pr_cutime */ 132 { 424, 16, 0, 0 }, /* pr_cstime */ 133 { 440, 1, 8, 0 }, /* pr_clname[] */ 134 { 448, 2, 0, 1 }, /* pr_syscall */ 135 { 450, 2, 0, 1 }, /* pr_nsysarg */ 136 { 456, 8, 8, 1 }, /* pr_sysarg[] */ 137 { 520, 4, 0, 0 }, /* pr_who */ 138 { 524, 16, 0, 0 }, /* pr_lwppend */ 139 { 544, 8, 0, 0 }, /* pr_oldcontext */ 140 { 552, 8, 0, 0 }, /* pr_brkbase */ 141 { 560, 8, 0, 0 }, /* pr_brksize */ 142 { 568, 8, 0, 0 }, /* pr_stkbase */ 143 { 576, 8, 0, 0 }, /* pr_stksize */ 144 { 584, 2, 0, 1 }, /* pr_processor */ 145 { 586, 2, 0, 1 }, /* pr_bind */ 146 { 592, 8, 0, 1 }, /* pr_instr */ 147 { 600, 224, 0, 0 }, /* pr_reg */ 148 }; 149 150 151 static const sl_psinfo_layout_t psinfo_layout = { 152 { 0, 416, 0, 0 }, /* sizeof (psinfo_t) */ 153 { 0, 4, 0, 1 }, /* pr_flag */ 154 { 4, 4, 0, 1 }, /* pr_nlwp */ 155 { 8, 4, 0, 0 }, /* pr_pid */ 156 { 12, 4, 0, 0 }, /* pr_ppid */ 157 { 16, 4, 0, 0 }, /* pr_pgid */ 158 { 20, 4, 0, 0 }, /* pr_sid */ 159 { 24, 4, 0, 0 }, /* pr_uid */ 160 { 28, 4, 0, 0 }, /* pr_euid */ 161 { 32, 4, 0, 0 }, /* pr_gid */ 162 { 36, 4, 0, 0 }, /* pr_egid */ 163 { 40, 8, 0, 0 }, /* pr_addr */ 164 { 48, 8, 0, 0 }, /* pr_size */ 165 { 56, 8, 0, 0 }, /* pr_rssize */ 166 { 72, 8, 0, 0 }, /* pr_ttydev */ 167 { 80, 2, 0, 0 }, /* pr_pctcpu */ 168 { 82, 2, 0, 0 }, /* pr_pctmem */ 169 { 88, 16, 0, 0 }, /* pr_start */ 170 { 104, 16, 0, 0 }, /* pr_time */ 171 { 120, 16, 0, 0 }, /* pr_ctime */ 172 { 136, 1, 16, 0 }, /* pr_fname[] */ 173 { 152, 1, 80, 0 }, /* pr_psargs[] */ 174 { 232, 4, 0, 1 }, /* pr_wstat */ 175 { 236, 4, 0, 1 }, /* pr_argc */ 176 { 240, 8, 0, 0 }, /* pr_argv */ 177 { 248, 8, 0, 0 }, /* pr_envp */ 178 { 256, 1, 0, 0 }, /* pr_dmodel */ 179 { 260, 4, 0, 0 }, /* pr_taskid */ 180 { 264, 4, 0, 0 }, /* pr_projid */ 181 { 268, 4, 0, 1 }, /* pr_nzomb */ 182 { 272, 4, 0, 0 }, /* pr_poolid */ 183 { 276, 4, 0, 0 }, /* pr_zoneid */ 184 { 280, 4, 0, 0 }, /* pr_contract */ 185 { 288, 128, 0, 0 }, /* pr_lwp */ 186 }; 187 188 189 static const sl_prpsinfo_layout_t prpsinfo_layout = { 190 { 0, 328, 0, 0 }, /* sizeof (prpsinfo_t) */ 191 { 0, 1, 0, 0 }, /* pr_state */ 192 { 1, 1, 0, 0 }, /* pr_sname */ 193 { 2, 1, 0, 0 }, /* pr_zomb */ 194 { 3, 1, 0, 0 }, /* pr_nice */ 195 { 4, 4, 0, 0 }, /* pr_flag */ 196 { 8, 4, 0, 0 }, /* pr_uid */ 197 { 12, 4, 0, 0 }, /* pr_gid */ 198 { 16, 4, 0, 0 }, /* pr_pid */ 199 { 20, 4, 0, 0 }, /* pr_ppid */ 200 { 24, 4, 0, 0 }, /* pr_pgrp */ 201 { 28, 4, 0, 0 }, /* pr_sid */ 202 { 32, 8, 0, 0 }, /* pr_addr */ 203 { 40, 8, 0, 0 }, /* pr_size */ 204 { 48, 8, 0, 0 }, /* pr_rssize */ 205 { 56, 8, 0, 0 }, /* pr_wchan */ 206 { 64, 16, 0, 0 }, /* pr_start */ 207 { 80, 16, 0, 0 }, /* pr_time */ 208 { 96, 4, 0, 1 }, /* pr_pri */ 209 { 100, 1, 0, 0 }, /* pr_oldpri */ 210 { 101, 1, 0, 0 }, /* pr_cpu */ 211 { 102, 2, 0, 0 }, /* pr_ottydev */ 212 { 104, 8, 0, 0 }, /* pr_lttydev */ 213 { 112, 1, 8, 0 }, /* pr_clname[] */ 214 { 120, 1, 16, 0 }, /* pr_fname[] */ 215 { 136, 1, 80, 0 }, /* pr_psargs[] */ 216 { 216, 2, 0, 1 }, /* pr_syscall */ 217 { 224, 16, 0, 0 }, /* pr_ctime */ 218 { 240, 8, 0, 0 }, /* pr_bysize */ 219 { 248, 8, 0, 0 }, /* pr_byrssize */ 220 { 256, 4, 0, 1 }, /* pr_argc */ 221 { 264, 8, 0, 0 }, /* pr_argv */ 222 { 272, 8, 0, 0 }, /* pr_envp */ 223 { 280, 4, 0, 1 }, /* pr_wstat */ 224 { 284, 2, 0, 0 }, /* pr_pctcpu */ 225 { 286, 2, 0, 0 }, /* pr_pctmem */ 226 { 288, 4, 0, 0 }, /* pr_euid */ 227 { 292, 4, 0, 0 }, /* pr_egid */ 228 { 296, 4, 0, 0 }, /* pr_aslwpid */ 229 { 300, 1, 0, 0 }, /* pr_dmodel */ 230 }; 231 232 233 static const sl_lwpsinfo_layout_t lwpsinfo_layout = { 234 { 0, 128, 0, 0 }, /* sizeof (lwpsinfo_t) */ 235 { 0, 4, 0, 1 }, /* pr_flag */ 236 { 4, 4, 0, 0 }, /* pr_lwpid */ 237 { 8, 8, 0, 0 }, /* pr_addr */ 238 { 16, 8, 0, 0 }, /* pr_wchan */ 239 { 24, 1, 0, 0 }, /* pr_stype */ 240 { 25, 1, 0, 0 }, /* pr_state */ 241 { 26, 1, 0, 0 }, /* pr_sname */ 242 { 27, 1, 0, 0 }, /* pr_nice */ 243 { 28, 2, 0, 0 }, /* pr_syscall */ 244 { 30, 1, 0, 0 }, /* pr_oldpri */ 245 { 31, 1, 0, 0 }, /* pr_cpu */ 246 { 32, 4, 0, 1 }, /* pr_pri */ 247 { 36, 2, 0, 0 }, /* pr_pctcpu */ 248 { 40, 16, 0, 0 }, /* pr_start */ 249 { 56, 16, 0, 0 }, /* pr_time */ 250 { 72, 1, 8, 0 }, /* pr_clname[] */ 251 { 80, 1, 16, 0 }, /* pr_name[] */ 252 { 96, 4, 0, 1 }, /* pr_onpro */ 253 { 100, 4, 0, 1 }, /* pr_bindpro */ 254 { 104, 4, 0, 1 }, /* pr_bindpset */ 255 { 108, 4, 0, 1 }, /* pr_lgrp */ 256 }; 257 258 259 static const sl_prcred_layout_t prcred_layout = { 260 { 0, 32, 0, 0 }, /* sizeof (prcred_t) */ 261 { 0, 4, 0, 0 }, /* pr_euid */ 262 { 4, 4, 0, 0 }, /* pr_ruid */ 263 { 8, 4, 0, 0 }, /* pr_suid */ 264 { 12, 4, 0, 0 }, /* pr_egid */ 265 { 16, 4, 0, 0 }, /* pr_rgid */ 266 { 20, 4, 0, 0 }, /* pr_sgid */ 267 { 24, 4, 0, 1 }, /* pr_ngroups */ 268 { 28, 4, 1, 0 }, /* pr_groups[] */ 269 }; 270 271 272 static const sl_prpriv_layout_t prpriv_layout = { 273 { 0, 16, 0, 0 }, /* sizeof (prpriv_t) */ 274 { 0, 4, 0, 0 }, /* pr_nsets */ 275 { 4, 4, 0, 0 }, /* pr_setsize */ 276 { 8, 4, 0, 0 }, /* pr_infosize */ 277 { 12, 4, 1, 0 }, /* pr_sets[] */ 278 }; 279 280 281 static const sl_priv_impl_info_layout_t priv_impl_info_layout = { 282 { 0, 28, 0, 0 }, /* sizeof (priv_impl_info_t) */ 283 { 0, 4, 0, 0 }, /* priv_headersize */ 284 { 4, 4, 0, 0 }, /* priv_flags */ 285 { 8, 4, 0, 0 }, /* priv_nsets */ 286 { 12, 4, 0, 0 }, /* priv_setsize */ 287 { 16, 4, 0, 0 }, /* priv_max */ 288 { 20, 4, 0, 0 }, /* priv_infosize */ 289 { 24, 4, 0, 0 }, /* priv_globalinfosize */ 290 }; 291 292 293 static const sl_fltset_layout_t fltset_layout = { 294 { 0, 16, 0, 0 }, /* sizeof (fltset_t) */ 295 { 0, 4, 4, 0 }, /* word[] */ 296 }; 297 298 299 static const sl_siginfo_layout_t siginfo_layout = { 300 { 0, 256, 0, 0 }, /* sizeof (siginfo_t) */ 301 { 0, 4, 0, 0 }, /* si_signo */ 302 { 8, 4, 0, 0 }, /* si_errno */ 303 { 4, 4, 0, 1 }, /* si_code */ 304 { 32, 4, 0, 0 }, /* si_value.sival_int */ 305 { 32, 8, 0, 0 }, /* si_value.sival_ptr */ 306 { 16, 4, 0, 0 }, /* si_pid */ 307 { 24, 4, 0, 0 }, /* si_uid */ 308 { 48, 4, 0, 0 }, /* si_ctid */ 309 { 52, 4, 0, 0 }, /* si_zoneid */ 310 { 16, 4, 0, 0 }, /* si_entity */ 311 { 16, 8, 0, 0 }, /* si_addr */ 312 { 32, 4, 0, 0 }, /* si_status */ 313 { 24, 8, 0, 0 }, /* si_band */ 314 }; 315 316 317 static const sl_sigset_layout_t sigset_layout = { 318 { 0, 16, 0, 0 }, /* sizeof (sigset_t) */ 319 { 0, 4, 4, 0 }, /* __sigbits[] */ 320 }; 321 322 323 static const sl_sigaction_layout_t sigaction_layout = { 324 { 0, 32, 0, 0 }, /* sizeof (struct sigaction) */ 325 { 0, 4, 0, 0 }, /* sa_flags */ 326 { 8, 8, 0, 0 }, /* sa_handler */ 327 { 8, 8, 0, 0 }, /* sa_sigaction */ 328 { 16, 16, 0, 0 }, /* sa_mask */ 329 }; 330 331 332 static const sl_stack_layout_t stack_layout = { 333 { 0, 24, 0, 0 }, /* sizeof (stack_t) */ 334 { 0, 8, 0, 0 }, /* ss_sp */ 335 { 8, 8, 0, 0 }, /* ss_size */ 336 { 16, 4, 0, 0 }, /* ss_flags */ 337 }; 338 339 340 static const sl_sysset_layout_t sysset_layout = { 341 { 0, 64, 0, 0 }, /* sizeof (sysset_t) */ 342 { 0, 4, 16, 0 }, /* word[] */ 343 }; 344 345 346 static const sl_timestruc_layout_t timestruc_layout = { 347 { 0, 16, 0, 0 }, /* sizeof (timestruc_t) */ 348 { 0, 8, 0, 0 }, /* tv_sec */ 349 { 8, 8, 0, 0 }, /* tv_nsec */ 350 }; 351 352 353 static const sl_utsname_layout_t utsname_layout = { 354 { 0, 1285, 0, 0 }, /* sizeof (struct utsname) */ 355 { 0, 1, 257, 0 }, /* sysname[] */ 356 { 257, 1, 257, 0 }, /* nodename[] */ 357 { 514, 1, 257, 0 }, /* release[] */ 358 { 771, 1, 257, 0 }, /* version[] */ 359 { 1028, 1, 257, 0 }, /* machine[] */ 360 }; 361 362 363 static const sl_prfdinfo_layout_t prfdinfo_layout = { 364 { 0, 1088, 0, 0 }, /* sizeof (prfdinfo_core_t) */ 365 { 0, 4, 0, 0 }, /* pr_fd */ 366 { 4, 4, 0, 0 }, /* pr_mode */ 367 { 8, 4, 0, 0 }, /* pr_uid */ 368 { 12, 4, 0, 0 }, /* pr_gid */ 369 { 16, 4, 0, 0 }, /* pr_major */ 370 { 20, 4, 0, 0 }, /* pr_minor */ 371 { 24, 4, 0, 0 }, /* pr_rmajor */ 372 { 28, 4, 0, 0 }, /* pr_rminor */ 373 { 32, 8, 0, 0 }, /* pr_ino */ 374 { 40, 8, 0, 0 }, /* pr_offset */ 375 { 48, 8, 0, 0 }, /* pr_size */ 376 { 56, 4, 0, 0 }, /* pr_fileflags */ 377 { 60, 4, 0, 0 }, /* pr_fdflags */ 378 { 64, 1, 1024, 0 }, /* pr_path[] */ 379 }; 380 381 382 static const sl_prsecflags_layout_t prsecflags_layout = { 383 { 0, 40, 0, 0 }, /* sizeof (prsecflags_t) */ 384 { 0, 4, 0, 0 }, /* pr_version */ 385 { 8, 8, 0, 0 }, /* pr_effective */ 386 { 16, 8, 0, 0 }, /* pr_inherit */ 387 { 24, 8, 0, 0 }, /* pr_lower */ 388 { 32, 8, 0, 0 }, /* pr_upper */ 389 }; 390 391 392 static const sl_prlwpname_layout_t prlwpname_layout = { 393 { 0, 40, 0, 0 }, /* sizeof (prlwpname_t) */ 394 { 0, 8, 0, 0 }, /* pr_lwpid */ 395 { 8, 1, 32, 0 }, /* pr_lwpname[] */ 396 }; 397 398 399 static const sl_prupanic_layout_t prupanic_layout = { 400 { 0, 1032, 0, 0 }, /* sizeof (prupanic_t) */ 401 { 0, 4, 0, 0 }, /* pru_version */ 402 { 4, 4, 0, 0 }, /* pru_flags */ 403 { 8, 1, 1024, 0 }, /* pru_data[] */ 404 }; 405 406 407 static const sl_prcwd_layout_t prcwd_layout = { 408 { 0, 3096, 0, 0 }, /* sizeof (prcwd_t) */ 409 { 0, 8, 0, 0 }, /* prcwd_fsid */ 410 { 8, 1, 16, 0 }, /* prcwd_fsname[] */ 411 { 24, 1, 1024, 0 }, /* prcwd_mntpt[] */ 412 { 1048, 1, 1024, 0 }, /* prcwd_mntspec[] */ 413 { 2072, 1, 1024, 0 }, /* prcwd_cwd[] */ 414 }; 415 416 417 418 419 static const sl_arch_layout_t layout_amd64 = { 420 &auxv_layout, 421 &fltset_layout, 422 &lwpsinfo_layout, 423 &lwpstatus_layout, 424 &prcred_layout, 425 &priv_impl_info_layout, 426 &prpriv_layout, 427 &psinfo_layout, 428 &pstatus_layout, 429 &prgregset_layout, 430 &prpsinfo_layout, 431 &prstatus_layout, 432 &sigaction_layout, 433 &siginfo_layout, 434 &sigset_layout, 435 &stack_layout, 436 &sysset_layout, 437 ×truc_layout, 438 &utsname_layout, 439 &prfdinfo_layout, 440 &prsecflags_layout, 441 &prlwpname_layout, 442 &prupanic_layout, 443 &prcwd_layout, 444 }; 445 446 447 const sl_arch_layout_t * 448 struct_layout_amd64(void) 449 { 450 return (&layout_amd64); 451 } 452