1/*-
2 * Copyright (c) 1999 Marcel Moolenaar
3 * Copyright (c) 2003 Peter Wemm
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer
11 *    in this position and unchanged.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 *    derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * $FreeBSD$
30 */
31
32#ifndef	_COMPAT_IA32_IA32_SIGNAL_H
33#define	_COMPAT_IA32_IA32_SIGNAL_H
34
35#define	_MC_IA32_HASSEGS	0x1
36#define	_MC_IA32_HASBASES	0x2
37#define	_MC_IA32_HASFPXSTATE	0x4
38#define	_MC_IA32_FLAG_MASK	\
39    (_MC_IA32_HASSEGS | _MC_IA32_HASBASES | _MC_IA32_HASFPXSTATE)
40
41struct ia32_mcontext {
42	u_int32_t	mc_onstack;		/* XXX - sigcontext compat. */
43	u_int32_t	mc_gs;			/* machine state (struct trapframe) */
44	u_int32_t	mc_fs;
45	u_int32_t	mc_es;
46	u_int32_t	mc_ds;
47	u_int32_t	mc_edi;
48	u_int32_t	mc_esi;
49	u_int32_t	mc_ebp;
50	u_int32_t	mc_isp;
51	u_int32_t	mc_ebx;
52	u_int32_t	mc_edx;
53	u_int32_t	mc_ecx;
54	u_int32_t	mc_eax;
55	u_int32_t	mc_trapno;
56	u_int32_t	mc_err;
57	u_int32_t	mc_eip;
58	u_int32_t	mc_cs;
59	u_int32_t	mc_eflags;
60	u_int32_t	mc_esp;
61	u_int32_t	mc_ss;
62	u_int32_t	mc_len;			/* sizeof(struct ia32_mcontext) */
63	/* We use the same values for fpformat and ownedfp */
64	u_int32_t	mc_fpformat;
65	u_int32_t	mc_ownedfp;
66	u_int32_t	mc_flags;
67	/*
68	 * See <i386/include/npx.h> for the internals of mc_fpstate[].
69	 */
70	u_int32_t	mc_fpstate[128] __aligned(16);
71	u_int32_t	mc_fsbase;
72	u_int32_t	mc_gsbase;
73	u_int32_t	mc_xfpustate;
74	u_int32_t	mc_xfpustate_len;
75	u_int32_t	mc_spare2[4];
76};
77
78struct ia32_ucontext {
79	sigset_t		uc_sigmask;
80	struct ia32_mcontext	uc_mcontext;
81	u_int32_t		uc_link;
82	struct sigaltstack32	uc_stack;
83	u_int32_t		uc_flags;
84	u_int32_t		__spare__[4];
85};
86
87
88#if defined(COMPAT_FREEBSD4)
89struct ia32_mcontext4 {
90	u_int32_t	mc_onstack;		/* XXX - sigcontext compat. */
91	u_int32_t	mc_gs;			/* machine state (struct trapframe) */
92	u_int32_t	mc_fs;
93	u_int32_t	mc_es;
94	u_int32_t	mc_ds;
95	u_int32_t	mc_edi;
96	u_int32_t	mc_esi;
97	u_int32_t	mc_ebp;
98	u_int32_t	mc_isp;
99	u_int32_t	mc_ebx;
100	u_int32_t	mc_edx;
101	u_int32_t	mc_ecx;
102	u_int32_t	mc_eax;
103	u_int32_t	mc_trapno;
104	u_int32_t	mc_err;
105	u_int32_t	mc_eip;
106	u_int32_t	mc_cs;
107	u_int32_t	mc_eflags;
108	u_int32_t	mc_esp;
109	u_int32_t	mc_ss;
110	u_int32_t	mc_fpregs[28];
111	u_int32_t	__spare__[17];
112};
113
114struct ia32_ucontext4 {
115	sigset_t		uc_sigmask;
116	struct ia32_mcontext4	uc_mcontext;
117	u_int32_t		uc_link;
118	struct sigaltstack32	uc_stack;
119	u_int32_t		__spare__[8];
120};
121#endif
122
123#ifdef COMPAT_43
124struct ia32_sigcontext3 {
125	u_int32_t	sc_onstack;
126	u_int32_t	sc_mask;
127	u_int32_t	sc_esp;
128	u_int32_t	sc_ebp;
129	u_int32_t	sc_isp;
130	u_int32_t	sc_eip;
131	u_int32_t	sc_eflags;
132	u_int32_t	sc_es;
133	u_int32_t	sc_ds;
134	u_int32_t	sc_cs;
135	u_int32_t	sc_ss;
136	u_int32_t	sc_edi;
137	u_int32_t	sc_esi;
138	u_int32_t	sc_ebx;
139	u_int32_t	sc_edx;
140	u_int32_t	sc_ecx;
141	u_int32_t	sc_eax;
142	u_int32_t	sc_gs;
143	u_int32_t	sc_fs;
144	u_int32_t	sc_trapno;
145	u_int32_t	sc_err;
146};
147#endif
148
149/*
150 * Signal frames, arguments passed to application signal handlers.
151 */
152
153#ifdef COMPAT_FREEBSD4
154struct ia32_sigframe4 {
155	u_int32_t		sf_signum;
156	u_int32_t		sf_siginfo;	/* code or pointer to sf_si */
157	u_int32_t		sf_ucontext;	/* points to sf_uc */
158	u_int32_t		sf_addr;	/* undocumented 4th arg */
159	u_int32_t		sf_ah;		/* action/handler pointer */
160	struct ia32_ucontext4	sf_uc;		/* = *sf_ucontext */
161	struct siginfo32	sf_si;		/* = *sf_siginfo (SA_SIGINFO case) */
162};
163#endif
164
165struct ia32_sigframe {
166	u_int32_t		sf_signum;
167	u_int32_t		sf_siginfo;	/* code or pointer to sf_si */
168	u_int32_t		sf_ucontext;	/* points to sf_uc */
169	u_int32_t		sf_addr;	/* undocumented 4th arg */
170	u_int32_t		sf_ah;		/* action/handler pointer */
171	/* Beware, hole due to ucontext being 16 byte aligned! */
172	struct ia32_ucontext	sf_uc;		/* = *sf_ucontext */
173	struct siginfo32	sf_si;		/* = *sf_siginfo (SA_SIGINFO case) */
174};
175
176#ifdef COMPAT_43
177struct ia32_siginfo3 {
178	struct ia32_sigcontext3 si_sc;
179	int			si_signo;
180	int			si_code;
181	union sigval32		si_value;
182};
183struct ia32_sigframe3 {
184	int			sf_signum;
185	u_int32_t		sf_arg2;	/* int or siginfo_t */
186	u_int32_t		sf_scp;
187	u_int32_t		sf_addr;
188	u_int32_t		sf_ah;		/* action/handler pointer */
189	struct ia32_siginfo3	sf_siginfo;
190};
191#endif
192
193struct ksiginfo;
194struct image_params;
195extern char ia32_sigcode[];
196extern char freebsd4_ia32_sigcode[];
197extern char ia32_osigcode[];
198extern char lcall_tramp;
199extern int sz_ia32_sigcode;
200extern int sz_freebsd4_ia32_sigcode;
201extern int sz_ia32_osigcode;
202extern int sz_lcall_tramp;
203void ia32_sendsig(sig_t, struct ksiginfo *, sigset_t *);
204void ia32_setregs(struct thread *td, struct image_params *imgp,
205    u_long stack);
206int setup_lcall_gate(void);
207
208#endif
209