xref: /freebsd/sys/x86/include/ucontext.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
131a53cd0SKonstantin Belousov /*-
2ebf5747bSPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
3ebf5747bSPedro F. Giffuni  *
431a53cd0SKonstantin Belousov  * Copyright (c) 2003 Peter Wemm
531a53cd0SKonstantin Belousov  * Copyright (c) 1999 Marcel Moolenaar
631a53cd0SKonstantin Belousov  * All rights reserved.
731a53cd0SKonstantin Belousov  *
831a53cd0SKonstantin Belousov  * Redistribution and use in source and binary forms, with or without
931a53cd0SKonstantin Belousov  * modification, are permitted provided that the following conditions
1031a53cd0SKonstantin Belousov  * are met:
1131a53cd0SKonstantin Belousov  * 1. Redistributions of source code must retain the above copyright
1231a53cd0SKonstantin Belousov  *    notice, this list of conditions and the following disclaimer
1331a53cd0SKonstantin Belousov  *    in this position and unchanged.
1431a53cd0SKonstantin Belousov  * 2. Redistributions in binary form must reproduce the above copyright
1531a53cd0SKonstantin Belousov  *    notice, this list of conditions and the following disclaimer in the
1631a53cd0SKonstantin Belousov  *    documentation and/or other materials provided with the distribution.
1731a53cd0SKonstantin Belousov  * 3. The name of the author may not be used to endorse or promote products
1831a53cd0SKonstantin Belousov  *    derived from this software without specific prior written permission.
1931a53cd0SKonstantin Belousov  *
2031a53cd0SKonstantin Belousov  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2131a53cd0SKonstantin Belousov  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2231a53cd0SKonstantin Belousov  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2331a53cd0SKonstantin Belousov  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2431a53cd0SKonstantin Belousov  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2531a53cd0SKonstantin Belousov  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2631a53cd0SKonstantin Belousov  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2731a53cd0SKonstantin Belousov  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2831a53cd0SKonstantin Belousov  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2931a53cd0SKonstantin Belousov  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3031a53cd0SKonstantin Belousov  */
3131a53cd0SKonstantin Belousov 
3231a53cd0SKonstantin Belousov #ifndef _X86_UCONTEXT_H_
3331a53cd0SKonstantin Belousov #define	_X86_UCONTEXT_H_
3431a53cd0SKonstantin Belousov 
3531a53cd0SKonstantin Belousov #ifdef __i386__
3631a53cd0SKonstantin Belousov /* Keep _MC_* values similar to amd64 */
3731a53cd0SKonstantin Belousov #define	_MC_HASSEGS	0x1
3831a53cd0SKonstantin Belousov #define	_MC_HASBASES	0x2
3931a53cd0SKonstantin Belousov #define	_MC_HASFPXSTATE	0x4
4031a53cd0SKonstantin Belousov #define	_MC_FLAG_MASK	(_MC_HASSEGS | _MC_HASBASES | _MC_HASFPXSTATE)
4131a53cd0SKonstantin Belousov 
4231a53cd0SKonstantin Belousov typedef struct __mcontext {
4331a53cd0SKonstantin Belousov 	/*
4431a53cd0SKonstantin Belousov 	 * The definition of mcontext_t must match the layout of
4531a53cd0SKonstantin Belousov 	 * struct sigcontext after the sc_mask member.  This is so
4631a53cd0SKonstantin Belousov 	 * that we can support sigcontext and ucontext_t at the same
4731a53cd0SKonstantin Belousov 	 * time.
4831a53cd0SKonstantin Belousov 	 */
4931a53cd0SKonstantin Belousov 	__register_t	mc_onstack;	/* XXX - sigcontext compat. */
5031a53cd0SKonstantin Belousov 	__register_t	mc_gs;		/* machine state (struct trapframe) */
5131a53cd0SKonstantin Belousov 	__register_t	mc_fs;
5231a53cd0SKonstantin Belousov 	__register_t	mc_es;
5331a53cd0SKonstantin Belousov 	__register_t	mc_ds;
5431a53cd0SKonstantin Belousov 	__register_t	mc_edi;
5531a53cd0SKonstantin Belousov 	__register_t	mc_esi;
5631a53cd0SKonstantin Belousov 	__register_t	mc_ebp;
5731a53cd0SKonstantin Belousov 	__register_t	mc_isp;
5831a53cd0SKonstantin Belousov 	__register_t	mc_ebx;
5931a53cd0SKonstantin Belousov 	__register_t	mc_edx;
6031a53cd0SKonstantin Belousov 	__register_t	mc_ecx;
6131a53cd0SKonstantin Belousov 	__register_t	mc_eax;
6231a53cd0SKonstantin Belousov 	__register_t	mc_trapno;
6331a53cd0SKonstantin Belousov 	__register_t	mc_err;
6431a53cd0SKonstantin Belousov 	__register_t	mc_eip;
6531a53cd0SKonstantin Belousov 	__register_t	mc_cs;
6631a53cd0SKonstantin Belousov 	__register_t	mc_eflags;
6731a53cd0SKonstantin Belousov 	__register_t	mc_esp;
6831a53cd0SKonstantin Belousov 	__register_t	mc_ss;
6931a53cd0SKonstantin Belousov 
7031a53cd0SKonstantin Belousov 	int	mc_len;			/* sizeof(mcontext_t) */
7131a53cd0SKonstantin Belousov #define	_MC_FPFMT_NODEV		0x10000	/* device not present or configured */
7231a53cd0SKonstantin Belousov #define	_MC_FPFMT_387		0x10001
7331a53cd0SKonstantin Belousov #define	_MC_FPFMT_XMM		0x10002
7431a53cd0SKonstantin Belousov 	int	mc_fpformat;
7531a53cd0SKonstantin Belousov #define	_MC_FPOWNED_NONE	0x20000	/* FP state not used */
7631a53cd0SKonstantin Belousov #define	_MC_FPOWNED_FPU		0x20001	/* FP state came from FPU */
7731a53cd0SKonstantin Belousov #define	_MC_FPOWNED_PCB		0x20002	/* FP state came from PCB */
7831a53cd0SKonstantin Belousov 	int	mc_ownedfp;
7931a53cd0SKonstantin Belousov 	__register_t mc_flags;
8031a53cd0SKonstantin Belousov 	/*
8131a53cd0SKonstantin Belousov 	 * See <machine/npx.h> for the internals of mc_fpstate[].
8231a53cd0SKonstantin Belousov 	 */
8331a53cd0SKonstantin Belousov 	int	mc_fpstate[128] __aligned(16);
8431a53cd0SKonstantin Belousov 
8531a53cd0SKonstantin Belousov 	__register_t mc_fsbase;
8631a53cd0SKonstantin Belousov 	__register_t mc_gsbase;
8731a53cd0SKonstantin Belousov 
8831a53cd0SKonstantin Belousov 	__register_t mc_xfpustate;
8931a53cd0SKonstantin Belousov 	__register_t mc_xfpustate_len;
9031a53cd0SKonstantin Belousov 
9131a53cd0SKonstantin Belousov 	int	mc_spare2[4];
9231a53cd0SKonstantin Belousov } mcontext_t;
9331a53cd0SKonstantin Belousov #endif /* __i386__ */
9431a53cd0SKonstantin Belousov 
9531a53cd0SKonstantin Belousov #ifdef __amd64__
9631a53cd0SKonstantin Belousov /*
97*7af5f2acSJohn Baldwin  * mc_flags bits. Shall be in sync with TF_XXX.
9831a53cd0SKonstantin Belousov  */
9931a53cd0SKonstantin Belousov #define	_MC_HASSEGS	0x1
10031a53cd0SKonstantin Belousov #define	_MC_HASBASES	0x2
10131a53cd0SKonstantin Belousov #define	_MC_HASFPXSTATE	0x4
10231a53cd0SKonstantin Belousov #define	_MC_FLAG_MASK	(_MC_HASSEGS | _MC_HASBASES | _MC_HASFPXSTATE)
10331a53cd0SKonstantin Belousov 
10431a53cd0SKonstantin Belousov typedef struct __mcontext {
10531a53cd0SKonstantin Belousov 	/*
10631a53cd0SKonstantin Belousov 	 * The definition of mcontext_t must match the layout of
10731a53cd0SKonstantin Belousov 	 * struct sigcontext after the sc_mask member.  This is so
10831a53cd0SKonstantin Belousov 	 * that we can support sigcontext and ucontext_t at the same
10931a53cd0SKonstantin Belousov 	 * time.
11031a53cd0SKonstantin Belousov 	 */
11131a53cd0SKonstantin Belousov 	__register_t	mc_onstack;	/* XXX - sigcontext compat. */
11231a53cd0SKonstantin Belousov 	__register_t	mc_rdi;		/* machine state (struct trapframe) */
11331a53cd0SKonstantin Belousov 	__register_t	mc_rsi;
11431a53cd0SKonstantin Belousov 	__register_t	mc_rdx;
11531a53cd0SKonstantin Belousov 	__register_t	mc_rcx;
11631a53cd0SKonstantin Belousov 	__register_t	mc_r8;
11731a53cd0SKonstantin Belousov 	__register_t	mc_r9;
11831a53cd0SKonstantin Belousov 	__register_t	mc_rax;
11931a53cd0SKonstantin Belousov 	__register_t	mc_rbx;
12031a53cd0SKonstantin Belousov 	__register_t	mc_rbp;
12131a53cd0SKonstantin Belousov 	__register_t	mc_r10;
12231a53cd0SKonstantin Belousov 	__register_t	mc_r11;
12331a53cd0SKonstantin Belousov 	__register_t	mc_r12;
12431a53cd0SKonstantin Belousov 	__register_t	mc_r13;
12531a53cd0SKonstantin Belousov 	__register_t	mc_r14;
12631a53cd0SKonstantin Belousov 	__register_t	mc_r15;
12731a53cd0SKonstantin Belousov 	__uint32_t	mc_trapno;
12831a53cd0SKonstantin Belousov 	__uint16_t	mc_fs;
12931a53cd0SKonstantin Belousov 	__uint16_t	mc_gs;
13031a53cd0SKonstantin Belousov 	__register_t	mc_addr;
13131a53cd0SKonstantin Belousov 	__uint32_t	mc_flags;
13231a53cd0SKonstantin Belousov 	__uint16_t	mc_es;
13331a53cd0SKonstantin Belousov 	__uint16_t	mc_ds;
13431a53cd0SKonstantin Belousov 	__register_t	mc_err;
13531a53cd0SKonstantin Belousov 	__register_t	mc_rip;
13631a53cd0SKonstantin Belousov 	__register_t	mc_cs;
13731a53cd0SKonstantin Belousov 	__register_t	mc_rflags;
13831a53cd0SKonstantin Belousov 	__register_t	mc_rsp;
13931a53cd0SKonstantin Belousov 	__register_t	mc_ss;
14031a53cd0SKonstantin Belousov 
14131a53cd0SKonstantin Belousov 	long	mc_len;			/* sizeof(mcontext_t) */
14231a53cd0SKonstantin Belousov 
14331a53cd0SKonstantin Belousov #define	_MC_FPFMT_NODEV		0x10000	/* device not present or configured */
14431a53cd0SKonstantin Belousov #define	_MC_FPFMT_XMM		0x10002
14531a53cd0SKonstantin Belousov 	long	mc_fpformat;
14631a53cd0SKonstantin Belousov #define	_MC_FPOWNED_NONE	0x20000	/* FP state not used */
14731a53cd0SKonstantin Belousov #define	_MC_FPOWNED_FPU		0x20001	/* FP state came from FPU */
14831a53cd0SKonstantin Belousov #define	_MC_FPOWNED_PCB		0x20002	/* FP state came from PCB */
14931a53cd0SKonstantin Belousov 	long	mc_ownedfp;
15031a53cd0SKonstantin Belousov 	/*
15131a53cd0SKonstantin Belousov 	 * See <machine/fpu.h> for the internals of mc_fpstate[].
15231a53cd0SKonstantin Belousov 	 */
15331a53cd0SKonstantin Belousov 	long	mc_fpstate[64] __aligned(16);
15431a53cd0SKonstantin Belousov 
15531a53cd0SKonstantin Belousov 	__register_t	mc_fsbase;
15631a53cd0SKonstantin Belousov 	__register_t	mc_gsbase;
15731a53cd0SKonstantin Belousov 
15831a53cd0SKonstantin Belousov 	__register_t	mc_xfpustate;
15931a53cd0SKonstantin Belousov 	__register_t	mc_xfpustate_len;
16031a53cd0SKonstantin Belousov 
16131a53cd0SKonstantin Belousov 	long	mc_spare[4];
16231a53cd0SKonstantin Belousov } mcontext_t;
16331a53cd0SKonstantin Belousov #endif /* __amd64__ */
16431a53cd0SKonstantin Belousov 
16531a53cd0SKonstantin Belousov #endif /* !_X86_UCONTEXT_H_ */
166