ReactOS 0.4.17-dev-599-ga318b62
cpu.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/ke/amd64/cpu.c
5 * PURPOSE: Routines for CPU-level support
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 * Timo Kreuzer (timo.kreuzer@reactos.org)
8 */
9
10/* INCLUDES *****************************************************************/
11
12#include <ntoskrnl.h>
13#include <x86x64/Cpuid.h>
14#include <x86x64/Msr.h>
15
16#define NDEBUG
17#include <debug.h>
18
19/* GLOBALS *******************************************************************/
20
21/* The Boot TSS */
23
24/* CPU Features and Flags */
32
33/* Flush data */
35
36/* CPU Signatures */
37typedef union _CPU_SIGNATURE
38{
39 struct
40 {
48 };
51
52/* FUNCTIONS *****************************************************************/
53
54VOID
57{
58 PKPRCB Prcb = KeGetCurrentPrcb();
59 CPU_INFO CpuInfo;
60 CPU_SIGNATURE CpuSignature;
61 BOOLEAN ExtendModel;
62 ULONG Stepping, Type, Vendor;
63
64 /* This initializes Prcb->CpuVendor */
67 Vendor = Prcb->CpuVendor;
68
69 /* Do CPUID 1 now */
70 KiCpuId(&CpuInfo, 1);
71
72 /*
73 * Get the Stepping and Type. The stepping contains both the
74 * Model and the Step, while the Type contains the returned Family.
75 *
76 * For the stepping, we convert this: zzzzzzxy into this: x0y
77 */
78 CpuSignature.AsULONG = CpuInfo.Eax;
79 Stepping = CpuSignature.Model;
80 ExtendModel = (CpuSignature.Family == 15);
81#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
82 if (CpuSignature.Family == 6)
83 {
84 ExtendModel |= (Vendor == CPU_INTEL);
85#if (NTDDI_VERSION >= NTDDI_WIN8)
86 ExtendModel |= (Vendor == CPU_CENTAUR);
87#endif
88 }
89#endif
90 if (ExtendModel)
91 {
92 /* Add ExtendedModel to distinguish from non-extended values. */
93 Stepping |= (CpuSignature.ExtendedModel << 4);
94 }
95 Stepping = (Stepping << 8) | CpuSignature.Step;
96 Type = CpuSignature.Family;
97 if (CpuSignature.Family == 15)
98 {
99 /* Add ExtendedFamily to distinguish from non-extended values.
100 * It must not be larger than 0xF0 to avoid overflow. */
101 Type += min(CpuSignature.ExtendedFamily, 0xF0);
102 }
103
104 /* Save them in the PRCB */
105 Prcb->CpuID = TRUE;
106 Prcb->CpuType = (UCHAR)Type;
107 Prcb->CpuStep = (USHORT)Stepping;
108}
109
124NTAPI
126{
127 PKPRCB Prcb = KeGetCurrentPrcb();
128 ULONG Vendor;
129 ULONG64 FeatureBits = 0;
132 CPUID_EXTENDED_FUNCTION_REGS extendedFunction;
133
134 /* Get the Vendor ID */
135 Vendor = Prcb->CpuVendor;
136
137 /* Make sure we got a valid vendor ID at least. */
138 if (Vendor == CPU_UNKNOWN) return FeatureBits;
139
140 /* Get signature CPUID for the maximum function */
142
143 /* Get the CPUID Info. */
145
146 /* Set the initial APIC ID */
147 Prcb->InitialApicId = (UCHAR)VersionInfo.Ebx.Bits.InitialLocalApicId;
148
149 /* Convert all CPUID Feature bits into our format */
150 if (VersionInfo.Edx.Bits.VME) FeatureBits |= KF_CR4;
151 if (VersionInfo.Edx.Bits.PSE) FeatureBits |= KF_LARGE_PAGE | KF_CR4;
152 if (VersionInfo.Edx.Bits.TSC) FeatureBits |= KF_RDTSC;
153 if (VersionInfo.Edx.Bits.CX8) FeatureBits |= KF_CMPXCHG8B;
154 if (VersionInfo.Edx.Bits.SEP) FeatureBits |= KF_FAST_SYSCALL;
155 if (VersionInfo.Edx.Bits.MTRR) FeatureBits |= KF_MTRR;
156 if (VersionInfo.Edx.Bits.PGE) FeatureBits |= KF_GLOBAL_PAGE | KF_CR4;
157 if (VersionInfo.Edx.Bits.CMOV) FeatureBits |= KF_CMOV;
158 if (VersionInfo.Edx.Bits.PAT) FeatureBits |= KF_PAT;
159 if (VersionInfo.Edx.Bits.DS) FeatureBits |= KF_DTS;
160 if (VersionInfo.Edx.Bits.MMX) FeatureBits |= KF_MMX;
161 if (VersionInfo.Edx.Bits.FXSR) FeatureBits |= KF_FXSR;
162 if (VersionInfo.Edx.Bits.SSE) FeatureBits |= KF_XMMI;
163 if (VersionInfo.Edx.Bits.SSE2) FeatureBits |= KF_XMMI64;
164
165 if (VersionInfo.Ecx.Bits.SSE3) FeatureBits |= KF_SSE3;
166 if (VersionInfo.Ecx.Bits.SSSE3) FeatureBits |= KF_SSSE3;
167 if (VersionInfo.Ecx.Bits.CMPXCHG16B) FeatureBits |= KF_CMPXCHG16B;
168 if (VersionInfo.Ecx.Bits.SSE4_1) FeatureBits |= KF_SSE4_1;
169 if (VersionInfo.Ecx.Bits.SSE4_2) FeatureBits |= KF_SSE4_2;
170 if (VersionInfo.Ecx.Bits.XSAVE) FeatureBits |= KF_XSTATE;
171 if (VersionInfo.Ecx.Bits.RDRAND) FeatureBits |= KF_RDRAND;
172 if (VersionInfo.Ecx.Bits.AVX) FeatureBits |= KF_AVX;
173
174 /* Check if the CPU has hyper-threading */
175 if (VersionInfo.Edx.Bits.HTT)
176 {
177 /* Set the number of logical CPUs */
179 VersionInfo.Ebx.Bits.MaximumAddressableIdsForLogicalProcessors;
181 {
182 /* We're on dual-core */
184 }
185 }
186 else
187 {
188 /* We only have a single CPU */
190 }
191
192 /* Check if CPUID_THERMAL_POWER_MANAGEMENT (0x06) is supported */
194 {
195 /* Read CPUID_THERMAL_POWER_MANAGEMENT */
198
199 if (PowerInfo.Undoc.Ecx.ACNT2) FeatureBits |= KF_ACNT2;
200 }
201
202 /* Check if CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS (0x07) is supported */
204 {
205 /* Read CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS */
207 __cpuidex(ExtFlags.AsInt32,
210
211 if (ExtFlags.Ebx.Bits.SMEP) FeatureBits |= KF_SMEP;
212 if (ExtFlags.Ebx.Bits.FSGSBASE) FeatureBits |= KF_RDWRFSGSBASE;
213 if (ExtFlags.Ebx.Bits.SMAP) FeatureBits |= KF_SMAP;
214 if (ExtFlags.Ebx.Bits.AVX2) FeatureBits |= KF_AVX2;
215 if (ExtFlags.Ebx.Bits.AVX512F) FeatureBits |= KF_AVX512F;
216 }
217
218 /* Check if CPUID_EXTENDED_STATE (0x0D) is supported */
219 if (signature.MaxLeaf >= CPUID_EXTENDED_STATE)
220 {
221 /* Read CPUID_EXTENDED_STATE */
223 __cpuidex(ExtStateSub.AsInt32,
226
227 if (ExtStateSub.Eax.Bits.XSAVEOPT) FeatureBits |= KF_XSAVEOPT;
228 if (ExtStateSub.Eax.Bits.XSAVES) FeatureBits |= KF_XSAVES;
229 }
230
231 /* Check extended cpuid features */
232 __cpuid(extendedFunction.AsInt32, CPUID_EXTENDED_FUNCTION);
233 if ((extendedFunction.MaxLeaf & 0xffffff00) == 0x80000000)
234 {
235 /* Check if CPUID_EXTENDED_CPU_SIG (0x80000001) is supported */
236 if (extendedFunction.MaxLeaf >= CPUID_EXTENDED_CPU_SIG)
237 {
238 /* Read CPUID_EXTENDED_CPU_SIG */
241
242 /* Check if NX-bit is supported */
243 if (ExtSig.Intel.Edx.Bits.NX) FeatureBits |= KF_NX_BIT;
244 if (ExtSig.Intel.Edx.Bits.Page1GB) FeatureBits |= KF_HUGEPAGE;
245 if (ExtSig.Intel.Edx.Bits.RDTSCP) FeatureBits |= KF_RDTSCP;
246
247 /* AMD specific */
248 if (Vendor == CPU_AMD)
249 {
250 if (ExtSig.Amd.Edx.Bits.ThreeDNow) FeatureBits |= KF_3DNOW;
251 }
252 }
253 }
254
255 /* Vendor specific */
256 if (Vendor == CPU_INTEL)
257 {
258 FeatureBits |= KF_GENUINE_INTEL;
259
260 /* Check for models that support LBR */
261 if (VersionInfo.Eax.Bits.FamilyId == 6)
262 {
263 if ((VersionInfo.Eax.Bits.Model == 15) ||
264 (VersionInfo.Eax.Bits.Model == 22) ||
265 (VersionInfo.Eax.Bits.Model == 23) ||
266 (VersionInfo.Eax.Bits.Model == 26))
267 {
268 FeatureBits |= KF_BRANCH;
269 }
270 }
271
272 /* Check if VMX is available */
273 if (VersionInfo.Ecx.Bits.VMX)
274 {
275 /* Read PROCBASED ctls and check if secondary are allowed */
278 if (ProcBasedCtls.Bits.Allowed1.ActivateSecondaryControls)
279 {
280 /* Read secondary controls and check if EPT is allowed */
283 if (ProcBasedCtls2.Bits.Allowed1.EPT)
284 FeatureBits |= KF_SLAT;
285 }
286 }
287 }
288 else if (Vendor == CPU_AMD)
289 {
290 FeatureBits |= KF_AUTHENTICAMD;
291 FeatureBits |= KF_BRANCH;
292
293 /* Check extended cpuid features */
294 if ((extendedFunction.MaxLeaf & 0xffffff00) == 0x80000000)
295 {
296 /* Check if CPUID_AMD_SVM_FEATURES (0x8000000A) is supported */
297 if (extendedFunction.MaxLeaf >= CPUID_AMD_SVM_FEATURES)
298 {
299 /* Read CPUID_AMD_SVM_FEATURES and check if Nested Paging is available */
300 CPUID_AMD_SVM_FEATURES_REGS SvmFeatures;
302 if (SvmFeatures.Edx.Bits.NP) FeatureBits |= KF_SLAT;
303 }
304 }
305 }
306
307 /* Return the Feature Bits */
308 return FeatureBits;
309}
310
311#if DBG
312VOID
313KiReportCpuFeatures(IN PKPRCB Prcb)
314{
315 ULONG64 FeatureBits = Prcb->FeatureBits | ((ULONG64)Prcb->FeatureBitsHigh << 32);
316 ULONG CpuFeatures = 0;
317 CPU_INFO CpuInfo;
318
319 if (Prcb->CpuVendor)
320 {
321 KiCpuId(&CpuInfo, 1);
322 CpuFeatures = CpuInfo.Edx;
323 }
324
325 DPRINT1("Supported CPU features:");
326
327#define print_kf_bit(kf_value) if (FeatureBits & kf_value) DbgPrint(" " #kf_value)
328 print_kf_bit(KF_SMEP);
329 print_kf_bit(KF_RDTSC);
330 print_kf_bit(KF_CR4);
331 print_kf_bit(KF_CMOV);
332 print_kf_bit(KF_GLOBAL_PAGE);
333 print_kf_bit(KF_LARGE_PAGE);
334 print_kf_bit(KF_MTRR);
335 print_kf_bit(KF_CMPXCHG8B);
336 print_kf_bit(KF_MMX);
337 print_kf_bit(KF_DTS);
338 print_kf_bit(KF_PAT);
339 print_kf_bit(KF_FXSR);
340 print_kf_bit(KF_FAST_SYSCALL);
341 print_kf_bit(KF_XMMI);
342 print_kf_bit(KF_3DNOW);
343 print_kf_bit(KF_XSAVEOPT);
344 print_kf_bit(KF_XMMI64);
345 print_kf_bit(KF_BRANCH);
346 print_kf_bit(KF_00040000);
347 print_kf_bit(KF_SSE3);
348 print_kf_bit(KF_CMPXCHG16B);
349 print_kf_bit(KF_AUTHENTICAMD);
350 print_kf_bit(KF_ACNT2);
351 print_kf_bit(KF_XSTATE);
352 print_kf_bit(KF_GENUINE_INTEL);
353 print_kf_bit(KF_SLAT);
354 print_kf_bit(KF_VIRT_FIRMWARE_ENABLED);
355 print_kf_bit(KF_RDWRFSGSBASE);
356 print_kf_bit(KF_NX_BIT);
357 print_kf_bit(KF_NX_DISABLED);
358 print_kf_bit(KF_NX_ENABLED);
359 print_kf_bit(KF_RDRAND);
360 print_kf_bit(KF_SMAP);
361 print_kf_bit(KF_RDTSCP);
362 print_kf_bit(KF_HUGEPAGE);
363 print_kf_bit(KF_XSAVES);
364 print_kf_bit(KF_FPU_LEAKAGE);
365 print_kf_bit(KF_CAT);
366 print_kf_bit(KF_CET_SS);
367 print_kf_bit(KF_SSSE3);
368 print_kf_bit(KF_SSE4_1);
369 print_kf_bit(KF_SSE4_2);
370 print_kf_bit(KF_AVX);
371 print_kf_bit(KF_AVX2);
372 print_kf_bit(KF_AVX512F);
373#undef print_kf_bit
374
375#define print_cf(cpu_flag) if (CpuFeatures & cpu_flag) DbgPrint(" " #cpu_flag)
376 print_cf(X86_FEATURE_PAE);
377 print_cf(X86_FEATURE_HT);
378#undef print_cf
379
380 DbgPrint("\n");
381}
382#endif // DBG
383
384VOID
385NTAPI
387{
388 PKIPCR Pcr = (PKIPCR)KeGetPcr();
389 ULONG CacheRequests = 0, i;
390 ULONG CurrentRegister;
391 UCHAR RegisterByte;
392 BOOLEAN FirstPass = TRUE;
393 CPU_INFO CpuInfo;
394
395 /* Set default L2 size */
396 Pcr->SecondLevelCacheSize = 0;
397
398 /* Check the Vendor ID */
399 switch (Pcr->Prcb.CpuVendor)
400 {
401 /* Handle Intel case */
402 case CPU_INTEL:
403
404 /*Check if we support CPUID 2 */
405 KiCpuId(&CpuInfo, 0);
406 if (CpuInfo.Eax >= 2)
407 {
408 /* We need to loop for the number of times CPUID will tell us to */
409 do
410 {
411 /* Do the CPUID call */
412 KiCpuId(&CpuInfo, 2);
413
414 /* Check if it was the first call */
415 if (FirstPass)
416 {
417 /*
418 * The number of times to loop is the first byte. Read
419 * it and then destroy it so we don't get confused.
420 */
421 CacheRequests = CpuInfo.Eax & 0xFF;
422 CpuInfo.Eax &= 0xFFFFFF00;
423
424 /* Don't go over this again */
425 FirstPass = FALSE;
426 }
427
428 /* Loop all 4 registers */
429 for (i = 0; i < 4; i++)
430 {
431 /* Get the current register */
432 CurrentRegister = CpuInfo.AsUINT32[i];
433
434 /*
435 * If the upper bit is set, then this register should
436 * be skipped.
437 */
438 if (CurrentRegister & 0x80000000) continue;
439
440 /* Keep looping for every byte inside this register */
441 while (CurrentRegister)
442 {
443 /* Read a byte, skip a byte. */
444 RegisterByte = (UCHAR)(CurrentRegister & 0xFF);
445 CurrentRegister >>= 8;
446 if (!RegisterByte) continue;
447
448 /*
449 * Valid values are from 0x40 (0 bytes) to 0x49
450 * (32MB), or from 0x80 to 0x89 (same size but
451 * 8-way associative.
452 */
453 if (((RegisterByte > 0x40) &&
454 (RegisterByte <= 0x49)) ||
455 ((RegisterByte > 0x80) &&
456 (RegisterByte <= 0x89)))
457 {
458 /* Mask out only the first nibble */
459 RegisterByte &= 0x0F;
460
461 /* Set the L2 Cache Size */
462 Pcr->SecondLevelCacheSize = 0x10000 <<
463 RegisterByte;
464 }
465 }
466 }
467 } while (--CacheRequests);
468 }
469 break;
470
471 case CPU_AMD:
472
473 /* Check if we support CPUID 0x80000006 */
474 KiCpuId(&CpuInfo, 0x80000000);
475 if (CpuInfo.Eax >= 6)
476 {
477 /* Get 2nd level cache and tlb size */
478 KiCpuId(&CpuInfo, 0x80000006);
479
480 /* Set the L2 Cache Size */
481 Pcr->SecondLevelCacheSize = (CpuInfo.Ecx & 0xFFFF0000) >> 6;
482 }
483 break;
484 }
485}
486
487VOID
488NTAPI
490{
491 /* Flush the TLB by resetting CR3 */
493}
494
495VOID
496NTAPI
498{
499 /* Restore the CR registers */
500 __writecr0(ProcessorState->SpecialRegisters.Cr0);
501// __writecr2(ProcessorState->SpecialRegisters.Cr2);
502 __writecr3(ProcessorState->SpecialRegisters.Cr3);
503 __writecr4(ProcessorState->SpecialRegisters.Cr4);
504 __writecr8(ProcessorState->SpecialRegisters.Cr8);
505
506 /* Restore the DR registers */
507 __writedr(0, ProcessorState->SpecialRegisters.KernelDr0);
508 __writedr(1, ProcessorState->SpecialRegisters.KernelDr1);
509 __writedr(2, ProcessorState->SpecialRegisters.KernelDr2);
510 __writedr(3, ProcessorState->SpecialRegisters.KernelDr3);
511 __writedr(6, ProcessorState->SpecialRegisters.KernelDr6);
512 __writedr(7, ProcessorState->SpecialRegisters.KernelDr7);
513
514 /* Restore GDT, IDT, LDT and TSS */
515 __lgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit);
516// __lldt(&ProcessorState->SpecialRegisters.Ldtr);
517// __ltr(&ProcessorState->SpecialRegisters.Tr);
518 __lidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
519
520 _mm_setcsr(ProcessorState->SpecialRegisters.MxCsr);
521// ProcessorState->SpecialRegisters.DebugControl
522// ProcessorState->SpecialRegisters.LastBranchToRip
523// ProcessorState->SpecialRegisters.LastBranchFromRip
524// ProcessorState->SpecialRegisters.LastExceptionToRip
525// ProcessorState->SpecialRegisters.LastExceptionFromRip
526
527 /* Restore MSRs */
534
535}
536
537VOID
538NTAPI
540{
541 /* Save the CR registers */
542 ProcessorState->SpecialRegisters.Cr0 = __readcr0();
543 ProcessorState->SpecialRegisters.Cr2 = __readcr2();
544 ProcessorState->SpecialRegisters.Cr3 = __readcr3();
545 ProcessorState->SpecialRegisters.Cr4 = __readcr4();
546 ProcessorState->SpecialRegisters.Cr8 = __readcr8();
547
548 /* Save the DR registers */
549 ProcessorState->SpecialRegisters.KernelDr0 = __readdr(0);
550 ProcessorState->SpecialRegisters.KernelDr1 = __readdr(1);
551 ProcessorState->SpecialRegisters.KernelDr2 = __readdr(2);
552 ProcessorState->SpecialRegisters.KernelDr3 = __readdr(3);
553 ProcessorState->SpecialRegisters.KernelDr6 = __readdr(6);
554 ProcessorState->SpecialRegisters.KernelDr7 = __readdr(7);
555
556 /* Save GDT, IDT, LDT and TSS */
557 __sgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit);
558 __sldt(&ProcessorState->SpecialRegisters.Ldtr);
559 __str(&ProcessorState->SpecialRegisters.Tr);
560 __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
561
562 ProcessorState->SpecialRegisters.MxCsr = _mm_getcsr();
563// ProcessorState->SpecialRegisters.DebugControl =
564// ProcessorState->SpecialRegisters.LastBranchToRip =
565// ProcessorState->SpecialRegisters.LastBranchFromRip =
566// ProcessorState->SpecialRegisters.LastExceptionToRip =
567// ProcessorState->SpecialRegisters.LastExceptionFromRip =
568
569 /* Save MSRs */
570 ProcessorState->SpecialRegisters.MsrGsBase = __readmsr(X86_MSR_GSBASE);
571 ProcessorState->SpecialRegisters.MsrGsSwap = __readmsr(X86_MSR_KERNEL_GSBASE);
572 ProcessorState->SpecialRegisters.MsrStar = __readmsr(X86_MSR_STAR);
573 ProcessorState->SpecialRegisters.MsrLStar = __readmsr(X86_MSR_LSTAR);
574 ProcessorState->SpecialRegisters.MsrCStar = __readmsr(X86_MSR_CSTAR);
575 ProcessorState->SpecialRegisters.MsrSyscallMask = __readmsr(X86_MSR_SFMASK);
576}
577
578VOID
579NTAPI
581 _In_ PKTRAP_FRAME TrapFrame,
582 _In_ PKEXCEPTION_FRAME ExceptionFrame)
583{
584 PKPRCB Prcb = KeGetCurrentPrcb();
585
586 /* Save all context */
588 KeTrapFrameToContext(TrapFrame, ExceptionFrame, &Prcb->ProcessorState.ContextFrame);
589
590 /* Save control registers */
592}
593
594VOID
595NTAPI
597 _Out_ PKTRAP_FRAME TrapFrame,
598 _Out_ PKEXCEPTION_FRAME ExceptionFrame)
599{
600 PKPRCB Prcb = KeGetCurrentPrcb();
601
602 /* Restore all context */
604 ExceptionFrame,
605 TrapFrame,
607 TrapFrame->PreviousMode);
608
609 /* Restore control registers */
611}
612
613VOID
614NTAPI
616 IN BOOLEAN AllProcessors)
617{
619
620 // FIXME: halfplemented
621 /* Raise the IRQL for the TB Flush */
623
624 /* Flush the TB for the Current CPU, and update the flush stamp */
626
627 /* Update the flush stamp and return to original IRQL */
630
631}
632
634NTAPI
636{
637 UNREFERENCED_PARAMETER(FloatingState);
638 return STATUS_SUCCESS;
639}
640
642NTAPI
644{
645 UNREFERENCED_PARAMETER(FloatingState);
646 return STATUS_SUCCESS;
647}
648
650NTAPI
652{
653 /* Invalidate all caches */
654 __wbinvd();
655 return TRUE;
656}
657
658/*
659 * @implemented
660 */
661ULONG
662NTAPI
664{
665 /* Return the global variable */
666 return KeLargestCacheLine;
667}
668
669/*
670 * @implemented
671 */
672VOID
675{
676 /* Capture the context */
677 RtlCaptureContext(&State->ContextFrame);
678
679 /* Capture the control state */
681}
682
683/*
684 * @implemented
685 */
686VOID
687NTAPI
689{
690 /* Save the coherency globally */
691 KiDmaIoCoherency = Coherency;
692}
#define MSR_IA32_VMX_PROCBASED_CTLS
#define MSR_IA32_VMX_PROCBASED_CTLS2
#define CPUID_AMD_SVM_FEATURES
Definition: Cpuid.h:160
#define CPUID_EXTENDED_FUNCTION
Definition: Cpuid.h:3802
#define CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS
Definition: Cpuid.h:1301
#define CPUID_SIGNATURE
Definition: Cpuid.h:45
#define CPUID_VERSION_INFO
Definition: Cpuid.h:81
#define CPUID_EXTENDED_STATE
Definition: Cpuid.h:1948
#define CPUID_THERMAL_POWER_MANAGEMENT
Definition: Cpuid.h:1114
#define CPUID_EXTENDED_STATE_SUB_LEAF
Definition: Cpuid.h:2063
#define CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO
Definition: Cpuid.h:1306
#define CPUID_EXTENDED_CPU_SIG
Definition: Cpuid.h:3825
Type
Definition: Type.h:7
unsigned char BOOLEAN
Definition: actypes.h:127
@ Invalid
Definition: asmpp.cpp:30
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
OSVERSIONINFOW VersionInfo
Definition: wkssvc.c:40
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define __cdecl
Definition: corecrt.h:121
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
KIRQL NTAPI KeRaiseIrqlToSynchLevel(VOID)
Definition: pic.c:156
#define DbgPrint
Definition: hal.h:12
#define InterlockedExchangeAdd
Definition: interlocked.h:196
PPC_QUAL void __writemsr(const unsigned long Value)
Definition: intrin_ppc.h:748
PPC_QUAL void __cpuid(int CPUInfo[], const int InfoType)
Definition: intrin_ppc.h:682
PPC_QUAL unsigned long long __readmsr()
Definition: intrin_ppc.h:741
PPC_QUAL void __wbinvd(void)
Definition: intrin_ppc.h:759
__INTRIN_INLINE unsigned long __readcr3(void)
Definition: intrin_x86.h:1850
__INTRIN_INLINE void __lidt(void *Source)
Definition: intrin_x86.h:2059
__INTRIN_INLINE void __cpuidex(int CPUInfo[4], int InfoType, int ECXValue)
Definition: intrin_x86.h:1680
__INTRIN_INLINE unsigned int __readdr(unsigned int reg)
Definition: intrin_x86.h:1934
__INTRIN_INLINE unsigned long __readcr4(void)
Definition: intrin_x86.h:1857
__INTRIN_INLINE unsigned long __readcr0(void)
Definition: intrin_x86.h:1836
__INTRIN_INLINE void __writecr3(unsigned int Data)
Definition: intrin_x86.h:1826
__INTRIN_INLINE unsigned long __readcr2(void)
Definition: intrin_x86.h:1843
__INTRIN_INLINE void __writecr0(unsigned int Data)
Definition: intrin_x86.h:1821
__INTRIN_INLINE void __sidt(void *Destination)
Definition: intrin_x86.h:2064
__INTRIN_INLINE void __writecr4(unsigned int Data)
Definition: intrin_x86.h:1831
__INTRIN_INLINE void __writedr(unsigned reg, unsigned int value)
Definition: intrin_x86.h:1967
if(dx< 0)
Definition: linetemp.h:194
unsigned __int64 ULONG64
Definition: imports.h:198
#define min(a, b)
Definition: monoChain.cc:55
#define KF_SSE4_2
Definition: ketypes.h:74
#define KF_SMEP
Definition: ketypes.h:31
#define KF_FPU_LEAKAGE
Definition: ketypes.h:69
#define KF_SSSE3
Definition: ketypes.h:72
#define KF_MTRR
Definition: ketypes.h:37
#define KF_HUGEPAGE
Definition: ketypes.h:67
#define KF_XSTATE
Definition: ketypes.h:55
#define KF_DTS
Definition: ketypes.h:40
#define KF_VIRT_FIRMWARE_ENABLED
Definition: ketypes.h:59
#define KF_CMPXCHG16B
Definition: ketypes.h:52
#define KF_CET_SS
Definition: ketypes.h:71
#define KF_NX_DISABLED
Definition: ketypes.h:62
#define KF_CR4
Definition: ketypes.h:33
#define KF_AUTHENTICAMD
Definition: ketypes.h:53
#define KF_XMMI64
Definition: ketypes.h:48
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
Definition: ketypes.h:1193
#define KF_CMOV
Definition: ketypes.h:34
#define KF_ACNT2
Definition: ketypes.h:54
#define KF_SSE4_1
Definition: ketypes.h:73
#define KF_RDWRFSGSBASE
Definition: ketypes.h:60
#define KF_00040000
Definition: ketypes.h:50
#define KF_CMPXCHG8B
Definition: ketypes.h:38
#define KF_NX_ENABLED
Definition: ketypes.h:63
#define KF_RDTSC
Definition: ketypes.h:32
#define KF_FAST_SYSCALL
Definition: ketypes.h:43
#define KF_3DNOW
Definition: ketypes.h:45
struct _KIPCR * PKIPCR
#define KF_NX_BIT
Definition: ketypes.h:61
#define KF_FXSR
Definition: ketypes.h:42
#define KF_RDRAND
Definition: ketypes.h:64
#define KF_CAT
Definition: ketypes.h:70
@ CPU_INTEL
Definition: ketypes.h:100
@ CPU_UNKNOWN
Definition: ketypes.h:98
@ CPU_AMD
Definition: ketypes.h:99
#define KF_XSAVES
Definition: ketypes.h:68
#define KF_LARGE_PAGE
Definition: ketypes.h:36
#define KF_BRANCH
Definition: ketypes.h:49
#define KF_AVX
Definition: ketypes.h:77
#define KF_GENUINE_INTEL
Definition: ketypes.h:56
#define KF_XMMI
Definition: ketypes.h:44
#define KF_MMX
Definition: ketypes.h:39
#define KF_XSAVEOPT
Definition: ketypes.h:47
#define KF_SSE3
Definition: ketypes.h:51
#define KF_SLAT
Definition: ketypes.h:58
#define KF_PAT
Definition: ketypes.h:41
#define KF_AVX2
Definition: ketypes.h:78
#define KF_RDTSCP
Definition: ketypes.h:66
#define KF_GLOBAL_PAGE
Definition: ketypes.h:35
#define KF_SMAP
Definition: ketypes.h:65
#define KF_AVX512F
Definition: ketypes.h:79
#define KeGetPcr()
Definition: ketypes.h:81
@ CPU_CENTAUR
Definition: ketypes.h:95
NTSYSAPI VOID NTAPI RtlCaptureContext(_Out_ PCONTEXT ContextRecord)
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define X86_MSR_CSTAR
Definition: ke.h:75
#define X86_FEATURE_HT
Definition: ke.h:47
#define X86_MSR_GSBASE
Definition: ke.h:70
#define X86_MSR_LSTAR
Definition: ke.h:74
#define X86_FEATURE_PAE
Definition: ke.h:35
#define X86_MSR_SFMASK
Definition: ke.h:76
#define X86_MSR_KERNEL_GSBASE
Definition: ke.h:71
#define X86_MSR_STAR
Definition: ke.h:73
VOID NTAPI KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN OUT PCONTEXT Context)
Definition: context.c:169
VOID NTAPI KeContextToTrapFrame(PCONTEXT Context, PKEXCEPTION_FRAME ExeptionFrame, PKTRAP_FRAME TrapFrame, ULONG ContextFlags, KPROCESSOR_MODE PreviousMode)
VOID NTAPI KiGetCpuVendorString(_Out_writes_z_(CPU_VENDOR_STR_LEN) CHAR VendorString[CPU_VENDOR_STR_LEN])
Get the CPUID information for a given CPU.
Definition: cpuinfo.c:24
CPU_VENDORS NTAPI KiIdentifyCpuVendor(_In_reads_z_(CPU_VENDOR_STR_LEN) const CHAR VendorString[CPU_VENDOR_STR_LEN])
Identify the CPU vendor by the vendor string.
Definition: cpuinfo.c:55
ULONG NTAPI KeGetRecommendedSharedDataAlignment(VOID)
Definition: cpu.c:663
VOID NTAPI KiRestoreProcessorControlState(PKPROCESSOR_STATE ProcessorState)
Definition: cpu.c:497
ULONG KeI386NpxPresent
Definition: cpu.c:28
VOID NTAPI KeFlushCurrentTb(VOID)
Definition: cpu.c:489
VOID NTAPI KiSetProcessorType(VOID)
Definition: cpu.c:56
ULONG KeI386MachineType
Definition: cpu.c:27
VOID NTAPI KeFlushEntireTb(IN BOOLEAN Invalid, IN BOOLEAN AllProcessors)
Definition: cpu.c:615
ULONG KeLargestCacheLine
Definition: cpu.c:29
VOID __cdecl KeSaveStateForHibernate(IN PKPROCESSOR_STATE State)
Definition: cpu.c:674
BOOLEAN KiSMTProcessorsPresent
Definition: cpu.c:31
ULONG64 NTAPI KiGetFeatureBits(VOID)
Evaluates the KeFeatureFlag bits for the current CPU.
Definition: cpu.c:125
BOOLEAN NTAPI KeInvalidateAllCaches(VOID)
Definition: cpu.c:651
NTSTATUS NTAPI KxRestoreFloatingPointState(IN PKFLOATING_SAVE FloatingState)
Definition: cpu.c:643
volatile LONG KiTbFlushTimeStamp
Definition: cpu.c:34
VOID NTAPI KiSaveProcessorState(_In_ PKTRAP_FRAME TrapFrame, _In_ PKEXCEPTION_FRAME ExceptionFrame)
Definition: cpu.c:580
VOID NTAPI KeSetDmaIoCoherency(IN ULONG Coherency)
Definition: cpu.c:688
KTSS64 KiBootTss
Definition: cpu.c:22
ULONG KeI386CpuType
Definition: cpu.c:25
NTSTATUS NTAPI KxSaveFloatingPointState(OUT PKFLOATING_SAVE FloatingState)
Definition: cpu.c:635
VOID NTAPI KiSaveProcessorControlState(OUT PKPROCESSOR_STATE ProcessorState)
Definition: cpu.c:539
VOID NTAPI KiRestoreProcessorState(_Out_ PKTRAP_FRAME TrapFrame, _Out_ PKEXCEPTION_FRAME ExceptionFrame)
Definition: cpu.c:596
ULONG KiDmaIoCoherency
Definition: cpu.c:30
VOID NTAPI KiGetCacheInformation(VOID)
Definition: cpu.c:386
union _CPU_SIGNATURE CPU_SIGNATURE
ULONG KeI386CpuStep
Definition: cpu.c:26
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
#define CONTEXT_ALL
#define STATUS_SUCCESS
Definition: shellext.h:65
ULONG ContextFlags
Definition: nt_native.h:1429
USHORT Limit
Definition: ketypes.h:449
KPRCB Prcb
Definition: ketypes.h:999
ULONG SecondLevelCacheSize
Definition: ketypes.h:991
CHAR CpuType
Definition: ketypes.h:684
USHORT CpuStep
Definition: ketypes.h:689
CHAR CpuID
Definition: ketypes.h:685
UCHAR CpuVendor
Definition: ketypes.h:704
UCHAR VendorString[13]
Definition: ketypes.h:901
UCHAR LogicalProcessorsPerPhysicalProcessor
Definition: ketypes.h:759
ULONG InitialApicId
Definition: ketypes.h:721
KPROCESSOR_STATE ProcessorState
Definition: ketypes.h:683
KSPECIAL_REGISTERS SpecialRegisters
Definition: ketypes.h:635
CONTEXT ContextFrame
Definition: ketypes.h:636
ULONG64 KernelDr1
Definition: ketypes.h:606
ULONG64 MsrLStar
Definition: ketypes.h:625
ULONG64 KernelDr2
Definition: ketypes.h:607
ULONG64 KernelDr0
Definition: ketypes.h:605
KDESCRIPTOR Gdtr
Definition: ketypes.h:611
ULONG64 MsrGsBase
Definition: ketypes.h:622
KDESCRIPTOR Idtr
Definition: ketypes.h:612
ULONG64 MsrCStar
Definition: ketypes.h:626
ULONG64 KernelDr7
Definition: ketypes.h:610
ULONG64 KernelDr6
Definition: ketypes.h:609
ULONG64 MsrSyscallMask
Definition: ketypes.h:627
ULONG64 KernelDr3
Definition: ketypes.h:608
ULONG64 MsrGsSwap
Definition: ketypes.h:623
unsigned char UCHAR
Definition: typedefs.h:53
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
struct CPUID_AMD_SVM_FEATURES_EDX::@3920 Bits
CPUID_AMD_SVM_FEATURES_EDX Edx
Definition: Cpuid.h:220
struct CPUID_EXTENDED_CPU_SIG_REGS::@3917 Intel
struct CPUID_EXTENDED_CPU_SIG_REGS::@3918 Amd
struct CPUID_EXTENDED_STATE_SUB_LEAF_EAX::@4015 Bits
CPUID_EXTENDED_STATE_SUB_LEAF_EAX Eax
Definition: Cpuid.h:107
struct CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX::@4005 Bits
CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX Ebx
Definition: Cpuid.h:80
struct CPUID_THERMAL_POWER_MANAGEMENT_REGS::@3906 Undoc
struct MSR_IA32_VMX_PROCBASED_CTLS2_REGISTER::@4052 Bits
struct MSR_IA32_VMX_PROCBASED_CTLS_REGISTER::@4051 Bits
ULONG Eax
Definition: ketypes.h:401
UINT32 AsUINT32[4]
Definition: ketypes.h:398
ULONG Ecx
Definition: ketypes.h:403
ULONG Edx
Definition: ketypes.h:404
ULONG Unused
Definition: cpu.c:44
ULONG ExtendedFamily
Definition: cpu.c:46
ULONG Model
Definition: cpu.c:42
ULONG Unused2
Definition: cpu.c:47
ULONG Family
Definition: cpu.c:43
ULONG AsULONG
Definition: cpu.c:49
ULONG Step
Definition: cpu.c:41
ULONG ExtendedModel
Definition: cpu.c:45
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
void _mm_setcsr(unsigned int a)
Definition: xmmintrin.h:542
unsigned int _mm_getcsr(void)
Definition: xmmintrin.h:535