xref: /freebsd/sys/x86/linux/linux_x86_sigframe.h (revision a95cb95e12e537dbe70f9de18cc0fe98e4a5ebf5)
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