- Add missing volatile statements to KPROCESS, KTHREAD, KPRCB and KDPC_DATA.
[reactos.git] / reactos / include / ndk / i386 / ketypes.h
1 /*++ NDK Version: 0098
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 ketypes.h (X86)
8
9 Abstract:
10
11 i386 Type definitions for the Kernel services.
12
13 Author:
14
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
16
17 --*/
18
19 #ifndef _I386_KETYPES_H
20 #define _I386_KETYPES_H
21
22 //
23 // Dependencies
24 //
25
26 //
27 // Machine Types
28 //
29 #define MACHINE_TYPE_ISA 0x0000
30 #define MACHINE_TYPE_EISA 0x0001
31 #define MACHINE_TYPE_MCA 0x0002
32
33 //
34 // X86 80386 Segment Types
35 //
36 #define I386_TASK_GATE 0x5
37 #define I386_TSS 0x9
38 #define I386_ACTIVE_TSS 0xB
39 #define I386_CALL_GATE 0xC
40 #define I386_INTERRUPT_GATE 0xE
41 #define I386_TRAP_GATE 0xF
42
43 //
44 // Selector Names
45 //
46 #define RPL_MASK 0x0003
47 #define MODE_MASK 0x0001
48 #define KGDT_R0_CODE 0x8
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_LDT 0x48
56 #define KGDT_DF_TSS 0x50
57 #define KGDT_NMI_TSS 0x58
58
59 //
60 // CR4
61 //
62 #define CR4_VME 0x1
63 #define CR4_PVI 0x2
64 #define CR4_TSD 0x4
65 #define CR4_DE 0x8
66 #define CR4_PSE 0x10
67 #define CR4_PAE 0x20
68 #define CR4_MCE 0x40
69 #define CR4_PGE 0x80
70 #define CR4_FXSR 0x200
71 #define CR4_XMMEXCPT 0x400
72
73 //
74 // EFlags
75 //
76 #define EFLAGS_CF 0x01L
77 #define EFLAGS_ZF 0x40L
78 #define EFLAGS_TF 0x100L
79 #define EFLAGS_INTERRUPT_MASK 0x200L
80 #define EFLAGS_DF 0x400L
81 #define EFLAGS_NESTED_TASK 0x4000L
82 #define EFLAGS_V86_MASK 0x20000
83 #define EFLAGS_ALIGN_CHECK 0x40000
84 #define EFLAGS_VIF 0x80000
85 #define EFLAGS_VIP 0x100000
86 #define EFLAGS_USER_SANITIZE 0x3F4DD7
87 #define EFLAG_SIGN 0x8000
88 #define EFLAG_ZERO 0x4000
89
90 //
91 // IPI Types
92 //
93 #define IPI_APC 1
94 #define IPI_DPC 2
95 #define IPI_FREEZE 4
96 #define IPI_PACKET_READY 8
97 #define IPI_SYNCH_REQUEST 16
98
99 //
100 // HAL Variables
101 //
102 #define INITIAL_STALL_COUNT 0x64
103
104 //
105 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
106 //
107 #define KSEG0_BASE 0x80000000
108
109 //
110 // Macro to get current KPRCB
111 //
112 #ifndef _REACTOS_ // fixme
113 #define KeGetCurrentPrcb() \
114 (PKPRCB)__readfsdword(KPCR_PRCB);
115 #endif
116
117 //
118 // Trap Frame Definition
119 //
120 typedef struct _KTRAP_FRAME
121 {
122 ULONG DbgEbp;
123 ULONG DbgEip;
124 ULONG DbgArgMark;
125 ULONG DbgArgPointer;
126 ULONG TempSegCs;
127 ULONG TempEsp;
128 ULONG Dr0;
129 ULONG Dr1;
130 ULONG Dr2;
131 ULONG Dr3;
132 ULONG Dr6;
133 ULONG Dr7;
134 ULONG SegGs;
135 ULONG SegEs;
136 ULONG SegDs;
137 ULONG Edx;
138 ULONG Ecx;
139 ULONG Eax;
140 ULONG PreviousPreviousMode;
141 struct _EXCEPTION_REGISTRATION_RECORD FAR *ExceptionList;
142 ULONG SegFs;
143 ULONG Edi;
144 ULONG Esi;
145 ULONG Ebx;
146 ULONG Ebp;
147 ULONG ErrCode;
148 ULONG Eip;
149 ULONG SegCs;
150 ULONG EFlags;
151 ULONG HardwareEsp;
152 ULONG HardwareSegSs;
153 ULONG V86Es;
154 ULONG V86Ds;
155 ULONG V86Fs;
156 ULONG V86Gs;
157 } KTRAP_FRAME, *PKTRAP_FRAME;
158
159 //
160 // LDT Entry Definition
161 //
162 #ifndef _LDT_ENTRY_DEFINED
163 #define _LDT_ENTRY_DEFINED
164 typedef struct _LDT_ENTRY
165 {
166 USHORT LimitLow;
167 USHORT BaseLow;
168 union
169 {
170 struct
171 {
172 UCHAR BaseMid;
173 UCHAR Flags1;
174 UCHAR Flags2;
175 UCHAR BaseHi;
176 } Bytes;
177 struct
178 {
179 ULONG BaseMid:8;
180 ULONG Type:5;
181 ULONG Dpl:2;
182 ULONG Pres:1;
183 ULONG LimitHi:4;
184 ULONG Sys:1;
185 ULONG Reserved_0:1;
186 ULONG Default_Big:1;
187 ULONG Granularity:1;
188 ULONG BaseHi:8;
189 } Bits;
190 } HighWord;
191 } LDT_ENTRY, *PLDT_ENTRY, *LPLDT_ENTRY;
192 #endif
193
194 //
195 // GDT Entry Definition
196 //
197 typedef struct _KGDTENTRY
198 {
199 USHORT LimitLow;
200 USHORT BaseLow;
201 union
202 {
203 struct
204 {
205 UCHAR BaseMid;
206 UCHAR Flags1;
207 UCHAR Flags2;
208 UCHAR BaseHi;
209 } Bytes;
210 struct
211 {
212 ULONG BaseMid:8;
213 ULONG Type:5;
214 ULONG Dpl:2;
215 ULONG Pres:1;
216 ULONG LimitHi:4;
217 ULONG Sys:1;
218 ULONG Reserved_0:1;
219 ULONG Default_Big:1;
220 ULONG Granularity:1;
221 ULONG BaseHi:8;
222 } Bits;
223 } HighWord;
224 } KGDTENTRY, *PKGDTENTRY;
225
226 //
227 // IDT Entry Access Definition
228 //
229 typedef struct _KIDT_ACCESS
230 {
231 union
232 {
233 struct
234 {
235 UCHAR Reserved;
236 UCHAR SegmentType:4;
237 UCHAR SystemSegmentFlag:1;
238 UCHAR Dpl:2;
239 UCHAR Present:1;
240 };
241 USHORT Value;
242 };
243 } KIDT_ACCESS, *PKIDT_ACCESS;
244
245 //
246 // IDT Entry Definition
247 //
248 typedef struct _KIDTENTRY
249 {
250 USHORT Offset;
251 USHORT Selector;
252 USHORT Access;
253 USHORT ExtendedOffset;
254 } KIDTENTRY, *PKIDTENTRY;
255
256 #include <pshpack2.h>
257 typedef struct _DESCRIPTOR
258 {
259 USHORT Limit;
260 ULONG Base;
261 USHORT Padding;
262 } KDESCRIPTOR, *PKDESCRIPTOR;
263 #include <poppack.h>
264
265 #ifndef NTOS_MODE_USER
266
267 //
268 // FN/FX (FPU) Save Area Structures
269 //
270 typedef struct _FNSAVE_FORMAT
271 {
272 ULONG ControlWord;
273 ULONG StatusWord;
274 ULONG TagWord;
275 ULONG ErrorOffset;
276 ULONG ErrorSelector;
277 ULONG DataOffset;
278 ULONG DataSelector;
279 UCHAR RegisterArea[80];
280 } FNSAVE_FORMAT, *PFNSAVE_FORMAT;
281
282 typedef struct _FXSAVE_FORMAT
283 {
284 USHORT ControlWord;
285 USHORT StatusWord;
286 USHORT TagWord;
287 USHORT ErrorOpcode;
288 ULONG ErrorOffset;
289 ULONG ErrorSelector;
290 ULONG DataOffset;
291 ULONG DataSelector;
292 ULONG MXCsr;
293 ULONG MXCsrMask;
294 UCHAR RegisterArea[128];
295 UCHAR Reserved3[128];
296 UCHAR Reserved4[224];
297 UCHAR Align16Byte[8];
298 } FXSAVE_FORMAT, *PFXSAVE_FORMAT;
299
300 typedef struct _FX_SAVE_AREA
301 {
302 union
303 {
304 FNSAVE_FORMAT FnArea;
305 FXSAVE_FORMAT FxArea;
306 } U;
307 ULONG NpxSavedCpu;
308 ULONG Cr0NpxState;
309 } FX_SAVE_AREA, *PFX_SAVE_AREA;
310
311 //
312 // Special Registers Structure (outside of CONTEXT)
313 //
314 typedef struct _KSPECIAL_REGISTERS
315 {
316 ULONG Cr0;
317 ULONG Cr2;
318 ULONG Cr3;
319 ULONG Cr4;
320 ULONG KernelDr0;
321 ULONG KernelDr1;
322 ULONG KernelDr2;
323 ULONG KernelDr3;
324 ULONG KernelDr6;
325 ULONG KernelDr7;
326 KDESCRIPTOR Gdtr;
327 KDESCRIPTOR Idtr;
328 USHORT Tr;
329 USHORT Ldtr;
330 ULONG Reserved[6];
331 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
332
333 //
334 // Processor State Data
335 //
336 #pragma pack(push,4)
337 typedef struct _KPROCESSOR_STATE
338 {
339 CONTEXT ContextFrame;
340 KSPECIAL_REGISTERS SpecialRegisters;
341 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
342
343 //
344 // Processor Region Control Block
345 //
346 typedef struct _KPRCB
347 {
348 USHORT MinorVersion;
349 USHORT MajorVersion;
350 struct _KTHREAD *CurrentThread;
351 struct _KTHREAD *NextThread;
352 struct _KTHREAD *IdleThread;
353 UCHAR Number;
354 UCHAR Reserved;
355 USHORT BuildType;
356 KAFFINITY SetMember;
357 UCHAR CpuType;
358 UCHAR CpuID;
359 USHORT CpuStep;
360 KPROCESSOR_STATE ProcessorState;
361 ULONG KernelReserved[16];
362 ULONG HalReserved[16];
363 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
364 ULONG CFlushSize;
365 UCHAR PrcbPad0[88];
366 #else
367 UCHAR PrcbPad0[92];
368 #endif
369 KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
370 struct _KTHREAD *NpxThread;
371 ULONG InterruptCount;
372 ULONG KernelTime;
373 ULONG UserTime;
374 ULONG DpcTime;
375 ULONG DebugDpcTime;
376 ULONG InterruptTime;
377 ULONG AdjustDpcThreshold;
378 ULONG PageColor;
379 UCHAR SkipTick;
380 UCHAR DebuggerSavedIRQL;
381 #if (NTDDI_VERSION >= NTDDI_WS03)
382 UCHAR NodeColor;
383 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
384 UCHAR PollSlot;
385 #else
386 UCHAR Spare1;
387 #endif
388 ULONG NodeShiftedColor;
389 #else
390 UCHAR Spare1[6];
391 #endif
392 struct _KNODE *ParentNode;
393 ULONG MultiThreadProcessorSet;
394 struct _KPRCB *MultiThreadSetMaster;
395 #if (NTDDI_VERSION >= NTDDI_WS03)
396 ULONG SecondaryColorMask;
397 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
398 ULONG DpcTimeLimit;
399 #else
400 LONG Sleeping;
401 #endif
402 #else
403 ULONG ThreadStartCount[2];
404 #endif
405 ULONG CcFastReadNoWait;
406 ULONG CcFastReadWait;
407 ULONG CcFastReadNotPossible;
408 ULONG CcCopyReadNoWait;
409 ULONG CcCopyReadWait;
410 ULONG CcCopyReadNoWaitMiss;
411 #if (NTDDI_VERSION < NTDDI_LONGHORN)
412 ULONG KeAlignmentFixupCount;
413 #endif
414 ULONG SpareCounter0;
415 #if (NTDDI_VERSION < NTDDI_LONGHORN)
416 ULONG KeDcacheFlushCount;
417 ULONG KeExceptionDispatchCount;
418 ULONG KeFirstLevelTbFills;
419 ULONG KeFloatingEmulationCount;
420 ULONG KeIcacheFlushCount;
421 ULONG KeSecondLevelTbFills;
422 ULONG KeSystemCalls;
423 #endif
424 volatile ULONG IoReadOperationCount;
425 volatile ULONG IoWriteOperationCount;
426 volatile ULONG IoOtherOperationCount;
427 LARGE_INTEGER IoReadTransferCount;
428 LARGE_INTEGER IoWriteTransferCount;
429 LARGE_INTEGER IoOtherTransferCount;
430 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
431 ULONG CcFastMdlReadNoWait;
432 ULONG CcFastMdlReadWait;
433 ULONG CcFastMdlReadNotPossible;
434 ULONG CcMapDataNoWait;
435 ULONG CcMapDataWait;
436 ULONG CcPinMappedDataCount;
437 ULONG CcPinReadNoWait;
438 ULONG CcPinReadWait;
439 ULONG CcMdlReadNoWait;
440 ULONG CcMdlReadWait;
441 ULONG CcLazyWriteHotSpots;
442 ULONG CcLazyWriteIos;
443 ULONG CcLazyWritePages;
444 ULONG CcDataFlushes;
445 ULONG CcDataPages;
446 ULONG CcLostDelayedWrites;
447 ULONG CcFastReadResourceMiss;
448 ULONG CcCopyReadWaitMiss;
449 ULONG CcFastMdlReadResourceMiss;
450 ULONG CcMapDataNoWaitMiss;
451 ULONG CcMapDataWaitMiss;
452 ULONG CcPinReadNoWaitMiss;
453 ULONG CcPinReadWaitMiss;
454 ULONG CcMdlReadNoWaitMiss;
455 ULONG CcMdlReadWaitMiss;
456 ULONG CcReadAheadIos;
457 ULONG KeAlignmentFixupCount;
458 ULONG KeExceptionDispatchCount;
459 ULONG KeSystemCalls;
460 ULONG PrcbPad1[3];
461 #else
462 ULONG SpareCounter1[8];
463 #endif
464 PP_LOOKASIDE_LIST PPLookasideList[16];
465 PP_LOOKASIDE_LIST PPNPagedLookasideList[32];
466 PP_LOOKASIDE_LIST PPPagedLookasideList[32];
467 volatile ULONG PacketBarrier;
468 volatile ULONG ReverseStall;
469 PVOID IpiFrame;
470 UCHAR PrcbPad2[52];
471 volatile PVOID CurrentPacket[3];
472 volatile ULONG TargetSet;
473 volatile PKIPI_WORKER WorkerRoutine;
474 volatile ULONG IpiFrozen;
475 UCHAR PrcbPad3[40];
476 volatile ULONG RequestSummary;
477 volatile struct _KPRCB *SignalDone;
478 UCHAR PrcbPad4[56];
479 struct _KDPC_DATA DpcData[2];
480 PVOID DpcStack;
481 ULONG MaximumDpcQueueDepth;
482 ULONG DpcRequestRate;
483 ULONG MinimumDpcRate;
484 volatile UCHAR DpcInterruptRequested;
485 volatile UCHAR DpcThreadRequested;
486 volatile UCHAR DpcRoutineActive;
487 volatile UCHAR DpcThreadActive;
488 ULONG PrcbLock;
489 ULONG DpcLastCount;
490 volatile ULONG TimerHand;
491 volatile ULONG TimerRequest;
492 PVOID DpcThread;
493 KEVENT DpcEvent;
494 UCHAR ThreadDpcEnable;
495 volatile BOOLEAN QuantumEnd;
496 UCHAR PrcbPad50;
497 volatile UCHAR IdleSchedule;
498 LONG DpcSetEventRequest;
499 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
500 LONG Sleeping;
501 ULONG PeriodicCount;
502 ULONG PeriodicBias;
503 UCHAR PrcbPad5[6];
504 #else
505 UCHAR PrcbPad5[18];
506 #endif
507 LONG TickOffset;
508 KDPC CallDpc;
509 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
510 LONG ClockKeepAlive;
511 UCHAR ClockCheckSlot;
512 UCHAR ClockPollCycle;
513 UCHAR PrcbPad6[2];
514 LONG DpcWatchdogPeriod;
515 LONG DpcWatchDogCount;
516 LONG ThreadWatchdogPeriod;
517 LONG ThreadWatchDogCount;
518 ULONG PrcbPad70[2];
519 #else
520 ULONG PrcbPad7[8];
521 #endif
522 LIST_ENTRY WaitListHead;
523 ULONG ReadySummary;
524 ULONG QueueIndex;
525 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
526 SINGLE_LIST_ENTRY DeferredReadyListHead;
527 ULONGLONG StartCycles;
528 ULONGLONG CycleTime;
529 ULONGLONG PrcbPad71[3];
530 LIST_ENTRY DispatcherReadyListHead[32];
531 #else
532 LIST_ENTRY DispatcherReadyListHead[32];
533 SINGLE_LIST_ENTRY DeferredReadyListHead;
534 ULONG PrcbPad72[11];
535 #endif
536 PVOID ChainedInterruptList;
537 LONG LookasideIrpFloat;
538 volatile LONG MmPageFaultCount;
539 volatile LONG MmCopyOnWriteCount;
540 volatile LONG MmTransitionCount;
541 volatile LONG MmCacheTransitionCount;
542 volatile LONG MmDemandZeroCount;
543 volatile LONG MmPageReadCount;
544 volatile LONG MmPageReadIoCount;
545 volatile LONG MmCacheReadCount;
546 volatile LONG MmCacheIoCount;
547 volatile LONG MmDirtyPagesWriteCount;
548 volatile LONG MmDirtyWriteIoCount;
549 volatile LONG MmMappedPagesWriteCount;
550 volatile LONG MmMappedWriteIoCount;
551 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
552 ULONG CachedCommit;
553 ULONG CachedResidentAvailable;
554 PVOID HyperPte;
555 UCHAR CpuVendor;
556 UCHAR PrcbPad9[3];
557 #else
558 ULONG SpareFields0[1];
559 #endif
560 CHAR VendorString[13];
561 UCHAR InitialApicId;
562 UCHAR LogicalProcessorsPerPhysicalProcessor;
563 ULONG MHz;
564 ULONG FeatureBits;
565 LARGE_INTEGER UpdateSignature;
566 volatile LARGE_INTEGER IsrTime;
567 LARGE_INTEGER SpareField1;
568 FX_SAVE_AREA NpxSaveArea;
569 PROCESSOR_POWER_STATE PowerState;
570 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
571 KDPC DpcWatchdogDoc;
572 KTIMER DpcWatchdogTimer;
573 PVOID WheaInfo;
574 PVOID EtwSupport;
575 SLIST_HEADER InterruptObjectPool;
576 LARGE_INTEGER HyperCallPagePhysical;
577 LARGE_INTEGER HyperCallPageVirtual;
578 PVOID RateControl;
579 CACHE_DESCRIPTOR Cache[5];
580 ULONG CacheCount;
581 ULONG CacheProcessorMask[5];
582 UCHAR LogicalProcessorsPerCore;
583 UCHAR PrcbPad8[3];
584 ULONG PackageProcessorSet;
585 ULONG CoreProcessorSet;
586 #endif
587 } KPRCB, *PKPRCB;
588
589 //
590 // Processor Control Region
591 //
592 typedef struct _KIPCR
593 {
594 union
595 {
596 NT_TIB NtTib;
597 struct
598 {
599 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
600 PVOID Used_StackBase;
601 PVOID PerfGlobalGroupMask;
602 PVOID TssCopy;
603 ULONG ContextSwitches;
604 KAFFINITY SetMemberCopy;
605 PVOID Used_Self;
606 };
607 };
608 struct _KPCR *Self;
609 struct _KPRCB *Prcb;
610 KIRQL Irql;
611 ULONG IRR;
612 ULONG IrrActive;
613 ULONG IDR;
614 PVOID KdVersionBlock;
615 PKIDTENTRY IDT;
616 #ifdef _REACTOS_
617 PUSHORT GDT;
618 #else
619 PKGDTENTRY GDT;
620 #endif
621 struct _KTSS *TSS;
622 USHORT MajorVersion;
623 USHORT MinorVersion;
624 KAFFINITY SetMember;
625 ULONG StallScaleFactor;
626 UCHAR SparedUnused;
627 UCHAR Number;
628 UCHAR Reserved;
629 UCHAR L2CacheAssociativity;
630 ULONG VdmAlert;
631 ULONG KernelReserved[14];
632 ULONG SecondLevelCacheSize;
633 ULONG HalReserved[16];
634 ULONG InterruptMode;
635 UCHAR Spare1;
636 ULONG KernelReserved2[17];
637 KPRCB PrcbData;
638 } KIPCR, *PKIPCR;
639 #pragma pack(pop)
640
641 //
642 // TSS Definition
643 //
644 typedef struct _KiIoAccessMap
645 {
646 UCHAR DirectionMap[32];
647 UCHAR IoMap[8196];
648 } KIIO_ACCESS_MAP;
649
650 #include <pshpack1.h>
651 typedef struct _KTSS
652 {
653 USHORT Backlink;
654 USHORT Reserved0;
655 ULONG Esp0;
656 USHORT Ss0;
657 USHORT Reserved1;
658 ULONG NotUsed1[4];
659 ULONG CR3;
660 ULONG Eip;
661 ULONG NotUsed2[9];
662 USHORT Es;
663 USHORT Reserved2;
664 USHORT Cs;
665 USHORT Reserved3;
666 USHORT Ss;
667 USHORT Reserved4;
668 USHORT Ds;
669 USHORT Reserved5;
670 USHORT Fs;
671 USHORT Reserved6;
672 USHORT Gs;
673 USHORT Reserved7;
674 USHORT LDT;
675 USHORT Reserved8;
676 USHORT Flags;
677 USHORT IoMapBase;
678 KIIO_ACCESS_MAP IoMaps[1];
679 UCHAR IntDirectionMap[32];
680 } KTSS, *PKTSS;
681 #include <poppack.h>
682
683 //
684 // i386 CPUs don't have exception frames
685 //
686 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
687 #endif
688 #endif