https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5ae65ab7a70aa6e627c2462042584861258352b5

commit 5ae65ab7a70aa6e627c2462042584861258352b5
Author:     Stanislav Motylkov <[email protected]>
AuthorDate: Fri Jun 30 18:06:38 2023 +0300
Commit:     Stanislav Motylkov <[email protected]>
CommitDate: Sun Jul 2 21:00:32 2023 +0300

    [NTOS:KE] Add x86 CPU features reporting to AMD64
    
    CORE-18023 CORE-14922
---
 ntoskrnl/include/internal/amd64/ke.h |  3 ++
 ntoskrnl/ke/amd64/cpu.c              | 54 ++++++++++++++++++++++++++++++++++++
 ntoskrnl/ke/amd64/kiinit.c           |  5 ++++
 3 files changed, 62 insertions(+)

diff --git a/ntoskrnl/include/internal/amd64/ke.h 
b/ntoskrnl/include/internal/amd64/ke.h
index 318b119d513..3287e7567c2 100644
--- a/ntoskrnl/include/internal/amd64/ke.h
+++ b/ntoskrnl/include/internal/amd64/ke.h
@@ -420,6 +420,9 @@ VOID KiGetCacheInformation(VOID);
 VOID KiSetProcessorType(VOID);
 ULONG KiGetFeatureBits(VOID);
 VOID KiInitializeCpuFeatures(VOID);
+#if DBG
+VOID KiReportCpuFeatures(IN PKPRCB Prcb);
+#endif
 
 ULONG KeAllocateGdtSelector(ULONG Desc[2]);
 VOID KeFreeGdtSelector(ULONG Entry);
diff --git a/ntoskrnl/ke/amd64/cpu.c b/ntoskrnl/ke/amd64/cpu.c
index 0967411e644..274320c1b12 100644
--- a/ntoskrnl/ke/amd64/cpu.c
+++ b/ntoskrnl/ke/amd64/cpu.c
@@ -234,6 +234,60 @@ KiGetFeatureBits(VOID)
     return FeatureBits;
 }
 
+#if DBG
+VOID
+KiReportCpuFeatures(IN PKPRCB Prcb)
+{
+    ULONG CpuFeatures = 0;
+    CPU_INFO CpuInfo;
+
+    if (Prcb->CpuVendor)
+    {
+        KiCpuId(&CpuInfo, 1);
+        CpuFeatures = CpuInfo.Edx;
+    }
+
+    DPRINT1("Supported CPU features: ");
+
+#define print_kf_bit(kf_value) if (Prcb->FeatureBits & kf_value) 
DbgPrint(#kf_value " ")
+    print_kf_bit(KF_V86_VIS);
+    print_kf_bit(KF_RDTSC);
+    print_kf_bit(KF_CR4);
+    print_kf_bit(KF_CMOV);
+    print_kf_bit(KF_GLOBAL_PAGE);
+    print_kf_bit(KF_LARGE_PAGE);
+    print_kf_bit(KF_MTRR);
+    print_kf_bit(KF_CMPXCHG8B);
+    print_kf_bit(KF_CMPXCHG16B);
+    print_kf_bit(KF_MMX);
+    print_kf_bit(KF_WORKING_PTE);
+    print_kf_bit(KF_PAT);
+    print_kf_bit(KF_FXSR);
+    print_kf_bit(KF_FAST_SYSCALL);
+    print_kf_bit(KF_XMMI);
+    print_kf_bit(KF_3DNOW);
+    print_kf_bit(KF_XMMI64);
+    print_kf_bit(KF_DTS);
+    print_kf_bit(KF_NX_BIT);
+    print_kf_bit(KF_NX_DISABLED);
+    print_kf_bit(KF_NX_ENABLED);
+    print_kf_bit(KF_SSE3);
+    //print_kf_bit(KF_SSE3SUP);
+    //print_kf_bit(KF_SSE41);
+    //print_kf_bit(KF_MONITOR);
+    //print_kf_bit(KF_POPCNT);
+    print_kf_bit(KF_XSTATE);
+#undef print_kf_bit
+
+#define print_cf(cpu_flag) if (CpuFeatures & cpu_flag) DbgPrint(#cpu_flag " ")
+    print_cf(X86_FEATURE_PAE);
+    print_cf(X86_FEATURE_HT);
+#undef print_cf
+
+    DbgPrint("\n");
+}
+#endif // DBG
+
 VOID
 NTAPI
 KiGetCacheInformation(VOID)
diff --git a/ntoskrnl/ke/amd64/kiinit.c b/ntoskrnl/ke/amd64/kiinit.c
index 65819290f46..a0dc2c5c5b8 100644
--- a/ntoskrnl/ke/amd64/kiinit.c
+++ b/ntoskrnl/ke/amd64/kiinit.c
@@ -341,6 +341,11 @@ KiInitializeKernelMachineDependent(
         SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_ALWAYSOFF;
         Prcb->FeatureBits |= KF_NX_DISABLED;
     }
+
+#if DBG
+    /* Print applied kernel features/policies and boot CPU features */
+    KiReportCpuFeatures(Prcb);
+#endif
 }
 
 static LDR_DATA_TABLE_ENTRY LdrCoreEntries[3];

Reply via email to