70f2971781d4fb9668bf67c096f6cea32d6ef0c4
[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
154 VOID
155 (NTAPI *SOFT386_IDLE_PROC)
156 (
157 PSOFT386_STATE State
158 );
159
160 typedef union _SOFT386_REG
161 {
162 union
163 {
164 struct
165 {
166 UCHAR LowByte;
167 UCHAR HighByte;
168 };
169 USHORT LowWord;
170 };
171 ULONG Long;
172 } SOFT386_REG, *PSOFT386_REG;
173
174 typedef struct _SOFT386_SEG_REG
175 {
176 USHORT Selector;
177
178 /* Descriptor cache */
179 ULONG Accessed : 1;
180 ULONG ReadWrite : 1;
181 ULONG DirConf : 1;
182 ULONG Executable : 1;
183 ULONG SystemType : 1;
184 ULONG Dpl : 2;
185 ULONG Present : 1;
186 ULONG Size : 1;
187 ULONG Limit;
188 ULONG Base;
189 } SOFT386_SEG_REG, *PSOFT386_SEG_REG;
190
191 typedef struct
192 {
193 ULONG Limit : 16;
194 ULONG Base : 24;
195 ULONG Accessed : 1;
196 ULONG ReadWrite : 1;
197 ULONG DirConf : 1;
198 ULONG Executable : 1;
199 ULONG SystemType : 1;
200 ULONG Dpl : 2;
201 ULONG Present : 1;
202 ULONG LimitHigh : 4;
203 ULONG Avl : 1;
204 ULONG Reserved : 1;
205 ULONG Size : 1;
206 ULONG Granularity : 1;
207 ULONG BaseHigh : 8;
208 } SOFT386_GDT_ENTRY, *PSOFT386_GDT_ENTRY;
209
210 typedef struct
211 {
212 ULONG Offset : 16;
213 ULONG Selector : 16;
214 ULONG Zero : 8;
215 ULONG Type : 4;
216 ULONG Storage : 1;
217 ULONG Dpl : 2;
218 ULONG Present : 1;
219 ULONG OffsetHigh : 16;
220 } SOFT386_IDT_ENTRY, *PSOFT386_IDT_ENTRY;
221
222 typedef struct _SOFT386_TABLE_REG
223 {
224 USHORT Size;
225 ULONG Address;
226 } SOFT386_TABLE_REG, *PSOFT386_TABLE_REG;
227
228 typedef union _SOFT386_FLAGS_REG
229 {
230 ULONG Long;
231 struct
232 {
233 ULONG Cf : 1;
234 ULONG AlwaysSet : 1;
235 ULONG Pf : 1;
236 ULONG Reserved0 : 1;
237 ULONG Af : 1;
238 ULONG Reserved1 : 1;
239 ULONG Zf : 1;
240 ULONG Sf : 1;
241 ULONG Tf : 1;
242 ULONG If : 1;
243 ULONG Df : 1;
244 ULONG Of : 1;
245 ULONG Iopl : 2;
246 ULONG Nt : 1;
247 ULONG Reserved2 : 1;
248 ULONG Rf : 1;
249 ULONG Vm : 1;
250 ULONG Ac : 1;
251 ULONG Vif : 1;
252 ULONG Vip : 1;
253 ULONG Id : 1;
254
255 // ULONG Reserved : 10;
256 };
257 } SOFT386_FLAGS_REG, *PSOFT386_FLAGS_REG;
258
259 typedef struct _SOFT386_TSS
260 {
261 ULONG Link;
262 ULONG Esp0;
263 ULONG Ss0;
264 ULONG Esp1;
265 ULONG Ss1;
266 ULONG Esp2;
267 ULONG Ss2;
268 ULONG Cr3;
269 ULONG Eip;
270 ULONG Eflags;
271 ULONG Eax;
272 ULONG Ecx;
273 ULONG Edx;
274 ULONG Ebx;
275 ULONG Esp;
276 ULONG Ebp;
277 ULONG Esi;
278 ULONG Edi;
279 ULONG Es;
280 ULONG Cs;
281 ULONG Ss;
282 ULONG Ds;
283 ULONG Fs;
284 ULONG Gs;
285 ULONG Ldtr;
286 ULONG IopbOffset;
287 } SOFT386_TSS, *PSOFT386_TSS;
288
289 struct _SOFT386_STATE
290 {
291 SOFT386_MEM_READ_PROC MemReadCallback;
292 SOFT386_MEM_WRITE_PROC MemWriteCallback;
293 SOFT386_IO_READ_PROC IoReadCallback;
294 SOFT386_IO_WRITE_PROC IoWriteCallback;
295 SOFT386_IDLE_PROC IdleCallback;
296 SOFT386_REG GeneralRegs[SOFT386_NUM_GEN_REGS];
297 SOFT386_SEG_REG SegmentRegs[SOFT386_NUM_SEG_REGS];
298 SOFT386_REG InstPtr;
299 SOFT386_FLAGS_REG Flags;
300 SOFT386_TABLE_REG Gdtr, Idtr, Ldtr, Tss;
301 ULONGLONG TimeStampCounter;
302 ULONG ControlRegisters[SOFT386_NUM_CTRL_REGS];
303 ULONG DebugRegisters[SOFT386_NUM_DBG_REGS];
304 ULONG ExceptionCount;
305 ULONG PrefixFlags;
306 INT SegmentOverride;
307 BOOLEAN HardwareInt;
308 };
309
310 /* FUNCTIONS ******************************************************************/
311
312 VOID
313 NTAPI
314 Soft386Continue(PSOFT386_STATE State);
315
316 VOID
317 NTAPI
318 Soft386StepInto(PSOFT386_STATE State);
319
320 VOID
321 NTAPI
322 Soft386StepOver(PSOFT386_STATE State);
323
324 VOID
325 NTAPI
326 Soft386StepOut(PSOFT386_STATE State);
327
328 VOID
329 NTAPI
330 Soft386DumpState(PSOFT386_STATE State);
331
332 VOID
333 NTAPI
334 Soft386Reset(PSOFT386_STATE State);
335
336 VOID
337 NTAPI
338 Soft386Interrupt(PSOFT386_STATE State, UCHAR Number);
339
340 VOID
341 NTAPI
342 Soft386ExecuteAt(PSOFT386_STATE State, USHORT Segment, ULONG Offset);
343
344 #endif // _SOFT386_H_
345
346 /* EOF */