4b2974248f461ce910b1c3e7577068a43fd3559c
[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 /* INCLUDES *******************************************************************/
13
14 #include <windows.h>
15 #include <debug.h>
16
17 /* DEFINES ********************************************************************/
18
19 #define SOFT386_NUM_GEN_REGS 8
20 #define SOFT386_NUM_SEG_REGS 6
21 #define SOFT386_NUM_CTRL_REGS 8
22 #define SOFT386_NUM_DBG_REGS 8
23
24 #define SOFT386_CR0_PE (1 << 0)
25 #define SOFT386_CR0_MP (1 << 1)
26 #define SOFT386_CR0_EM (1 << 2)
27 #define SOFT386_CR0_TS (1 << 3)
28 #define SOFT386_CR0_ET (1 << 4)
29 #define SOFT386_CR0_NE (1 << 5)
30 #define SOFT386_CR0_WP (1 << 16)
31 #define SOFT386_CR0_AM (1 << 18)
32 #define SOFT386_CR0_NW (1 << 29)
33 #define SOFT386_CR0_CD (1 << 30)
34 #define SOFT386_CR0_PG (1 << 31)
35
36 struct _SOFT386_STATE;
37 typedef struct _SOFT386_STATE SOFT386_STATE;
38 typedef struct _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 typedef
87 BOOLEAN
88 (NTAPI *SOFT386_MEM_READ_PROC)
89 (
90 PSOFT386_STATE State,
91 ULONG Address,
92 LPVOID Buffer,
93 ULONG Size
94 );
95
96 typedef
97 BOOLEAN
98 (NTAPI *SOFT386_MEM_WRITE_PROC)
99 (
100 PSOFT386_STATE State,
101 ULONG Address,
102 LPVOID Buffer,
103 ULONG Size
104 );
105
106 typedef
107 VOID
108 (NTAPI *SOFT386_IO_READ_PROC)
109 (
110 PSOFT386_STATE State,
111 ULONG Port,
112 LPVOID Buffer,
113 ULONG Size
114 );
115
116 typedef
117 VOID
118 (NTAPI *SOFT386_IO_WRITE_PROC)
119 (
120 PSOFT386_STATE State,
121 ULONG Port,
122 LPVOID Buffer,
123 ULONG Size
124 );
125
126 typedef union _SOFT386_REG
127 {
128 struct
129 {
130 UCHAR LowByte;
131 UCHAR HighByte;
132 };
133 USHORT LowWord;
134 ULONG Long;
135 } SOFT386_REG, *PSOFT386_REG;
136
137 typedef struct _SOFT386_SEG_REG
138 {
139 USHORT Selector;
140
141 /* Descriptor cache */
142 ULONG Accessed : 1;
143 ULONG ReadWrite : 1;
144 ULONG DirConf : 1;
145 ULONG Executable : 1;
146 ULONG SystemType : 1;
147 ULONG Dpl : 2;
148 ULONG Present : 1;
149 ULONG Size : 1;
150 ULONG Limit;
151 ULONG Base;
152 } SOFT386_SEG_REG, *PSOFT386_SEG_REG;
153
154 typedef struct
155 {
156 ULONG Limit : 16;
157 ULONG Base : 24;
158 ULONG Accessed : 1;
159 ULONG ReadWrite : 1;
160 ULONG DirConf : 1;
161 ULONG Executable : 1;
162 ULONG SystemType : 1;
163 ULONG Dpl : 2;
164 ULONG Present : 1;
165 ULONG LimitHigh : 4;
166 ULONG Avl : 1;
167 ULONG Reserved : 1;
168 ULONG Size : 1;
169 ULONG Granularity : 1;
170 ULONG BaseHigh : 8;
171 } SOFT386_GDT_ENTRY;
172
173 typedef struct
174 {
175 ULONG Offset : 16;
176 ULONG Selector : 16;
177 ULONG Zero : 8;
178 ULONG Type : 4;
179 ULONG Storage : 1;
180 ULONG Dpl : 2;
181 ULONG Present : 1;
182 ULONG OffsetHigh : 16;
183 } SOFT386_IDT_ENTRY;
184
185 typedef struct _SOFT386_TABLE_REG
186 {
187 USHORT Size;
188 ULONG Address;
189 } SOFT386_TABLE_REG, *PSOFT386_TABLE_REG;
190
191 typedef union _SOFT386_FLAGS_REG
192 {
193 ULONG Long;
194 struct
195 {
196 ULONG Cf : 1;
197 ULONG AlwaysSet : 1;
198 ULONG Pf : 1;
199 ULONG Reserved0 : 1;
200 ULONG Af : 1;
201 ULONG Reserved1 : 1;
202 ULONG Zf : 1;
203 ULONG Sf : 1;
204 ULONG Tf : 1;
205 ULONG If : 1;
206 ULONG Df : 1;
207 ULONG Of : 1;
208 ULONG Iopl : 2;
209 ULONG Nt : 1;
210 ULONG Reserved2 : 1;
211 ULONG Rf : 1;
212 ULONG Vm : 1;
213 ULONG Ac : 1;
214 ULONG Vif : 1;
215 ULONG Vip : 1;
216 ULONG Id : 1;
217 };
218 } SOFT386_FLAGS_REG, *PSOFT386_FLAGS_REG;
219
220 typedef struct _SOFT386_TSS
221 {
222 ULONG Link;
223 ULONG Esp0;
224 ULONG Ss0;
225 ULONG Esp1;
226 ULONG Ss1;
227 ULONG Esp2;
228 ULONG Ss2;
229 ULONG Cr3;
230 ULONG Eip;
231 ULONG Eflags;
232 ULONG Eax;
233 ULONG Ecx;
234 ULONG Edx;
235 ULONG Ebx;
236 ULONG Esp;
237 ULONG Ebp;
238 ULONG Esi;
239 ULONG Edi;
240 ULONG Es;
241 ULONG Cs;
242 ULONG Ss;
243 ULONG Ds;
244 ULONG Fs;
245 ULONG Gs;
246 ULONG Ldtr;
247 ULONG IopbOffset;
248 } SOFT386_TSS, *PSOFT386_TSS;
249
250 struct _SOFT386_STATE
251 {
252 SOFT386_MEM_READ_PROC MemReadCallback;
253 SOFT386_MEM_WRITE_PROC MemWriteCallback;
254 SOFT386_IO_READ_PROC IoReadCallback;
255 SOFT386_IO_WRITE_PROC IoWriteCallback;
256 SOFT386_REG GeneralRegs[SOFT386_NUM_GEN_REGS];
257 SOFT386_SEG_REG SegmentRegs[SOFT386_NUM_SEG_REGS];
258 SOFT386_REG InstPtr;
259 SOFT386_FLAGS_REG Flags;
260 SOFT386_TABLE_REG Gdtr, Idtr, Ldtr, Tss;
261 ULONGLONG TimeStampCounter;
262 ULONG ControlRegisters[SOFT386_NUM_CTRL_REGS];
263 ULONG DebugRegisters[SOFT386_NUM_DBG_REGS];
264 };
265
266 /* FUNCTIONS ******************************************************************/
267
268 VOID
269 NTAPI
270 Soft386Continue(PSOFT386_STATE State);
271
272 VOID
273 NTAPI
274 Soft386StepInto(PSOFT386_STATE State);
275
276 VOID
277 NTAPI
278 Soft386StepOver(PSOFT386_STATE State);
279
280 VOID
281 NTAPI
282 Soft386StepOut(PSOFT386_STATE State);
283
284 VOID
285 NTAPI
286 Soft386DumpState(PSOFT386_STATE State);
287
288 VOID
289 NTAPI
290 Soft386Reset(PSOFT386_STATE State);
291
292 #endif // _SOFT386_H_
293
294 /* EOF */