xref: /titanic_44/usr/src/uts/intel/sys/mcontext.h (revision c5a5e6f47e8f40ef4f4a14b199b09585e3ecf9a0)
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