17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 57c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 67c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 77c478bd9Sstevel@tonic-gate * with the License. 87c478bd9Sstevel@tonic-gate * 97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate * and limitations under the License. 137c478bd9Sstevel@tonic-gate * 147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate * 207c478bd9Sstevel@tonic-gate * CDDL HEADER END 217c478bd9Sstevel@tonic-gate */ 227c478bd9Sstevel@tonic-gate /* 23c2e7b48dSkalai * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 27*ed093b41SRobert Mustacchi /* 28*ed093b41SRobert Mustacchi * Copyright 2023 Oxide Computer Company 29*ed093b41SRobert Mustacchi */ 30*ed093b41SRobert Mustacchi 317c478bd9Sstevel@tonic-gate #ifndef _SYS_PROCFS_ISA_H 327c478bd9Sstevel@tonic-gate #define _SYS_PROCFS_ISA_H 337c478bd9Sstevel@tonic-gate 347c478bd9Sstevel@tonic-gate /* 357c478bd9Sstevel@tonic-gate * Instruction Set Architecture specific component of <sys/procfs.h> 367c478bd9Sstevel@tonic-gate * i386 version 377c478bd9Sstevel@tonic-gate */ 387c478bd9Sstevel@tonic-gate 397c478bd9Sstevel@tonic-gate #include <sys/regset.h> 407c478bd9Sstevel@tonic-gate 417c478bd9Sstevel@tonic-gate #ifdef __cplusplus 427c478bd9Sstevel@tonic-gate extern "C" { 437c478bd9Sstevel@tonic-gate #endif 447c478bd9Sstevel@tonic-gate 457c478bd9Sstevel@tonic-gate /* 467c478bd9Sstevel@tonic-gate * Possible values of pr_dmodel. 477c478bd9Sstevel@tonic-gate * This isn't isa-specific, but it needs to be defined here for other reasons. 487c478bd9Sstevel@tonic-gate */ 497c478bd9Sstevel@tonic-gate #define PR_MODEL_UNKNOWN 0 507c478bd9Sstevel@tonic-gate #define PR_MODEL_ILP32 1 /* process data model is ILP32 */ 517c478bd9Sstevel@tonic-gate #define PR_MODEL_LP64 2 /* process data model is LP64 */ 527c478bd9Sstevel@tonic-gate 537c478bd9Sstevel@tonic-gate /* 547c478bd9Sstevel@tonic-gate * To determine whether application is running native. 557c478bd9Sstevel@tonic-gate */ 567c478bd9Sstevel@tonic-gate #if defined(_LP64) 577c478bd9Sstevel@tonic-gate #define PR_MODEL_NATIVE PR_MODEL_LP64 587c478bd9Sstevel@tonic-gate #elif defined(_ILP32) 597c478bd9Sstevel@tonic-gate #define PR_MODEL_NATIVE PR_MODEL_ILP32 607c478bd9Sstevel@tonic-gate #else 617c478bd9Sstevel@tonic-gate #error "No DATAMODEL_NATIVE specified" 627c478bd9Sstevel@tonic-gate #endif /* _LP64 || _ILP32 */ 637c478bd9Sstevel@tonic-gate 647c478bd9Sstevel@tonic-gate #if defined(__i386) || defined(__amd64) 657c478bd9Sstevel@tonic-gate /* 667c478bd9Sstevel@tonic-gate * Holds one i386 or amd64 instruction 677c478bd9Sstevel@tonic-gate */ 687c478bd9Sstevel@tonic-gate typedef uchar_t instr_t; 697c478bd9Sstevel@tonic-gate #endif 707c478bd9Sstevel@tonic-gate 717c478bd9Sstevel@tonic-gate #define NPRGREG _NGREG 727c478bd9Sstevel@tonic-gate #define prgreg_t greg_t 737c478bd9Sstevel@tonic-gate #define prgregset_t gregset_t 74bc0e9132SGordon Ross #define prfpregset _fpu 757c478bd9Sstevel@tonic-gate #define prfpregset_t fpregset_t 767c478bd9Sstevel@tonic-gate 777c478bd9Sstevel@tonic-gate #if defined(_SYSCALL32) 787c478bd9Sstevel@tonic-gate /* 797c478bd9Sstevel@tonic-gate * kernel view of the ia32 register set 807c478bd9Sstevel@tonic-gate */ 817c478bd9Sstevel@tonic-gate typedef uchar_t instr32_t; 82c2e7b48dSkalai #if defined(__amd64) 837c478bd9Sstevel@tonic-gate #define NPRGREG32 _NGREG32 847c478bd9Sstevel@tonic-gate #define prgreg32_t greg32_t 857c478bd9Sstevel@tonic-gate #define prgregset32_t gregset32_t 867c478bd9Sstevel@tonic-gate #define prfpregset32 fpu32 877c478bd9Sstevel@tonic-gate #define prfpregset32_t fpregset32_t 887c478bd9Sstevel@tonic-gate #else 897c478bd9Sstevel@tonic-gate #define NPRGREG32 _NGREG 907c478bd9Sstevel@tonic-gate #define prgreg32_t greg_t 917c478bd9Sstevel@tonic-gate #define prgregset32_t gregset_t 92bc0e9132SGordon Ross #define prfpregset32 _fpu 937c478bd9Sstevel@tonic-gate #define prfpregset32_t fpregset_t 947c478bd9Sstevel@tonic-gate #endif 957c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */ 967c478bd9Sstevel@tonic-gate 977c478bd9Sstevel@tonic-gate #if defined(__amd64) 987c478bd9Sstevel@tonic-gate /* 997c478bd9Sstevel@tonic-gate * The following defines are for portability (see <sys/regset.h>). 1007c478bd9Sstevel@tonic-gate */ 1017c478bd9Sstevel@tonic-gate #define R_PC REG_RIP 1027c478bd9Sstevel@tonic-gate #define R_PS REG_RFL 1037c478bd9Sstevel@tonic-gate #define R_SP REG_RSP 1047c478bd9Sstevel@tonic-gate #define R_FP REG_RBP 1057c478bd9Sstevel@tonic-gate #define R_R0 REG_RAX 1067c478bd9Sstevel@tonic-gate #define R_R1 REG_RDX 1077c478bd9Sstevel@tonic-gate #elif defined(__i386) 1087c478bd9Sstevel@tonic-gate /* 1097c478bd9Sstevel@tonic-gate * The following defines are for portability (see <sys/regset.h>). 1107c478bd9Sstevel@tonic-gate */ 1117c478bd9Sstevel@tonic-gate #define R_PC EIP 1127c478bd9Sstevel@tonic-gate #define R_PS EFL 1137c478bd9Sstevel@tonic-gate #define R_SP UESP 1147c478bd9Sstevel@tonic-gate #define R_FP EBP 1157c478bd9Sstevel@tonic-gate #define R_R0 EAX 1167c478bd9Sstevel@tonic-gate #define R_R1 EDX 1177c478bd9Sstevel@tonic-gate #endif 1187c478bd9Sstevel@tonic-gate 119*ed093b41SRobert Mustacchi /* 120*ed093b41SRobert Mustacchi * The x86 xregs structure is a blob of data that contains a header with several 121*ed093b41SRobert Mustacchi * descriptors that describe the region of additional data that corresponds to 122*ed093b41SRobert Mustacchi * it. Effectively this looks like: 123*ed093b41SRobert Mustacchi * 124*ed093b41SRobert Mustacchi * 0 +-----------------+ 125*ed093b41SRobert Mustacchi * | prxregset_hdr_t | 126*ed093b41SRobert Mustacchi * +-----------------+ 127*ed093b41SRobert Mustacchi * | Info 0 (XCR) |-------+ 128*ed093b41SRobert Mustacchi * +-----------------+ | 129*ed093b41SRobert Mustacchi * | Info 1 (XSAVE) |----------+ 130*ed093b41SRobert Mustacchi * +-----------------+ | | 131*ed093b41SRobert Mustacchi * ... | | 132*ed093b41SRobert Mustacchi * +-----------------+ | | 133*ed093b41SRobert Mustacchi * | Info n (Hi ZMM) |-------------+ 134*ed093b41SRobert Mustacchi * +-----------------+ | | | 135*ed093b41SRobert Mustacchi * +-----------------+ | | | 136*ed093b41SRobert Mustacchi * | prxregset_xcr_t |<------+ | | 137*ed093b41SRobert Mustacchi * +-----------------+ | | 138*ed093b41SRobert Mustacchi * +-------------------+ | | 139*ed093b41SRobert Mustacchi * | prxregset_xsave_t |<-------+ | 140*ed093b41SRobert Mustacchi * | | | 141*ed093b41SRobert Mustacchi * | XMM + xsave | | 142*ed093b41SRobert Mustacchi * +-------------------+ | 143*ed093b41SRobert Mustacchi * ... | 144*ed093b41SRobert Mustacchi * +---------------------+ | 145*ed093b41SRobert Mustacchi * | prxregset_hi_zmm_t |<--------+ 146*ed093b41SRobert Mustacchi * | | 147*ed093b41SRobert Mustacchi * | 1 KiB %zmm16-%zmm31 | 148*ed093b41SRobert Mustacchi * +---------------------+ 149*ed093b41SRobert Mustacchi * 150*ed093b41SRobert Mustacchi * The actual structure size will vary based on the CPU features present. For 151*ed093b41SRobert Mustacchi * more information, see proc(5). When adding structures, please make sure all 152*ed093b41SRobert Mustacchi * structures are multiples of 16 bytes (0x10) so as to ensure alignment. 153*ed093b41SRobert Mustacchi */ 154*ed093b41SRobert Mustacchi typedef struct prxregset prxregset_t; 155*ed093b41SRobert Mustacchi 156*ed093b41SRobert Mustacchi #define PRX_INFO_XCR 0x01 157*ed093b41SRobert Mustacchi #define PRX_INFO_XSAVE 0x02 158*ed093b41SRobert Mustacchi #define PRX_INFO_YMM 0x03 159*ed093b41SRobert Mustacchi #define PRX_INFO_OPMASK 0x04 160*ed093b41SRobert Mustacchi #define PRX_INFO_ZMM 0x05 161*ed093b41SRobert Mustacchi #define PRX_INFO_HI_ZMM 0x06 162*ed093b41SRobert Mustacchi 163*ed093b41SRobert Mustacchi typedef struct prxregset_info { 164*ed093b41SRobert Mustacchi uint32_t pri_type; 165*ed093b41SRobert Mustacchi uint32_t pri_flags; 166*ed093b41SRobert Mustacchi uint32_t pri_size; 167*ed093b41SRobert Mustacchi uint32_t pri_offset; 168*ed093b41SRobert Mustacchi } prxregset_info_t; 169*ed093b41SRobert Mustacchi 170*ed093b41SRobert Mustacchi #define PR_TYPE_XSAVE 0x01 171*ed093b41SRobert Mustacchi 172*ed093b41SRobert Mustacchi typedef struct prxregset_hdr { 173*ed093b41SRobert Mustacchi uint32_t pr_type; 174*ed093b41SRobert Mustacchi uint32_t pr_size; 175*ed093b41SRobert Mustacchi uint32_t pr_flags; 176*ed093b41SRobert Mustacchi uint32_t pr_pad[4]; 177*ed093b41SRobert Mustacchi uint32_t pr_ninfo; 178*ed093b41SRobert Mustacchi #if defined(_STDC_C99) || defined(__C99FEATURES__) 179*ed093b41SRobert Mustacchi prxregset_info_t pr_info[]; 180*ed093b41SRobert Mustacchi #endif 181*ed093b41SRobert Mustacchi } prxregset_hdr_t; 182*ed093b41SRobert Mustacchi 183*ed093b41SRobert Mustacchi typedef struct prxregset_xcr { 184*ed093b41SRobert Mustacchi uint64_t prx_xcr_xcr0; 185*ed093b41SRobert Mustacchi uint64_t prx_xcr_xfd; 186*ed093b41SRobert Mustacchi uint64_t prx_xcr_pad[2]; 187*ed093b41SRobert Mustacchi } prxregset_xcr_t; 188*ed093b41SRobert Mustacchi 189*ed093b41SRobert Mustacchi typedef struct prxregset_xsave { 190*ed093b41SRobert Mustacchi uint16_t prx_fx_fcw; 191*ed093b41SRobert Mustacchi uint16_t prx_fx_fsw; 192*ed093b41SRobert Mustacchi uint16_t prx_fx_fctw; /* compressed tag word */ 193*ed093b41SRobert Mustacchi uint16_t prx_fx_fop; 194*ed093b41SRobert Mustacchi #if defined(__amd64) 195*ed093b41SRobert Mustacchi uint64_t prx_fx_rip; 196*ed093b41SRobert Mustacchi uint64_t prx_fx_rdp; 197*ed093b41SRobert Mustacchi #else 198*ed093b41SRobert Mustacchi uint32_t prx_fx_eip; 199*ed093b41SRobert Mustacchi uint16_t prx_fx_cs; 200*ed093b41SRobert Mustacchi uint16_t __prx_fx_ign0; 201*ed093b41SRobert Mustacchi uint32_t prx_fx_dp; 202*ed093b41SRobert Mustacchi uint16_t prx_fx_ds; 203*ed093b41SRobert Mustacchi uint16_t __prx_fx_ign1; 204*ed093b41SRobert Mustacchi #endif 205*ed093b41SRobert Mustacchi uint32_t prx_fx_mxcsr; 206*ed093b41SRobert Mustacchi uint32_t prx_fx_mxcsr_mask; 207*ed093b41SRobert Mustacchi union { 208*ed093b41SRobert Mustacchi uint16_t prx_fpr_16[5]; /* 80-bits of x87 state */ 209*ed093b41SRobert Mustacchi u_longlong_t prx_fpr_mmx; /* 64-bit mmx register */ 210*ed093b41SRobert Mustacchi uint32_t _prx__fpr_pad[4]; /* (pad out to 128-bits) */ 211*ed093b41SRobert Mustacchi } fx_st[8]; 212*ed093b41SRobert Mustacchi #if defined(__amd64) 213*ed093b41SRobert Mustacchi upad128_t prx_fx_xmm[16]; /* 128-bit registers */ 214*ed093b41SRobert Mustacchi upad128_t __prx_fx_ign2[6]; 215*ed093b41SRobert Mustacchi #else 216*ed093b41SRobert Mustacchi upad128_t prx_fx_xmm[8]; /* 128-bit registers */ 217*ed093b41SRobert Mustacchi upad128_t __prx_fx_ign2[14]; 218*ed093b41SRobert Mustacchi #endif 219*ed093b41SRobert Mustacchi uint64_t prx_xsh_xstate_bv; 220*ed093b41SRobert Mustacchi uint64_t prx_xsh_xcomp_bv; 221*ed093b41SRobert Mustacchi uint64_t prx_xsh_reserved[6]; 222*ed093b41SRobert Mustacchi } prxregset_xsave_t; 223*ed093b41SRobert Mustacchi 224*ed093b41SRobert Mustacchi typedef struct prxregset_ymm { 225*ed093b41SRobert Mustacchi #if defined(__amd64) 226*ed093b41SRobert Mustacchi upad128_t prx_ymm[16]; 227*ed093b41SRobert Mustacchi #else 228*ed093b41SRobert Mustacchi upad128_t prx_ymm[8]; 229*ed093b41SRobert Mustacchi upad128_t prx_rsvd[8]; 230*ed093b41SRobert Mustacchi #endif 231*ed093b41SRobert Mustacchi } prxregset_ymm_t; 232*ed093b41SRobert Mustacchi 233*ed093b41SRobert Mustacchi typedef struct prxregset_opmask { 234*ed093b41SRobert Mustacchi uint64_t prx_opmask[8]; 235*ed093b41SRobert Mustacchi } prxregset_opmask_t; 236*ed093b41SRobert Mustacchi 237*ed093b41SRobert Mustacchi typedef struct prxregset_zmm { 238*ed093b41SRobert Mustacchi #if defined(__amd64) 239*ed093b41SRobert Mustacchi upad256_t prx_zmm[16]; 240*ed093b41SRobert Mustacchi #else 241*ed093b41SRobert Mustacchi upad256_t prx_zmm[8]; 242*ed093b41SRobert Mustacchi upad256_t prx_rsvd[8]; 243*ed093b41SRobert Mustacchi #endif 244*ed093b41SRobert Mustacchi } prxregset_zmm_t; 245*ed093b41SRobert Mustacchi 246*ed093b41SRobert Mustacchi typedef struct prxregset_hi_zmm { 247*ed093b41SRobert Mustacchi #if defined(__amd64) 248*ed093b41SRobert Mustacchi upad512_t prx_hi_zmm[16]; 249*ed093b41SRobert Mustacchi #else 250*ed093b41SRobert Mustacchi upad512_t prx_rsvd[16]; 251*ed093b41SRobert Mustacchi #endif 252*ed093b41SRobert Mustacchi } prxregset_hi_zmm_t; 253*ed093b41SRobert Mustacchi 2547c478bd9Sstevel@tonic-gate #ifdef __cplusplus 2557c478bd9Sstevel@tonic-gate } 2567c478bd9Sstevel@tonic-gate #endif 2577c478bd9Sstevel@tonic-gate 2587c478bd9Sstevel@tonic-gate #endif /* _SYS_PROCFS_ISA_H */ 259