https://git.reactos.org/?p=reactos.git;a=commitdiff;h=00715ccf8bde403dce65e…
commit 00715ccf8bde403dce65e4e0cb63b63b133dfc5a
Author: Stanislav Motylkov <x86corez(a)gmail.com>
AuthorDate: Fri Jun 30 17:06:19 2023 +0300
Commit: Stanislav Motylkov <x86corez(a)gmail.com>
CommitDate: Sun Jul 2 21:00:31 2023 +0300
[NTOS:KE] Fix magic constants for x86 CPU features
Do it the same way as in amd64 ke.h/cpu.c. CORE-18023
---
ntoskrnl/include/internal/i386/ke.h | 24 +++++++++++++++++++++++
ntoskrnl/ke/i386/cpu.c | 38 ++++++++++++++++++-------------------
2 files changed, 43 insertions(+), 19 deletions(-)
diff --git a/ntoskrnl/include/internal/i386/ke.h b/ntoskrnl/include/internal/i386/ke.h
index cdeba9ab87d..cc8bca420bf 100644
--- a/ntoskrnl/include/internal/i386/ke.h
+++ b/ntoskrnl/include/internal/i386/ke.h
@@ -22,6 +22,30 @@ extern "C"
#define KD_BREAKPOINT_SIZE sizeof(UCHAR)
#define KD_BREAKPOINT_VALUE 0xCC
+/* CPUID 1 - EDX flags */
+#define X86_FEATURE_FPU 0x00000001 /* x87 FPU is present */
+#define X86_FEATURE_VME 0x00000002 /* Virtual 8086 Extensions are present */
+#define X86_FEATURE_DBG 0x00000004 /* Debugging extensions are present */
+#define X86_FEATURE_PSE 0x00000008 /* Page Size Extension is present */
+#define X86_FEATURE_TSC 0x00000010 /* Time Stamp Counters are present */
+#define X86_FEATURE_PAE 0x00000040 /* Physical Address Extension is present */
+#define X86_FEATURE_CX8 0x00000100 /* CMPXCHG8B instruction present */
+#define X86_FEATURE_APIC 0x00000200 /* APIC is present */
+#define X86_FEATURE_SYSCALL 0x00000800 /* SYSCALL/SYSRET support present */
+#define X86_FEATURE_MTTR 0x00001000 /* Memory type range registers are present */
+#define X86_FEATURE_PGE 0x00002000 /* Page Global Enable */
+#define X86_FEATURE_CMOV 0x00008000 /* "Conditional move" instruction
supported */
+#define X86_FEATURE_PAT 0x00010000 /* Page Attribute Table is supported */
+#define X86_FEATURE_DS 0x00200000 /* Debug Store is present */
+#define X86_FEATURE_MMX 0x00800000 /* MMX extension present */
+#define X86_FEATURE_FXSR 0x01000000 /* FXSAVE/FXRSTOR instructions present */
+#define X86_FEATURE_SSE 0x02000000 /* SSE extension present */
+#define X86_FEATURE_SSE2 0x04000000 /* SSE2 extension present */
+#define X86_FEATURE_HT 0x10000000 /* Hyper-Threading present */
+
+/* CPUID 0x80000001 - EDX extended flags */
+#define X86_FEATURE_NX 0x00100000 /* NX support present */
+
//
// One-liners for getting and setting special purpose registers in portable code
//
diff --git a/ntoskrnl/ke/i386/cpu.c b/ntoskrnl/ke/i386/cpu.c
index eac0bf42680..d4634cbe33b 100644
--- a/ntoskrnl/ke/i386/cpu.c
+++ b/ntoskrnl/ke/i386/cpu.c
@@ -365,28 +365,28 @@ KiGetFeatureBits(VOID)
CpuFeatures = CpuInfo.Edx;
/* Convert all CPUID Feature bits into our format */
- if (CpuFeatures & 0x00000002) FeatureBits |= KF_V86_VIS | KF_CR4;
- if (CpuFeatures & 0x00000008) FeatureBits |= KF_LARGE_PAGE | KF_CR4;
- if (CpuFeatures & 0x00000010) FeatureBits |= KF_RDTSC;
- if (CpuFeatures & 0x00000100) FeatureBits |= KF_CMPXCHG8B;
- if (CpuFeatures & 0x00000800) FeatureBits |= KF_FAST_SYSCALL;
- if (CpuFeatures & 0x00001000) FeatureBits |= KF_MTRR;
- if (CpuFeatures & 0x00002000) FeatureBits |= KF_GLOBAL_PAGE | KF_CR4;
- if (CpuFeatures & 0x00008000) FeatureBits |= KF_CMOV;
- if (CpuFeatures & 0x00010000) FeatureBits |= KF_PAT;
- if (CpuFeatures & 0x00200000) FeatureBits |= KF_DTS;
- if (CpuFeatures & 0x00800000) FeatureBits |= KF_MMX;
- if (CpuFeatures & 0x01000000) FeatureBits |= KF_FXSR;
- if (CpuFeatures & 0x02000000) FeatureBits |= KF_XMMI;
- if (CpuFeatures & 0x04000000) FeatureBits |= KF_XMMI64;
-
- if (CpuFeatures & 0x00000040)
+ if (CpuFeatures & X86_FEATURE_VME) FeatureBits |= KF_V86_VIS | KF_CR4;
+ if (CpuFeatures & X86_FEATURE_PSE) FeatureBits |= KF_LARGE_PAGE | KF_CR4;
+ if (CpuFeatures & X86_FEATURE_TSC) FeatureBits |= KF_RDTSC;
+ if (CpuFeatures & X86_FEATURE_CX8) FeatureBits |= KF_CMPXCHG8B;
+ if (CpuFeatures & X86_FEATURE_SYSCALL) FeatureBits |= KF_FAST_SYSCALL;
+ if (CpuFeatures & X86_FEATURE_MTTR) FeatureBits |= KF_MTRR;
+ if (CpuFeatures & X86_FEATURE_PGE) FeatureBits |= KF_GLOBAL_PAGE | KF_CR4;
+ if (CpuFeatures & X86_FEATURE_CMOV) FeatureBits |= KF_CMOV;
+ if (CpuFeatures & X86_FEATURE_PAT) FeatureBits |= KF_PAT;
+ if (CpuFeatures & X86_FEATURE_DS) FeatureBits |= KF_DTS;
+ if (CpuFeatures & X86_FEATURE_MMX) FeatureBits |= KF_MMX;
+ if (CpuFeatures & X86_FEATURE_FXSR) FeatureBits |= KF_FXSR;
+ if (CpuFeatures & X86_FEATURE_SSE) FeatureBits |= KF_XMMI;
+ if (CpuFeatures & X86_FEATURE_SSE2) FeatureBits |= KF_XMMI64;
+
+ if (CpuFeatures & X86_FEATURE_PAE)
{
DPRINT1("Support PAE\n");
}
/* Check if the CPU has hyper-threading */
- if (CpuFeatures & 0x10000000)
+ if (CpuFeatures & X86_FEATURE_HT)
{
/* Set the number of logical CPUs */
Prcb->LogicalProcessorsPerPhysicalProcessor = (UCHAR)(CpuInfo.Ebx >>
16);
@@ -416,7 +416,7 @@ KiGetFeatureBits(VOID)
KiCpuId(&CpuInfo, 0x80000001);
/* Check if NX-bit is supported */
- if (CpuInfo.Edx & 0x00100000) FeatureBits |= KF_NX_BIT;
+ if (CpuInfo.Edx & X86_FEATURE_NX) FeatureBits |= KF_NX_BIT;
/* Now handle each features for each CPU Vendor */
switch (Vendor)
@@ -481,7 +481,7 @@ KiGetCacheInformation(VOID)
/* Handle Intel case */
case CPU_INTEL:
- /*Check if we support CPUID 2 */
+ /* Check if we support CPUID 2 */
KiCpuId(&CpuInfo, 0);
if (CpuInfo.Eax >= 2)
{