1/*	$NetBSD: netbsd32_machdep.h,v 1.15 2007/12/25 18:33:32 perry Exp $	*/
2
3#ifndef _MACHINE_NETBSD32_H_
4#define _MACHINE_NETBSD32_H_
5
6#include <sys/ucontext.h>
7#include <compat/sys/ucontext.h>
8#include <compat/sys/siginfo.h>
9
10#define NETBSD32_POINTER_TYPE uint32_t
11typedef	struct { NETBSD32_POINTER_TYPE i32; } netbsd32_pointer_t;
12
13/* i386 has 32bit aligned 64bit integers */
14#define NETBSD32_INT64_ALIGN __attribute__((__aligned__(4)))
15
16typedef netbsd32_pointer_t netbsd32_sigcontextp_t;
17
18struct netbsd32_sigcontext13 {
19	uint32_t	sc_gs;
20	uint32_t	sc_fs;
21	uint32_t	sc_es;
22	uint32_t	sc_ds;
23	uint32_t	sc_edi;
24	uint32_t	sc_esi;
25	uint32_t	sc_ebp;
26	uint32_t	sc_ebx;
27	uint32_t	sc_edx;
28	uint32_t	sc_ecx;
29	uint32_t	sc_eax;
30	/* XXX */
31	uint32_t	sc_eip;
32	uint32_t	sc_cs;
33	uint32_t	sc_eflags;
34	uint32_t	sc_esp;
35	uint32_t	sc_ss;
36
37	uint32_t	sc_onstack;	/* sigstack state to restore */
38	uint32_t	sc_mask;	/* signal mask to restore (old style) */
39
40	uint32_t	sc_trapno;	/* XXX should be above */
41	uint32_t	sc_err;
42};
43
44struct netbsd32_sigcontext {
45	uint32_t	sc_gs;
46	uint32_t	sc_fs;
47	uint32_t	sc_es;
48	uint32_t	sc_ds;
49	uint32_t	sc_edi;
50	uint32_t	sc_esi;
51	uint32_t	sc_ebp;
52	uint32_t	sc_ebx;
53	uint32_t	sc_edx;
54	uint32_t	sc_ecx;
55	uint32_t	sc_eax;
56	/* XXX */
57	uint32_t	sc_eip;
58	uint32_t	sc_cs;
59	uint32_t	sc_eflags;
60	uint32_t	sc_esp;
61	uint32_t	sc_ss;
62
63	uint32_t	sc_onstack;	/* sigstack state to restore */
64	uint32_t	__sc_mask13;	/* signal mask to restore (old style) */
65
66	uint32_t	sc_trapno;	/* XXX should be above */
67	uint32_t	sc_err;
68
69	sigset_t sc_mask;		/* signal mask to restore (new style) */
70};
71
72#define sc_sp sc_esp
73#define sc_fp sc_ebp
74#define sc_pc sc_eip
75#define sc_ps sc_eflags
76
77struct netbsd32_sigframe_sigcontext {
78	uint32_t	sf_ra;
79	int32_t		sf_signum;
80	int32_t		sf_code;
81	uint32_t	sf_scp;
82	struct netbsd32_sigcontext sf_sc;
83};
84
85struct netbsd32_sigframe_siginfo {
86	uint32_t	sf_ra;
87	int32_t		sf_signum;
88	uint32_t	sf_sip;
89	uint32_t	sf_ucp;
90	siginfo32_t	sf_si;
91	ucontext32_t	sf_uc;
92};
93
94struct reg32 {
95	int	r_eax;
96	int	r_ecx;
97	int	r_edx;
98	int	r_ebx;
99	int	r_esp;
100	int	r_ebp;
101	int	r_esi;
102	int	r_edi;
103	int	r_eip;
104	int	r_eflags;
105	int	r_cs;
106	int	r_ss;
107	int	r_ds;
108	int	r_es;
109	int	r_fs;
110	int	r_gs;
111};
112
113struct fpreg32 {
114	char	__data[108];
115};
116
117struct mtrr32 {
118	uint64_t base;
119	uint64_t len;
120	uint8_t type;
121	uint8_t __pad0[3];
122	int flags;
123	uint32_t owner;
124} __packed;
125
126struct x86_64_get_mtrr_args32 {
127	uint32_t mtrrp;
128	uint32_t n;
129};
130
131struct x86_64_set_mtrr_args32 {
132	uint32_t mtrrp;
133	uint32_t n;
134};
135
136struct netbsd32_saframe {
137	int			sa_ra;
138	int			sa_type;
139	netbsd32_pointer_t	sa_sas;
140	int			sa_events;
141	int			sa_interrupted;
142	netbsd32_pointer_t	sa_arg;
143};
144
145struct env87 {
146	int32_t		en_cw;
147	int32_t		en_sw;
148	int32_t		en_tw;
149	int32_t		en_fip;
150	uint16_t	en_fcs;
151	uint16_t	en_opcode;
152	int32_t		en_foo;
153	int32_t		en_fos;
154} __packed;
155
156struct fpacc87 {
157	uint8_t 	fp_bytes[10];
158} __packed;
159
160struct save87 {
161	struct env87	sv_env;
162	struct fpacc87	sv_ac[8];
163	int32_t		sv_ex_sw;
164	int32_t		sv_ex_tw;
165	uint8_t		sv_pad[8 * 2 - 2 * 4];
166} __packed;
167
168#define NETBSD32_MID_MACHINE MID_I386
169
170int netbsd32_process_read_regs(struct lwp *, struct reg32 *);
171int netbsd32_process_read_fpregs(struct lwp *, struct fpreg32 *);
172
173#endif /* _MACHINE_NETBSD32_H_ */
174