From 37f7bbad77cd7dfed36eebf6bb9ee4c111d48962 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Sat, 3 Oct 2026 09:11:01 +1000 Subject: [PATCH] [common] cpuinfo: move feature queries to platform code --- common/include/common/cpuinfo.h | 4 ++++ common/src/cpuinfo.c | 29 +++------------------------ common/src/platform/linux/cpuinfo.c | 27 +++++++++++++++++++++++++ common/src/platform/windows/cpuinfo.c | 11 ++++++++++ 4 files changed, 45 insertions(+), 26 deletions(-) diff --git a/common/include/common/cpuinfo.h b/common/include/common/cpuinfo.h index 474fef37..c76703e2 100644 --- a/common/include/common/cpuinfo.h +++ b/common/include/common/cpuinfo.h @@ -23,6 +23,10 @@ #include #include +#include + +void platform_cpuInfoCPUID(int registers[4], int leaf, int subleaf); +uint64_t platform_cpuInfoXGETBV(unsigned int index); bool cpuInfo_get(char * model, size_t modelSize, int * procs, int * cores, int * sockets); diff --git a/common/src/cpuinfo.c b/common/src/cpuinfo.c index fcda820e..4a5d8cfd 100644 --- a/common/src/cpuinfo.c +++ b/common/src/cpuinfo.c @@ -50,15 +50,7 @@ const CPUInfoFeatures * cpuInfo_getFeatures(void) int cpuid[4] = {0}; // leaf1 - asm volatile - ( - "cpuid;" - : "=a" (cpuid[0]), - "=b" (cpuid[1]), - "=c" (cpuid[2]), - "=d" (cpuid[3]) - : "a" (1) - ); + platform_cpuInfoCPUID(cpuid, 1, 0); features.sse = cpuid[3] & (1 << 25); features.sse2 = cpuid[3] & (1 << 26); @@ -74,15 +66,7 @@ const CPUInfoFeatures * cpuInfo_getFeatures(void) features.avx = cpuid[2] & (1 << 28); // leaf7 - asm volatile - ( - "cpuid;" - : "=a" (cpuid[0]), - "=b" (cpuid[1]), - "=c" (cpuid[2]), - "=d" (cpuid[3]) - : "a" (7), "c" (0) - ); + platform_cpuInfoCPUID(cpuid, 7, 0); features.avx2 = cpuid[1] & (1 << 5); features.bmi1 = cpuid[2] & (1 << 3); @@ -90,14 +74,7 @@ const CPUInfoFeatures * cpuInfo_getFeatures(void) if (features.osxsave && features.avx) { - int xgetbv = 0; - asm volatile - ( - "xgetbv;" - : "=a" (xgetbv) - : "c" (0) - : "edx" - ); + const uint64_t xgetbv = platform_cpuInfoXGETBV(0); if (!(xgetbv & 0x6)) { diff --git a/common/src/platform/linux/cpuinfo.c b/common/src/platform/linux/cpuinfo.c index 574f31b7..2d178a43 100644 --- a/common/src/platform/linux/cpuinfo.c +++ b/common/src/platform/linux/cpuinfo.c @@ -27,6 +27,33 @@ #include #include +void platform_cpuInfoCPUID(int registers[4], int leaf, int subleaf) +{ + asm volatile + ( + "cpuid;" + : "=a" (registers[0]), + "=b" (registers[1]), + "=c" (registers[2]), + "=d" (registers[3]) + : "a" (leaf), "c" (subleaf) + ); +} + +uint64_t platform_cpuInfoXGETBV(unsigned int index) +{ + uint32_t low; + uint32_t high; + asm volatile + ( + "xgetbv;" + : "=a" (low), "=d" (high) + : "c" (index) + ); + + return ((uint64_t)high << 32) | low; +} + bool cpuInfo_get(char * model, size_t modelSize, int * procs, int * cores, int * sockets) { diff --git a/common/src/platform/windows/cpuinfo.c b/common/src/platform/windows/cpuinfo.c index 9a0c7fd2..8ce60674 100644 --- a/common/src/platform/windows/cpuinfo.c +++ b/common/src/platform/windows/cpuinfo.c @@ -22,8 +22,19 @@ #include "common/debug.h" #include "common/windebug.h" +#include #include +void platform_cpuInfoCPUID(int registers[4], int leaf, int subleaf) +{ + __cpuidex(registers, leaf, subleaf); +} + +uint64_t platform_cpuInfoXGETBV(unsigned int index) +{ + return _xgetbv(index); +} + static bool getCPUModel(char * model, size_t modelSize) { if (!model)