ReactOS  0.4.13-dev-982-g9853eab
asm.h
Go to the documentation of this file.
1 /*++ NDK Version: 0095
2 
3 Copyright (c) Alex Ionescu. All rights reserved.
4 
5 Header Name:
6 
7  asm.h
8 
9 Abstract:
10 
11  ASM Offsets for dealing with de-referencing structures in registers.
12  C-compatible version of the file ks386.inc present in the newest WDK.
13 
14 Author:
15 
16  Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
17 
18 --*/
19 
20 #ifndef _ASM_X86_H
21 #define _ASM_X86_H
22 
23 //
24 // PCR Access
25 //
26 #ifdef __ASM__
27 #ifdef CONFIG_SMP
28 #define PCR fs:
29 #else
30 #define PCR ds:[0xFFDFF000]
31 #endif
32 #endif
33 
34 //
35 // CPU Modes
36 //
37 #define KernelMode 0x0
38 #define UserMode 0x1
39 
40 //
41 // Selector Names
42 //
43 #ifdef __ASM__
44 #define RPL_MASK 0x0003
45 #define MODE_MASK 0x0001
46 #define KGDT_R0_CODE (0x8)
47 #define KGDT_R0_DATA (0x10)
48 #define KGDT_R3_CODE (0x18)
49 #define KGDT_R3_DATA (0x20)
50 #define KGDT_TSS (0x28)
51 #define KGDT_R0_PCR (0x30)
52 #define KGDT_R3_TEB (0x38)
53 #define KGDT_LDT (0x48)
54 #define KGDT_DF_TSS (0x50)
55 #define KGDT_NMI_TSS (0x58)
56 #endif
57 
58 //
59 // TSS Offsets
60 //
61 #define KTSS_ESP0 0x4
62 #define KTSS_CR3 0x1C
63 #define KTSS_EIP 0x20
64 #define KTSS_EFLAGS 0x24
65 #define KTSS_EAX 0x28
66 #define KTSS_ECX 0x2C
67 #define KTSS_EDX 0x30
68 #define KTSS_EBX 0x34
69 #define KTSS_ESP 0x38
70 #define KTSS_EBP 0x3C
71 #define KTSS_ESI 0x40
72 #define KTSS_EDI 0x44
73 #define KTSS_ES 0x48
74 #define KTSS_CS 0x4C
75 #define KTSS_SS 0x50
76 #define KTSS_DS 0x54
77 #define KTSS_FS 0x58
78 #define KTSS_GS 0x5C
79 #define KTSS_LDT 0x60
80 #define KTSS_IOMAPBASE 0x66
81 #define KTSS_IO_MAPS 0x68
82 
83 //
84 // KTHREAD Offsets
85 //
86 #define KTHREAD_DEBUG_ACTIVE 0x03
87 #define KTHREAD_INITIAL_STACK 0x18
88 #define KTHREAD_STACK_LIMIT 0x1C
89 #define KTHREAD_TEB 0x74
90 #define KTHREAD_KERNEL_STACK 0x20
91 #define KTHREAD_ALERTED 0x5E
92 #define KTHREAD_APCSTATE_PROCESS 0x28 + 0x10
93 #define KTHREAD_PENDING_USER_APC 0x28 + 0x16
94 #define KTHREAD_PENDING_KERNEL_APC 0x28 + 0x15
95 #define KTHREAD_CONTEXT_SWITCHES 0x48
96 #define KTHREAD_STATE_ 0x4C
97 #define KTHREAD_NPX_STATE 0x4D
98 #define KTHREAD_WAIT_IRQL 0x4E
99 #define KTHREAD_NEXT_PROCESSOR 0x40
100 #define KTHREAD_WAIT_REASON 0x5A
101 #define KTHREAD_PRIORITY 0x5B
102 #define KTHREAD_SWAP_BUSY 0x5D
103 #define KTHREAD_SERVICE_TABLE 0x118
104 #define KTHREAD_PREVIOUS_MODE 0xD7
105 #define KTHREAD_COMBINED_APC_DISABLE 0x70
106 #define KTHREAD_SPECIAL_APC_DISABLE 0x72
107 #define KTHREAD_LARGE_STACK 0x107
108 #define KTHREAD_TRAP_FRAME 0x110
109 #define KTHREAD_CALLBACK_STACK 0x114
110 #define KTHREAD_APC_STATE_INDEX 0x11C
111 #define KTHREAD_STACK_BASE 0x158
112 #define KTHREAD_QUANTUM 0x15D
113 #define KTHREAD_KERNEL_TIME 0x160
114 #define KTHREAD_USER_TIME 0x18C
115 
116 //
117 // KPROCESS Offsets
118 //
119 #define KPROCESS_DIRECTORY_TABLE_BASE 0x18
120 #define KPROCESS_LDT_DESCRIPTOR0 0x20
121 #define KPROCESS_LDT_DESCRIPTOR1 0x24
122 #define KPROCESS_INT21_DESCRIPTOR0 0x28
123 #define KPROCESS_INT21_DESCRIPTOR1 0x2C
124 #define KPROCESS_IOPM_OFFSET 0x30
125 #define KPROCESS_ACTIVE_PROCESSORS 0x34
126 #define EPROCESS_VDM_OBJECTS 0x144
127 
128 //
129 // KTIMER_TABLE Offsets
130 //
131 #ifdef __ASM__
132 #define KTIMER_TABLE_ENTRY 0x00
133 #define KTIMER_TABLE_TIME 0x08
134 #define TIMER_ENTRY_SIZE 0x10
135 #define TIMER_TABLE_SIZE 0x200
136 #endif
137 
138 //
139 // KPRCB Offsets
140 //
141 #define KPRCB_DR0 0x2F8
142 #define KPRCB_DR1 0x2FC
143 #define KPRCB_DR2 0x300
144 #define KPRCB_DR3 0x304
145 #define KPRCB_DR6 0x308
146 #define KPRCB_DR7 0x30C
147 #define KPRCB_TIMER_HAND 0x964
148 #define KPRCB_TIMER_REQUEST 0x968
149 
150 //
151 // KPCR Offsets
152 //
153 #define KPCR_EXCEPTION_LIST 0x0
154 #define KPCR_INITIAL_STACK 0x4
155 #define KPCR_STACK_LIMIT 0x8
156 #define KPCR_PERF_GLOBAL_GROUP_MASK 0x8
157 #define KPCR_CONTEXT_SWITCHES 0x10
158 #define KPCR_SET_MEMBER_COPY 0x14
159 #define KPCR_TEB 0x18
160 #define KPCR_SELF 0x1C
161 #define KPCR_PRCB 0x20
162 #define KPCR_IRQL 0x24
163 #define KPCR_IRR 0x28
164 #define KPCR_IRR_ACTIVE 0x2C
165 #define KPCR_IDR 0x30
166 #define KPCR_KD_VERSION_BLOCK 0x34
167 #define KPCR_IDT 0x38
168 #define KPCR_GDT 0x3C
169 #define KPCR_TSS 0x40
170 #define KPCR_STALL_SCALE_FACTOR 0x4C
171 #define KPCR_SET_MEMBER 0x48
172 #define KPCR_NUMBER 0x51
173 #define KPCR_VDM_ALERT 0x54
174 #define KPCR_PRCB_DATA 0x120
175 #define KPCR_CURRENT_THREAD 0x124
176 #define KPCR_PRCB_NEXT_THREAD 0x128
177 #define KPCR_PRCB_IDLE_THREAD 0x12C
178 #define KPCR_PROCESSOR_NUMBER 0x130
179 #define KPCR_PRCB_SET_MEMBER 0x134
180 #define KPCR_PRCB_CPU_TYPE 0x138
181 #define KPCR_PRCB_PRCB_LOCK 0xA7C
182 #define KPCR_NPX_THREAD 0x640
183 #define KPCR_DR6 0x428
184 #define KPCR_DR7 0x42C
185 #define KPCR_PRCB_INTERRUPT_COUNT 0x644
186 #define KPCR_PRCB_KERNEL_TIME 0x648
187 #define KPCR_PRCB_USER_TIME 0x64C
188 #define KPCR_PRCB_DPC_TIME 0x650
189 #define KPCR_PRCB_DEBUG_DPC_TIME 0x654
190 #define KPCR_PRCB_INTERRUPT_TIME 0x658
191 #define KPCR_PRCB_ADJUST_DPC_THRESHOLD 0x65C
192 #define KPCR_PRCB_SKIP_TICK 0x664
193 #define KPCR_SYSTEM_CALLS 0x6B8
194 #define KPCR_PRCB_DPC_QUEUE_DEPTH 0xA4C
195 #define KPCR_PRCB_DPC_COUNT 0xA50
196 #define KPCR_PRCB_DPC_STACK 0xA68
197 #define KPCR_PRCB_MAXIMUM_DPC_QUEUE_DEPTH 0xA6C
198 #define KPCR_PRCB_DPC_REQUEST_RATE 0xA70
199 #define KPCR_PRCB_DPC_INTERRUPT_REQUESTED 0xA78
200 #define KPCR_PRCB_DPC_ROUTINE_ACTIVE 0xA7A
201 #define KPCR_PRCB_DPC_LAST_COUNT 0xA80
202 #define KPCR_PRCB_TIMER_REQUEST 0xA88
203 #define KPCR_PRCB_QUANTUM_END 0xAA1
204 #define KPCR_PRCB_IDLE_SCHEDULE 0xAA3
205 #define KPCR_PRCB_DEFERRED_READY_LIST_HEAD 0xC10
206 #define KPCR_PRCB_POWER_STATE_IDLE_FUNCTION 0xEC0
207 
208 //
209 // KINTERRUPT Offsets
210 //
211 #define KINTERRUPT_INTERRUPT_LIST_HEAD 0x04
212 #define KINTERRUPT_SERVICE_ROUTINE 0x0C
213 #define KINTERRUPT_SERVICE_CONTEXT 0x10
214 #define KINTERRUPT_TICK_COUNT 0x18
215 #define KINTERRUPT_ACTUAL_LOCK 0x1C
216 #define KINTERRUPT_DISPATCH_ADDRESS 0x20
217 #define KINTERRUPT_VECTOR 0x24
218 #define KINTERRUPT_IRQL 0x28
219 #define KINTERRUPT_SYNCHRONIZE_IRQL 0x29
220 #define KINTERRUPT_DISPATCH_COUNT 0x38
221 #define KINTERRUPT_DISPATCH_CODE 0x3C
222 
223 //
224 // KGDTENTRY Offsets
225 //
226 #define KGDT_BASE_LOW 0x2
227 #define KGDT_BASE_MID 0x4
228 #define KGDT_BASE_HI 0x7
229 #define KGDT_LIMIT_HI 0x6
230 #define KGDT_LIMIT_LOW 0x0
231 
232 //
233 // FPU Save Area Offsets
234 //
235 #define FP_CONTROL_WORD 0x0
236 #define FP_STATUS_WORD 0x4
237 #define FP_TAG_WORD 0x8
238 #define FP_ERROR_OFFSET 0xC
239 #define FP_ERROR_SELECTOR 0x10
240 #define FP_DATA_OFFSET 0x14
241 #define FP_DATA_SELECTOR 0x18
242 #define FN_CR0_NPX_STATE 0x20C
243 #define SIZEOF_FX_SAVE_AREA 528
244 #define NPX_FRAME_LENGTH 0x210
245 
246 //
247 // FX Save Area Offsets
248 //
249 #define FX_CONTROL_WORD 0x0
250 #define FX_STATUS_WORD 0x2
251 #define FX_TAG_WORD 0x4
252 #define FX_ERROR_OPCODE 0x6
253 #define FX_ERROR_OFFSET 0x8
254 #define FX_ERROR_SELECTOR 0xC
255 #define FX_DATA_OFFSET 0x10
256 #define FX_DATA_SELECTOR 0x14
257 #define FX_MXCSR 0x18
258 
259 //
260 // NPX States
261 //
262 #define NPX_STATE_NOT_LOADED 0xA
263 #define NPX_STATE_LOADED 0x0
264 
265 //
266 // Trap Frame Offsets
267 //
268 #define KTRAP_FRAME_DEBUGEBP 0x0
269 #define KTRAP_FRAME_DEBUGEIP 0x4
270 #define KTRAP_FRAME_DEBUGARGMARK 0x8
271 #define KTRAP_FRAME_DEBUGPOINTER 0xC
272 #define KTRAP_FRAME_TEMPCS 0x10
273 #define KTRAP_FRAME_TEMPESP 0x14
274 #define KTRAP_FRAME_DR0 0x18
275 #define KTRAP_FRAME_DR1 0x1C
276 #define KTRAP_FRAME_DR2 0x20
277 #define KTRAP_FRAME_DR3 0x24
278 #define KTRAP_FRAME_DR6 0x28
279 #define KTRAP_FRAME_DR7 0x2C
280 #define KTRAP_FRAME_GS 0x30
281 #define KTRAP_FRAME_RESERVED1 0x32
282 #define KTRAP_FRAME_ES 0x34
283 #define KTRAP_FRAME_RESERVED2 0x36
284 #define KTRAP_FRAME_DS 0x38
285 #define KTRAP_FRAME_RESERVED3 0x3A
286 #define KTRAP_FRAME_EDX 0x3C
287 #define KTRAP_FRAME_ECX 0x40
288 #define KTRAP_FRAME_EAX 0x44
289 #define KTRAP_FRAME_PREVIOUS_MODE 0x48
290 #define KTRAP_FRAME_EXCEPTION_LIST 0x4C
291 #define KTRAP_FRAME_FS 0x50
292 #define KTRAP_FRAME_RESERVED4 0x52
293 #define KTRAP_FRAME_EDI 0x54
294 #define KTRAP_FRAME_ESI 0x58
295 #define KTRAP_FRAME_EBX 0x5C
296 #define KTRAP_FRAME_EBP 0x60
297 #define KTRAP_FRAME_ERROR_CODE 0x64
298 #define KTRAP_FRAME_EIP 0x68
299 #define KTRAP_FRAME_CS 0x6C
300 #define KTRAP_FRAME_EFLAGS 0x70
301 #define KTRAP_FRAME_ESP 0x74
302 #define KTRAP_FRAME_SS 0x78
303 #define KTRAP_FRAME_RESERVED5 0x7A
304 #define KTRAP_FRAME_V86_ES 0x7C
305 #define KTRAP_FRAME_RESERVED6 0x7E
306 #define KTRAP_FRAME_V86_DS 0x80
307 #define KTRAP_FRAME_RESERVED7 0x82
308 #define KTRAP_FRAME_V86_FS 0x84
309 #define KTRAP_FRAME_RESERVED8 0x86
310 #define KTRAP_FRAME_V86_GS 0x88
311 #define KTRAP_FRAME_RESERVED9 0x8A
312 #define KTRAP_FRAME_SIZE 0x8C
313 #define KTRAP_FRAME_LENGTH 0x8C
314 #define KTRAP_FRAME_ALIGN 0x04
315 #define FRAME_EDITED 0xFFF8
316 
317 //
318 // USER_SHARED_DATA Offsets
319 //
320 #ifdef __ASM__
321 #define USER_SHARED_DATA 0xFFDF0000
322 #endif
323 #define USER_SHARED_DATA_INTERRUPT_TIME 0x8
324 #define USER_SHARED_DATA_SYSTEM_TIME 0x14
325 #define USER_SHARED_DATA_PROCESSOR_FEATURES 0x274
326 #define USER_SHARED_DATA_TICK_COUNT 0x320
327 
328 //
329 // KUSER_SHARED_DATA Offsets (this stuff is trash)
330 //
331 #define KERNEL_USER_SHARED_DATA 0x7FFE0000
332 #define KUSER_SHARED_PROCESSOR_FEATURES KERNEL_USER_SHARED_DATA + 0x274
333 #define KUSER_SHARED_SYSCALL KERNEL_USER_SHARED_DATA + 0x300
334 #define KUSER_SHARED_SYSCALL_RET KERNEL_USER_SHARED_DATA + 0x304
335 #define PROCESSOR_FEATURE_FXSR KUSER_SHARED_PROCESSOR_FEATURES + 0x4
336 
337 //
338 // CONTEXT Offsets
339 //
340 #define CONTEXT_FLAGS 0x0
341 #define CONTEXT_DR6 0x14
342 #define CONTEXT_FLOAT_SAVE 0x1C
343 #define CONTEXT_SEGGS 0x8C
344 #define CONTEXT_SEGFS 0x90
345 #define CONTEXT_SEGES 0x94
346 #define CONTEXT_SEGDS 0x98
347 #define CONTEXT_EDI 0x9C
348 #define CONTEXT_ESI 0xA0
349 #define CONTEXT_EBX 0xA4
350 #define CONTEXT_EDX 0xA8
351 #define CONTEXT_ECX 0xAC
352 #define CONTEXT_EAX 0xB0
353 #define CONTEXT_EBP 0xB4
354 #define CONTEXT_EIP 0xB8
355 #define CONTEXT_SEGCS 0xBC
356 #define CONTEXT_EFLAGS 0xC0
357 #define CONTEXT_ESP 0xC4
358 #define CONTEXT_SEGSS 0xC8
359 #define CONTEXT_FLOAT_SAVE_CONTROL_WORD CONTEXT_FLOAT_SAVE + FP_CONTROL_WORD
360 #define CONTEXT_FLOAT_SAVE_STATUS_WORD CONTEXT_FLOAT_SAVE + FP_STATUS_WORD
361 #define CONTEXT_FLOAT_SAVE_TAG_WORD CONTEXT_FLOAT_SAVE + FP_TAG_WORD
362 #define CONTEXT_ALIGNED_SIZE 0x2CC
363 #define CONTEXT_FRAME_LENGTH 0x2D0
364 
365 //
366 // CONTEXT Flags
367 //
368 #ifdef __ASM__
369 #define CONTEXT_CONTROL 0x10001
370 #define CONTEXT_INTEGER 0x10002
371 #define CONTEXT_SEGMENTS 0x10004
372 #define CONTEXT_FLOATING_POINT 0x10008
373 #define CONTEXT_DEBUG_REGISTERS 0x10010
374 #define CONTEXT_FULL 0x10007
375 #endif
376 
377 //
378 // EXCEPTION_RECORD Offsets
379 //
380 #define EXCEPTION_RECORD_EXCEPTION_CODE 0x0
381 #define EXCEPTION_RECORD_EXCEPTION_FLAGS 0x4
382 #define EXCEPTION_RECORD_EXCEPTION_RECORD 0x8
383 #define EXCEPTION_RECORD_EXCEPTION_ADDRESS 0xC
384 #define EXCEPTION_RECORD_NUMBER_PARAMETERS 0x10
385 #define SIZEOF_EXCEPTION_RECORD 0x14
386 #define EXCEPTION_RECORD_LENGTH 0x50
387 
388 //
389 // Exception types
390 //
391 #ifdef __ASM__
392 #define EXCEPTION_NONCONTINUABLE 0x0001
393 #define EXCEPTION_UNWINDING 0x0002
394 #define EXCEPTION_EXIT_UNWIND 0x0004
395 #define EXCEPTION_STACK_INVALID 0x0008
396 #define EXCEPTION_NESTED_CALL 0x00010
397 #define EXCEPTION_TARGET_UNWIND 0x00020
398 #define EXCEPTION_COLLIDED_UNWIND 0x00040
399 #define EXCEPTION_UNWIND 0x00066
400 #define EXCEPTION_EXECUTE_HANDLER 0x00001
401 #define EXCEPTION_CONTINUE_SEARCH 0x00000
402 #define EXCEPTION_CONTINUE_EXECUTION 0xFFFFFFFF
403 #define EXCEPTION_CHAIN_END 0xFFFFFFFF
404 #endif
405 
406 //
407 // TEB Offsets
408 //
409 #define TEB_EXCEPTION_LIST 0x0
410 #define TEB_STACK_BASE 0x4
411 #define TEB_STACK_LIMIT 0x8
412 #define TEB_FIBER_DATA 0x10
413 #define TEB_SELF 0x18
414 #define TEB_PEB 0x30
415 #define TEB_EXCEPTION_CODE 0x1A4
416 #define TEB_ACTIVATION_CONTEXT_STACK_POINTER 0x1A8
417 #define TEB_GL_TABLE 0xBE8
418 #define TEB_DEALLOCATION_STACK 0xE0C
419 #define TEB_GDI_BATCH_COUNT 0xF70
420 #define TEB_GUARANTEED_STACK_BYTES 0xF78
421 #define TEB_FLS_DATA 0xFB4
422 
423 //
424 // PEB Offsets
425 //
426 #define PEB_KERNEL_CALLBACK_TABLE 0x2C
427 
428 //
429 // FIBER Offsets
430 //
431 #define FIBER_PARAMETER 0x0
432 #define FIBER_EXCEPTION_LIST 0x4
433 #define FIBER_STACK_BASE 0x8
434 #define FIBER_STACK_LIMIT 0xC
435 #define FIBER_DEALLOCATION_STACK 0x10
436 #define FIBER_CONTEXT 0x14
437 #define FIBER_GUARANTEED_STACK_BYTES 0x2E0
438 #define FIBER_FLS_DATA 0x2E4
439 #define FIBER_ACTIVATION_CONTEXT_STACK 0x2E8
440 #define FIBER_CONTEXT_FLAGS FIBER_CONTEXT + CONTEXT_FLAGS
441 #define FIBER_CONTEXT_EAX FIBER_CONTEXT + CONTEXT_EAX
442 #define FIBER_CONTEXT_EBX FIBER_CONTEXT + CONTEXT_EBX
443 #define FIBER_CONTEXT_ECX FIBER_CONTEXT + CONTEXT_ECX
444 #define FIBER_CONTEXT_EDX FIBER_CONTEXT + CONTEXT_EDX
445 #define FIBER_CONTEXT_ESI FIBER_CONTEXT + CONTEXT_ESI
446 #define FIBER_CONTEXT_EDI FIBER_CONTEXT + CONTEXT_EDI
447 #define FIBER_CONTEXT_EBP FIBER_CONTEXT + CONTEXT_EBP
448 #define FIBER_CONTEXT_EIP FIBER_CONTEXT + CONTEXT_EIP
449 #define FIBER_CONTEXT_ESP FIBER_CONTEXT + CONTEXT_ESP
450 #define FIBER_CONTEXT_DR6 FIBER_CONTEXT + CONTEXT_DR6
451 #define FIBER_CONTEXT_FLOAT_SAVE_STATUS_WORD FIBER_CONTEXT + CONTEXT_FLOAT_SAVE_STATUS_WORD
452 #define FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD FIBER_CONTEXT + CONTEXT_FLOAT_SAVE_CONTROL_WORD
453 #define FIBER_CONTEXT_FLOAT_SAVE_TAG_WORD FIBER_CONTEXT + CONTEXT_FLOAT_SAVE_TAG_WORD
454 
455 //
456 // EFLAGS
457 //
458 #ifdef __ASM__
459 #define EFLAGS_TF 0x100
460 #define EFLAGS_INTERRUPT_MASK 0x200
461 #define EFLAGS_IOPL 0x3000
462 #define EFLAGS_NESTED_TASK 0x4000
463 #define EFLAGS_V86_MASK 0x20000
464 #define EFLAGS_ALIGN_CHECK 0x40000
465 #define EFLAGS_VIF 0x80000
466 #define EFLAGS_VIP 0x100000
467 #define EFLAG_SIGN 0x8000
468 #define EFLAG_ZERO 0x4000
469 #define EFLAGS_ID 0x200000
470 #define EFLAG_SELECT (EFLAG_SIGN + EFLAG_ZERO)
471 #endif
472 #define EFLAGS_USER_SANITIZE 0x3F4DD7
473 
474 //
475 // CR0
476 //
477 #define CR0_PE 0x1
478 #define CR0_MP 0x2
479 #define CR0_EM 0x4
480 #define CR0_TS 0x8
481 #define CR0_ET 0x10
482 #define CR0_NE 0x20
483 #define CR0_WP 0x10000
484 #define CR0_AM 0x40000
485 #define CR0_NW 0x20000000
486 #define CR0_CD 0x40000000
487 #define CR0_PG 0x80000000
488 
489 //
490 // CR4
491 //
492 #ifdef __ASM__
493 #define CR4_VME 0x1
494 #define CR4_PVI 0x2
495 #define CR4_TSD 0x4
496 #define CR4_DE 0x8
497 #define CR4_PSE 0x10
498 #define CR4_PAE 0x20
499 #define CR4_MCE 0x40
500 #define CR4_PGE 0x80
501 #define CR4_FXSR 0x200
502 #define CR4_XMMEXCPT 0x400
503 #endif
504 
505 //
506 // DR6 and 7 Masks
507 //
508 #define DR6_LEGAL 0xE00F
509 #define DR7_LEGAL 0xFFFF0155
510 #define DR7_ACTIVE 0x55
511 #define DR7_OVERRIDE_V 0x04
512 #define DR7_RESERVED_MASK 0xDC00
513 #define DR7_OVERRIDE_MASK 0xF0000
514 
515 //
516 // Usermode callout frame definitions
517 //
518 #define CBSTACK_STACK 0x0
519 #define CBSTACK_TRAP_FRAME 0x4
520 #define CBSTACK_CALLBACK_STACK 0x8
521 #define CBSTACK_EBP 0x18
522 #define CBSTACK_RESULT 0x20
523 #define CBSTACK_RESULT_LENGTH 0x24
524 
525 //
526 // NTSTATUS, Bugcheck Codes and Debug Codes
527 //
528 #ifdef __ASM__
529 #define STATUS_ACCESS_VIOLATION 0xC0000005
530 #define STATUS_IN_PAGE_ERROR 0xC0000006
531 #define STATUS_GUARD_PAGE_VIOLATION 0x80000001
532 #define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096
533 #define STATUS_STACK_OVERFLOW 0xC00000FD
534 #define KI_EXCEPTION_ACCESS_VIOLATION 0x10000004
535 #define STATUS_INVALID_SYSTEM_SERVICE 0xC000001C
536 #define STATUS_NO_CALLBACK_ACTIVE 0xC0000258
537 #define STATUS_CALLBACK_POP_STACK 0xC0000423
538 #define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C
539 #define STATUS_ILLEGAL_INSTRUCTION 0xC000001D
540 #define STATUS_INVALID_LOCK_SEQUENCE 0xC000001E
541 #define STATUS_BREAKPOINT 0x80000003
542 #define STATUS_SINGLE_STEP 0x80000004
543 #define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094
544 #define STATUS_INTEGER_OVERFLOW 0xC0000095
545 #define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D
546 #define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E
547 #define STATUS_FLOAT_INEXACT_RESULT 0xC000008F
548 #define STATUS_FLOAT_INVALID_OPERATION 0xC0000090
549 #define STATUS_FLOAT_OVERFLOW 0xC0000091
550 #define STATUS_FLOAT_STACK_CHECK 0xC0000092
551 #define STATUS_FLOAT_UNDERFLOW 0xC0000093
552 #define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4
553 #define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5
554 #define STATUS_ASSERTION_FAILURE 0xC0000420
555 #define APC_INDEX_MISMATCH 0x01
556 #define IRQL_NOT_GREATER_OR_EQUAL 0x09
557 #define IRQL_NOT_LESS_OR_EQUAL 0x0A
558 #define TRAP_CAUSE_UNKNOWN 0x12
559 #define KMODE_EXCEPTION_NOT_HANDLED 0x13
560 #define IRQL_GT_ZERO_AT_SYSTEM_SERVICE 0x4A
561 #define UNEXPECTED_KERNEL_MODE_TRAP 0x7F
562 #define ATTEMPTED_SWITCH_FROM_DPC 0xB8
563 #define HARDWARE_INTERRUPT_STORM 0xF2
564 #define DBG_STATUS_CONTROL_C 0x01
565 
566 //
567 // DebugService Control Types
568 //
569 #define BREAKPOINT_BREAK 0x0
570 
571 //
572 // IRQL Levels
573 //
574 #define PASSIVE_LEVEL 0x0
575 #define APC_LEVEL 0x1
576 #define DISPATCH_LEVEL 0x2
577 #define PROFILE_LEVEL 0x1B
578 #define CLOCK2_LEVEL 0x1C
579 #define IPI_LEVEL 0x1D
580 #define HIGH_LEVEL 0x1F
581 
582 //
583 // Synchronization-level IRQL
584 //
585 #ifndef CONFIG_SMP
586 #define SYNCH_LEVEL DISPATCH_LEVEL
587 #else
588 #if (NTDDI_VERSION < NTDDI_WS03)
589 #define SYNCH_LEVEL (IPI_LEVEL - 0x1)
590 #else
591 #define SYNCH_LEVEL (IPI_LEVEL - 0x2)
592 #endif
593 #endif
594 
595 //
596 // Quantum Decrements
597 //
598 #define CLOCK_QUANTUM_DECREMENT 0x3
599 #endif
600 
601 //
602 // System Call Table definitions
603 //
604 #define SERVICE_DESCRIPTOR_BASE 0x0000
605 #define SERVICE_DESCRIPTOR_COUNT 0x0004
606 #define SERVICE_DESCRIPTOR_LIMIT 0x0008
607 #define SERVICE_DESCRIPTOR_NUMBER 0x000C
608 #define SERVICE_DESCRIPTOR_LENGTH 0x0010
609 
610 //
611 // Exception codes
612 //
613 #define EXCEPTION_DIVIDED_BY_ZERO 0
614 #define EXCEPTION_DEBUG 1
615 #define EXCEPTION_NMI 2
616 #define EXCEPTION_INT3 3
617 #define EXCEPTION_BOUND_CHECK 5
618 #define EXCEPTION_INVALID_OPCODE 6
619 #define EXCEPTION_NPX_NOT_AVAILABLE 7
620 #define EXCEPTION_DOUBLE_FAULT 8
621 #define EXCEPTION_NPX_OVERRUN 9
622 #define EXCEPTION_INVALID_TSS 0x0A
623 #define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B
624 #define EXCEPTION_STACK_FAULT 0x0C
625 #define EXCEPTION_GP_FAULT 0x0D
626 #define EXCEPTION_RESERVED_TRAP 0x0F
627 #define EXCEPTION_NPX_ERROR 0x010
628 #define EXCEPTION_ALIGNMENT_CHECK 0x011
629 
630 //
631 // Hypervisor Enlightenment Definitions
632 //
633 #define HV_MMU_USE_HYPERCALL_FOR_ADDRESS_SWITCH 0x01
634 #define HV_MMU_USE_HYPERCALL_FOR_LOCAL_FLUSH 0x02
635 #define HV_MMU_USE_HYPERCALL_FOR_REMOTE_FLUSH 0x04
636 #define HV_APIC_ENLIGHTENED 0x10
637 #define HV_KE_USE_HYPERCALL_FOR_LONG_SPIN_WAIT 0x40
638 
639 //
640 // VDM State Pointer
641 //
642 #define FIXED_NTVDMSTATE_LINEAR_PC_AT 0x714
643 
644 //
645 // Machine types
646 //
647 #ifdef __ASM__
648 #define MACHINE_TYPE_ISA 0x0000
649 #define MACHINE_TYPE_EISA 0x0001
650 #define MACHINE_TYPE_MCA 0x0002
651 
652 //
653 // Kernel Feature Bits
654 //
655 #define KF_RDTSC 0x00000002
656 
657 //
658 // Kernel Stack Size
659 //
660 #define KERNEL_STACK_SIZE 0x3000
661 #endif
662 
663 //
664 // Generic Definitions
665 //
666 #define PRIMARY_VECTOR_BASE 0x30 // FIXME: HACK
667 #define MAXIMUM_IDTVECTOR 0xFF
668 #endif // !_ASM_X86_H