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