1*21f24617SDmitry Chagin /*- 2*21f24617SDmitry Chagin * SPDX-License-Identifier: BSD-3-Clause 3*21f24617SDmitry Chagin * 4*21f24617SDmitry Chagin * Copyright (c) 2004 Tim J. Robbins 5*21f24617SDmitry Chagin * Copyright (c) 2001 Doug Rabson 6*21f24617SDmitry Chagin * Copyright (c) 1994-1996 Søren Schmidt 7*21f24617SDmitry Chagin * All rights reserved. 8*21f24617SDmitry Chagin * 9*21f24617SDmitry Chagin * Redistribution and use in source and binary forms, with or without 10*21f24617SDmitry Chagin * modification, are permitted provided that the following conditions 11*21f24617SDmitry Chagin * are met: 12*21f24617SDmitry Chagin * 1. Redistributions of source code must retain the above copyright 13*21f24617SDmitry Chagin * notice, this list of conditions and the following disclaimer 14*21f24617SDmitry Chagin * in this position and unchanged. 15*21f24617SDmitry Chagin * 2. Redistributions in binary form must reproduce the above copyright 16*21f24617SDmitry Chagin * notice, this list of conditions and the following disclaimer in the 17*21f24617SDmitry Chagin * documentation and/or other materials provided with the distribution. 18*21f24617SDmitry Chagin * 3. The name of the author may not be used to endorse or promote products 19*21f24617SDmitry Chagin * derived from this software without specific prior written permission 20*21f24617SDmitry Chagin * 21*21f24617SDmitry Chagin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22*21f24617SDmitry Chagin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23*21f24617SDmitry Chagin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24*21f24617SDmitry Chagin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25*21f24617SDmitry Chagin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26*21f24617SDmitry Chagin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27*21f24617SDmitry Chagin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28*21f24617SDmitry Chagin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29*21f24617SDmitry Chagin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30*21f24617SDmitry Chagin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31*21f24617SDmitry Chagin * 32*21f24617SDmitry Chagin * $FreeBSD$ 33*21f24617SDmitry Chagin */ 34*21f24617SDmitry Chagin 35*21f24617SDmitry Chagin #ifndef _X86_LINUX_SIGFRAME_H_ 36*21f24617SDmitry Chagin #define _X86_LINUX_SIGFRAME_H_ 37*21f24617SDmitry Chagin 38*21f24617SDmitry Chagin #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) 39*21f24617SDmitry Chagin 40*21f24617SDmitry Chagin /* The Linux sigcontext, pretty much a standard 386 trapframe. */ 41*21f24617SDmitry Chagin struct l_sigcontext { 42*21f24617SDmitry Chagin l_uint sc_gs; 43*21f24617SDmitry Chagin l_uint sc_fs; 44*21f24617SDmitry Chagin l_uint sc_es; 45*21f24617SDmitry Chagin l_uint sc_ds; 46*21f24617SDmitry Chagin l_uint sc_edi; 47*21f24617SDmitry Chagin l_uint sc_esi; 48*21f24617SDmitry Chagin l_uint sc_ebp; 49*21f24617SDmitry Chagin l_uint sc_esp; 50*21f24617SDmitry Chagin l_uint sc_ebx; 51*21f24617SDmitry Chagin l_uint sc_edx; 52*21f24617SDmitry Chagin l_uint sc_ecx; 53*21f24617SDmitry Chagin l_uint sc_eax; 54*21f24617SDmitry Chagin l_uint sc_trapno; 55*21f24617SDmitry Chagin l_uint sc_err; 56*21f24617SDmitry Chagin l_uint sc_eip; 57*21f24617SDmitry Chagin l_uint sc_cs; 58*21f24617SDmitry Chagin l_uint sc_eflags; 59*21f24617SDmitry Chagin l_uint sc_esp_at_signal; 60*21f24617SDmitry Chagin l_uint sc_ss; 61*21f24617SDmitry Chagin l_uint sc_387; 62*21f24617SDmitry Chagin l_uint sc_mask; 63*21f24617SDmitry Chagin l_uint sc_cr2; 64*21f24617SDmitry Chagin }; 65*21f24617SDmitry Chagin 66*21f24617SDmitry Chagin struct l_ucontext { 67*21f24617SDmitry Chagin l_ulong uc_flags; 68*21f24617SDmitry Chagin l_uintptr_t uc_link; 69*21f24617SDmitry Chagin l_stack_t uc_stack; 70*21f24617SDmitry Chagin struct l_sigcontext uc_mcontext; 71*21f24617SDmitry Chagin l_sigset_t uc_sigmask; 72*21f24617SDmitry Chagin } __packed; 73*21f24617SDmitry Chagin 74*21f24617SDmitry Chagin struct l_fpreg { 75*21f24617SDmitry Chagin u_int16_t significand[4]; 76*21f24617SDmitry Chagin u_int16_t exponent; 77*21f24617SDmitry Chagin }; 78*21f24617SDmitry Chagin 79*21f24617SDmitry Chagin struct l_fpxreg { 80*21f24617SDmitry Chagin u_int16_t significand[4]; 81*21f24617SDmitry Chagin u_int16_t exponent; 82*21f24617SDmitry Chagin u_int16_t padding[3]; 83*21f24617SDmitry Chagin }; 84*21f24617SDmitry Chagin 85*21f24617SDmitry Chagin struct l_xmmreg { 86*21f24617SDmitry Chagin u_int32_t element[4]; 87*21f24617SDmitry Chagin }; 88*21f24617SDmitry Chagin 89*21f24617SDmitry Chagin struct l_fpstate { 90*21f24617SDmitry Chagin /* Regular FPU environment */ 91*21f24617SDmitry Chagin u_int32_t cw; 92*21f24617SDmitry Chagin u_int32_t sw; 93*21f24617SDmitry Chagin u_int32_t tag; 94*21f24617SDmitry Chagin u_int32_t ipoff; 95*21f24617SDmitry Chagin u_int32_t cssel; 96*21f24617SDmitry Chagin u_int32_t dataoff; 97*21f24617SDmitry Chagin u_int32_t datasel; 98*21f24617SDmitry Chagin struct l_fpreg _st[8]; 99*21f24617SDmitry Chagin u_int16_t status; 100*21f24617SDmitry Chagin u_int16_t magic; /* 0xffff = regular FPU data */ 101*21f24617SDmitry Chagin 102*21f24617SDmitry Chagin /* FXSR FPU environment */ 103*21f24617SDmitry Chagin u_int32_t _fxsr_env[6]; /* env is ignored. */ 104*21f24617SDmitry Chagin u_int32_t mxcsr; 105*21f24617SDmitry Chagin u_int32_t reserved; 106*21f24617SDmitry Chagin struct l_fpxreg _fxsr_st[8]; /* reg data is ignored. */ 107*21f24617SDmitry Chagin struct l_xmmreg _xmm[8]; 108*21f24617SDmitry Chagin u_int32_t padding[56]; 109*21f24617SDmitry Chagin }; 110*21f24617SDmitry Chagin 111*21f24617SDmitry Chagin /* 112*21f24617SDmitry Chagin * We make the stack look like Linux expects it when calling a signal 113*21f24617SDmitry Chagin * handler, but use the BSD way of calling the handler and sigreturn(). 114*21f24617SDmitry Chagin */ 115*21f24617SDmitry Chagin struct l_sigframe { 116*21f24617SDmitry Chagin l_int sf_sig; 117*21f24617SDmitry Chagin struct l_sigcontext sf_sc; 118*21f24617SDmitry Chagin struct l_fpstate sf_fpstate; 119*21f24617SDmitry Chagin l_uint sf_extramask[1]; 120*21f24617SDmitry Chagin }; 121*21f24617SDmitry Chagin 122*21f24617SDmitry Chagin struct l_rt_sigframe { 123*21f24617SDmitry Chagin l_int sf_sig; 124*21f24617SDmitry Chagin l_uintptr_t sf_siginfo; 125*21f24617SDmitry Chagin l_uintptr_t sf_ucontext; 126*21f24617SDmitry Chagin l_siginfo_t sf_si; 127*21f24617SDmitry Chagin struct l_ucontext sf_sc; 128*21f24617SDmitry Chagin }; 129*21f24617SDmitry Chagin 130*21f24617SDmitry Chagin #else 131*21f24617SDmitry Chagin 132*21f24617SDmitry Chagin struct l_fpstate { 133*21f24617SDmitry Chagin u_int16_t cwd; 134*21f24617SDmitry Chagin u_int16_t swd; 135*21f24617SDmitry Chagin u_int16_t twd; 136*21f24617SDmitry Chagin u_int16_t fop; 137*21f24617SDmitry Chagin u_int64_t rip; 138*21f24617SDmitry Chagin u_int64_t rdp; 139*21f24617SDmitry Chagin u_int32_t mxcsr; 140*21f24617SDmitry Chagin u_int32_t mxcsr_mask; 141*21f24617SDmitry Chagin u_int32_t st_space[32]; 142*21f24617SDmitry Chagin u_int32_t xmm_space[64]; 143*21f24617SDmitry Chagin u_int32_t reserved2[24]; 144*21f24617SDmitry Chagin }; 145*21f24617SDmitry Chagin 146*21f24617SDmitry Chagin struct l_sigcontext { 147*21f24617SDmitry Chagin l_ulong sc_r8; 148*21f24617SDmitry Chagin l_ulong sc_r9; 149*21f24617SDmitry Chagin l_ulong sc_r10; 150*21f24617SDmitry Chagin l_ulong sc_r11; 151*21f24617SDmitry Chagin l_ulong sc_r12; 152*21f24617SDmitry Chagin l_ulong sc_r13; 153*21f24617SDmitry Chagin l_ulong sc_r14; 154*21f24617SDmitry Chagin l_ulong sc_r15; 155*21f24617SDmitry Chagin l_ulong sc_rdi; 156*21f24617SDmitry Chagin l_ulong sc_rsi; 157*21f24617SDmitry Chagin l_ulong sc_rbp; 158*21f24617SDmitry Chagin l_ulong sc_rbx; 159*21f24617SDmitry Chagin l_ulong sc_rdx; 160*21f24617SDmitry Chagin l_ulong sc_rax; 161*21f24617SDmitry Chagin l_ulong sc_rcx; 162*21f24617SDmitry Chagin l_ulong sc_rsp; 163*21f24617SDmitry Chagin l_ulong sc_rip; 164*21f24617SDmitry Chagin l_ulong sc_rflags; 165*21f24617SDmitry Chagin l_ushort sc_cs; 166*21f24617SDmitry Chagin l_ushort sc_gs; 167*21f24617SDmitry Chagin l_ushort sc_fs; 168*21f24617SDmitry Chagin l_ushort sc___pad0; 169*21f24617SDmitry Chagin l_ulong sc_err; 170*21f24617SDmitry Chagin l_ulong sc_trapno; 171*21f24617SDmitry Chagin l_sigset_t sc_mask; 172*21f24617SDmitry Chagin l_ulong sc_cr2; 173*21f24617SDmitry Chagin struct l_fpstate *sc_fpstate; 174*21f24617SDmitry Chagin l_ulong sc_reserved1[8]; 175*21f24617SDmitry Chagin }; 176*21f24617SDmitry Chagin 177*21f24617SDmitry Chagin struct l_ucontext { 178*21f24617SDmitry Chagin l_ulong uc_flags; 179*21f24617SDmitry Chagin l_uintptr_t uc_link; 180*21f24617SDmitry Chagin l_stack_t uc_stack; 181*21f24617SDmitry Chagin struct l_sigcontext uc_mcontext; 182*21f24617SDmitry Chagin l_sigset_t uc_sigmask; 183*21f24617SDmitry Chagin }; 184*21f24617SDmitry Chagin 185*21f24617SDmitry Chagin /* 186*21f24617SDmitry Chagin * We make the stack look like Linux expects it when calling a signal 187*21f24617SDmitry Chagin * handler, but use the BSD way of calling the handler and sigreturn(). 188*21f24617SDmitry Chagin */ 189*21f24617SDmitry Chagin struct l_rt_sigframe { 190*21f24617SDmitry Chagin struct l_ucontext sf_sc; 191*21f24617SDmitry Chagin struct l_siginfo sf_si; 192*21f24617SDmitry Chagin }; 193*21f24617SDmitry Chagin 194*21f24617SDmitry Chagin #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */ 195*21f24617SDmitry Chagin 196*21f24617SDmitry Chagin #endif /* !_X86_LINUX_SIGFRAME_H_ */ 197