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 * $FreeBSD$ 3321f24617SDmitry Chagin */ 3421f24617SDmitry Chagin 3521f24617SDmitry Chagin #ifndef _X86_LINUX_SIGFRAME_H_ 3621f24617SDmitry Chagin #define _X86_LINUX_SIGFRAME_H_ 3721f24617SDmitry Chagin 38*cbbac560SDmitry Chagin #define LINUX_UC_FP_XSTATE 0x1 39*cbbac560SDmitry Chagin 40*cbbac560SDmitry Chagin #define LINUX_FP_XSTATE_MAGIC1 0x46505853U 41*cbbac560SDmitry Chagin #define LINUX_FP_XSTATE_MAGIC2 0x46505845U 42*cbbac560SDmitry Chagin #define LINUX_FP_XSTATE_MAGIC2_SIZE sizeof(uint32_t) 43*cbbac560SDmitry Chagin 44*cbbac560SDmitry Chagin struct l_fpx_sw_bytes { 45*cbbac560SDmitry Chagin uint32_t magic1; 46*cbbac560SDmitry Chagin uint32_t extended_size; 47*cbbac560SDmitry Chagin uint64_t xfeatures; 48*cbbac560SDmitry Chagin uint32_t xstate_size; 49*cbbac560SDmitry Chagin uint32_t padding[7]; 50*cbbac560SDmitry Chagin }; 51*cbbac560SDmitry Chagin 5221f24617SDmitry Chagin #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) 5321f24617SDmitry Chagin 5421f24617SDmitry Chagin /* The Linux sigcontext, pretty much a standard 386 trapframe. */ 5521f24617SDmitry Chagin struct l_sigcontext { 5621f24617SDmitry Chagin l_uint sc_gs; 5721f24617SDmitry Chagin l_uint sc_fs; 5821f24617SDmitry Chagin l_uint sc_es; 5921f24617SDmitry Chagin l_uint sc_ds; 6021f24617SDmitry Chagin l_uint sc_edi; 6121f24617SDmitry Chagin l_uint sc_esi; 6221f24617SDmitry Chagin l_uint sc_ebp; 6321f24617SDmitry Chagin l_uint sc_esp; 6421f24617SDmitry Chagin l_uint sc_ebx; 6521f24617SDmitry Chagin l_uint sc_edx; 6621f24617SDmitry Chagin l_uint sc_ecx; 6721f24617SDmitry Chagin l_uint sc_eax; 6821f24617SDmitry Chagin l_uint sc_trapno; 6921f24617SDmitry Chagin l_uint sc_err; 7021f24617SDmitry Chagin l_uint sc_eip; 7121f24617SDmitry Chagin l_uint sc_cs; 7221f24617SDmitry Chagin l_uint sc_eflags; 7321f24617SDmitry Chagin l_uint sc_esp_at_signal; 7421f24617SDmitry Chagin l_uint sc_ss; 7521f24617SDmitry Chagin l_uint sc_387; 7621f24617SDmitry Chagin l_uint sc_mask; 7721f24617SDmitry Chagin l_uint sc_cr2; 7821f24617SDmitry Chagin }; 7921f24617SDmitry Chagin 8021f24617SDmitry Chagin struct l_ucontext { 8121f24617SDmitry Chagin l_ulong uc_flags; 8221f24617SDmitry Chagin l_uintptr_t uc_link; 8321f24617SDmitry Chagin l_stack_t uc_stack; 8421f24617SDmitry Chagin struct l_sigcontext uc_mcontext; 8521f24617SDmitry Chagin l_sigset_t uc_sigmask; 8621f24617SDmitry Chagin } __packed; 8721f24617SDmitry Chagin 8821f24617SDmitry Chagin struct l_fpreg { 8921f24617SDmitry Chagin u_int16_t significand[4]; 9021f24617SDmitry Chagin u_int16_t exponent; 9121f24617SDmitry Chagin }; 9221f24617SDmitry Chagin 9321f24617SDmitry Chagin struct l_fpxreg { 9421f24617SDmitry Chagin u_int16_t significand[4]; 9521f24617SDmitry Chagin u_int16_t exponent; 9621f24617SDmitry Chagin u_int16_t padding[3]; 9721f24617SDmitry Chagin }; 9821f24617SDmitry Chagin 9921f24617SDmitry Chagin struct l_xmmreg { 10021f24617SDmitry Chagin u_int32_t element[4]; 10121f24617SDmitry Chagin }; 10221f24617SDmitry Chagin 10321f24617SDmitry Chagin struct l_fpstate { 10421f24617SDmitry Chagin /* Regular FPU environment */ 10521f24617SDmitry Chagin u_int32_t cw; 10621f24617SDmitry Chagin u_int32_t sw; 10721f24617SDmitry Chagin u_int32_t tag; 10821f24617SDmitry Chagin u_int32_t ipoff; 10921f24617SDmitry Chagin u_int32_t cssel; 11021f24617SDmitry Chagin u_int32_t dataoff; 11121f24617SDmitry Chagin u_int32_t datasel; 11221f24617SDmitry Chagin struct l_fpreg _st[8]; 11321f24617SDmitry Chagin u_int16_t status; 11421f24617SDmitry Chagin u_int16_t magic; /* 0xffff = regular FPU data */ 11521f24617SDmitry Chagin 11621f24617SDmitry Chagin /* FXSR FPU environment */ 11721f24617SDmitry Chagin u_int32_t _fxsr_env[6]; /* env is ignored. */ 11821f24617SDmitry Chagin u_int32_t mxcsr; 11921f24617SDmitry Chagin u_int32_t reserved; 12021f24617SDmitry Chagin struct l_fpxreg _fxsr_st[8]; /* reg data is ignored. */ 12121f24617SDmitry Chagin struct l_xmmreg _xmm[8]; 12221f24617SDmitry Chagin u_int32_t padding[56]; 12321f24617SDmitry Chagin }; 12421f24617SDmitry Chagin 12521f24617SDmitry Chagin /* 12621f24617SDmitry Chagin * We make the stack look like Linux expects it when calling a signal 12721f24617SDmitry Chagin * handler, but use the BSD way of calling the handler and sigreturn(). 12821f24617SDmitry Chagin */ 12921f24617SDmitry Chagin struct l_sigframe { 13021f24617SDmitry Chagin l_int sf_sig; 13121f24617SDmitry Chagin struct l_sigcontext sf_sc; 13221f24617SDmitry Chagin struct l_fpstate sf_fpstate; 1334a6c2d07SDmitry Chagin sigset_t sf_sigmask; 13421f24617SDmitry Chagin }; 13521f24617SDmitry Chagin 13621f24617SDmitry Chagin struct l_rt_sigframe { 13721f24617SDmitry Chagin l_int sf_sig; 13821f24617SDmitry Chagin l_uintptr_t sf_siginfo; 13921f24617SDmitry Chagin l_uintptr_t sf_ucontext; 14021f24617SDmitry Chagin l_siginfo_t sf_si; 1416e826d27SDmitry Chagin struct l_ucontext sf_uc; 14221f24617SDmitry Chagin }; 14321f24617SDmitry Chagin 14421f24617SDmitry Chagin #else 14521f24617SDmitry Chagin 14621f24617SDmitry Chagin struct l_fpstate { 14721f24617SDmitry Chagin u_int16_t cwd; 14821f24617SDmitry Chagin u_int16_t swd; 14921f24617SDmitry Chagin u_int16_t twd; 15021f24617SDmitry Chagin u_int16_t fop; 15121f24617SDmitry Chagin u_int64_t rip; 15221f24617SDmitry Chagin u_int64_t rdp; 15321f24617SDmitry Chagin u_int32_t mxcsr; 15421f24617SDmitry Chagin u_int32_t mxcsr_mask; 155a95cb95eSDmitry Chagin u_int8_t st[8][16]; 156a95cb95eSDmitry Chagin u_int8_t xmm[16][16]; 157*cbbac560SDmitry Chagin u_int32_t reserved2[12]; 158*cbbac560SDmitry Chagin union { 159*cbbac560SDmitry Chagin u_int32_t reserved3[12]; 160*cbbac560SDmitry Chagin struct l_fpx_sw_bytes sw_reserved; 161*cbbac560SDmitry Chagin }; 162a95cb95eSDmitry Chagin } __aligned(16); 16321f24617SDmitry Chagin 16421f24617SDmitry Chagin struct l_sigcontext { 16521f24617SDmitry Chagin l_ulong sc_r8; 16621f24617SDmitry Chagin l_ulong sc_r9; 16721f24617SDmitry Chagin l_ulong sc_r10; 16821f24617SDmitry Chagin l_ulong sc_r11; 16921f24617SDmitry Chagin l_ulong sc_r12; 17021f24617SDmitry Chagin l_ulong sc_r13; 17121f24617SDmitry Chagin l_ulong sc_r14; 17221f24617SDmitry Chagin l_ulong sc_r15; 17321f24617SDmitry Chagin l_ulong sc_rdi; 17421f24617SDmitry Chagin l_ulong sc_rsi; 17521f24617SDmitry Chagin l_ulong sc_rbp; 17621f24617SDmitry Chagin l_ulong sc_rbx; 17721f24617SDmitry Chagin l_ulong sc_rdx; 17821f24617SDmitry Chagin l_ulong sc_rax; 17921f24617SDmitry Chagin l_ulong sc_rcx; 18021f24617SDmitry Chagin l_ulong sc_rsp; 18121f24617SDmitry Chagin l_ulong sc_rip; 18221f24617SDmitry Chagin l_ulong sc_rflags; 18321f24617SDmitry Chagin l_ushort sc_cs; 18421f24617SDmitry Chagin l_ushort sc_gs; 18521f24617SDmitry Chagin l_ushort sc_fs; 18621f24617SDmitry Chagin l_ushort sc___pad0; 18721f24617SDmitry Chagin l_ulong sc_err; 18821f24617SDmitry Chagin l_ulong sc_trapno; 18921f24617SDmitry Chagin l_sigset_t sc_mask; 19021f24617SDmitry Chagin l_ulong sc_cr2; 191920184edSDmitry Chagin /* 192920184edSDmitry Chagin * On Linux sc_fpstate is (struct l_fpstate *) or (struct l_xstate *) 193920184edSDmitry Chagin * depending on the FP_XSTATE_MAGIC1 encoded in the sw_reserved 194920184edSDmitry Chagin * bytes of (struct l_fpstate) and FP_XSTATE_MAGIC2 present at the end 195920184edSDmitry Chagin * of extended memory layout. 196920184edSDmitry Chagin */ 197920184edSDmitry Chagin l_uintptr_t sc_fpstate; 19821f24617SDmitry Chagin l_ulong sc_reserved1[8]; 19921f24617SDmitry Chagin }; 20021f24617SDmitry Chagin 20121f24617SDmitry Chagin struct l_ucontext { 20221f24617SDmitry Chagin l_ulong uc_flags; 20321f24617SDmitry Chagin l_uintptr_t uc_link; 20421f24617SDmitry Chagin l_stack_t uc_stack; 20521f24617SDmitry Chagin struct l_sigcontext uc_mcontext; 20621f24617SDmitry Chagin l_sigset_t uc_sigmask; 20721f24617SDmitry Chagin }; 20821f24617SDmitry Chagin 20921f24617SDmitry Chagin /* 21021f24617SDmitry Chagin * We make the stack look like Linux expects it when calling a signal 21121f24617SDmitry Chagin * handler, but use the BSD way of calling the handler and sigreturn(). 21221f24617SDmitry Chagin */ 21321f24617SDmitry Chagin struct l_rt_sigframe { 2146e826d27SDmitry Chagin struct l_ucontext sf_uc; 21521f24617SDmitry Chagin struct l_siginfo sf_si; 21621f24617SDmitry Chagin }; 21721f24617SDmitry Chagin 21821f24617SDmitry Chagin #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */ 21921f24617SDmitry Chagin 22021f24617SDmitry Chagin #endif /* !_X86_LINUX_SIGFRAME_H_ */ 221