xref: /freebsd/sys/x86/linux/linux_x86_sigframe.h (revision 95ee2897)
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 
36cbbac560SDmitry Chagin #define	LINUX_UC_FP_XSTATE		0x1
37cbbac560SDmitry Chagin 
38cbbac560SDmitry Chagin #define	LINUX_FP_XSTATE_MAGIC1		0x46505853U
39cbbac560SDmitry Chagin #define	LINUX_FP_XSTATE_MAGIC2		0x46505845U
40cbbac560SDmitry Chagin #define	LINUX_FP_XSTATE_MAGIC2_SIZE	sizeof(uint32_t)
41cbbac560SDmitry Chagin 
42cbbac560SDmitry Chagin struct l_fpx_sw_bytes {
43cbbac560SDmitry Chagin 	uint32_t	magic1;
44cbbac560SDmitry Chagin 	uint32_t	extended_size;
45cbbac560SDmitry Chagin 	uint64_t	xfeatures;
46cbbac560SDmitry Chagin 	uint32_t	xstate_size;
47cbbac560SDmitry Chagin 	uint32_t	padding[7];
48cbbac560SDmitry Chagin };
49cbbac560SDmitry 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];
155cbbac560SDmitry Chagin 	u_int32_t reserved2[12];
156cbbac560SDmitry Chagin 	union {
157cbbac560SDmitry Chagin 		u_int32_t		reserved3[12];
158cbbac560SDmitry Chagin 		struct l_fpx_sw_bytes	sw_reserved;
159cbbac560SDmitry 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