From 2f58cd792ece47bd415da74794036d0f49837691 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 4 Feb 2025 14:47:44 +0200 Subject: [PATCH] HACK WIP [NTOS:KE] Detect AVX, AVX2 and AVX512 --- ntoskrnl/ke/amd64/cpu.c | 5 +++++ ntoskrnl/ke/amd64/kiinit.c | 9 ++++++--- sdk/include/ndk/amd64/ketypes.h | 5 +++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ntoskrnl/ke/amd64/cpu.c b/ntoskrnl/ke/amd64/cpu.c index 4fe811aaa42..01115cbd27b 100644 --- a/ntoskrnl/ke/amd64/cpu.c +++ b/ntoskrnl/ke/amd64/cpu.c @@ -210,6 +210,8 @@ KiGetFeatureBits(VOID) if (VersionInfo.Ecx.Bits.XSAVE) FeatureBits |= KF_XSTATE; if (VersionInfo.Ecx.Bits.RDRAND) FeatureBits |= KF_RDRAND; + if (VersionInfo.Ecx.Bits.AVX) FeatureBits |= KF_AVX; + /* Check if the CPU has hyper-threading */ if (VersionInfo.Edx.Bits.HTT) { @@ -250,6 +252,9 @@ KiGetFeatureBits(VOID) if (ExtFlags.Ebx.Bits.SMEP) FeatureBits |= KF_SMEP; if (ExtFlags.Ebx.Bits.FSGSBASE) FeatureBits |= KF_RDWRFSGSBASE; if (ExtFlags.Ebx.Bits.SMAP) FeatureBits |= KF_SMAP; + + if (ExtFlags.Ebx.Bits.AVX2) FeatureBits |= KF_AVX2; + if (ExtFlags.Ebx.Bits.AVX512F) FeatureBits |= KF_AVX512F; } /* Check if CPUID_EXTENDED_STATE (0x0D) is supported */ diff --git a/ntoskrnl/ke/amd64/kiinit.c b/ntoskrnl/ke/amd64/kiinit.c index 09a33226288..14ecdd2b920 100644 --- a/ntoskrnl/ke/amd64/kiinit.c +++ b/ntoskrnl/ke/amd64/kiinit.c @@ -399,9 +399,12 @@ KiInitializeKernelMachineDependent( (FeatureBits & KF_SSE4_1) ? TRUE : FALSE; SharedUserData->ProcessorFeatures[PF_SSE4_2_INSTRUCTIONS_AVAILABLE] = (FeatureBits & KF_SSE4_2) ? TRUE : FALSE; - SharedUserData->ProcessorFeatures[PF_AVX_INSTRUCTIONS_AVAILABLE] = FALSE; // FIXME - SharedUserData->ProcessorFeatures[PF_AVX2_INSTRUCTIONS_AVAILABLE] = FALSE; // FIXME - SharedUserData->ProcessorFeatures[PF_AVX512F_INSTRUCTIONS_AVAILABLE] = FALSE; // FIXME + SharedUserData->ProcessorFeatures[PF_AVX_INSTRUCTIONS_AVAILABLE] = + (FeatureBits & KF_AVX) ? TRUE : FALSE; + SharedUserData->ProcessorFeatures[PF_AVX2_INSTRUCTIONS_AVAILABLE] = + (FeatureBits & KF_AVX2) ? TRUE : FALSE; + SharedUserData->ProcessorFeatures[PF_AVX512F_INSTRUCTIONS_AVAILABLE] = + (FeatureBits & KF_AVX512F) ? TRUE : FALSE; /* Set the default NX policy (opt-in) */ SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_OPTIN; diff --git a/sdk/include/ndk/amd64/ketypes.h b/sdk/include/ndk/amd64/ketypes.h index 5d65d4a3508..4a24569ccb5 100644 --- a/sdk/include/ndk/amd64/ketypes.h +++ b/sdk/include/ndk/amd64/ketypes.h @@ -73,6 +73,11 @@ Author: #define KF_SSE4_1 0x0001000000000000ULL #define KF_SSE4_2 0x0002000000000000ULL +// Hacks +#define KF_AVX 0x1000000000000000ULL +#define KF_AVX2 0x2000000000000000ULL +#define KF_AVX512F 0x4000000000000000ULL + #define KF_XSAVEOPT_BIT 15 // From ksamd64.inc (0x0F -> 0x8000) #define KF_XSTATE_BIT 23 // From ksamd64.inc (0x17 -> 0x800000) #define KF_RDWRFSGSBASE_BIT 28 // From ksamd64.inc (0x1C -> 0x10000000)