master
  1/*	$NetBSD: netbsd32_machdep.h,v 1.25 2019/11/27 09:16:58 rin 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#include <x86/fpu.h>
 11
 12/*
 13 * i386 ptrace constants
 14 * Please keep in sync with sys/arch/i386/include/ptrace.h.
 15 */
 16#define	PT32_STEP		(PT_FIRSTMACH + 0)
 17#define	PT32_GETREGS		(PT_FIRSTMACH + 1)
 18#define	PT32_SETREGS		(PT_FIRSTMACH + 2)
 19#define	PT32_GETFPREGS		(PT_FIRSTMACH + 3)
 20#define	PT32_SETFPREGS		(PT_FIRSTMACH + 4)
 21#define	PT32_GETXMMREGS		(PT_FIRSTMACH + 5)
 22#define	PT32_SETXMMREGS		(PT_FIRSTMACH + 6)
 23#define	PT32_GETDBREGS		(PT_FIRSTMACH + 7)
 24#define	PT32_SETDBREGS		(PT_FIRSTMACH + 8)
 25#define	PT32_SETSTEP		(PT_FIRSTMACH + 9)
 26#define	PT32_CLEARSTEP		(PT_FIRSTMACH + 10)
 27#define	PT32_GETXSTATE		(PT_FIRSTMACH + 11)
 28#define	PT32_SETXSTATE		(PT_FIRSTMACH + 12)
 29
 30#define NETBSD32_POINTER_TYPE uint32_t
 31typedef	struct { NETBSD32_POINTER_TYPE i32; } netbsd32_pointer_t;
 32
 33/* i386 has 32bit aligned 64bit integers */
 34#define NETBSD32_INT64_ALIGN __attribute__((__aligned__(4)))
 35
 36typedef netbsd32_pointer_t netbsd32_sigcontextp_t;
 37
 38struct netbsd32_sigcontext13 {
 39	uint32_t	sc_gs;
 40	uint32_t	sc_fs;
 41	uint32_t	sc_es;
 42	uint32_t	sc_ds;
 43	uint32_t	sc_edi;
 44	uint32_t	sc_esi;
 45	uint32_t	sc_ebp;
 46	uint32_t	sc_ebx;
 47	uint32_t	sc_edx;
 48	uint32_t	sc_ecx;
 49	uint32_t	sc_eax;
 50	/* XXX */
 51	uint32_t	sc_eip;
 52	uint32_t	sc_cs;
 53	uint32_t	sc_eflags;
 54	uint32_t	sc_esp;
 55	uint32_t	sc_ss;
 56
 57	uint32_t	sc_onstack;	/* sigstack state to restore */
 58	uint32_t	sc_mask;	/* signal mask to restore (old style) */
 59
 60	uint32_t	sc_trapno;	/* XXX should be above */
 61	uint32_t	sc_err;
 62};
 63
 64struct netbsd32_sigcontext {
 65	uint32_t	sc_gs;
 66	uint32_t	sc_fs;
 67	uint32_t	sc_es;
 68	uint32_t	sc_ds;
 69	uint32_t	sc_edi;
 70	uint32_t	sc_esi;
 71	uint32_t	sc_ebp;
 72	uint32_t	sc_ebx;
 73	uint32_t	sc_edx;
 74	uint32_t	sc_ecx;
 75	uint32_t	sc_eax;
 76	/* XXX */
 77	uint32_t	sc_eip;
 78	uint32_t	sc_cs;
 79	uint32_t	sc_eflags;
 80	uint32_t	sc_esp;
 81	uint32_t	sc_ss;
 82
 83	uint32_t	sc_onstack;	/* sigstack state to restore */
 84	uint32_t	__sc_mask13;	/* signal mask to restore (old style) */
 85
 86	uint32_t	sc_trapno;	/* XXX should be above */
 87	uint32_t	sc_err;
 88
 89	sigset_t sc_mask;		/* signal mask to restore (new style) */
 90};
 91
 92#define sc_sp sc_esp
 93#define sc_fp sc_ebp
 94#define sc_pc sc_eip
 95#define sc_ps sc_eflags
 96
 97struct netbsd32_sigframe_sigcontext {
 98	uint32_t	sf_ra;
 99	int32_t		sf_signum;
100	int32_t		sf_code;
101	uint32_t	sf_scp;
102	struct netbsd32_sigcontext sf_sc;
103};
104
105struct netbsd32_sigframe_siginfo {
106	uint32_t	sf_ra;
107	int32_t		sf_signum;
108	uint32_t	sf_sip;
109	uint32_t	sf_ucp;
110	siginfo32_t	sf_si;
111	ucontext32_t	sf_uc;
112};
113
114struct reg32 {
115	int	r_eax;
116	int	r_ecx;
117	int	r_edx;
118	int	r_ebx;
119	int	r_esp;
120	int	r_ebp;
121	int	r_esi;
122	int	r_edi;
123	int	r_eip;
124	int	r_eflags;
125	int	r_cs;
126	int	r_ss;
127	int	r_ds;
128	int	r_es;
129	int	r_fs;
130	int	r_gs;
131};
132
133struct fpreg32 {
134	char	__data[108];
135};
136
137struct dbreg32 {
138	int	dr[8];
139};
140
141struct xmmregs32 {
142	struct fxsave fxstate;
143};
144__CTASSERT(sizeof(struct xmmregs32) == 512);
145
146struct x86_get_ldt_args32 {
147	int32_t start;
148	uint32_t desc;
149	int32_t num;
150};
151
152struct x86_set_ldt_args32 {
153	int32_t start;
154	uint32_t desc;
155	int32_t num;
156};
157
158struct mtrr32 {
159	uint64_t base;
160	uint64_t len;
161	uint8_t type;
162	uint8_t __pad0[3];
163	int flags;
164	uint32_t owner;
165} __packed;
166
167struct x86_64_get_mtrr_args32 {
168	uint32_t mtrrp;
169	uint32_t n;
170};
171
172struct x86_64_set_mtrr_args32 {
173	uint32_t mtrrp;
174	uint32_t n;
175};
176
177#define NETBSD32_MID_MACHINE MID_I386
178
179/* Translate ptrace() PT_* request from 32-bit userland to kernel. */
180int netbsd32_ptrace_translate_request(int);
181
182int netbsd32_process_read_regs(struct lwp *, struct reg32 *);
183int netbsd32_process_read_fpregs(struct lwp *, struct fpreg32 *, size_t *);
184int netbsd32_process_read_dbregs(struct lwp *, struct dbreg32 *, size_t *);
185
186int netbsd32_process_write_regs(struct lwp *, const struct reg32 *);
187int netbsd32_process_write_fpregs(struct lwp *, const struct fpreg32 *, size_t);
188int netbsd32_process_write_dbregs(struct lwp *, const struct dbreg32 *, size_t);
189
190#endif /* _MACHINE_NETBSD32_H_ */