1/*	$NetBSD: x86emu.h,v 1.1 2007/12/01 20:14:10 joerg Exp $	*/
2
3/****************************************************************************
4*
5*  Realmode X86 Emulator Library
6*
7*  Copyright (C) 1996-1999 SciTech Software, Inc.
8*  Copyright (C) David Mosberger-Tang
9*  Copyright (C) 1999 Egbert Eich
10*  Copyright (C) 2007 Joerg Sonnenberger
11*
12*  ========================================================================
13*
14*  Permission to use, copy, modify, distribute, and sell this software and
15*  its documentation for any purpose is hereby granted without fee,
16*  provided that the above copyright notice appear in all copies and that
17*  both that copyright notice and this permission notice appear in
18*  supporting documentation, and that the name of the authors not be used
19*  in advertising or publicity pertaining to distribution of the software
20*  without specific, written prior permission.  The authors makes no
21*  representations about the suitability of this software for any purpose.
22*  It is provided "as is" without express or implied warranty.
23*
24*  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
25*  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
26*  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
27*  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
28*  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
29*  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
30*  PERFORMANCE OF THIS SOFTWARE.
31*
32****************************************************************************/
33
34#ifndef __X86EMU_X86EMU_H
35#define __X86EMU_X86EMU_H
36
37#include <sys/types.h>
38#include <sys/endian.h>
39
40#ifdef _KERNEL
41#include <sys/systm.h>
42#else
43#include <setjmp.h>
44#endif
45
46/*
47 * General EAX, EBX, ECX, EDX type registers.  Note that for
48 * portability, and speed, the issue of byte swapping is not addressed
49 * in the registers.  All registers are stored in the default format
50 * available on the host machine.  The only critical issue is that the
51 * registers should line up EXACTLY in the same manner as they do in
52 * the 386.  That is:
53 *
54 * EAX & 0xff  === AL
55 * EAX & 0xffff == AX
56 *
57 * etc.  The result is that alot of the calculations can then be
58 * done using the native instruction set fully.
59 */
60
61#ifdef	__BIG_ENDIAN__
62
63struct X86EMU_register32 {
64	uint32_t e_reg;
65};
66
67struct X86EMU_register16 {
68	uint16_t filler0;
69	uint16_t x_reg;
70};
71
72struct X86EMU_register8 {
73	uint8_t filler0, filler1;
74	uint8_t h_reg, l_reg;
75};
76
77#else /* !__BIG_ENDIAN__ */
78
79struct X86EMU_register32 {
80	uint32_t e_reg;
81};
82
83struct X86EMU_register16 {
84	uint16_t x_reg;
85};
86
87struct X86EMU_register8 {
88	uint8_t l_reg, h_reg;
89};
90
91#endif /* BIG_ENDIAN */
92
93union X86EMU_register {
94	struct X86EMU_register32	I32_reg;
95	struct X86EMU_register16	I16_reg;
96	struct X86EMU_register8		I8_reg;
97};
98
99struct X86EMU_regs {
100	uint16_t		register_cs;
101	uint16_t		register_ds;
102	uint16_t		register_es;
103	uint16_t		register_fs;
104	uint16_t		register_gs;
105	uint16_t		register_ss;
106	uint32_t		register_flags;
107	union X86EMU_register	register_a;
108	union X86EMU_register	register_b;
109	union X86EMU_register	register_c;
110	union X86EMU_register	register_d;
111
112	union X86EMU_register	register_sp;
113	union X86EMU_register	register_bp;
114	union X86EMU_register	register_si;
115	union X86EMU_register	register_di;
116	union X86EMU_register	register_ip;
117
118	/*
119	 * MODE contains information on:
120	 *  REPE prefix             2 bits  repe,repne
121	 *  SEGMENT overrides       5 bits  normal,DS,SS,CS,ES
122	 *  Delayed flag set        3 bits  (zero, signed, parity)
123	 *  reserved                6 bits
124	 *  interrupt #             8 bits  instruction raised interrupt
125	 *  BIOS video segregs      4 bits
126	 *  Interrupt Pending       1 bits
127	 *  Extern interrupt        1 bits
128	 *  Halted                  1 bits
129	 */
130	uint32_t		mode;
131	volatile int		intr;   /* mask of pending interrupts */
132	uint8_t			intno;
133	uint8_t			__pad[3];
134};
135
136struct X86EMU {
137	char			*mem_base;
138	size_t			mem_size;
139	void        		*sys_private;
140	struct X86EMU_regs	x86;
141
142#ifdef _KERNEL
143	label_t		exec_state;
144#else
145	jmp_buf		exec_state;
146#endif
147
148	uint64_t	cur_cycles;
149
150	unsigned int	cur_mod:2;
151	unsigned int	cur_rl:3;
152	unsigned int	cur_rh:3;
153	uint32_t	cur_offset;
154
155	uint8_t  	(*emu_rdb)(struct X86EMU *, uint32_t addr);
156	uint16_t 	(*emu_rdw)(struct X86EMU *, uint32_t addr);
157	uint32_t 	(*emu_rdl)(struct X86EMU *, uint32_t addr);
158	void		(*emu_wrb)(struct X86EMU *, uint32_t addr,uint8_t val);
159	void		(*emu_wrw)(struct X86EMU *, uint32_t addr, uint16_t val);
160	void		(*emu_wrl)(struct X86EMU *, uint32_t addr, uint32_t val);
161
162	uint8_t  	(*emu_inb)(struct X86EMU *, uint16_t addr);
163	uint16_t 	(*emu_inw)(struct X86EMU *, uint16_t addr);
164	uint32_t 	(*emu_inl)(struct X86EMU *, uint16_t addr);
165	void		(*emu_outb)(struct X86EMU *, uint16_t addr, uint8_t val);
166	void		(*emu_outw)(struct X86EMU *, uint16_t addr, uint16_t val);
167	void		(*emu_outl)(struct X86EMU *, uint16_t addr, uint32_t val);
168
169	void 		(*_X86EMU_intrTab[256])(struct X86EMU *, int);
170};
171
172__BEGIN_DECLS
173
174void	X86EMU_init_default(struct X86EMU *);
175
176/* decode.c */
177
178void 	X86EMU_exec(struct X86EMU *);
179void	X86EMU_exec_call(struct X86EMU *, uint16_t, uint16_t);
180void	X86EMU_exec_intr(struct X86EMU *, uint8_t);
181void 	X86EMU_halt_sys(struct X86EMU *) __dead;
182
183__END_DECLS
184
185#endif /* __X86EMU_X86EMU_H */
186