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