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