[FAST486]
[reactos.git] / include / reactos / libs / fast486 / fast486.h
1 /*
2 * Fast486 386/486 CPU Emulation Library
3 * fast486.h
4 *
5 * Copyright (C) 2013 Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 */
21
22 #ifndef _FAST486_H_
23 #define _FAST486_H_
24
25 #pragma once
26
27 /* DEFINES ********************************************************************/
28
29 #ifndef FASTCALL
30 #define FASTCALL __fastcall
31 #endif
32
33 #define FAST486_NUM_GEN_REGS 8
34 #define FAST486_NUM_SEG_REGS 6
35 #define FAST486_NUM_CTRL_REGS 3
36 #define FAST486_NUM_DBG_REGS 6
37
38 #define FAST486_CR0_PE (1 << 0)
39 #define FAST486_CR0_MP (1 << 1)
40 #define FAST486_CR0_EM (1 << 2)
41 #define FAST486_CR0_TS (1 << 3)
42 #define FAST486_CR0_ET (1 << 4)
43 #define FAST486_CR0_NE (1 << 5)
44 #define FAST486_CR0_WP (1 << 16)
45 #define FAST486_CR0_AM (1 << 18)
46 #define FAST486_CR0_NW (1 << 29)
47 #define FAST486_CR0_CD (1 << 30)
48 #define FAST486_CR0_PG (1 << 31)
49
50 #define FAST486_DR4_B0 (1 << 0)
51 #define FAST486_DR4_B1 (1 << 1)
52 #define FAST486_DR4_B2 (1 << 2)
53 #define FAST486_DR4_B3 (1 << 3)
54 #define FAST486_DR4_BD (1 << 13)
55 #define FAST486_DR4_BS (1 << 14)
56 #define FAST486_DR4_BT (1 << 15)
57
58 #define FAST486_DR5_L0 (1 << 0)
59 #define FAST486_DR5_G0 (1 << 1)
60 #define FAST486_DR5_L1 (1 << 2)
61 #define FAST486_DR5_G1 (1 << 3)
62 #define FAST486_DR5_L2 (1 << 4)
63 #define FAST486_DR5_G2 (1 << 5)
64 #define FAST486_DR5_L3 (1 << 6)
65 #define FAST486_DR5_G3 (1 << 7)
66 #define FAST486_DR5_LE (1 << 8)
67 #define FAST486_DR5_GE (1 << 9)
68 #define FAST486_DR5_GD (1 << 13)
69
70 #define FAST486_DBG_BREAK_EXEC 0
71 #define FAST486_DBG_BREAK_WRITE 1
72 #define FAST486_DBG_BREAK_READWRITE 3
73
74 #define FAST486_DR4_RESERVED 0xFFFF1FF0
75 #define FAST486_DR5_RESERVED 0x0000DC00
76
77 #define FAST486_IDT_TASK_GATE 0x5
78 #define FAST486_IDT_INT_GATE 0x6
79 #define FAST486_IDT_TRAP_GATE 0x7
80 #define FAST486_IDT_INT_GATE_32 0xE
81 #define FAST486_IDT_TRAP_GATE_32 0xF
82
83 #define FAST486_PREFIX_SEG (1 << 0)
84 #define FAST486_PREFIX_OPSIZE (1 << 1)
85 #define FAST486_PREFIX_ADSIZE (1 << 2)
86 #define FAST486_PREFIX_LOCK (1 << 3)
87 #define FAST486_PREFIX_REPNZ (1 << 4)
88 #define FAST486_PREFIX_REP (1 << 5)
89
90 struct _FAST486_STATE;
91 typedef struct _FAST486_STATE FAST486_STATE, *PFAST486_STATE;
92
93 typedef enum _FAST486_GEN_REGS
94 {
95 FAST486_REG_EAX,
96 FAST486_REG_ECX,
97 FAST486_REG_EDX,
98 FAST486_REG_EBX,
99 FAST486_REG_ESP,
100 FAST486_REG_EBP,
101 FAST486_REG_ESI,
102 FAST486_REG_EDI
103 } FAST486_GEN_REGS, *PFAST486_GEN_REGS;
104
105 typedef enum _FAST486_SEG_REGS
106 {
107 FAST486_REG_ES,
108 FAST486_REG_CS,
109 FAST486_REG_SS,
110 FAST486_REG_DS,
111 FAST486_REG_FS,
112 FAST486_REG_GS
113 } FAST486_SEG_REGS, *PFAST486_SEG_REGS;
114
115 typedef enum _FAST486_CTRL_REGS
116 {
117 FAST486_REG_CR0 = 0,
118 FAST486_REG_CR2 = 1,
119 FAST486_REG_CR3 = 2,
120 } FAST486_CTRL_REGS, *PFAST486_CTRL_REGS;
121
122 typedef enum _FAST486_DBG_REGS
123 {
124 FAST486_REG_DR0 = 0,
125 FAST486_REG_DR1 = 1,
126 FAST486_REG_DR2 = 2,
127 FAST486_REG_DR3 = 3,
128 FAST486_REG_DR4 = 4,
129 FAST486_REG_DR5 = 5,
130 FAST486_REG_DR6 = 4, // alias to DR4
131 FAST486_REG_DR7 = 5 // alias to DR5
132 } FAST486_DBG_REGS, *PFAST486_DBG_REGS;
133
134 typedef enum _FAST486_EXCEPTIONS
135 {
136 FAST486_EXCEPTION_DE = 0x00,
137 FAST486_EXCEPTION_DB = 0x01,
138 FAST486_EXCEPTION_BP = 0x03,
139 FAST486_EXCEPTION_OF = 0x04,
140 FAST486_EXCEPTION_BR = 0x05,
141 FAST486_EXCEPTION_UD = 0x06,
142 FAST486_EXCEPTION_NM = 0x07,
143 FAST486_EXCEPTION_DF = 0x08,
144 FAST486_EXCEPTION_TS = 0x0A,
145 FAST486_EXCEPTION_NP = 0x0B,
146 FAST486_EXCEPTION_SS = 0x0C,
147 FAST486_EXCEPTION_GP = 0x0D,
148 FAST486_EXCEPTION_PF = 0x0E,
149 FAST486_EXCEPTION_MF = 0x10,
150 FAST486_EXCEPTION_AC = 0x11,
151 FAST486_EXCEPTION_MC = 0x12
152 } FAST486_EXCEPTIONS, *PFAST486_EXCEPTIONS;
153
154 typedef enum _FAST486_INT_STATUS
155 {
156 FAST486_INT_NONE = 0,
157 FAST486_INT_EXECUTE = 1,
158 FAST486_INT_SIGNAL = 2
159 } FAST486_INT_STATUS, *PFAST486_INT_STATUS;
160
161 typedef
162 VOID
163 (NTAPI *FAST486_MEM_READ_PROC)
164 (
165 PFAST486_STATE State,
166 ULONG Address,
167 PVOID Buffer,
168 ULONG Size
169 );
170
171 typedef
172 VOID
173 (NTAPI *FAST486_MEM_WRITE_PROC)
174 (
175 PFAST486_STATE State,
176 ULONG Address,
177 PVOID Buffer,
178 ULONG Size
179 );
180
181 typedef
182 VOID
183 (NTAPI *FAST486_IO_READ_PROC)
184 (
185 PFAST486_STATE State,
186 ULONG Port,
187 PVOID Buffer,
188 ULONG DataCount,
189 UCHAR DataSize
190 );
191
192 typedef
193 VOID
194 (NTAPI *FAST486_IO_WRITE_PROC)
195 (
196 PFAST486_STATE State,
197 ULONG Port,
198 PVOID Buffer,
199 ULONG DataCount,
200 UCHAR DataSize
201 );
202
203 typedef
204 VOID
205 (NTAPI *FAST486_IDLE_PROC)
206 (
207 PFAST486_STATE State
208 );
209
210 typedef
211 VOID
212 (NTAPI *FAST486_BOP_PROC)
213 (
214 PFAST486_STATE State,
215 UCHAR BopCode
216 );
217
218 typedef
219 UCHAR
220 (NTAPI *FAST486_INT_ACK_PROC)
221 (
222 PFAST486_STATE State
223 );
224
225 typedef union _FAST486_REG
226 {
227 union
228 {
229 struct
230 {
231 UCHAR LowByte;
232 UCHAR HighByte;
233 };
234 USHORT LowWord;
235 };
236 ULONG Long;
237 } FAST486_REG, *PFAST486_REG;
238
239 typedef struct _FAST486_SEG_REG
240 {
241 USHORT Selector;
242
243 /* Descriptor cache */
244 ULONG Accessed : 1;
245 ULONG ReadWrite : 1;
246 ULONG DirConf : 1;
247 ULONG Executable : 1;
248 ULONG SystemType : 1;
249 ULONG Dpl : 2;
250 ULONG Present : 1;
251 ULONG Size : 1;
252 ULONG Limit;
253 ULONG Base;
254 } FAST486_SEG_REG, *PFAST486_SEG_REG;
255
256 #pragma pack(push, 1)
257
258 typedef struct
259 {
260 ULONG Limit : 16;
261 ULONG Base : 16;
262 ULONG BaseMid : 8;
263 ULONG Accessed : 1;
264 ULONG ReadWrite : 1;
265 ULONG DirConf : 1;
266 ULONG Executable : 1;
267 ULONG SystemType : 1;
268 ULONG Dpl : 2;
269 ULONG Present : 1;
270 ULONG LimitHigh : 4;
271 ULONG Avl : 1;
272 ULONG Reserved : 1;
273 ULONG Size : 1;
274 ULONG Granularity : 1;
275 ULONG BaseHigh : 8;
276 } FAST486_GDT_ENTRY, *PFAST486_GDT_ENTRY;
277
278 /* Verify the structure size */
279 C_ASSERT(sizeof(FAST486_GDT_ENTRY) == sizeof(ULONGLONG));
280
281 typedef struct
282 {
283 ULONG Offset : 16;
284 ULONG Selector : 16;
285 ULONG ParamCount : 5;
286 ULONG Reserved : 3;
287 ULONG Type : 4;
288 ULONG SystemType : 1;
289 ULONG Dpl : 2;
290 ULONG Present : 1;
291 ULONG OffsetHigh : 16;
292 } FAST486_CALL_GATE, *PFAST486_CALL_GATE;
293
294 /* Verify the structure size */
295 C_ASSERT(sizeof(FAST486_CALL_GATE) == sizeof(ULONGLONG));
296
297 typedef struct
298 {
299 ULONG Offset : 16;
300 ULONG Selector : 16;
301 ULONG Zero : 8;
302 ULONG Type : 4;
303 ULONG Storage : 1;
304 ULONG Dpl : 2;
305 ULONG Present : 1;
306 ULONG OffsetHigh : 16;
307 } FAST486_IDT_ENTRY, *PFAST486_IDT_ENTRY;
308
309 /* Verify the structure size */
310 C_ASSERT(sizeof(FAST486_IDT_ENTRY) == sizeof(ULONGLONG));
311
312 #pragma pack(pop)
313
314 typedef struct _FAST486_TABLE_REG
315 {
316 USHORT Size;
317 ULONG Address;
318 } FAST486_TABLE_REG, *PFAST486_TABLE_REG;
319
320 typedef union _FAST486_FLAGS_REG
321 {
322 USHORT LowWord;
323 ULONG Long;
324
325 struct
326 {
327 ULONG Cf : 1;
328 ULONG AlwaysSet : 1;
329 ULONG Pf : 1;
330 ULONG Reserved0 : 1;
331 ULONG Af : 1;
332 ULONG Reserved1 : 1;
333 ULONG Zf : 1;
334 ULONG Sf : 1;
335 ULONG Tf : 1;
336 ULONG If : 1;
337 ULONG Df : 1;
338 ULONG Of : 1;
339 ULONG Iopl : 2;
340 ULONG Nt : 1;
341 ULONG Reserved2 : 1;
342 ULONG Rf : 1;
343 ULONG Vm : 1;
344 ULONG Ac : 1;
345 ULONG Vif : 1;
346 ULONG Vip : 1;
347 ULONG Id : 1;
348
349 // ULONG Reserved : 10;
350 };
351 } FAST486_FLAGS_REG, *PFAST486_FLAGS_REG;
352
353 typedef struct _FAST486_TSS
354 {
355 ULONG Link;
356 ULONG Esp0;
357 ULONG Ss0;
358 ULONG Esp1;
359 ULONG Ss1;
360 ULONG Esp2;
361 ULONG Ss2;
362 ULONG Cr3;
363 ULONG Eip;
364 ULONG Eflags;
365 ULONG Eax;
366 ULONG Ecx;
367 ULONG Edx;
368 ULONG Ebx;
369 ULONG Esp;
370 ULONG Ebp;
371 ULONG Esi;
372 ULONG Edi;
373 ULONG Es;
374 ULONG Cs;
375 ULONG Ss;
376 ULONG Ds;
377 ULONG Fs;
378 ULONG Gs;
379 ULONG Ldtr;
380 ULONG IopbOffset;
381 } FAST486_TSS, *PFAST486_TSS;
382
383 struct _FAST486_STATE
384 {
385 FAST486_MEM_READ_PROC MemReadCallback;
386 FAST486_MEM_WRITE_PROC MemWriteCallback;
387 FAST486_IO_READ_PROC IoReadCallback;
388 FAST486_IO_WRITE_PROC IoWriteCallback;
389 FAST486_IDLE_PROC IdleCallback;
390 FAST486_BOP_PROC BopCallback;
391 FAST486_INT_ACK_PROC IntAckCallback;
392 FAST486_REG GeneralRegs[FAST486_NUM_GEN_REGS];
393 FAST486_SEG_REG SegmentRegs[FAST486_NUM_SEG_REGS];
394 FAST486_REG InstPtr, SavedInstPtr;
395 FAST486_FLAGS_REG Flags;
396 FAST486_TABLE_REG Gdtr, Idtr, Ldtr, Tss;
397 ULONG ControlRegisters[FAST486_NUM_CTRL_REGS];
398 ULONG DebugRegisters[FAST486_NUM_DBG_REGS];
399 ULONG ExceptionCount;
400 ULONG PrefixFlags;
401 FAST486_SEG_REGS SegmentOverride;
402 FAST486_INT_STATUS IntStatus;
403 UCHAR PendingIntNum;
404 PULONG Tlb;
405 };
406
407 /* FUNCTIONS ******************************************************************/
408
409 VOID
410 NTAPI
411 Fast486Initialize(PFAST486_STATE State,
412 FAST486_MEM_READ_PROC MemReadCallback,
413 FAST486_MEM_WRITE_PROC MemWriteCallback,
414 FAST486_IO_READ_PROC IoReadCallback,
415 FAST486_IO_WRITE_PROC IoWriteCallback,
416 FAST486_IDLE_PROC IdleCallback,
417 FAST486_BOP_PROC BopCallback,
418 FAST486_INT_ACK_PROC IntAckCallback,
419 PULONG Tlb);
420
421 VOID
422 NTAPI
423 Fast486Reset(PFAST486_STATE State);
424
425 VOID
426 NTAPI
427 Fast486Continue(PFAST486_STATE State);
428
429 VOID
430 NTAPI
431 Fast486StepInto(PFAST486_STATE State);
432
433 VOID
434 NTAPI
435 Fast486StepOver(PFAST486_STATE State);
436
437 VOID
438 NTAPI
439 Fast486StepOut(PFAST486_STATE State);
440
441 VOID
442 NTAPI
443 Fast486DumpState(PFAST486_STATE State);
444
445 VOID
446 NTAPI
447 Fast486Interrupt(PFAST486_STATE State, UCHAR Number);
448
449 VOID
450 NTAPI
451 Fast486InterruptSignal(PFAST486_STATE State);
452
453 VOID
454 NTAPI
455 Fast486ExecuteAt(PFAST486_STATE State, USHORT Segment, ULONG Offset);
456
457 VOID
458 NTAPI
459 Fast486SetStack(PFAST486_STATE State, USHORT Segment, ULONG Offset);
460
461 VOID
462 NTAPI
463 Fast486SetSegment
464 (
465 PFAST486_STATE State,
466 FAST486_SEG_REGS Segment,
467 USHORT Selector
468 );
469
470 #endif // _FAST486_H_
471
472 /* EOF */