1 /*	$NetBSD: netbsd32_machdep.h,v 1.16 2008/10/15 06:51:17 wrstuden 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
11 typedef	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 
16 typedef netbsd32_pointer_t netbsd32_sigcontextp_t;
17 
18 struct 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 
44 struct 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 
77 struct 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 
85 struct 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 
94 struct 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 
113 struct fpreg32 {
114 	char	__data[108];
115 };
116 
117 struct 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 
126 struct x86_64_get_mtrr_args32 {
127 	uint32_t mtrrp;
128 	uint32_t n;
129 };
130 
131 struct x86_64_set_mtrr_args32 {
132 	uint32_t mtrrp;
133 	uint32_t n;
134 };
135 
136 struct 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 
145 struct 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 
156 struct fpacc87 {
157 	uint8_t 	fp_bytes[10];
158 } __packed;
159 
160 struct 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 
170 int netbsd32_process_read_regs(struct lwp *, struct reg32 *);
171 int netbsd32_process_read_fpregs(struct lwp *, struct fpreg32 *);
172 
173 #endif /* _MACHINE_NETBSD32_H_ */
174