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