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