ReactOS 0.4.17-dev-1190-g4c812f4
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/* FUNCTIONS *****************************************************************/
37
38VOID
41{
42 PKPRCB Prcb = KeGetCurrentPrcb();
43 USHORT Family, Model, Stepping;
44
45 /* This initializes Prcb->CpuVendor */
48
49 /* Get the family, model and stepping */
50 KiGetCpuSignature(&Family, &Model, &Stepping);
51
52 /* Save them in the PRCB */
53 Prcb->CpuID = TRUE;
54 Prcb->CpuType = (UCHAR)Family;
55 Prcb->CpuStep = ((Model << 8) | Stepping);
56}
57
74{
75 PKPRCB Prcb = KeGetCurrentPrcb();
76 ULONG Vendor;
77 ULONG64 FeatureBits = 0;
80 CPUID_EXTENDED_FUNCTION_REGS extendedFunction;
81
82 /* Get the Vendor ID */
83 Vendor = Prcb->CpuVendor;
84
85 /* Make sure we got a valid vendor ID at least. */
86 if (Vendor == CPU_UNKNOWN) return FeatureBits;
87
88 /* Get signature CPUID for the maximum function */
90
91 /* Get the CPUID Info. */
93
94 /* Set the initial APIC ID */
95 Prcb->InitialApicId = (UCHAR)VersionInfo.Ebx.Bits.InitialLocalApicId;
96
97 /* Convert all CPUID Feature bits into our format */
98 if (VersionInfo.Edx.Bits.VME) FeatureBits |= KF_CR4;
99 if (VersionInfo.Edx.Bits.PSE) FeatureBits |= KF_LARGE_PAGE | KF_CR4;
100 if (VersionInfo.Edx.Bits.TSC) FeatureBits |= KF_RDTSC;
101 if (VersionInfo.Edx.Bits.CX8) FeatureBits |= KF_CMPXCHG8B;
102 if (VersionInfo.Edx.Bits.SEP) FeatureBits |= KF_FAST_SYSCALL;
103 if (VersionInfo.Edx.Bits.MTRR) FeatureBits |= KF_MTRR;
104 if (VersionInfo.Edx.Bits.PGE) FeatureBits |= KF_GLOBAL_PAGE | KF_CR4;
105 if (VersionInfo.Edx.Bits.CMOV) FeatureBits |= KF_CMOV;
106 if (VersionInfo.Edx.Bits.PAT) FeatureBits |= KF_PAT;
107 if (VersionInfo.Edx.Bits.DS) FeatureBits |= KF_DTS;
108 if (VersionInfo.Edx.Bits.MMX) FeatureBits |= KF_MMX;
109 if (VersionInfo.Edx.Bits.FXSR) FeatureBits |= KF_FXSR;
110 if (VersionInfo.Edx.Bits.SSE) FeatureBits |= KF_XMMI;
111 if (VersionInfo.Edx.Bits.SSE2) FeatureBits |= KF_XMMI64;
112
113 if (VersionInfo.Ecx.Bits.SSE3) FeatureBits |= KF_SSE3;
114 if (VersionInfo.Ecx.Bits.SSSE3) FeatureBits |= KF_SSSE3;
115 if (VersionInfo.Ecx.Bits.CMPXCHG16B) FeatureBits |= KF_CMPXCHG16B;
116 if (VersionInfo.Ecx.Bits.SSE4_1) FeatureBits |= KF_SSE4_1;
117 if (VersionInfo.Ecx.Bits.SSE4_2) FeatureBits |= KF_SSE4_2;
118 if (VersionInfo.Ecx.Bits.XSAVE) FeatureBits |= KF_XSTATE;
119 if (VersionInfo.Ecx.Bits.RDRAND) FeatureBits |= KF_RDRAND;
120 if (VersionInfo.Ecx.Bits.AVX) FeatureBits |= KF_AVX;
121
122 /* Check if the CPU has hyper-threading */
123 if (VersionInfo.Edx.Bits.HTT)
124 {
125 /* Set the number of logical CPUs */
127 VersionInfo.Ebx.Bits.MaximumAddressableIdsForLogicalProcessors;
129 {
130 /* We're on dual-core */
132 }
133 }
134 else
135 {
136 /* We only have a single CPU */
138 }
139
140 /* Check if CPUID_THERMAL_POWER_MANAGEMENT (0x06) is supported */
142 {
143 /* Read CPUID_THERMAL_POWER_MANAGEMENT */
146
147 if (PowerInfo.Undoc.Ecx.ACNT2) FeatureBits |= KF_ACNT2;
148 }
149
150 /* Check if CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS (0x07) is supported */
152 {
153 /* Read CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS */
155 __cpuidex(ExtFlags.AsInt32,
158
159 if (ExtFlags.Ebx.Bits.SMEP) FeatureBits |= KF_SMEP;
160 if (ExtFlags.Ebx.Bits.FSGSBASE) FeatureBits |= KF_RDWRFSGSBASE;
161 if (ExtFlags.Ebx.Bits.SMAP) FeatureBits |= KF_SMAP;
162 if (ExtFlags.Ebx.Bits.AVX2) FeatureBits |= KF_AVX2;
163 if (ExtFlags.Ebx.Bits.AVX512F) FeatureBits |= KF_AVX512F;
164 }
165
166 /* Check if CPUID_EXTENDED_STATE (0x0D) is supported */
167 if (signature.MaxLeaf >= CPUID_EXTENDED_STATE)
168 {
169 /* Read CPUID_EXTENDED_STATE */
171 __cpuidex(ExtStateSub.AsInt32,
174
175 if (ExtStateSub.Eax.Bits.XSAVEOPT) FeatureBits |= KF_XSAVEOPT;
176 if (ExtStateSub.Eax.Bits.XSAVES) FeatureBits |= KF_XSAVES;
177 }
178
179 /* Check extended cpuid features */
180 __cpuid(extendedFunction.AsInt32, CPUID_EXTENDED_FUNCTION);
181 if ((extendedFunction.MaxLeaf & 0xffffff00) == 0x80000000)
182 {
183 /* Check if CPUID_EXTENDED_CPU_SIG (0x80000001) is supported */
184 if (extendedFunction.MaxLeaf >= CPUID_EXTENDED_CPU_SIG)
185 {
186 /* Read CPUID_EXTENDED_CPU_SIG */
189
190 /* Check if NX-bit is supported */
191 if (ExtSig.Intel.Edx.Bits.NX) FeatureBits |= KF_NX_BIT;
192 if (ExtSig.Intel.Edx.Bits.Page1GB) FeatureBits |= KF_HUGEPAGE;
193 if (ExtSig.Intel.Edx.Bits.RDTSCP) FeatureBits |= KF_RDTSCP;
194
195 /* AMD specific */
196 if (Vendor == CPU_AMD)
197 {
198 if (ExtSig.Amd.Edx.Bits.ThreeDNow) FeatureBits |= KF_3DNOW;
199 }
200 }
201 }
202
203 /* Vendor specific */
204 if (Vendor == CPU_INTEL)
205 {
206 FeatureBits |= KF_GENUINE_INTEL;
207
208 /* Check for models that support LBR */
209 if (VersionInfo.Eax.Bits.FamilyId == 6)
210 {
211 if ((VersionInfo.Eax.Bits.Model == 15) ||
212 (VersionInfo.Eax.Bits.Model == 22) ||
213 (VersionInfo.Eax.Bits.Model == 23) ||
214 (VersionInfo.Eax.Bits.Model == 26))
215 {
216 FeatureBits |= KF_BRANCH;
217 }
218 }
219
220 /* Check if VMX is available */
221 if (VersionInfo.Ecx.Bits.VMX)
222 {
223 /* Read PROCBASED ctls and check if secondary are allowed */
226 if (ProcBasedCtls.Bits.Allowed1.ActivateSecondaryControls)
227 {
228 /* Read secondary controls and check if EPT is allowed */
231 if (ProcBasedCtls2.Bits.Allowed1.EPT)
232 FeatureBits |= KF_SLAT;
233 }
234 }
235 }
236 else if (Vendor == CPU_AMD)
237 {
238 FeatureBits |= KF_AUTHENTICAMD;
239 FeatureBits |= KF_BRANCH;
240
241 /* Check extended cpuid features */
242 if ((extendedFunction.MaxLeaf & 0xffffff00) == 0x80000000)
243 {
244 /* Check if CPUID_AMD_SVM_FEATURES (0x8000000A) is supported */
245 if (extendedFunction.MaxLeaf >= CPUID_AMD_SVM_FEATURES)
246 {
247 /* Read CPUID_AMD_SVM_FEATURES and check if Nested Paging is available */
248 CPUID_AMD_SVM_FEATURES_REGS SvmFeatures;
250 if (SvmFeatures.Edx.Bits.NP) FeatureBits |= KF_SLAT;
251 }
252 }
253 }
254
255 /* Return the Feature Bits */
256 return FeatureBits;
257}
258
259#if DBG
260VOID
261KiReportCpuFeatures(IN PKPRCB Prcb)
262{
263 ULONG64 FeatureBits = Prcb->FeatureBits | ((ULONG64)Prcb->FeatureBitsHigh << 32);
264 ULONG CpuFeatures = 0;
265 CPU_INFO CpuInfo;
266
267 if (Prcb->CpuVendor)
268 {
269 KiCpuId(&CpuInfo, 1);
270 CpuFeatures = CpuInfo.Edx;
271 }
272
273 DPRINT1("Supported CPU features:");
274
275#define print_kf_bit(kf_value) if (FeatureBits & kf_value) DbgPrint(" " #kf_value)
276 print_kf_bit(KF_SMEP);
277 print_kf_bit(KF_RDTSC);
278 print_kf_bit(KF_CR4);
279 print_kf_bit(KF_CMOV);
280 print_kf_bit(KF_GLOBAL_PAGE);
281 print_kf_bit(KF_LARGE_PAGE);
282 print_kf_bit(KF_MTRR);
283 print_kf_bit(KF_CMPXCHG8B);
284 print_kf_bit(KF_MMX);
285 print_kf_bit(KF_DTS);
286 print_kf_bit(KF_PAT);
287 print_kf_bit(KF_FXSR);
288 print_kf_bit(KF_FAST_SYSCALL);
289 print_kf_bit(KF_XMMI);
290 print_kf_bit(KF_3DNOW);
291 print_kf_bit(KF_XSAVEOPT);
292 print_kf_bit(KF_XMMI64);
293 print_kf_bit(KF_BRANCH);
294 print_kf_bit(KF_00040000);
295 print_kf_bit(KF_SSE3);
296 print_kf_bit(KF_CMPXCHG16B);
297 print_kf_bit(KF_AUTHENTICAMD);
298 print_kf_bit(KF_ACNT2);
299 print_kf_bit(KF_XSTATE);
300 print_kf_bit(KF_GENUINE_INTEL);
301 print_kf_bit(KF_SLAT);
302 print_kf_bit(KF_VIRT_FIRMWARE_ENABLED);
303 print_kf_bit(KF_RDWRFSGSBASE);
304 print_kf_bit(KF_NX_BIT);
305 print_kf_bit(KF_NX_DISABLED);
306 print_kf_bit(KF_NX_ENABLED);
307 print_kf_bit(KF_RDRAND);
308 print_kf_bit(KF_SMAP);
309 print_kf_bit(KF_RDTSCP);
310 print_kf_bit(KF_HUGEPAGE);
311 print_kf_bit(KF_XSAVES);
312 print_kf_bit(KF_FPU_LEAKAGE);
313 print_kf_bit(KF_CAT);
314 print_kf_bit(KF_CET_SS);
315 print_kf_bit(KF_SSSE3);
316 print_kf_bit(KF_SSE4_1);
317 print_kf_bit(KF_SSE4_2);
318 print_kf_bit(KF_AVX);
319 print_kf_bit(KF_AVX2);
320 print_kf_bit(KF_AVX512F);
321#undef print_kf_bit
322
323#define print_cf(cpu_flag) if (CpuFeatures & cpu_flag) DbgPrint(" " #cpu_flag)
324 print_cf(X86_FEATURE_PAE);
325 print_cf(X86_FEATURE_HT);
326#undef print_cf
327
328 DbgPrint("\n");
329}
330#endif // DBG
331
332VOID
333NTAPI
335{
336 PKPRCB Prcb = KeGetCurrentPrcb();
337 PKIPCR Pcr = (PKIPCR)KeGetPcr();
338
339 /* Set default L2 size */
340 Pcr->SecondLevelCacheSize = 0;
341
342 /* Retrieve the cache descriptors */
344 ARRAYSIZE(Prcb->Cache),
345 Pcr->Prcb.CpuVendor);
346
347 /* Loop the descriptors to find the L2 cache size */
348 for (ULONG i = 0; i < Prcb->CacheCount; i++)
349 {
350 if (Prcb->Cache[i].Level == 2)
351 {
352 Pcr->SecondLevelCacheSize = Prcb->Cache[i].Size;
354 break;
355 }
356 }
357}
358
359VOID
360NTAPI
362{
363 /* Flush the TLB by resetting CR3 */
365}
366
367VOID
368NTAPI
370{
371 /* Restore the CR registers */
372 __writecr0(ProcessorState->SpecialRegisters.Cr0);
373// __writecr2(ProcessorState->SpecialRegisters.Cr2);
374 __writecr3(ProcessorState->SpecialRegisters.Cr3);
375 __writecr4(ProcessorState->SpecialRegisters.Cr4);
376 __writecr8(ProcessorState->SpecialRegisters.Cr8);
377
378 /* Restore the DR registers */
379 __writedr(0, ProcessorState->SpecialRegisters.KernelDr0);
380 __writedr(1, ProcessorState->SpecialRegisters.KernelDr1);
381 __writedr(2, ProcessorState->SpecialRegisters.KernelDr2);
382 __writedr(3, ProcessorState->SpecialRegisters.KernelDr3);
383 __writedr(6, ProcessorState->SpecialRegisters.KernelDr6);
384 __writedr(7, ProcessorState->SpecialRegisters.KernelDr7);
385
386 /* Restore GDT, IDT, LDT and TSS */
387 __lgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit);
388// __lldt(&ProcessorState->SpecialRegisters.Ldtr);
389// __ltr(&ProcessorState->SpecialRegisters.Tr);
390 __lidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
391
392 _mm_setcsr(ProcessorState->SpecialRegisters.MxCsr);
393// ProcessorState->SpecialRegisters.DebugControl
394// ProcessorState->SpecialRegisters.LastBranchToRip
395// ProcessorState->SpecialRegisters.LastBranchFromRip
396// ProcessorState->SpecialRegisters.LastExceptionToRip
397// ProcessorState->SpecialRegisters.LastExceptionFromRip
398
399 /* Restore MSRs */
406
407}
408
409VOID
410NTAPI
412{
413 /* Save the CR registers */
414 ProcessorState->SpecialRegisters.Cr0 = __readcr0();
415 ProcessorState->SpecialRegisters.Cr2 = __readcr2();
416 ProcessorState->SpecialRegisters.Cr3 = __readcr3();
417 ProcessorState->SpecialRegisters.Cr4 = __readcr4();
418 ProcessorState->SpecialRegisters.Cr8 = __readcr8();
419
420 /* Save the DR registers */
421 ProcessorState->SpecialRegisters.KernelDr0 = __readdr(0);
422 ProcessorState->SpecialRegisters.KernelDr1 = __readdr(1);
423 ProcessorState->SpecialRegisters.KernelDr2 = __readdr(2);
424 ProcessorState->SpecialRegisters.KernelDr3 = __readdr(3);
425 ProcessorState->SpecialRegisters.KernelDr6 = __readdr(6);
426 ProcessorState->SpecialRegisters.KernelDr7 = __readdr(7);
427
428 /* Save GDT, IDT, LDT and TSS */
429 __sgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit);
430 __sldt(&ProcessorState->SpecialRegisters.Ldtr);
431 __str(&ProcessorState->SpecialRegisters.Tr);
432 __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
433
434 ProcessorState->SpecialRegisters.MxCsr = _mm_getcsr();
435// ProcessorState->SpecialRegisters.DebugControl =
436// ProcessorState->SpecialRegisters.LastBranchToRip =
437// ProcessorState->SpecialRegisters.LastBranchFromRip =
438// ProcessorState->SpecialRegisters.LastExceptionToRip =
439// ProcessorState->SpecialRegisters.LastExceptionFromRip =
440
441 /* Save MSRs */
442 ProcessorState->SpecialRegisters.MsrGsBase = __readmsr(X86_MSR_GSBASE);
443 ProcessorState->SpecialRegisters.MsrGsSwap = __readmsr(X86_MSR_KERNEL_GSBASE);
444 ProcessorState->SpecialRegisters.MsrStar = __readmsr(X86_MSR_STAR);
445 ProcessorState->SpecialRegisters.MsrLStar = __readmsr(X86_MSR_LSTAR);
446 ProcessorState->SpecialRegisters.MsrCStar = __readmsr(X86_MSR_CSTAR);
447 ProcessorState->SpecialRegisters.MsrSyscallMask = __readmsr(X86_MSR_SFMASK);
448}
449
450VOID
451NTAPI
453 _In_ PKTRAP_FRAME TrapFrame,
454 _In_ PKEXCEPTION_FRAME ExceptionFrame)
455{
456 PKPRCB Prcb = KeGetCurrentPrcb();
457
458 /* Save all context */
460 KeTrapFrameToContext(TrapFrame, ExceptionFrame, &Prcb->ProcessorState.ContextFrame);
461
462 /* Save control registers */
464}
465
466VOID
467NTAPI
469 _Out_ PKTRAP_FRAME TrapFrame,
470 _Out_ PKEXCEPTION_FRAME ExceptionFrame)
471{
472 PKPRCB Prcb = KeGetCurrentPrcb();
473
474 /* Restore all context */
476 ExceptionFrame,
477 TrapFrame,
479 TrapFrame->PreviousMode);
480
481 /* Restore control registers */
483}
484
485VOID
486NTAPI
488 IN BOOLEAN AllProcessors)
489{
491
492 // FIXME: halfplemented
493 /* Raise the IRQL for the TB Flush */
495
496 /* Flush the TB for the Current CPU, and update the flush stamp */
498
499 /* Update the flush stamp and return to original IRQL */
502
503}
504
506NTAPI
508{
509 UNREFERENCED_PARAMETER(FloatingState);
510 return STATUS_SUCCESS;
511}
512
514NTAPI
516{
517 UNREFERENCED_PARAMETER(FloatingState);
518 return STATUS_SUCCESS;
519}
520
522NTAPI
524{
525 /* Invalidate all caches */
526 __wbinvd();
527 return TRUE;
528}
529
530/*
531 * @implemented
532 */
533ULONG
534NTAPI
536{
537 /* Return the global variable */
538 return KeLargestCacheLine;
539}
540
541/*
542 * @implemented
543 */
544VOID
547{
548 /* Capture the context */
549 RtlCaptureContext(&State->ContextFrame);
550
551 /* Capture the control state */
553}
554
555/*
556 * @implemented
557 */
558VOID
559NTAPI
561{
562 /* Save the coherency globally */
563 KiDmaIoCoherency = Coherency;
564}
#define MSR_IA32_VMX_PROCBASED_CTLS
#define MSR_IA32_VMX_PROCBASED_CTLS2
#define CPUID_AMD_SVM_FEATURES
Definition: Cpuid.h:329
#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
unsigned char BOOLEAN
Definition: actypes.h:127
@ Invalid
Definition: asmpp.cpp:35
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
OSVERSIONINFOW VersionInfo
Definition: wkssvc.c:40
#define ARRAYSIZE(a)
Definition: cat.c:25
#define TRUE
Definition: types.h:120
#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 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:1197
#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
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)
ULONG NTAPI KiGetCpuCacheDescriptors(_Out_writes_(MaxCount) PCACHE_DESCRIPTOR CacheDescriptors, _In_ ULONG MaxCount, _In_ CPU_VENDORS Vendor)
Retrieves cache descriptors for the current CPU.
Definition: cacheinfo.c:484
VOID NTAPI KiGetCpuSignature(_Out_ PUSHORT Family, _Out_ PUSHORT Model, _Out_ PUSHORT Stepping)
Get the CPU signature.
Definition: cpuinfo.c:118
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:535
VOID NTAPI KiRestoreProcessorControlState(PKPROCESSOR_STATE ProcessorState)
Definition: cpu.c:369
ULONG KeI386NpxPresent
Definition: cpu.c:28
VOID NTAPI KeFlushCurrentTb(VOID)
Definition: cpu.c:361
VOID NTAPI KiSetProcessorType(VOID)
Definition: cpu.c:40
ULONG KeI386MachineType
Definition: cpu.c:27
VOID NTAPI KeFlushEntireTb(IN BOOLEAN Invalid, IN BOOLEAN AllProcessors)
Definition: cpu.c:487
ULONG KeLargestCacheLine
Definition: cpu.c:29
VOID __cdecl KeSaveStateForHibernate(IN PKPROCESSOR_STATE State)
Definition: cpu.c:546
BOOLEAN KiSMTProcessorsPresent
Definition: cpu.c:31
ULONG64 NTAPI KiGetFeatureBits(VOID)
Evaluates the KeFeatureFlag bits for the current CPU.
Definition: cpu.c:73
BOOLEAN NTAPI KeInvalidateAllCaches(VOID)
Definition: cpu.c:523
NTSTATUS NTAPI KxRestoreFloatingPointState(IN PKFLOATING_SAVE FloatingState)
Definition: cpu.c:515
volatile LONG KiTbFlushTimeStamp
Definition: cpu.c:34
VOID NTAPI KiSaveProcessorState(_In_ PKTRAP_FRAME TrapFrame, _In_ PKEXCEPTION_FRAME ExceptionFrame)
Definition: cpu.c:452
VOID NTAPI KeSetDmaIoCoherency(IN ULONG Coherency)
Definition: cpu.c:560
KTSS64 KiBootTss
Definition: cpu.c:22
ULONG KeI386CpuType
Definition: cpu.c:25
NTSTATUS NTAPI KxSaveFloatingPointState(OUT PKFLOATING_SAVE FloatingState)
Definition: cpu.c:507
VOID NTAPI KiSaveProcessorControlState(OUT PKPROCESSOR_STATE ProcessorState)
Definition: cpu.c:411
VOID NTAPI KiRestoreProcessorState(_Out_ PKTRAP_FRAME TrapFrame, _Out_ PKEXCEPTION_FRAME ExceptionFrame)
Definition: cpu.c:468
ULONG KiDmaIoCoherency
Definition: cpu.c:30
VOID NTAPI KiGetCacheInformation(VOID)
Definition: cpu.c:334
ULONG KeI386CpuStep
Definition: cpu.c:26
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
static int Family
Definition: ping.c:62
#define CONTEXT_ALL
#define STATUS_SUCCESS
Definition: shellext.h:65
UCHAR Associativity
Definition: ketypes.h:52
ULONG ContextFlags
Definition: nt_native.h:1429
USHORT Limit
Definition: ketypes.h:460
KPRCB Prcb
Definition: ketypes.h:1003
ULONG SecondLevelCacheSize
Definition: ketypes.h:995
UCHAR SecondLevelCacheAssociativity
Definition: ketypes.h:986
CHAR CpuType
Definition: ketypes.h:684
ULONG CacheCount
Definition: ketypes.h:908
CACHE_DESCRIPTOR Cache[5]
Definition: ketypes.h:907
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:770
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::@4444 Bits
CPUID_AMD_SVM_FEATURES_EDX Edx
Definition: Cpuid.h:389
struct CPUID_EXTENDED_CPU_SIG_REGS::@4429 Amd
struct CPUID_EXTENDED_CPU_SIG_REGS::@4428 Intel
struct CPUID_EXTENDED_STATE_SUB_LEAF_EAX::@4539 Bits
CPUID_EXTENDED_STATE_SUB_LEAF_EAX Eax
Definition: Cpuid.h:121
struct CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX::@4529 Bits
CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX Ebx
Definition: Cpuid.h:94
struct CPUID_THERMAL_POWER_MANAGEMENT_REGS::@4415 Undoc
struct MSR_IA32_VMX_PROCBASED_CTLS2_REGISTER::@4576 Bits
struct MSR_IA32_VMX_PROCBASED_CTLS_REGISTER::@4575 Bits
ULONG Edx
Definition: ketypes.h:404
_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