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 3821f24617SDmitry Chagin #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) 3921f24617SDmitry Chagin 4021f24617SDmitry Chagin /* The Linux sigcontext, pretty much a standard 386 trapframe. */ 4121f24617SDmitry Chagin struct l_sigcontext { 4221f24617SDmitry Chagin l_uint sc_gs; 4321f24617SDmitry Chagin l_uint sc_fs; 4421f24617SDmitry Chagin l_uint sc_es; 4521f24617SDmitry Chagin l_uint sc_ds; 4621f24617SDmitry Chagin l_uint sc_edi; 4721f24617SDmitry Chagin l_uint sc_esi; 4821f24617SDmitry Chagin l_uint sc_ebp; 4921f24617SDmitry Chagin l_uint sc_esp; 5021f24617SDmitry Chagin l_uint sc_ebx; 5121f24617SDmitry Chagin l_uint sc_edx; 5221f24617SDmitry Chagin l_uint sc_ecx; 5321f24617SDmitry Chagin l_uint sc_eax; 5421f24617SDmitry Chagin l_uint sc_trapno; 5521f24617SDmitry Chagin l_uint sc_err; 5621f24617SDmitry Chagin l_uint sc_eip; 5721f24617SDmitry Chagin l_uint sc_cs; 5821f24617SDmitry Chagin l_uint sc_eflags; 5921f24617SDmitry Chagin l_uint sc_esp_at_signal; 6021f24617SDmitry Chagin l_uint sc_ss; 6121f24617SDmitry Chagin l_uint sc_387; 6221f24617SDmitry Chagin l_uint sc_mask; 6321f24617SDmitry Chagin l_uint sc_cr2; 6421f24617SDmitry Chagin }; 6521f24617SDmitry Chagin 6621f24617SDmitry Chagin struct l_ucontext { 6721f24617SDmitry Chagin l_ulong uc_flags; 6821f24617SDmitry Chagin l_uintptr_t uc_link; 6921f24617SDmitry Chagin l_stack_t uc_stack; 7021f24617SDmitry Chagin struct l_sigcontext uc_mcontext; 7121f24617SDmitry Chagin l_sigset_t uc_sigmask; 7221f24617SDmitry Chagin } __packed; 7321f24617SDmitry Chagin 7421f24617SDmitry Chagin struct l_fpreg { 7521f24617SDmitry Chagin u_int16_t significand[4]; 7621f24617SDmitry Chagin u_int16_t exponent; 7721f24617SDmitry Chagin }; 7821f24617SDmitry Chagin 7921f24617SDmitry Chagin struct l_fpxreg { 8021f24617SDmitry Chagin u_int16_t significand[4]; 8121f24617SDmitry Chagin u_int16_t exponent; 8221f24617SDmitry Chagin u_int16_t padding[3]; 8321f24617SDmitry Chagin }; 8421f24617SDmitry Chagin 8521f24617SDmitry Chagin struct l_xmmreg { 8621f24617SDmitry Chagin u_int32_t element[4]; 8721f24617SDmitry Chagin }; 8821f24617SDmitry Chagin 8921f24617SDmitry Chagin struct l_fpstate { 9021f24617SDmitry Chagin /* Regular FPU environment */ 9121f24617SDmitry Chagin u_int32_t cw; 9221f24617SDmitry Chagin u_int32_t sw; 9321f24617SDmitry Chagin u_int32_t tag; 9421f24617SDmitry Chagin u_int32_t ipoff; 9521f24617SDmitry Chagin u_int32_t cssel; 9621f24617SDmitry Chagin u_int32_t dataoff; 9721f24617SDmitry Chagin u_int32_t datasel; 9821f24617SDmitry Chagin struct l_fpreg _st[8]; 9921f24617SDmitry Chagin u_int16_t status; 10021f24617SDmitry Chagin u_int16_t magic; /* 0xffff = regular FPU data */ 10121f24617SDmitry Chagin 10221f24617SDmitry Chagin /* FXSR FPU environment */ 10321f24617SDmitry Chagin u_int32_t _fxsr_env[6]; /* env is ignored. */ 10421f24617SDmitry Chagin u_int32_t mxcsr; 10521f24617SDmitry Chagin u_int32_t reserved; 10621f24617SDmitry Chagin struct l_fpxreg _fxsr_st[8]; /* reg data is ignored. */ 10721f24617SDmitry Chagin struct l_xmmreg _xmm[8]; 10821f24617SDmitry Chagin u_int32_t padding[56]; 10921f24617SDmitry Chagin }; 11021f24617SDmitry Chagin 11121f24617SDmitry Chagin /* 11221f24617SDmitry Chagin * We make the stack look like Linux expects it when calling a signal 11321f24617SDmitry Chagin * handler, but use the BSD way of calling the handler and sigreturn(). 11421f24617SDmitry Chagin */ 11521f24617SDmitry Chagin struct l_sigframe { 11621f24617SDmitry Chagin l_int sf_sig; 11721f24617SDmitry Chagin struct l_sigcontext sf_sc; 11821f24617SDmitry Chagin struct l_fpstate sf_fpstate; 1194a6c2d07SDmitry Chagin sigset_t sf_sigmask; 12021f24617SDmitry Chagin }; 12121f24617SDmitry Chagin 12221f24617SDmitry Chagin struct l_rt_sigframe { 12321f24617SDmitry Chagin l_int sf_sig; 12421f24617SDmitry Chagin l_uintptr_t sf_siginfo; 12521f24617SDmitry Chagin l_uintptr_t sf_ucontext; 12621f24617SDmitry Chagin l_siginfo_t sf_si; 1276e826d27SDmitry Chagin struct l_ucontext sf_uc; 12821f24617SDmitry Chagin }; 12921f24617SDmitry Chagin 13021f24617SDmitry Chagin #else 13121f24617SDmitry Chagin 13221f24617SDmitry Chagin struct l_fpstate { 13321f24617SDmitry Chagin u_int16_t cwd; 13421f24617SDmitry Chagin u_int16_t swd; 13521f24617SDmitry Chagin u_int16_t twd; 13621f24617SDmitry Chagin u_int16_t fop; 13721f24617SDmitry Chagin u_int64_t rip; 13821f24617SDmitry Chagin u_int64_t rdp; 13921f24617SDmitry Chagin u_int32_t mxcsr; 14021f24617SDmitry Chagin u_int32_t mxcsr_mask; 141*a95cb95eSDmitry Chagin u_int8_t st[8][16]; 142*a95cb95eSDmitry Chagin u_int8_t xmm[16][16]; 14321f24617SDmitry Chagin u_int32_t reserved2[24]; 144*a95cb95eSDmitry Chagin } __aligned(16); 14521f24617SDmitry Chagin 14621f24617SDmitry Chagin struct l_sigcontext { 14721f24617SDmitry Chagin l_ulong sc_r8; 14821f24617SDmitry Chagin l_ulong sc_r9; 14921f24617SDmitry Chagin l_ulong sc_r10; 15021f24617SDmitry Chagin l_ulong sc_r11; 15121f24617SDmitry Chagin l_ulong sc_r12; 15221f24617SDmitry Chagin l_ulong sc_r13; 15321f24617SDmitry Chagin l_ulong sc_r14; 15421f24617SDmitry Chagin l_ulong sc_r15; 15521f24617SDmitry Chagin l_ulong sc_rdi; 15621f24617SDmitry Chagin l_ulong sc_rsi; 15721f24617SDmitry Chagin l_ulong sc_rbp; 15821f24617SDmitry Chagin l_ulong sc_rbx; 15921f24617SDmitry Chagin l_ulong sc_rdx; 16021f24617SDmitry Chagin l_ulong sc_rax; 16121f24617SDmitry Chagin l_ulong sc_rcx; 16221f24617SDmitry Chagin l_ulong sc_rsp; 16321f24617SDmitry Chagin l_ulong sc_rip; 16421f24617SDmitry Chagin l_ulong sc_rflags; 16521f24617SDmitry Chagin l_ushort sc_cs; 16621f24617SDmitry Chagin l_ushort sc_gs; 16721f24617SDmitry Chagin l_ushort sc_fs; 16821f24617SDmitry Chagin l_ushort sc___pad0; 16921f24617SDmitry Chagin l_ulong sc_err; 17021f24617SDmitry Chagin l_ulong sc_trapno; 17121f24617SDmitry Chagin l_sigset_t sc_mask; 17221f24617SDmitry Chagin l_ulong sc_cr2; 17321f24617SDmitry Chagin struct l_fpstate *sc_fpstate; 17421f24617SDmitry Chagin l_ulong sc_reserved1[8]; 17521f24617SDmitry Chagin }; 17621f24617SDmitry Chagin 17721f24617SDmitry Chagin struct l_ucontext { 17821f24617SDmitry Chagin l_ulong uc_flags; 17921f24617SDmitry Chagin l_uintptr_t uc_link; 18021f24617SDmitry Chagin l_stack_t uc_stack; 18121f24617SDmitry Chagin struct l_sigcontext uc_mcontext; 18221f24617SDmitry Chagin l_sigset_t uc_sigmask; 18321f24617SDmitry Chagin }; 18421f24617SDmitry Chagin 18521f24617SDmitry Chagin /* 18621f24617SDmitry Chagin * We make the stack look like Linux expects it when calling a signal 18721f24617SDmitry Chagin * handler, but use the BSD way of calling the handler and sigreturn(). 18821f24617SDmitry Chagin */ 18921f24617SDmitry Chagin struct l_rt_sigframe { 1906e826d27SDmitry Chagin struct l_ucontext sf_uc; 19121f24617SDmitry Chagin struct l_siginfo sf_si; 192*a95cb95eSDmitry Chagin struct l_fpstate sf_fs; 19321f24617SDmitry Chagin }; 19421f24617SDmitry Chagin 19521f24617SDmitry Chagin #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */ 19621f24617SDmitry Chagin 19721f24617SDmitry Chagin #endif /* !_X86_LINUX_SIGFRAME_H_ */ 198