ia32_signal.h revision 114987
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: head/sys/compat/ia32/ia32_signal.h 114987 2003-05-14 04:10:49Z peter $
30114987Speter */
31114987Speter
32114987Speterstruct ia32_sigaltstack {
33114987Speter	u_int32_t	ss_sp;		/* signal stack base */
34114987Speter	u_int32_t	ss_size;	/* signal stack length */
35114987Speter	int		ss_flags;	/* SS_DISABLE and/or SS_ONSTACK */
36114987Speter};
37114987Speter
38114987Speter/* XXX should be 640 bytes long; check and see if __packed is needed */
39114987Speterstruct ia32_mcontext {
40114987Speter	int	mc_onstack;		/* XXX - sigcontext compat. */
41114987Speter	int	mc_gs;			/* machine state (struct trapframe) */
42114987Speter	int	mc_fs;
43114987Speter	int	mc_es;
44114987Speter	int	mc_ds;
45114987Speter	int	mc_edi;
46114987Speter	int	mc_esi;
47114987Speter	int	mc_ebp;
48114987Speter	int	mc_isp;
49114987Speter	int	mc_ebx;
50114987Speter	int	mc_edx;
51114987Speter	int	mc_ecx;
52114987Speter	int	mc_eax;
53114987Speter	int	mc_trapno;
54114987Speter	int	mc_err;
55114987Speter	int	mc_eip;
56114987Speter	int	mc_cs;
57114987Speter	int	mc_eflags;
58114987Speter	int	mc_esp;
59114987Speter	int	mc_ss;
60114987Speter	int	mc_len;			/* sizeof(struct ia32_mcontext) */
61114987Speter	/* We use the same values for fpformat and ownedfp */
62114987Speter	int	mc_fpformat;
63114987Speter	int	mc_ownedfp;
64114987Speter	int	mc_spare1[1];		/* align next field to 16 bytes */
65114987Speter	/*
66114987Speter	 * See <machine/npx.h> for the internals of mc_fpstate[].
67114987Speter	 */
68114987Speter	int	mc_fpstate[128] __aligned(16);
69114987Speter	int	mc_spare2[8];
70114987Speter};
71114987Speter
72114987Speter/* XXX should be 704 bytes long; check and see if __packed is needed */
73114987Speterstruct ia32_ucontext {
74114987Speter	sigset_t		uc_sigmask;
75114987Speter	struct ia32_mcontext	uc_mcontext;
76114987Speter	u_int32_t		uc_link;
77114987Speter	struct ia32_sigaltstack	uc_stack;
78114987Speter	int			uc_flags;
79114987Speter	int			__spare__[4];
80114987Speter};
81114987Speter
82114987Speter
83114987Speter#if defined(COMPAT_FREEBSD4)
84114987Speterstruct ia32_mcontext4 {
85114987Speter	int	mc_onstack;		/* XXX - sigcontext compat. */
86114987Speter	int	mc_gs;			/* machine state (struct trapframe) */
87114987Speter	int	mc_fs;
88114987Speter	int	mc_es;
89114987Speter	int	mc_ds;
90114987Speter	int	mc_edi;
91114987Speter	int	mc_esi;
92114987Speter	int	mc_ebp;
93114987Speter	int	mc_isp;
94114987Speter	int	mc_ebx;
95114987Speter	int	mc_edx;
96114987Speter	int	mc_ecx;
97114987Speter	int	mc_eax;
98114987Speter	int	mc_trapno;
99114987Speter	int	mc_err;
100114987Speter	int	mc_eip;
101114987Speter	int	mc_cs;
102114987Speter	int	mc_eflags;
103114987Speter	int	mc_esp;
104114987Speter	int	mc_ss;
105114987Speter	int	mc_fpregs[28];
106114987Speter	int	__spare__[17];
107114987Speter};
108114987Speter
109114987Speterstruct ia32_ucontext4 {
110114987Speter	sigset_t		uc_sigmask;
111114987Speter	struct ia32_mcontext4	uc_mcontext;
112114987Speter	u_int32_t		uc_link;
113114987Speter	struct ia32_sigaltstack	uc_stack;
114114987Speter	int			__spare__[8];
115114987Speter};
116114987Speter#endif
117114987Speter
118114987Speter/*
119114987Speter * Signal frames, arguments passed to application signal handlers.
120114987Speter */
121114987Speterunion ia32_sigval {
122114987Speter	int			sigval_int;
123114987Speter	u_int32_t		sigval_ptr;
124114987Speter};
125114987Speterstruct ia32_siginfo {
126114987Speter	int			si_signo;	/* signal number */
127114987Speter	int			si_errno;	/* errno association */
128114987Speter	int			si_code;	/* signal code */
129114987Speter	int32_t			si_pid;		/* sending process */
130114987Speter	u_int32_t		si_uid;		/* sender's ruid */
131114987Speter	int			si_status;	/* exit value */
132114987Speter	u_int32_t		si_addr;	/* faulting instruction */
133114987Speter	union ia32_sigval	si_value;	/* signal value */
134114987Speter	int32_t			si_band;	/* band event for SIGPOLL */
135114987Speter	int			__spare__[7];	/* gimme some slack */
136114987Speter};
137114987Speter
138114987Speter#ifdef COMPAT_FREEBSD4
139114987Speterstruct ia32_sigframe4 {
140114987Speter	u_int32_t		sf_signum;
141114987Speter	u_int32_t		sf_siginfo;	/* code or pointer to sf_si */
142114987Speter	u_int32_t		sf_ucontext;	/* points to sf_uc */
143114987Speter	u_int32_t		sf_addr;	/* undocumented 4th arg */
144114987Speter	u_int32_t		sf_ah;		/* action/handler pointer */
145114987Speter	struct ia32_ucontext4	sf_uc;		/* = *sf_ucontext */
146114987Speter	struct ia32_siginfo	sf_si;		/* = *sf_siginfo (SA_SIGINFO case) */
147114987Speter};
148114987Speter#endif
149114987Speter
150114987Speterstruct ia32_sigframe {
151114987Speter	u_int32_t		sf_signum;
152114987Speter	u_int32_t		sf_siginfo;	/* code or pointer to sf_si */
153114987Speter	u_int32_t		sf_ucontext;	/* points to sf_uc */
154114987Speter	u_int32_t		sf_addr;	/* undocumented 4th arg */
155114987Speter	u_int32_t		sf_ah;		/* action/handler pointer */
156114987Speter	struct ia32_ucontext	sf_uc;		/* = *sf_ucontext */
157114987Speter	struct ia32_siginfo	sf_si;		/* = *sf_siginfo (SA_SIGINFO case) */
158114987Speter};
159114987Speter
160114987Speterextern char ia32_sigcode[];
161114987Speterextern char freebsd4_ia32_sigcode[];
162114987Speterextern int sz_ia32_sigcode;
163114987Speterextern int sz_freebsd4_ia32_sigcode;
164114987Speterextern void ia32_sendsig(sig_t, int, sigset_t *, u_long);
165