1114987Speter/*-
2114987Speter * Copyright (c) 1999 Marcel Moolenaar
3114987Speter * Copyright (c) 2003 Peter Wemm
4114987Speter * All rights reserved.
5114987Speter *
6114987Speter * Redistribution and use in source and binary forms, with or without
7114987Speter * modification, are permitted provided that the following conditions
8114987Speter * are met:
9114987Speter * 1. Redistributions of source code must retain the above copyright
10114987Speter *    notice, this list of conditions and the following disclaimer
11114987Speter *    in this position and unchanged.
12114987Speter * 2. Redistributions in binary form must reproduce the above copyright
13114987Speter *    notice, this list of conditions and the following disclaimer in the
14114987Speter *    documentation and/or other materials provided with the distribution.
15114987Speter * 3. The name of the author may not be used to endorse or promote products
16114987Speter *    derived from this software without specific prior written permission.
17114987Speter *
18114987Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19114987Speter * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20114987Speter * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21114987Speter * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22114987Speter * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23114987Speter * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24114987Speter * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25114987Speter * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26114987Speter * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27114987Speter * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28114987Speter *
29114987Speter * $FreeBSD: releng/10.3/sys/compat/ia32/ia32_signal.h 230426 2012-01-21 17:45:27Z kib $
30114987Speter */
31114987Speter
32215741Skib#ifndef	_COMPAT_IA32_IA32_SIGNAL_H
33215741Skib#define	_COMPAT_IA32_IA32_SIGNAL_H
34215741Skib
35230426Skib#define	_MC_IA32_HASSEGS	0x1
36230426Skib#define	_MC_IA32_HASBASES	0x2
37230426Skib#define	_MC_IA32_HASFPXSTATE	0x4
38230426Skib#define	_MC_IA32_FLAG_MASK	\
39230426Skib    (_MC_IA32_HASSEGS | _MC_IA32_HASBASES | _MC_IA32_HASFPXSTATE)
40230426Skib
41114987Speterstruct ia32_mcontext {
42144689Speter	u_int32_t	mc_onstack;		/* XXX - sigcontext compat. */
43144689Speter	u_int32_t	mc_gs;			/* machine state (struct trapframe) */
44144689Speter	u_int32_t	mc_fs;
45144689Speter	u_int32_t	mc_es;
46144689Speter	u_int32_t	mc_ds;
47144689Speter	u_int32_t	mc_edi;
48144689Speter	u_int32_t	mc_esi;
49144689Speter	u_int32_t	mc_ebp;
50144689Speter	u_int32_t	mc_isp;
51144689Speter	u_int32_t	mc_ebx;
52144689Speter	u_int32_t	mc_edx;
53144689Speter	u_int32_t	mc_ecx;
54144689Speter	u_int32_t	mc_eax;
55144689Speter	u_int32_t	mc_trapno;
56144689Speter	u_int32_t	mc_err;
57144689Speter	u_int32_t	mc_eip;
58144689Speter	u_int32_t	mc_cs;
59144689Speter	u_int32_t	mc_eflags;
60144689Speter	u_int32_t	mc_esp;
61144689Speter	u_int32_t	mc_ss;
62144689Speter	u_int32_t	mc_len;			/* sizeof(struct ia32_mcontext) */
63114987Speter	/* We use the same values for fpformat and ownedfp */
64144689Speter	u_int32_t	mc_fpformat;
65144689Speter	u_int32_t	mc_ownedfp;
66230426Skib	u_int32_t	mc_flags;
67114987Speter	/*
68122277Speter	 * See <i386/include/npx.h> for the internals of mc_fpstate[].
69114987Speter	 */
70144689Speter	u_int32_t	mc_fpstate[128] __aligned(16);
71190616Skib	u_int32_t	mc_fsbase;
72190616Skib	u_int32_t	mc_gsbase;
73230426Skib	u_int32_t	mc_xfpustate;
74230426Skib	u_int32_t	mc_xfpustate_len;
75230426Skib	u_int32_t	mc_spare2[4];
76114987Speter};
77114987Speter
78114987Speterstruct ia32_ucontext {
79114987Speter	sigset_t		uc_sigmask;
80114987Speter	struct ia32_mcontext	uc_mcontext;
81114987Speter	u_int32_t		uc_link;
82163018Sdavidxu	struct sigaltstack32	uc_stack;
83144689Speter	u_int32_t		uc_flags;
84144689Speter	u_int32_t		__spare__[4];
85114987Speter};
86114987Speter
87114987Speter
88114987Speter#if defined(COMPAT_FREEBSD4)
89114987Speterstruct ia32_mcontext4 {
90144689Speter	u_int32_t	mc_onstack;		/* XXX - sigcontext compat. */
91144689Speter	u_int32_t	mc_gs;			/* machine state (struct trapframe) */
92144689Speter	u_int32_t	mc_fs;
93144689Speter	u_int32_t	mc_es;
94144689Speter	u_int32_t	mc_ds;
95144689Speter	u_int32_t	mc_edi;
96144689Speter	u_int32_t	mc_esi;
97144689Speter	u_int32_t	mc_ebp;
98144689Speter	u_int32_t	mc_isp;
99144689Speter	u_int32_t	mc_ebx;
100144689Speter	u_int32_t	mc_edx;
101144689Speter	u_int32_t	mc_ecx;
102144689Speter	u_int32_t	mc_eax;
103144689Speter	u_int32_t	mc_trapno;
104144689Speter	u_int32_t	mc_err;
105144689Speter	u_int32_t	mc_eip;
106144689Speter	u_int32_t	mc_cs;
107144689Speter	u_int32_t	mc_eflags;
108144689Speter	u_int32_t	mc_esp;
109144689Speter	u_int32_t	mc_ss;
110144689Speter	u_int32_t	mc_fpregs[28];
111144689Speter	u_int32_t	__spare__[17];
112114987Speter};
113114987Speter
114114987Speterstruct ia32_ucontext4 {
115114987Speter	sigset_t		uc_sigmask;
116114987Speter	struct ia32_mcontext4	uc_mcontext;
117114987Speter	u_int32_t		uc_link;
118163018Sdavidxu	struct sigaltstack32	uc_stack;
119144689Speter	u_int32_t		__spare__[8];
120114987Speter};
121114987Speter#endif
122114987Speter
123220238Skib#ifdef COMPAT_43
124128262Speterstruct ia32_sigcontext3 {
125144689Speter	u_int32_t	sc_onstack;
126144689Speter	u_int32_t	sc_mask;
127144689Speter	u_int32_t	sc_esp;
128144689Speter	u_int32_t	sc_ebp;
129144689Speter	u_int32_t	sc_isp;
130144689Speter	u_int32_t	sc_eip;
131144689Speter	u_int32_t	sc_eflags;
132144689Speter	u_int32_t	sc_es;
133144689Speter	u_int32_t	sc_ds;
134144689Speter	u_int32_t	sc_cs;
135144689Speter	u_int32_t	sc_ss;
136144689Speter	u_int32_t	sc_edi;
137144689Speter	u_int32_t	sc_esi;
138144689Speter	u_int32_t	sc_ebx;
139144689Speter	u_int32_t	sc_edx;
140144689Speter	u_int32_t	sc_ecx;
141144689Speter	u_int32_t	sc_eax;
142144689Speter	u_int32_t	sc_gs;
143144689Speter	u_int32_t	sc_fs;
144144689Speter	u_int32_t	sc_trapno;
145144689Speter	u_int32_t	sc_err;
146128262Speter};
147128262Speter#endif
148128262Speter
149114987Speter/*
150114987Speter * Signal frames, arguments passed to application signal handlers.
151114987Speter */
152114987Speter
153114987Speter#ifdef COMPAT_FREEBSD4
154114987Speterstruct ia32_sigframe4 {
155114987Speter	u_int32_t		sf_signum;
156114987Speter	u_int32_t		sf_siginfo;	/* code or pointer to sf_si */
157114987Speter	u_int32_t		sf_ucontext;	/* points to sf_uc */
158114987Speter	u_int32_t		sf_addr;	/* undocumented 4th arg */
159114987Speter	u_int32_t		sf_ah;		/* action/handler pointer */
160114987Speter	struct ia32_ucontext4	sf_uc;		/* = *sf_ucontext */
161163018Sdavidxu	struct siginfo32	sf_si;		/* = *sf_siginfo (SA_SIGINFO case) */
162114987Speter};
163114987Speter#endif
164114987Speter
165114987Speterstruct ia32_sigframe {
166114987Speter	u_int32_t		sf_signum;
167114987Speter	u_int32_t		sf_siginfo;	/* code or pointer to sf_si */
168114987Speter	u_int32_t		sf_ucontext;	/* points to sf_uc */
169114987Speter	u_int32_t		sf_addr;	/* undocumented 4th arg */
170114987Speter	u_int32_t		sf_ah;		/* action/handler pointer */
171126091Speter	/* Beware, hole due to ucontext being 16 byte aligned! */
172114987Speter	struct ia32_ucontext	sf_uc;		/* = *sf_ucontext */
173163018Sdavidxu	struct siginfo32	sf_si;		/* = *sf_siginfo (SA_SIGINFO case) */
174114987Speter};
175114987Speter
176220238Skib#ifdef COMPAT_43
177128262Speterstruct ia32_siginfo3 {
178128262Speter	struct ia32_sigcontext3 si_sc;
179128262Speter	int			si_signo;
180128262Speter	int			si_code;
181163018Sdavidxu	union sigval32		si_value;
182128262Speter};
183128262Speterstruct ia32_sigframe3 {
184128262Speter	int			sf_signum;
185128262Speter	u_int32_t		sf_arg2;	/* int or siginfo_t */
186128262Speter	u_int32_t		sf_scp;
187128262Speter	u_int32_t		sf_addr;
188128262Speter	u_int32_t		sf_ah;		/* action/handler pointer */
189128262Speter	struct ia32_siginfo3	sf_siginfo;
190128262Speter};
191128262Speter#endif
192128262Speter
193151316Sdavidxustruct ksiginfo;
194206136Sbzstruct image_params;
195114987Speterextern char ia32_sigcode[];
196114987Speterextern char freebsd4_ia32_sigcode[];
197220238Skibextern char ia32_osigcode[];
198220238Skibextern char lcall_tramp;
199114987Speterextern int sz_ia32_sigcode;
200114987Speterextern int sz_freebsd4_ia32_sigcode;
201220238Skibextern int sz_ia32_osigcode;
202220238Skibextern int sz_lcall_tramp;
203220238Skibvoid ia32_sendsig(sig_t, struct ksiginfo *, sigset_t *);
204220238Skibvoid ia32_setregs(struct thread *td, struct image_params *imgp,
205205642Snwhitehorn    u_long stack);
206220238Skibint setup_lcall_gate(void);
207215741Skib
208215741Skib#endif
209