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