151792Smarcel/*-
2122296Speter * Copyright (c) 2003 Peter Wemm
351792Smarcel * Copyright (c) 1999 Marcel Moolenaar
451792Smarcel * All rights reserved.
551792Smarcel *
651792Smarcel * Redistribution and use in source and binary forms, with or without
751792Smarcel * modification, are permitted provided that the following conditions
851792Smarcel * are met:
951792Smarcel * 1. Redistributions of source code must retain the above copyright
1051792Smarcel *    notice, this list of conditions and the following disclaimer
1151792Smarcel *    in this position and unchanged.
1251792Smarcel * 2. Redistributions in binary form must reproduce the above copyright
1351792Smarcel *    notice, this list of conditions and the following disclaimer in the
1451792Smarcel *    documentation and/or other materials provided with the distribution.
1551792Smarcel * 3. The name of the author may not be used to endorse or promote products
1651792Smarcel *    derived from this software without specific prior written permission.
1751792Smarcel *
1851792Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1951792Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2051792Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2151792Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2251792Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2351792Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2451792Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2551792Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2651792Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2751792Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2851792Smarcel *
2951792Smarcel * $FreeBSD$
3051792Smarcel */
3151792Smarcel
3251792Smarcel#ifndef _MACHINE_UCONTEXT_H_
3351942Smarcel#define	_MACHINE_UCONTEXT_H_
3451792Smarcel
35190616Skib/*
36190616Skib * mc_trapno bits. Shall be in sync with TF_XXX.
37190616Skib */
38190616Skib#define	_MC_HASSEGS	0x1
39190616Skib#define	_MC_HASBASES	0x2
40231979Skib#define	_MC_HASFPXSTATE	0x4
41231979Skib#define	_MC_FLAG_MASK	(_MC_HASSEGS | _MC_HASBASES | _MC_HASFPXSTATE)
42190616Skib
4351942Smarceltypedef struct __mcontext {
4451942Smarcel	/*
45229023Skib	 * The definition of mcontext_t must match the layout of
46229023Skib	 * struct sigcontext after the sc_mask member.  This is so
47229023Skib	 * that we can support sigcontext and ucontext_t at the same
48229023Skib	 * time.
4951942Smarcel	 */
50229023Skib	__register_t	mc_onstack;	/* XXX - sigcontext compat. */
51229023Skib	__register_t	mc_rdi;		/* machine state (struct trapframe) */
52120617Speter	__register_t	mc_rsi;
53120617Speter	__register_t	mc_rdx;
54120617Speter	__register_t	mc_rcx;
55120617Speter	__register_t	mc_r8;
56120617Speter	__register_t	mc_r9;
57120617Speter	__register_t	mc_rax;
58120617Speter	__register_t	mc_rbx;
59120617Speter	__register_t	mc_rbp;
60120617Speter	__register_t	mc_r10;
61120617Speter	__register_t	mc_r11;
62120617Speter	__register_t	mc_r12;
63120617Speter	__register_t	mc_r13;
64120617Speter	__register_t	mc_r14;
65120617Speter	__register_t	mc_r15;
66190616Skib	__uint32_t	mc_trapno;
67190616Skib	__uint16_t	mc_fs;
68190616Skib	__uint16_t	mc_gs;
69120617Speter	__register_t	mc_addr;
70190616Skib	__uint32_t	mc_flags;
71190616Skib	__uint16_t	mc_es;
72190616Skib	__uint16_t	mc_ds;
73120617Speter	__register_t	mc_err;
74120617Speter	__register_t	mc_rip;
75120617Speter	__register_t	mc_cs;
76120617Speter	__register_t	mc_rflags;
77120617Speter	__register_t	mc_rsp;
78120617Speter	__register_t	mc_ss;
7951942Smarcel
80114349Speter	long	mc_len;			/* sizeof(mcontext_t) */
81190616Skib
82104460Sdeischen#define	_MC_FPFMT_NODEV		0x10000	/* device not present or configured */
83104460Sdeischen#define	_MC_FPFMT_XMM		0x10002
84114349Speter	long	mc_fpformat;
85104460Sdeischen#define	_MC_FPOWNED_NONE	0x20000	/* FP state not used */
86104460Sdeischen#define	_MC_FPOWNED_FPU		0x20001	/* FP state came from FPU */
87104460Sdeischen#define	_MC_FPOWNED_PCB		0x20002	/* FP state came from PCB */
88114349Speter	long	mc_ownedfp;
89107521Sdeischen	/*
90122278Speter	 * See <machine/fpu.h> for the internals of mc_fpstate[].
91107521Sdeischen	 */
92119779Speter	long	mc_fpstate[64] __aligned(16);
93190616Skib
94190616Skib	__register_t	mc_fsbase;
95190616Skib	__register_t	mc_gsbase;
96190616Skib
97231979Skib	__register_t	mc_xfpustate;
98231979Skib	__register_t	mc_xfpustate_len;
99231979Skib
100231979Skib	long	mc_spare[4];
10151792Smarcel} mcontext_t;
10251792Smarcel
10351942Smarcel#endif /* !_MACHINE_UCONTEXT_H_ */
104