121f24617SDmitry Chagin /*- 221f24617SDmitry Chagin * SPDX-License-Identifier: BSD-3-Clause 321f24617SDmitry Chagin * 421f24617SDmitry Chagin * Copyright (c) 2004 Tim J. Robbins 521f24617SDmitry Chagin * Copyright (c) 2001 Doug Rabson 621f24617SDmitry Chagin * Copyright (c) 1994-1996 Søren Schmidt 721f24617SDmitry Chagin * All rights reserved. 821f24617SDmitry Chagin * 921f24617SDmitry Chagin * Redistribution and use in source and binary forms, with or without 1021f24617SDmitry Chagin * modification, are permitted provided that the following conditions 1121f24617SDmitry Chagin * are met: 1221f24617SDmitry Chagin * 1. Redistributions of source code must retain the above copyright 1321f24617SDmitry Chagin * notice, this list of conditions and the following disclaimer 1421f24617SDmitry Chagin * in this position and unchanged. 1521f24617SDmitry Chagin * 2. Redistributions in binary form must reproduce the above copyright 1621f24617SDmitry Chagin * notice, this list of conditions and the following disclaimer in the 1721f24617SDmitry Chagin * documentation and/or other materials provided with the distribution. 1821f24617SDmitry Chagin * 3. The name of the author may not be used to endorse or promote products 1921f24617SDmitry Chagin * derived from this software without specific prior written permission 2021f24617SDmitry Chagin * 2121f24617SDmitry Chagin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 2221f24617SDmitry Chagin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2321f24617SDmitry Chagin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2421f24617SDmitry Chagin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2521f24617SDmitry Chagin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2621f24617SDmitry Chagin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2721f24617SDmitry Chagin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2821f24617SDmitry Chagin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2921f24617SDmitry Chagin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 3021f24617SDmitry Chagin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3121f24617SDmitry Chagin */ 3221f24617SDmitry Chagin 3321f24617SDmitry Chagin #ifndef _X86_LINUX_SIGFRAME_H_ 3421f24617SDmitry Chagin #define _X86_LINUX_SIGFRAME_H_ 3521f24617SDmitry Chagin 36*cbbac560SDmitry Chagin #define LINUX_UC_FP_XSTATE 0x1 37*cbbac560SDmitry Chagin 38*cbbac560SDmitry Chagin #define LINUX_FP_XSTATE_MAGIC1 0x46505853U 39*cbbac560SDmitry Chagin #define LINUX_FP_XSTATE_MAGIC2 0x46505845U 40*cbbac560SDmitry Chagin #define LINUX_FP_XSTATE_MAGIC2_SIZE sizeof(uint32_t) 41*cbbac560SDmitry Chagin 42*cbbac560SDmitry Chagin struct l_fpx_sw_bytes { 43*cbbac560SDmitry Chagin uint32_t magic1; 44*cbbac560SDmitry Chagin uint32_t extended_size; 45*cbbac560SDmitry Chagin uint64_t xfeatures; 46*cbbac560SDmitry Chagin uint32_t xstate_size; 47*cbbac560SDmitry Chagin uint32_t padding[7]; 48*cbbac560SDmitry Chagin }; 49*cbbac560SDmitry Chagin 5021f24617SDmitry Chagin #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) 5121f24617SDmitry Chagin 5221f24617SDmitry Chagin /* The Linux sigcontext, pretty much a standard 386 trapframe. */ 5321f24617SDmitry Chagin struct l_sigcontext { 5421f24617SDmitry Chagin l_uint sc_gs; 5521f24617SDmitry Chagin l_uint sc_fs; 5621f24617SDmitry Chagin l_uint sc_es; 5721f24617SDmitry Chagin l_uint sc_ds; 5821f24617SDmitry Chagin l_uint sc_edi; 5921f24617SDmitry Chagin l_uint sc_esi; 6021f24617SDmitry Chagin l_uint sc_ebp; 6121f24617SDmitry Chagin l_uint sc_esp; 6221f24617SDmitry Chagin l_uint sc_ebx; 6321f24617SDmitry Chagin l_uint sc_edx; 6421f24617SDmitry Chagin l_uint sc_ecx; 6521f24617SDmitry Chagin l_uint sc_eax; 6621f24617SDmitry Chagin l_uint sc_trapno; 6721f24617SDmitry Chagin l_uint sc_err; 6821f24617SDmitry Chagin l_uint sc_eip; 6921f24617SDmitry Chagin l_uint sc_cs; 7021f24617SDmitry Chagin l_uint sc_eflags; 7121f24617SDmitry Chagin l_uint sc_esp_at_signal; 7221f24617SDmitry Chagin l_uint sc_ss; 7321f24617SDmitry Chagin l_uint sc_387; 7421f24617SDmitry Chagin l_uint sc_mask; 7521f24617SDmitry Chagin l_uint sc_cr2; 7621f24617SDmitry Chagin }; 7721f24617SDmitry Chagin 7821f24617SDmitry Chagin struct l_ucontext { 7921f24617SDmitry Chagin l_ulong uc_flags; 8021f24617SDmitry Chagin l_uintptr_t uc_link; 8121f24617SDmitry Chagin l_stack_t uc_stack; 8221f24617SDmitry Chagin struct l_sigcontext uc_mcontext; 8321f24617SDmitry Chagin l_sigset_t uc_sigmask; 8421f24617SDmitry Chagin } __packed; 8521f24617SDmitry Chagin 8621f24617SDmitry Chagin struct l_fpreg { 8721f24617SDmitry Chagin u_int16_t significand[4]; 8821f24617SDmitry Chagin u_int16_t exponent; 8921f24617SDmitry Chagin }; 9021f24617SDmitry Chagin 9121f24617SDmitry Chagin struct l_fpxreg { 9221f24617SDmitry Chagin u_int16_t significand[4]; 9321f24617SDmitry Chagin u_int16_t exponent; 9421f24617SDmitry Chagin u_int16_t padding[3]; 9521f24617SDmitry Chagin }; 9621f24617SDmitry Chagin 9721f24617SDmitry Chagin struct l_xmmreg { 9821f24617SDmitry Chagin u_int32_t element[4]; 9921f24617SDmitry Chagin }; 10021f24617SDmitry Chagin 10121f24617SDmitry Chagin struct l_fpstate { 10221f24617SDmitry Chagin /* Regular FPU environment */ 10321f24617SDmitry Chagin u_int32_t cw; 10421f24617SDmitry Chagin u_int32_t sw; 10521f24617SDmitry Chagin u_int32_t tag; 10621f24617SDmitry Chagin u_int32_t ipoff; 10721f24617SDmitry Chagin u_int32_t cssel; 10821f24617SDmitry Chagin u_int32_t dataoff; 10921f24617SDmitry Chagin u_int32_t datasel; 11021f24617SDmitry Chagin struct l_fpreg _st[8]; 11121f24617SDmitry Chagin u_int16_t status; 11221f24617SDmitry Chagin u_int16_t magic; /* 0xffff = regular FPU data */ 11321f24617SDmitry Chagin 11421f24617SDmitry Chagin /* FXSR FPU environment */ 11521f24617SDmitry Chagin u_int32_t _fxsr_env[6]; /* env is ignored. */ 11621f24617SDmitry Chagin u_int32_t mxcsr; 11721f24617SDmitry Chagin u_int32_t reserved; 11821f24617SDmitry Chagin struct l_fpxreg _fxsr_st[8]; /* reg data is ignored. */ 11921f24617SDmitry Chagin struct l_xmmreg _xmm[8]; 12021f24617SDmitry Chagin u_int32_t padding[56]; 12121f24617SDmitry Chagin }; 12221f24617SDmitry Chagin 12321f24617SDmitry Chagin /* 12421f24617SDmitry Chagin * We make the stack look like Linux expects it when calling a signal 12521f24617SDmitry Chagin * handler, but use the BSD way of calling the handler and sigreturn(). 12621f24617SDmitry Chagin */ 12721f24617SDmitry Chagin struct l_sigframe { 12821f24617SDmitry Chagin l_int sf_sig; 12921f24617SDmitry Chagin struct l_sigcontext sf_sc; 13021f24617SDmitry Chagin struct l_fpstate sf_fpstate; 1314a6c2d07SDmitry Chagin sigset_t sf_sigmask; 13221f24617SDmitry Chagin }; 13321f24617SDmitry Chagin 13421f24617SDmitry Chagin struct l_rt_sigframe { 13521f24617SDmitry Chagin l_int sf_sig; 13621f24617SDmitry Chagin l_uintptr_t sf_siginfo; 13721f24617SDmitry Chagin l_uintptr_t sf_ucontext; 13821f24617SDmitry Chagin l_siginfo_t sf_si; 1396e826d27SDmitry Chagin struct l_ucontext sf_uc; 14021f24617SDmitry Chagin }; 14121f24617SDmitry Chagin 14221f24617SDmitry Chagin #else 14321f24617SDmitry Chagin 14421f24617SDmitry Chagin struct l_fpstate { 14521f24617SDmitry Chagin u_int16_t cwd; 14621f24617SDmitry Chagin u_int16_t swd; 14721f24617SDmitry Chagin u_int16_t twd; 14821f24617SDmitry Chagin u_int16_t fop; 14921f24617SDmitry Chagin u_int64_t rip; 15021f24617SDmitry Chagin u_int64_t rdp; 15121f24617SDmitry Chagin u_int32_t mxcsr; 15221f24617SDmitry Chagin u_int32_t mxcsr_mask; 153a95cb95eSDmitry Chagin u_int8_t st[8][16]; 154a95cb95eSDmitry Chagin u_int8_t xmm[16][16]; 155*cbbac560SDmitry Chagin u_int32_t reserved2[12]; 156*cbbac560SDmitry Chagin union { 157*cbbac560SDmitry Chagin u_int32_t reserved3[12]; 158*cbbac560SDmitry Chagin struct l_fpx_sw_bytes sw_reserved; 159*cbbac560SDmitry Chagin }; 160a95cb95eSDmitry Chagin } __aligned(16); 16121f24617SDmitry Chagin 16221f24617SDmitry Chagin struct l_sigcontext { 16321f24617SDmitry Chagin l_ulong sc_r8; 16421f24617SDmitry Chagin l_ulong sc_r9; 16521f24617SDmitry Chagin l_ulong sc_r10; 16621f24617SDmitry Chagin l_ulong sc_r11; 16721f24617SDmitry Chagin l_ulong sc_r12; 16821f24617SDmitry Chagin l_ulong sc_r13; 16921f24617SDmitry Chagin l_ulong sc_r14; 17021f24617SDmitry Chagin l_ulong sc_r15; 17121f24617SDmitry Chagin l_ulong sc_rdi; 17221f24617SDmitry Chagin l_ulong sc_rsi; 17321f24617SDmitry Chagin l_ulong sc_rbp; 17421f24617SDmitry Chagin l_ulong sc_rbx; 17521f24617SDmitry Chagin l_ulong sc_rdx; 17621f24617SDmitry Chagin l_ulong sc_rax; 17721f24617SDmitry Chagin l_ulong sc_rcx; 17821f24617SDmitry Chagin l_ulong sc_rsp; 17921f24617SDmitry Chagin l_ulong sc_rip; 18021f24617SDmitry Chagin l_ulong sc_rflags; 18121f24617SDmitry Chagin l_ushort sc_cs; 18221f24617SDmitry Chagin l_ushort sc_gs; 18321f24617SDmitry Chagin l_ushort sc_fs; 18421f24617SDmitry Chagin l_ushort sc___pad0; 18521f24617SDmitry Chagin l_ulong sc_err; 18621f24617SDmitry Chagin l_ulong sc_trapno; 18721f24617SDmitry Chagin l_sigset_t sc_mask; 18821f24617SDmitry Chagin l_ulong sc_cr2; 189920184edSDmitry Chagin /* 190920184edSDmitry Chagin * On Linux sc_fpstate is (struct l_fpstate *) or (struct l_xstate *) 191920184edSDmitry Chagin * depending on the FP_XSTATE_MAGIC1 encoded in the sw_reserved 192920184edSDmitry Chagin * bytes of (struct l_fpstate) and FP_XSTATE_MAGIC2 present at the end 193920184edSDmitry Chagin * of extended memory layout. 194920184edSDmitry Chagin */ 195920184edSDmitry Chagin l_uintptr_t sc_fpstate; 19621f24617SDmitry Chagin l_ulong sc_reserved1[8]; 19721f24617SDmitry Chagin }; 19821f24617SDmitry Chagin 19921f24617SDmitry Chagin struct l_ucontext { 20021f24617SDmitry Chagin l_ulong uc_flags; 20121f24617SDmitry Chagin l_uintptr_t uc_link; 20221f24617SDmitry Chagin l_stack_t uc_stack; 20321f24617SDmitry Chagin struct l_sigcontext uc_mcontext; 20421f24617SDmitry Chagin l_sigset_t uc_sigmask; 20521f24617SDmitry Chagin }; 20621f24617SDmitry Chagin 20721f24617SDmitry Chagin /* 20821f24617SDmitry Chagin * We make the stack look like Linux expects it when calling a signal 20921f24617SDmitry Chagin * handler, but use the BSD way of calling the handler and sigreturn(). 21021f24617SDmitry Chagin */ 21121f24617SDmitry Chagin struct l_rt_sigframe { 2126e826d27SDmitry Chagin struct l_ucontext sf_uc; 21321f24617SDmitry Chagin struct l_siginfo sf_si; 21421f24617SDmitry Chagin }; 21521f24617SDmitry Chagin 21621f24617SDmitry Chagin #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */ 21721f24617SDmitry Chagin 21821f24617SDmitry Chagin #endif /* !_X86_LINUX_SIGFRAME_H_ */ 219