updates EFLAGS definitions
[reactos.git] / reactos / include / ndk / amd64 / ketypes.h
1 /*++ NDK Version: 0098
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4 Copyright (c) Timo Kreuzer. All rights reserved.
5
6 Header Name:
7
8 ketypes.h (AMD64)
9
10 Abstract:
11
12 amd64 Type definitions for the Kernel services.
13
14 Author:
15
16 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
17 Timo Kreuzer (timo.kreuzer@reactos.org) - Updated - 14-Aug-2008
18
19 --*/
20
21 #ifndef _AMD64_KETYPES_H
22 #define _AMD64_KETYPES_H
23
24 //
25 // Dependencies
26 //
27
28 //
29 // KPCR Access for non-IA64 builds
30 //
31 //#define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
32 //#define PCR ((volatile KPCR * const)K0IPCR)
33 #define PCR ((volatile KPCR * const)__readgsqword(FIELD_OFFSET(KPCR, Self)))
34 //#if defined(CONFIG_SMP) || defined(NT_BUILD)
35 //#undef KeGetPcr
36 //#define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
37 //#endif
38
39 //
40 // Machine Types
41 //
42 #define MACHINE_TYPE_ISA 0x0000
43 #define MACHINE_TYPE_EISA 0x0001
44 #define MACHINE_TYPE_MCA 0x0002
45
46 //
47 // X86 80386 Segment Types
48 //
49 #define I386_TASK_GATE 0x5
50 #define I386_TSS 0x9
51 #define I386_ACTIVE_TSS 0xB
52 #define I386_CALL_GATE 0xC
53 #define I386_INTERRUPT_GATE 0xE
54 #define I386_TRAP_GATE 0xF
55
56 //
57 // Selector Names
58 //
59 #define RPL_MASK 0x0003
60 #define MODE_MASK 0x0001
61 #define KGDT_64_R0_CODE 0x0010
62 #define KGDT_64_R0_SS 0x0018
63 #define KGDT_64_DATA 0x0028 // 2b
64 #define KGDT_64_R3_CODE 0x0030 // 33
65 #define KGDT_TSS 0x0040
66 #define KGDT_32_R3_TEB 0x0050 // 53
67
68 //
69 // CR4
70 //
71 #define CR4_VME 0x1
72 #define CR4_PVI 0x2
73 #define CR4_TSD 0x4
74 #define CR4_DE 0x8
75 #define CR4_PSE 0x10
76 #define CR4_PAE 0x20
77 #define CR4_MCE 0x40
78 #define CR4_PGE 0x80
79 #define CR4_FXSR 0x200
80 #define CR4_XMMEXCPT 0x400
81
82 //
83 // EFlags
84 //
85 #define EFLAGS_CF 0x01
86 #define EFLAGS_PF 0x04
87 #define EFLAGS_AF 0x10
88 #define EFLAGS_ZF 0x40
89 #define EFLAGS_SF 0x80
90 #define EFLAGS_TF 0x100
91 #define EFLAGS_INTERRUPT_MASK 0x200
92 #define EFLAGS_DF 0x400
93 #define EFLAGS_OF 0x800
94 #define EFLAGS_IOPL_MASK 0x3000
95 #define EFLAGS_NESTED_TASK 0x4000
96 #define EFLAGS_RF 0x10000
97 #define EFLAGS_VM 0x20000
98 #define EFLAGS_ALIGN_CHECK 0x40000
99 #define EFLAGS_VIF 0x80000
100 #define EFLAGS_VIP 0x100000
101 #define EFLAGS_ID 0x200000
102 #define EFLAGS_USER_SANITIZE 0x3F4DD7
103
104 //
105 // IPI Types
106 //
107 #define IPI_APC 1
108 #define IPI_DPC 2
109 #define IPI_FREEZE 4
110 #define IPI_PACKET_READY 8
111 #define IPI_SYNCH_REQUEST 16
112
113 //
114 // PRCB Flags
115 //
116 #define PRCB_MAJOR_VERSION 1
117 #define PRCB_BUILD_DEBUG 1
118 #define PRCB_BUILD_UNIPROCESSOR 2
119
120 //
121 // HAL Variables
122 //
123 #define INITIAL_STALL_COUNT 100
124
125 //
126 // IOPM Definitions
127 //
128 #define IO_ACCESS_MAP_NONE 0
129 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
130 #define KiComputeIopmOffset(MapNumber) \
131 (MapNumber == IO_ACCESS_MAP_NONE) ? \
132 (USHORT)(sizeof(KTSS)) : \
133 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
134
135 //
136 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
137 //
138 #define KSEG0_BASE 0xfffff80000000000ULL
139
140 //
141 // Synchronization-level IRQL
142 //
143 #ifndef CONFIG_SMP
144 #define SYNCH_LEVEL DISPATCH_LEVEL
145 #else
146 #define SYNCH_LEVEL (IPI_LEVEL - 2)
147 #endif
148
149 //
150 // Trap Frame Definition
151 //
152 typedef struct _KTRAP_FRAME
153 {
154 UINT64 P1Home;
155 UINT64 P2Home;
156 UINT64 P3Home;
157 UINT64 P4Home;
158 UINT64 P5;
159 CHAR PreviousMode;
160 UCHAR PreviousIrql;
161 UCHAR FaultIndicator;
162 UCHAR ExceptionActive;
163 ULONG MxCsr;
164 UINT64 Rax;
165 UINT64 Rcx;
166 UINT64 Rdx;
167 UINT64 R8;
168 UINT64 R9;
169 UINT64 R10;
170 UINT64 R11;
171 union
172 {
173 UINT64 GsBase;
174 UINT64 GsSwap;
175 };
176 M128A Xmm0;
177 M128A Xmm1;
178 M128A Xmm2;
179 M128A Xmm3;
180 M128A Xmm4;
181 M128A Xmm5;
182 union
183 {
184 UINT64 FaultAddress;
185 UINT64 ContextRecord;
186 UINT64 TimeStampCKCL;
187 };
188 UINT64 Dr0;
189 UINT64 Dr1;
190 UINT64 Dr2;
191 UINT64 Dr3;
192 UINT64 Dr6;
193 UINT64 Dr7;
194 union
195 {
196 struct
197 {
198 UINT64 DebugControl;
199 UINT64 LastBranchToRip;
200 UINT64 LastBranchFromRip;
201 UINT64 LastExceptionToRip;
202 UINT64 LastExceptionFromRip;
203 };
204 struct
205 {
206 UINT64 LastBranchControl;
207 ULONG LastBranchMSR;
208 };
209 };
210 USHORT SegDs;
211 USHORT SegEs;
212 USHORT SegFs;
213 USHORT SegGs;
214 UINT64 TrapFrame;
215 UINT64 Rbx;
216 UINT64 Rdi;
217 UINT64 Rsi;
218 UINT64 Rbp;
219 union
220 {
221 UINT64 ErrorCode;
222 UINT64 ExceptionFrame;
223 UINT64 TimeStampKlog;
224 };
225 UINT64 Rip;
226 USHORT SegCs;
227 UCHAR Fill0;
228 UCHAR Logging;
229 USHORT Fill1[2];
230 ULONG EFlags;
231 ULONG Fill2;
232 UINT64 Rsp;
233 USHORT SegSs;
234 USHORT Fill3;
235 LONG CodePatchCycle;
236 } KTRAP_FRAME, *PKTRAP_FRAME;
237
238 //
239 // Defines the Callback Stack Layout for User Mode Callbacks
240 //
241 typedef struct _KCALLOUT_FRAME
242 {
243 ULONG64 InitialStack;
244 ULONG64 TrapFrame;
245 ULONG64 CallbackStack;
246 ULONG64 Rdi;
247 ULONG64 Rsi;
248 ULONG64 Rbx;
249 ULONG64 Rbp;
250 ULONG64 ReturnAddress;
251 ULONG64 Result;
252 ULONG64 ResultLength;
253 } KCALLOUT_FRAME, *PKCALLOUT_FRAME;
254
255 //
256 // Dummy LDT_ENTRY
257 //
258 #ifndef _LDT_ENTRY_DEFINED
259 #define _LDT_ENTRY_DEFINED
260 typedef ULONG LDT_ENTRY;
261 #endif
262
263 //
264 // GDT Entry Definition
265 //
266 typedef union _KGDTENTRY64
267 {
268 struct
269 {
270 USHORT LimitLow;
271 USHORT BaseLow;
272 union
273 {
274 struct
275 {
276 UCHAR BaseMiddle;
277 UCHAR Flags1;
278 UCHAR Flags2;
279 UCHAR BaseHigh;
280 } Bytes;
281 struct
282 {
283 ULONG BaseMiddle:8;
284 ULONG Type:5;
285 ULONG Dpl:2;
286 ULONG Present:1;
287 ULONG LimitHigh:4;
288 ULONG System:1;
289 ULONG LongMode:1;
290 ULONG DefaultBig:1;
291 ULONG Granularity:1;
292 ULONG BaseHigh:8;
293 } Bits;
294 };
295 ULONG BaseUpper;
296 ULONG MustBeZero;
297 };
298 UINT64 Alignment;
299 } KGDTENTRY64, *PKGDTENTRY64;
300 #define KGDTENTRY KGDTENTRY64
301 #define PKGDTENTRY PKGDTENTRY64
302
303 //
304 // IDT Entry Access Definition
305 //
306 typedef struct _KIDT_ACCESS
307 {
308 union
309 {
310 struct
311 {
312 UCHAR Reserved;
313 UCHAR SegmentType:4;
314 UCHAR SystemSegmentFlag:1;
315 UCHAR Dpl:2;
316 UCHAR Present:1;
317 };
318 USHORT Value;
319 };
320 } KIDT_ACCESS, *PKIDT_ACCESS;
321
322 //
323 // IDT Entry Definition
324 //
325 typedef union _KIDTENTRY64
326 {
327 struct
328 {
329 USHORT OffsetLow;
330 USHORT Selector;
331 USHORT IstIndex:3;
332 USHORT Reserved0:5;
333 USHORT Type:5;
334 USHORT Dpl:2;
335 USHORT Present:1;
336 USHORT OffsetMiddle;
337 ULONG OffsetHigh;
338 ULONG Reserved1;
339 };
340 UINT64 Alignment;
341 } KIDTENTRY64, *PKIDTENTRY64;
342 #define KIDTENTRY KIDTENTRY64
343 #define PKIDTENTRY PKIDTENTRY64
344
345 typedef struct _KDESCRIPTOR
346 {
347 USHORT Pad[3];
348 USHORT Limit;
349 PVOID Base;
350 } KDESCRIPTOR, *PKDESCRIPTOR;
351
352 #ifndef NTOS_MODE_USER
353
354 //
355 // Special Registers Structure (outside of CONTEXT)
356 //
357 typedef struct _KSPECIAL_REGISTERS
358 {
359 UINT64 Cr0;
360 UINT64 Cr2;
361 UINT64 Cr3;
362 UINT64 Cr4;
363 UINT64 KernelDr0;
364 UINT64 KernelDr1;
365 UINT64 KernelDr2;
366 UINT64 KernelDr3;
367 UINT64 KernelDr6;
368 UINT64 KernelDr7;
369 struct _KDESCRIPTOR Gdtr;
370 struct _KDESCRIPTOR Idtr;
371 USHORT Tr;
372 USHORT Ldtr;
373 ULONG MxCsr;
374 UINT64 DebugControl;
375 UINT64 LastBranchToRip;
376 UINT64 LastBranchFromRip;
377 UINT64 LastExceptionToRip;
378 UINT64 LastExceptionFromRip;
379 UINT64 Cr8;
380 UINT64 MsrGsBase;
381 UINT64 MsrGsSwap;
382 UINT64 MsrStar;
383 UINT64 MsrLStar;
384 UINT64 MsrCStar;
385 UINT64 MsrSyscallMask;
386 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
387
388 //
389 // Processor State Data
390 //
391 typedef struct _KPROCESSOR_STATE
392 {
393 KSPECIAL_REGISTERS SpecialRegisters;
394 CONTEXT ContextFrame;
395 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
396
397 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
398 typedef struct _GENERAL_LOOKASIDE_POOL
399 {
400 union
401 {
402 SLIST_HEADER ListHead;
403 SINGLE_LIST_ENTRY SingleListHead;
404 };
405 USHORT Depth;
406 USHORT MaximumDepth;
407 ULONG TotalAllocates;
408 union
409 {
410 ULONG AllocateMisses;
411 ULONG AllocateHits;
412 };
413 union
414 {
415 ULONG TotalFrees;
416 ULONG FreeMisses;
417 };
418 ULONG FreeHits;
419 POOL_TYPE Type;
420 ULONG Tag;
421 ULONG Size;
422 union
423 {
424 PVOID AllocateEx;
425 PVOID Allocate;
426 };
427 union
428 {
429 PVOID FreeEx;
430 PVOID Free;
431 };
432 LIST_ENTRY ListEntry;
433 ULONG LastTotalAllocates;
434 union
435 {
436 ULONG LastAllocateMisses;
437 ULONG LastAllocateHits;
438 };
439 ULONG Future[2];
440 } GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
441 #else
442 #define GENERAL_LOOKASIDE_POOL PP_LOOKASIDE_LIST
443 #endif
444
445 typedef struct _KREQUEST_PACKET
446 {
447 PVOID CurrentPacket[3];
448 PVOID WorkerRoutine;
449 } KREQUEST_PACKET, *PKREQUEST_PACKET;
450
451 typedef struct _REQUEST_MAILBOX
452 {
453 INT64 RequestSummary;
454 KREQUEST_PACKET RequestPacket;
455 PVOID Virtual[7];
456 } REQUEST_MAILBOX, *PREQUEST_MAILBOX;
457
458 //
459 // Processor Region Control Block
460 //
461 #pragma pack(push,4)
462 typedef struct _KPRCB
463 {
464 ULONG MxCsr;
465 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
466 USHORT Number;
467 #else
468 UCHAR Number;
469 UCHAR NestingLevel;
470 #endif
471 UCHAR InterruptRequest;
472 UCHAR IdleHalt;
473 struct _KTHREAD *CurrentThread;
474 struct _KTHREAD *NextThread;
475 struct _KTHREAD *IdleThread;
476 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
477 UCHAR NestingLevel;
478 UCHAR Group;
479 UCHAR PrcbPad00[6];
480 #else
481 UINT64 UserRsp;
482 #endif
483 UINT64 RspBase;
484 UINT64 PrcbLock;
485 UINT64 SetMember;
486 KPROCESSOR_STATE ProcessorState;
487 CHAR CpuType;
488 CHAR CpuID;
489 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
490 union
491 {
492 USHORT CpuStep;
493 struct
494 {
495 UCHAR CpuStepping;
496 UCHAR CpuModel;
497 };
498 };
499 #else
500 USHORT CpuStep;
501 #endif
502 ULONG MHz;
503 UINT64 HalReserved[8];
504 USHORT MinorVersion;
505 USHORT MajorVersion;
506 UCHAR BuildType;
507 UCHAR CpuVendor;
508 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
509 UCHAR CoresPerPhysicalProcessor;
510 UCHAR LogicalProcessorsPerCore;
511 #else
512 UCHAR InitialApicId;
513 UCHAR LogicalProcessorsPerPhysicalProcessor;
514 #endif
515 ULONG ApicMask;
516 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
517 ULONG CFlushSize;
518 #else
519 UCHAR CFlushSize;
520 UCHAR PrcbPad0x[3];
521 #endif
522 PVOID AcpiReserved;
523 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
524 ULONG InitialApicId;
525 ULONG Stride;
526 UINT64 PrcbPad01[3];
527 #else
528 UINT64 PrcbPad00[4];
529 #endif
530 KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock]; // 2003: 33, vista:49
531 PP_LOOKASIDE_LIST PPLookasideList[16];
532 GENERAL_LOOKASIDE_POOL PPNPagedLookasideList[32];
533 GENERAL_LOOKASIDE_POOL PPPagedLookasideList[32];
534 UINT64 PacketBarrier;
535 SINGLE_LIST_ENTRY DeferredReadyListHead;
536 LONG MmPageFaultCount;
537 LONG MmCopyOnWriteCount;
538 LONG MmTransitionCount;
539 #if (NTDDI_VERSION < NTDDI_LONGHORN)
540 LONG MmCacheTransitionCount;
541 #endif
542 LONG MmDemandZeroCount;
543 LONG MmPageReadCount;
544 LONG MmPageReadIoCount;
545 #if (NTDDI_VERSION < NTDDI_LONGHORN)
546 LONG MmCacheReadCount;
547 LONG MmCacheIoCount;
548 #endif
549 LONG MmDirtyPagesWriteCount;
550 LONG MmDirtyWriteIoCount;
551 LONG MmMappedPagesWriteCount;
552 LONG MmMappedWriteIoCount;
553 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
554 ULONG KeSystemCalls;
555 ULONG KeContextSwitches;
556 ULONG CcFastReadNoWait;
557 ULONG CcFastReadWait;
558 ULONG CcFastReadNotPossible;
559 ULONG CcCopyReadNoWait;
560 ULONG CcCopyReadWait;
561 ULONG CcCopyReadNoWaitMiss;
562 LONG LookasideIrpFloat;
563 #else
564 LONG LookasideIrpFloat;
565 ULONG KeSystemCalls;
566 #endif
567 LONG IoReadOperationCount;
568 LONG IoWriteOperationCount;
569 LONG IoOtherOperationCount;
570 LARGE_INTEGER IoReadTransferCount;
571 LARGE_INTEGER IoWriteTransferCount;
572 LARGE_INTEGER IoOtherTransferCount;
573 #if (NTDDI_VERSION < NTDDI_LONGHORN)
574 ULONG KeContextSwitches;
575 UCHAR PrcbPad2[12];
576 #endif
577 UINT64 TargetSet;
578 ULONG IpiFrozen;
579 UCHAR PrcbPad3[116];
580 REQUEST_MAILBOX RequestMailbox[64];
581 UINT64 SenderSummary;
582 UCHAR PrcbPad4[120];
583 KDPC_DATA DpcData[2];
584 PVOID DpcStack;
585 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
586 PVOID SparePtr0;
587 #else
588 PVOID SavedRsp;
589 #endif
590 LONG MaximumDpcQueueDepth;
591 ULONG DpcRequestRate;
592 ULONG MinimumDpcRate;
593 UCHAR DpcInterruptRequested;
594 UCHAR DpcThreadRequested;
595 UCHAR DpcRoutineActive;
596 UCHAR DpcThreadActive;
597 UINT64 TimerHand;
598 UINT64 TimerRequest;
599 LONG TickOffset;
600 LONG MasterOffset;
601 ULONG DpcLastCount;
602 UCHAR ThreadDpcEnable;
603 UCHAR QuantumEnd;
604 UCHAR PrcbPad50;
605 UCHAR IdleSchedule;
606 LONG DpcSetEventRequest;
607 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
608 ULONG KeExceptionDispatchCount;
609 #else
610 LONG PrcbPad40;
611 PVOID DpcThread;
612 #endif
613 KEVENT DpcEvent;
614 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
615 PVOID PrcbPad51;
616 #endif
617 KDPC CallDpc;
618 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
619 LONG ClockKeepAlive;
620 UCHAR ClockCheckSlot;
621 UCHAR ClockPollCycle;
622 UCHAR PrcbPad6[2];
623 LONG DpcWatchdogPeriod;
624 LONG DpcWatchdogCount;
625 UINT64 PrcbPad70[2];
626 #else
627 UINT64 PrcbPad7[4];
628 #endif
629 LIST_ENTRY WaitListHead;
630 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
631 UINT64 WaitLock;
632 #endif
633 ULONG ReadySummary;
634 ULONG QueueIndex;
635 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
636 UINT64 PrcbPad71[12];
637 #endif
638 LIST_ENTRY DispatcherReadyListHead[32];
639 ULONG InterruptCount;
640 ULONG KernelTime;
641 ULONG UserTime;
642 ULONG DpcTime;
643 ULONG InterruptTime;
644 ULONG AdjustDpcThreshold;
645 UCHAR SkipTick;
646 UCHAR DebuggerSavedIRQL;
647 UCHAR PollSlot;
648 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
649 UCHAR PrcbPad80[5];
650 ULONG DpcTimeCount;
651 ULONG DpcTimeLimit;
652 ULONG PeriodicCount;
653 ULONG PeriodicBias;
654 UINT64 PrcbPad81[2];
655 #else
656 UCHAR PrcbPad8[13];
657 #endif
658 struct _KNODE *ParentNode;
659 UINT64 MultiThreadProcessorSet;
660 struct _KPRCB *MultiThreadSetMaster;
661 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
662 UINT64 StartCycles;
663 LONG MmSpinLockOrdering;
664 ULONG PageColor;
665 ULONG NodeColor;
666 ULONG NodeShiftedColor;
667 ULONG SecondaryColorMask;
668 #endif
669 LONG Sleeping;
670 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
671 UINT64 CycleTime;
672 ULONG CcFastMdlReadNoWait;
673 ULONG CcFastMdlReadWait;
674 ULONG CcFastMdlReadNotPossible;
675 ULONG CcMapDataNoWait;
676 ULONG CcMapDataWait;
677 ULONG CcPinMappedDataCount;
678 ULONG CcPinReadNoWait;
679 ULONG CcPinReadWait;
680 ULONG CcMdlReadNoWait;
681 ULONG CcMdlReadWait;
682 ULONG CcLazyWriteHotSpots;
683 ULONG CcLazyWriteIos;
684 ULONG CcLazyWritePages;
685 ULONG CcDataFlushes;
686 ULONG CcDataPages;
687 ULONG CcLostDelayedWrites;
688 ULONG CcFastReadResourceMiss;
689 ULONG CcCopyReadWaitMiss;
690 ULONG CcFastMdlReadResourceMiss;
691 ULONG CcMapDataNoWaitMiss;
692 ULONG CcMapDataWaitMiss;
693 ULONG CcPinReadNoWaitMiss;
694 ULONG CcPinReadWaitMiss;
695 ULONG CcMdlReadNoWaitMiss;
696 ULONG CcMdlReadWaitMiss;
697 ULONG CcReadAheadIos;
698 LONG MmCacheTransitionCount;
699 LONG MmCacheReadCount;
700 LONG MmCacheIoCount;
701 ULONG PrcbPad91[3];
702 PROCESSOR_POWER_STATE PowerState;
703 ULONG KeAlignmentFixupCount;
704 UCHAR VendorString[13];
705 UCHAR PrcbPad10[3];
706 ULONG FeatureBits;
707 LARGE_INTEGER UpdateSignature;
708 KDPC DpcWatchdogDpc;
709 KTIMER DpcWatchdogTimer;
710 CACHE_DESCRIPTOR Cache[5];
711 ULONG CacheCount;
712 ULONG CachedCommit;
713 ULONG CachedResidentAvailable;
714 PVOID HyperPte;
715 PVOID WheaInfo;
716 PVOID EtwSupport;
717 SLIST_HEADER InterruptObjectPool;
718 SLIST_HEADER HypercallPageList;
719 PVOID HypercallPageVirtual;
720 PVOID VirtualApicAssist;
721 UINT64* StatisticsPage;
722 PVOID RateControl;
723 UINT64 CacheProcessorMask[5];
724 UINT64 PackageProcessorSet;
725 UINT64 CoreProcessorSet;
726 #else
727 ULONG PrcbPad90[1];
728 ULONG DebugDpcTime;
729 ULONG PageColor;
730 ULONG NodeColor;
731 ULONG NodeShiftedColor;
732 ULONG SecondaryColorMask;
733 UCHAR PrcbPad9[12];
734 ULONG CcFastReadNoWait;
735 ULONG CcFastReadWait;
736 ULONG CcFastReadNotPossible;
737 ULONG CcCopyReadNoWait;
738 ULONG CcCopyReadWait;
739 ULONG CcCopyReadNoWaitMiss;
740 ULONG KeAlignmentFixupCount;
741 ULONG KeDcacheFlushCount;
742 ULONG KeExceptionDispatchCount;
743 ULONG KeFirstLevelTbFills;
744 ULONG KeFloatingEmulationCount;
745 ULONG KeIcacheFlushCount;
746 ULONG KeSecondLevelTbFills;
747 UCHAR VendorString[13];
748 UCHAR PrcbPad10[2];
749 ULONG FeatureBits;
750 LARGE_INTEGER UpdateSignature;
751 PROCESSOR_POWER_STATE PowerState;
752 CACHE_DESCRIPTOR Cache[5];
753 ULONG CacheCount;
754 #endif
755 }
756 KPRCB, *PKPRCB;
757
758 //
759 // Processor Control Region
760 //
761 typedef struct _KIPCR
762 {
763 union
764 {
765 NT_TIB NtTib;
766 struct
767 {
768 union _KGDTENTRY64 *GdtBase;
769 struct _KTSS64 *TssBase;
770 ULONG64 UserRsp;
771 struct _KPCR *Self;
772 struct _KPRCB *CurrentPrcb;
773 PKSPIN_LOCK_QUEUE LockArray;
774 PVOID Used_Self;
775 };
776 };
777 union _KIDTENTRY64 *IdtBase;
778 ULONG64 Unused[2];
779 KIRQL Irql;
780 UCHAR SecondLevelCacheAssociativity;
781 UCHAR ObsoleteNumber;
782 UCHAR Fill0;
783 ULONG Unused0[3];
784 USHORT MajorVersion;
785 USHORT MinorVersion;
786 ULONG StallScaleFactor;
787 PVOID Unused1[3];
788 ULONG KernelReserved[15];
789 ULONG SecondLevelCacheSize;
790 ULONG HalReserved[16];
791 ULONG Unused2;
792 ULONG Fill1;
793 PVOID KdVersionBlock; // 0x108
794 PVOID Unused3;
795 ULONG PcrAlign1[24];
796 ULONG Fill2[2]; // 0x178
797 KPRCB Prcb; // 0x180
798
799 // hack:
800 ULONG ContextSwitches;
801
802 } KIPCR, *PKIPCR;
803 #pragma pack(pop)
804
805 //
806 // TSS Definition
807 //
808 typedef struct _KiIoAccessMap
809 {
810 UCHAR DirectionMap[32];
811 UCHAR IoMap[8196];
812 } KIIO_ACCESS_MAP;
813
814
815 #pragma pack(push,4)
816 typedef struct _KTSS64
817 {
818 /* 000 */ ULONG Reserved0;
819 /* 004 */ UINT64 Rsp0;
820 /* 00c */ UINT64 Rsp1;
821 /* 014 */ UINT64 Rsp2;
822 /* 01c */ UINT64 Ist[8];
823 /* 05c */ UINT64 Reserved1;
824 /* 064 */ USHORT Reserved2;
825 /* 066 */ USHORT IoMapBase;
826 } KTSS64, *PKTSS64;
827 #pragma pack(pop)
828 #define KTSS KTSS64
829 #define PKTSS PKTSS64
830
831 //
832 // KEXCEPTION_FRAME
833 //
834 typedef struct _KEXCEPTION_FRAME
835 {
836 UINT64 P1Home;
837 UINT64 P2Home;
838 UINT64 P3Home;
839 UINT64 P4Home;
840 UINT64 P5;
841 UINT64 InitialStack;
842 M128A Xmm6;
843 M128A Xmm7;
844 M128A Xmm8;
845 M128A Xmm9;
846 M128A Xmm10;
847 M128A Xmm11;
848 M128A Xmm12;
849 M128A Xmm13;
850 M128A Xmm14;
851 M128A Xmm15;
852 UINT64 TrapFrame;
853 UINT64 CallbackStack;
854 UINT64 OutputBuffer;
855 UINT64 OutputLength;
856 UINT64 MxCsr;
857 UINT64 Rbp;
858 UINT64 Rbx;
859 UINT64 Rdi;
860 UINT64 Rsi;
861 UINT64 R12;
862 UINT64 R13;
863 UINT64 R14;
864 UINT64 R15;
865 UINT64 Return;
866 } KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
867
868 //
869 // Inline function to get current KPRCB
870 //
871 FORCEINLINE
872 struct _KPRCB *
873 KeGetCurrentPrcb(VOID)
874 {
875 return (struct _KPRCB *)__readgsqword(FIELD_OFFSET(KIPCR, CurrentPrcb));
876 }
877
878 #endif
879 #endif