[SOFT386]
[reactos.git] / include / reactos / libs / soft386 / soft386.h
1 /*
2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: 386/486 CPU Emulation Library
4 * FILE: soft386.h
5 * PURPOSE: Header file for Soft386.
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 */
8
9 #ifndef _SOFT386_H_
10 #define _SOFT386_H_
11
12 /* DEFINES ********************************************************************/
13
14 #define SOFT386_NUM_GEN_REGS 8
15 #define SOFT386_NUM_SEG_REGS 6
16 #define SOFT386_NUM_CTRL_REGS 8
17 #define SOFT386_NUM_DBG_REGS 8
18
19 #define SOFT386_CR0_PE (1 << 0)
20 #define SOFT386_CR0_MP (1 << 1)
21 #define SOFT386_CR0_EM (1 << 2)
22 #define SOFT386_CR0_TS (1 << 3)
23 #define SOFT386_CR0_ET (1 << 4)
24 #define SOFT386_CR0_NE (1 << 5)
25 #define SOFT386_CR0_WP (1 << 16)
26 #define SOFT386_CR0_AM (1 << 18)
27 #define SOFT386_CR0_NW (1 << 29)
28 #define SOFT386_CR0_CD (1 << 30)
29 #define SOFT386_CR0_PG (1 << 31)
30
31 #define SOFT386_IDT_TASK_GATE 0x5
32 #define SOFT386_IDT_INT_GATE 0x6
33 #define SOFT386_IDT_TRAP_GATE 0x7
34 #define SOFT386_IDT_INT_GATE_32 0xE
35 #define SOFT386_IDT_TRAP_GATE_32 0xF
36
37 #define SOFT386_PREFIX_SEG (1 << 0)
38 #define SOFT386_PREFIX_OPSIZE (1 << 1)
39 #define SOFT386_PREFIX_ADSIZE (1 << 2)
40 #define SOFT386_PREFIX_LOCK (1 << 3)
41 #define SOFT386_PREFIX_REPNZ (1 << 4)
42 #define SOFT386_PREFIX_REP (1 << 5)
43
44 struct _SOFT386_STATE;
45 typedef struct _SOFT386_STATE SOFT386_STATE, *PSOFT386_STATE;
46
47 enum _SOFT386_GEN_REGS
48 {
49 SOFT386_REG_EAX,
50 SOFT386_REG_ECX,
51 SOFT386_REG_EDX,
52 SOFT386_REG_EBX,
53 SOFT386_REG_ESP,
54 SOFT386_REG_EBP,
55 SOFT386_REG_ESI,
56 SOFT386_REG_EDI
57 };
58
59 enum _SOFT386_SEG_REGS
60 {
61 SOFT386_REG_ES,
62 SOFT386_REG_CS,
63 SOFT386_REG_SS,
64 SOFT386_REG_DS,
65 SOFT386_REG_FS,
66 SOFT386_REG_GS
67 };
68
69 enum _SOFT386_CTRL_REGS
70 {
71 SOFT386_REG_CR0,
72 SOFT386_REG_CR1,
73 SOFT386_REG_CR2,
74 SOFT386_REG_CR3,
75 SOFT386_REG_CR4,
76 SOFT386_REG_CR5,
77 SOFT386_REG_CR6,
78 SOFT386_REG_CR7
79 };
80
81 enum _SOFT386_DBG_REGS
82 {
83 SOFT386_REG_DR0,
84 SOFT386_REG_DR1,
85 SOFT386_REG_DR2,
86 SOFT386_REG_DR3,
87 SOFT386_REG_DR4,
88 SOFT386_REG_DR5,
89 SOFT386_REG_DR6,
90 SOFT386_REG_DR7
91 };
92
93 enum _SOFT386_EXCEPTIONS
94 {
95 SOFT386_EXCEPTION_DE = 0x00,
96 SOFT386_EXCEPTION_DB = 0x01,
97 SOFT386_EXCEPTION_BP = 0x03,
98 SOFT386_EXCEPTION_OF = 0x04,
99 SOFT386_EXCEPTION_BR = 0x05,
100 SOFT386_EXCEPTION_UD = 0x06,
101 SOFT386_EXCEPTION_NM = 0x07,
102 SOFT386_EXCEPTION_DF = 0x08,
103 SOFT386_EXCEPTION_TS = 0x0A,
104 SOFT386_EXCEPTION_NP = 0x0B,
105 SOFT386_EXCEPTION_SS = 0x0C,
106 SOFT386_EXCEPTION_GP = 0x0D,
107 SOFT386_EXCEPTION_PF = 0x0E,
108 SOFT386_EXCEPTION_MF = 0x10,
109 SOFT386_EXCEPTION_AC = 0x11,
110 SOFT386_EXCEPTION_MC = 0x12
111 };
112
113 typedef
114 BOOLEAN
115 (NTAPI *SOFT386_MEM_READ_PROC)
116 (
117 PSOFT386_STATE State,
118 ULONG Address,
119 PVOID Buffer,
120 ULONG Size
121 );
122
123 typedef
124 BOOLEAN
125 (NTAPI *SOFT386_MEM_WRITE_PROC)
126 (
127 PSOFT386_STATE State,
128 ULONG Address,
129 PVOID Buffer,
130 ULONG Size
131 );
132
133 typedef
134 VOID
135 (NTAPI *SOFT386_IO_READ_PROC)
136 (
137 PSOFT386_STATE State,
138 ULONG Port,
139 PVOID Buffer,
140 ULONG Size
141 );
142
143 typedef
144 VOID
145 (NTAPI *SOFT386_IO_WRITE_PROC)
146 (
147 PSOFT386_STATE State,
148 ULONG Port,
149 PVOID Buffer,
150 ULONG Size
151 );
152
153 typedef union _SOFT386_REG
154 {
155 struct
156 {
157 UCHAR LowByte;
158 UCHAR HighByte;
159 };
160 USHORT LowWord;
161 ULONG Long;
162 } SOFT386_REG, *PSOFT386_REG;
163
164 typedef struct _SOFT386_SEG_REG
165 {
166 USHORT Selector;
167
168 /* Descriptor cache */
169 ULONG Accessed : 1;
170 ULONG ReadWrite : 1;
171 ULONG DirConf : 1;
172 ULONG Executable : 1;
173 ULONG SystemType : 1;
174 ULONG Dpl : 2;
175 ULONG Present : 1;
176 ULONG Size : 1;
177 ULONG Limit;
178 ULONG Base;
179 } SOFT386_SEG_REG, *PSOFT386_SEG_REG;
180
181 typedef struct
182 {
183 ULONG Limit : 16;
184 ULONG Base : 24;
185 ULONG Accessed : 1;
186 ULONG ReadWrite : 1;
187 ULONG DirConf : 1;
188 ULONG Executable : 1;
189 ULONG SystemType : 1;
190 ULONG Dpl : 2;
191 ULONG Present : 1;
192 ULONG LimitHigh : 4;
193 ULONG Avl : 1;
194 ULONG Reserved : 1;
195 ULONG Size : 1;
196 ULONG Granularity : 1;
197 ULONG BaseHigh : 8;
198 } SOFT386_GDT_ENTRY, *PSOFT386_GDT_ENTRY;
199
200 typedef struct
201 {
202 ULONG Offset : 16;
203 ULONG Selector : 16;
204 ULONG Zero : 8;
205 ULONG Type : 4;
206 ULONG Storage : 1;
207 ULONG Dpl : 2;
208 ULONG Present : 1;
209 ULONG OffsetHigh : 16;
210 } SOFT386_IDT_ENTRY, *PSOFT386_IDT_ENTRY;
211
212 typedef struct _SOFT386_TABLE_REG
213 {
214 USHORT Size;
215 ULONG Address;
216 } SOFT386_TABLE_REG, *PSOFT386_TABLE_REG;
217
218 typedef union _SOFT386_FLAGS_REG
219 {
220 ULONG Long;
221 struct
222 {
223 ULONG Cf : 1;
224 ULONG AlwaysSet : 1;
225 ULONG Pf : 1;
226 ULONG Reserved0 : 1;
227 ULONG Af : 1;
228 ULONG Reserved1 : 1;
229 ULONG Zf : 1;
230 ULONG Sf : 1;
231 ULONG Tf : 1;
232 ULONG If : 1;
233 ULONG Df : 1;
234 ULONG Of : 1;
235 ULONG Iopl : 2;
236 ULONG Nt : 1;
237 ULONG Reserved2 : 1;
238 ULONG Rf : 1;
239 ULONG Vm : 1;
240 ULONG Ac : 1;
241 ULONG Vif : 1;
242 ULONG Vip : 1;
243 ULONG Id : 1;
244 };
245 } SOFT386_FLAGS_REG, *PSOFT386_FLAGS_REG;
246
247 typedef struct _SOFT386_TSS
248 {
249 ULONG Link;
250 ULONG Esp0;
251 ULONG Ss0;
252 ULONG Esp1;
253 ULONG Ss1;
254 ULONG Esp2;
255 ULONG Ss2;
256 ULONG Cr3;
257 ULONG Eip;
258 ULONG Eflags;
259 ULONG Eax;
260 ULONG Ecx;
261 ULONG Edx;
262 ULONG Ebx;
263 ULONG Esp;
264 ULONG Ebp;
265 ULONG Esi;
266 ULONG Edi;
267 ULONG Es;
268 ULONG Cs;
269 ULONG Ss;
270 ULONG Ds;
271 ULONG Fs;
272 ULONG Gs;
273 ULONG Ldtr;
274 ULONG IopbOffset;
275 } SOFT386_TSS, *PSOFT386_TSS;
276
277 struct _SOFT386_STATE
278 {
279 SOFT386_MEM_READ_PROC MemReadCallback;
280 SOFT386_MEM_WRITE_PROC MemWriteCallback;
281 SOFT386_IO_READ_PROC IoReadCallback;
282 SOFT386_IO_WRITE_PROC IoWriteCallback;
283 SOFT386_REG GeneralRegs[SOFT386_NUM_GEN_REGS];
284 SOFT386_SEG_REG SegmentRegs[SOFT386_NUM_SEG_REGS];
285 SOFT386_REG InstPtr;
286 SOFT386_FLAGS_REG Flags;
287 SOFT386_TABLE_REG Gdtr, Idtr, Ldtr, Tss;
288 ULONGLONG TimeStampCounter;
289 ULONG ControlRegisters[SOFT386_NUM_CTRL_REGS];
290 ULONG DebugRegisters[SOFT386_NUM_DBG_REGS];
291 ULONG ExceptionCount;
292 ULONG PrefixFlags;
293 INT SegmentOverride;
294 };
295
296 /* FUNCTIONS ******************************************************************/
297
298 VOID
299 NTAPI
300 Soft386Continue(PSOFT386_STATE State);
301
302 VOID
303 NTAPI
304 Soft386StepInto(PSOFT386_STATE State);
305
306 VOID
307 NTAPI
308 Soft386StepOver(PSOFT386_STATE State);
309
310 VOID
311 NTAPI
312 Soft386StepOut(PSOFT386_STATE State);
313
314 VOID
315 NTAPI
316 Soft386DumpState(PSOFT386_STATE State);
317
318 VOID
319 NTAPI
320 Soft386Reset(PSOFT386_STATE State);
321
322 VOID
323 NTAPI
324 Soft386Interrupt(PSOFT386_STATE State, UCHAR Number);
325
326 #endif // _SOFT386_H_
327
328 /* EOF */