/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2015 Nexenta Systems, Inc. All rights reserved. * * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */ /* * Essential struct definitions for mcontext_t needed by ucontext.h * These were formerly in regset.h, which now includes this file. */ #ifndef _SYS_MCONTEXT_H #define _SYS_MCONTEXT_H #include #if !defined(_ASM) #include #endif #ifdef __cplusplus extern "C" { #endif /* * A gregset_t is defined as an array type for compatibility with the reference * source. This is important due to differences in the way the C language * treats arrays and structures as parameters. */ #if defined(__amd64) #define _NGREG 28 #else #define _NGREG 19 #endif #if !defined(_ASM) #if defined(_LP64) || defined(_I32LPx) typedef long greg_t; #else typedef int greg_t; #endif #if defined(_SYSCALL32) typedef int32_t greg32_t; typedef int64_t greg64_t; #endif /* _SYSCALL32 */ typedef greg_t gregset_t[_NGREG]; #if defined(_SYSCALL32) #define _NGREG32 19 #define _NGREG64 28 typedef greg32_t gregset32_t[_NGREG32]; typedef greg64_t gregset64_t[_NGREG64]; #endif /* _SYSCALL32 */ /* * Floating point definitions. */ #if defined(__amd64) typedef struct _fpu { union { struct _fpchip_state { uint16_t cw; uint16_t sw; uint8_t fctw; uint8_t __fx_rsvd; uint16_t fop; uint64_t rip; uint64_t rdp; uint32_t mxcsr; uint32_t mxcsr_mask; union { uint16_t fpr_16[5]; upad128_t __fpr_pad; } st[8]; upad128_t xmm[16]; upad128_t __fx_ign2[6]; uint32_t status; /* sw at exception */ uint32_t xstatus; /* mxcsr at exception */ } fpchip_state; uint32_t f_fpregs[130]; } fp_reg_set; } fpregset_t; #else /* __i386 */ /* * This definition of the floating point structure is binary * compatible with the Intel386 psABI definition, and source * compatible with that specification for x87-style floating point. * It also allows SSE/SSE2 state to be accessed on machines that * possess such hardware capabilities. */ typedef struct _fpu { union { struct _fpchip_state { uint32_t state[27]; /* 287/387 saved state */ uint32_t status; /* saved at exception */ uint32_t mxcsr; /* SSE control and status */ uint32_t xstatus; /* SSE mxcsr at exception */ uint32_t __pad[2]; /* align to 128-bits */ upad128_t xmm[8]; /* %xmm0-%xmm7 */ } fpchip_state; struct _fp_emul_space { /* for emulator(s) */ uint8_t fp_emul[246]; uint8_t fp_epad[2]; } fp_emul_space; uint32_t f_fpregs[95]; /* union of the above */ } fp_reg_set; } fpregset_t; #endif /* __i386 */ #if defined(_SYSCALL32) /* Kernel view of user i386 fpu structure */ typedef struct fpu32 { union { struct fpchip32_state { uint32_t state[27]; /* 287/387 saved state */ uint32_t status; /* saved at exception */ uint32_t mxcsr; /* SSE control and status */ uint32_t xstatus; /* SSE mxcsr at exception */ uint32_t __pad[2]; /* align to 128-bits */ uint32_t xmm[8][4]; /* %xmm0-%xmm7 */ } fpchip_state; uint32_t f_fpregs[95]; /* union of the above */ } fp_reg_set; } fpregset32_t; #endif /* _SYSCALL32 */ /* * Structure mcontext defines the complete hardware machine state. * (This structure is specified in the i386 ABI suppl.) */ typedef struct { gregset_t gregs; /* general register set */ fpregset_t fpregs; /* floating point register set */ } mcontext_t; #if defined(_SYSCALL32) typedef struct { gregset32_t gregs; /* general register set */ fpregset32_t fpregs; /* floating point register set */ } mcontext32_t; #endif /* _SYSCALL32 */ #endif /* _ASM */ #ifdef __cplusplus } #endif #endif /* _SYS_MCONTEXT_H */