1*c5a5e6f4SGordon Ross /* 2*c5a5e6f4SGordon Ross * CDDL HEADER START 3*c5a5e6f4SGordon Ross * 4*c5a5e6f4SGordon Ross * The contents of this file are subject to the terms of the 5*c5a5e6f4SGordon Ross * Common Development and Distribution License (the "License"). 6*c5a5e6f4SGordon Ross * You may not use this file except in compliance with the License. 7*c5a5e6f4SGordon Ross * 8*c5a5e6f4SGordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*c5a5e6f4SGordon Ross * or http://www.opensolaris.org/os/licensing. 10*c5a5e6f4SGordon Ross * See the License for the specific language governing permissions 11*c5a5e6f4SGordon Ross * and limitations under the License. 12*c5a5e6f4SGordon Ross * 13*c5a5e6f4SGordon Ross * When distributing Covered Code, include this CDDL HEADER in each 14*c5a5e6f4SGordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*c5a5e6f4SGordon Ross * If applicable, add the following below this CDDL HEADER, with the 16*c5a5e6f4SGordon Ross * fields enclosed by brackets "[]" replaced with your own identifying 17*c5a5e6f4SGordon Ross * information: Portions Copyright [yyyy] [name of copyright owner] 18*c5a5e6f4SGordon Ross * 19*c5a5e6f4SGordon Ross * CDDL HEADER END 20*c5a5e6f4SGordon Ross */ 21*c5a5e6f4SGordon Ross /* 22*c5a5e6f4SGordon Ross * Copyright 2015 Nexenta Systems, Inc. All rights reserved. 23*c5a5e6f4SGordon Ross * 24*c5a5e6f4SGordon Ross * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. 25*c5a5e6f4SGordon Ross */ 26*c5a5e6f4SGordon Ross /* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */ 27*c5a5e6f4SGordon Ross 28*c5a5e6f4SGordon Ross /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 29*c5a5e6f4SGordon Ross /* All Rights Reserved */ 30*c5a5e6f4SGordon Ross 31*c5a5e6f4SGordon Ross /* 32*c5a5e6f4SGordon Ross * Essential struct definitions for mcontext_t needed by ucontext.h 33*c5a5e6f4SGordon Ross * These were formerly in regset.h, which now includes this file. 34*c5a5e6f4SGordon Ross */ 35*c5a5e6f4SGordon Ross 36*c5a5e6f4SGordon Ross #ifndef _SYS_MCONTEXT_H 37*c5a5e6f4SGordon Ross #define _SYS_MCONTEXT_H 38*c5a5e6f4SGordon Ross 39*c5a5e6f4SGordon Ross #include <sys/feature_tests.h> 40*c5a5e6f4SGordon Ross 41*c5a5e6f4SGordon Ross #if !defined(_ASM) 42*c5a5e6f4SGordon Ross #include <sys/types.h> 43*c5a5e6f4SGordon Ross #endif 44*c5a5e6f4SGordon Ross 45*c5a5e6f4SGordon Ross #ifdef __cplusplus 46*c5a5e6f4SGordon Ross extern "C" { 47*c5a5e6f4SGordon Ross #endif 48*c5a5e6f4SGordon Ross 49*c5a5e6f4SGordon Ross /* 50*c5a5e6f4SGordon Ross * A gregset_t is defined as an array type for compatibility with the reference 51*c5a5e6f4SGordon Ross * source. This is important due to differences in the way the C language 52*c5a5e6f4SGordon Ross * treats arrays and structures as parameters. 53*c5a5e6f4SGordon Ross */ 54*c5a5e6f4SGordon Ross #if defined(__amd64) 55*c5a5e6f4SGordon Ross #define _NGREG 28 56*c5a5e6f4SGordon Ross #else 57*c5a5e6f4SGordon Ross #define _NGREG 19 58*c5a5e6f4SGordon Ross #endif 59*c5a5e6f4SGordon Ross 60*c5a5e6f4SGordon Ross #if !defined(_ASM) 61*c5a5e6f4SGordon Ross 62*c5a5e6f4SGordon Ross #if defined(_LP64) || defined(_I32LPx) 63*c5a5e6f4SGordon Ross typedef long greg_t; 64*c5a5e6f4SGordon Ross #else 65*c5a5e6f4SGordon Ross typedef int greg_t; 66*c5a5e6f4SGordon Ross #endif 67*c5a5e6f4SGordon Ross 68*c5a5e6f4SGordon Ross #if defined(_SYSCALL32) 69*c5a5e6f4SGordon Ross 70*c5a5e6f4SGordon Ross typedef int32_t greg32_t; 71*c5a5e6f4SGordon Ross typedef int64_t greg64_t; 72*c5a5e6f4SGordon Ross 73*c5a5e6f4SGordon Ross #endif /* _SYSCALL32 */ 74*c5a5e6f4SGordon Ross 75*c5a5e6f4SGordon Ross typedef greg_t gregset_t[_NGREG]; 76*c5a5e6f4SGordon Ross 77*c5a5e6f4SGordon Ross #if defined(_SYSCALL32) 78*c5a5e6f4SGordon Ross 79*c5a5e6f4SGordon Ross #define _NGREG32 19 80*c5a5e6f4SGordon Ross #define _NGREG64 28 81*c5a5e6f4SGordon Ross 82*c5a5e6f4SGordon Ross typedef greg32_t gregset32_t[_NGREG32]; 83*c5a5e6f4SGordon Ross typedef greg64_t gregset64_t[_NGREG64]; 84*c5a5e6f4SGordon Ross 85*c5a5e6f4SGordon Ross #endif /* _SYSCALL32 */ 86*c5a5e6f4SGordon Ross 87*c5a5e6f4SGordon Ross /* 88*c5a5e6f4SGordon Ross * Floating point definitions. 89*c5a5e6f4SGordon Ross */ 90*c5a5e6f4SGordon Ross 91*c5a5e6f4SGordon Ross #if defined(__amd64) 92*c5a5e6f4SGordon Ross 93*c5a5e6f4SGordon Ross typedef struct _fpu { 94*c5a5e6f4SGordon Ross union { 95*c5a5e6f4SGordon Ross struct _fpchip_state { 96*c5a5e6f4SGordon Ross uint16_t cw; 97*c5a5e6f4SGordon Ross uint16_t sw; 98*c5a5e6f4SGordon Ross uint8_t fctw; 99*c5a5e6f4SGordon Ross uint8_t __fx_rsvd; 100*c5a5e6f4SGordon Ross uint16_t fop; 101*c5a5e6f4SGordon Ross uint64_t rip; 102*c5a5e6f4SGordon Ross uint64_t rdp; 103*c5a5e6f4SGordon Ross uint32_t mxcsr; 104*c5a5e6f4SGordon Ross uint32_t mxcsr_mask; 105*c5a5e6f4SGordon Ross union { 106*c5a5e6f4SGordon Ross uint16_t fpr_16[5]; 107*c5a5e6f4SGordon Ross upad128_t __fpr_pad; 108*c5a5e6f4SGordon Ross } st[8]; 109*c5a5e6f4SGordon Ross upad128_t xmm[16]; 110*c5a5e6f4SGordon Ross upad128_t __fx_ign2[6]; 111*c5a5e6f4SGordon Ross uint32_t status; /* sw at exception */ 112*c5a5e6f4SGordon Ross uint32_t xstatus; /* mxcsr at exception */ 113*c5a5e6f4SGordon Ross } fpchip_state; 114*c5a5e6f4SGordon Ross uint32_t f_fpregs[130]; 115*c5a5e6f4SGordon Ross } fp_reg_set; 116*c5a5e6f4SGordon Ross } fpregset_t; 117*c5a5e6f4SGordon Ross 118*c5a5e6f4SGordon Ross #else /* __i386 */ 119*c5a5e6f4SGordon Ross 120*c5a5e6f4SGordon Ross /* 121*c5a5e6f4SGordon Ross * This definition of the floating point structure is binary 122*c5a5e6f4SGordon Ross * compatible with the Intel386 psABI definition, and source 123*c5a5e6f4SGordon Ross * compatible with that specification for x87-style floating point. 124*c5a5e6f4SGordon Ross * It also allows SSE/SSE2 state to be accessed on machines that 125*c5a5e6f4SGordon Ross * possess such hardware capabilities. 126*c5a5e6f4SGordon Ross */ 127*c5a5e6f4SGordon Ross typedef struct _fpu { 128*c5a5e6f4SGordon Ross union { 129*c5a5e6f4SGordon Ross struct _fpchip_state { 130*c5a5e6f4SGordon Ross uint32_t state[27]; /* 287/387 saved state */ 131*c5a5e6f4SGordon Ross uint32_t status; /* saved at exception */ 132*c5a5e6f4SGordon Ross uint32_t mxcsr; /* SSE control and status */ 133*c5a5e6f4SGordon Ross uint32_t xstatus; /* SSE mxcsr at exception */ 134*c5a5e6f4SGordon Ross uint32_t __pad[2]; /* align to 128-bits */ 135*c5a5e6f4SGordon Ross upad128_t xmm[8]; /* %xmm0-%xmm7 */ 136*c5a5e6f4SGordon Ross } fpchip_state; 137*c5a5e6f4SGordon Ross struct _fp_emul_space { /* for emulator(s) */ 138*c5a5e6f4SGordon Ross uint8_t fp_emul[246]; 139*c5a5e6f4SGordon Ross uint8_t fp_epad[2]; 140*c5a5e6f4SGordon Ross } fp_emul_space; 141*c5a5e6f4SGordon Ross uint32_t f_fpregs[95]; /* union of the above */ 142*c5a5e6f4SGordon Ross } fp_reg_set; 143*c5a5e6f4SGordon Ross } fpregset_t; 144*c5a5e6f4SGordon Ross 145*c5a5e6f4SGordon Ross #endif /* __i386 */ 146*c5a5e6f4SGordon Ross 147*c5a5e6f4SGordon Ross #if defined(_SYSCALL32) 148*c5a5e6f4SGordon Ross 149*c5a5e6f4SGordon Ross /* Kernel view of user i386 fpu structure */ 150*c5a5e6f4SGordon Ross 151*c5a5e6f4SGordon Ross typedef struct fpu32 { 152*c5a5e6f4SGordon Ross union { 153*c5a5e6f4SGordon Ross struct fpchip32_state { 154*c5a5e6f4SGordon Ross uint32_t state[27]; /* 287/387 saved state */ 155*c5a5e6f4SGordon Ross uint32_t status; /* saved at exception */ 156*c5a5e6f4SGordon Ross uint32_t mxcsr; /* SSE control and status */ 157*c5a5e6f4SGordon Ross uint32_t xstatus; /* SSE mxcsr at exception */ 158*c5a5e6f4SGordon Ross uint32_t __pad[2]; /* align to 128-bits */ 159*c5a5e6f4SGordon Ross uint32_t xmm[8][4]; /* %xmm0-%xmm7 */ 160*c5a5e6f4SGordon Ross } fpchip_state; 161*c5a5e6f4SGordon Ross uint32_t f_fpregs[95]; /* union of the above */ 162*c5a5e6f4SGordon Ross } fp_reg_set; 163*c5a5e6f4SGordon Ross } fpregset32_t; 164*c5a5e6f4SGordon Ross 165*c5a5e6f4SGordon Ross #endif /* _SYSCALL32 */ 166*c5a5e6f4SGordon Ross 167*c5a5e6f4SGordon Ross /* 168*c5a5e6f4SGordon Ross * Structure mcontext defines the complete hardware machine state. 169*c5a5e6f4SGordon Ross * (This structure is specified in the i386 ABI suppl.) 170*c5a5e6f4SGordon Ross */ 171*c5a5e6f4SGordon Ross typedef struct { 172*c5a5e6f4SGordon Ross gregset_t gregs; /* general register set */ 173*c5a5e6f4SGordon Ross fpregset_t fpregs; /* floating point register set */ 174*c5a5e6f4SGordon Ross } mcontext_t; 175*c5a5e6f4SGordon Ross 176*c5a5e6f4SGordon Ross #if defined(_SYSCALL32) 177*c5a5e6f4SGordon Ross 178*c5a5e6f4SGordon Ross typedef struct { 179*c5a5e6f4SGordon Ross gregset32_t gregs; /* general register set */ 180*c5a5e6f4SGordon Ross fpregset32_t fpregs; /* floating point register set */ 181*c5a5e6f4SGordon Ross } mcontext32_t; 182*c5a5e6f4SGordon Ross 183*c5a5e6f4SGordon Ross #endif /* _SYSCALL32 */ 184*c5a5e6f4SGordon Ross 185*c5a5e6f4SGordon Ross #endif /* _ASM */ 186*c5a5e6f4SGordon Ross 187*c5a5e6f4SGordon Ross #ifdef __cplusplus 188*c5a5e6f4SGordon Ross } 189*c5a5e6f4SGordon Ross #endif 190*c5a5e6f4SGordon Ross 191*c5a5e6f4SGordon Ross #endif /* _SYS_MCONTEXT_H */ 192