From feeb7d2d015c03eb95b66d1efafcfe6b908e1e49 Mon Sep 17 00:00:00 2001 From: Sam Demeulemeester Date: Tue, 17 Mar 2026 00:15:46 +0100 Subject: [PATCH] Fix Core Topology Determination on some CPUs (eg: Intel PTL) --- app/display.c | 2 +- system/cpuid.h | 1 + system/x86/cpuid.c | 23 +++++++++++------------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/display.c b/app/display.c index b7739b3..bf6fd8f 100644 --- a/app/display.c +++ b/app/display.c @@ -268,7 +268,7 @@ void display_cpu_topology(void) if (cpuid_info.topology.is_hybrid) { if (cpuid_info.topology.pcore_count > 1) { - if (cpuid_info.flags.htt && + if (cpuid_info.flags.htt && cpuid_info.topology.thread_per_core > 1 && (cpuid_info.topology.thread_count - cpuid_info.topology.ecore_count) == cpuid_info.topology.pcore_count) { cpuid_info.topology.pcore_count /= 2; } diff --git a/system/cpuid.h b/system/cpuid.h index 1e0b2cb..384e757 100644 --- a/system/cpuid.h +++ b/system/cpuid.h @@ -146,6 +146,7 @@ typedef union { typedef struct { int core_count; int thread_count; + int thread_per_core; int is_hybrid; int ecore_count; int pcore_count; diff --git a/system/x86/cpuid.c b/system/x86/cpuid.c index 2200b56..97cbaa3 100644 --- a/system/x86/cpuid.c +++ b/system/x86/cpuid.c @@ -126,13 +126,12 @@ void cpuid_init(void) } // Detect CPU Topology (Core/Thread) infos - cpuid_info.topology.core_count = -1; - cpuid_info.topology.thread_count = -1; - cpuid_info.topology.is_hybrid = 0; - cpuid_info.topology.ecore_count = -1; - cpuid_info.topology.pcore_count = -1; - - int thread_per_core = 1; + cpuid_info.topology.core_count = -1; + cpuid_info.topology.thread_count = -1; + cpuid_info.topology.thread_per_core = 1; + cpuid_info.topology.is_hybrid = 0; + cpuid_info.topology.ecore_count = -1; + cpuid_info.topology.pcore_count = -1; // Set correct HTT flag according to AP-485 if (cpuid_info.max_cpuid >= 1 && cpuid_info.flags.htt) { @@ -154,16 +153,16 @@ void cpuid_init(void) cpuid(0x8000001E, 0, ®[0], ®[1], ®[2], ®[3]); if (((reg[1] >> 8) & 0x3) > 0) { - thread_per_core = 2; + cpuid_info.topology.thread_per_core = 2; } } else if (cpuid_info.flags.htt) { if (cpuid_info.version.extendedFamily >= 8) { - thread_per_core = 2; + cpuid_info.topology.thread_per_core = 2; } else { cpuid_info.flags.htt = 0; // Pre-ZEN never has SMT } } - cpuid_info.topology.core_count = cpuid_info.topology.thread_count / thread_per_core; + cpuid_info.topology.core_count = cpuid_info.topology.thread_count / cpuid_info.topology.thread_per_core ; } break; case 'C': @@ -192,7 +191,7 @@ void cpuid_init(void) switch((reg[2] >> 8) & 0xFF) { case 1: // SMT - thread_per_core = reg[1] & 0xFF; + cpuid_info.topology.thread_per_core = reg[1] & 0xFF; break; case 2: // Cores cpuid_info.topology.thread_count = reg[1] & 0xFFFF; @@ -202,7 +201,7 @@ void cpuid_init(void) } } - cpuid_info.topology.core_count = cpuid_info.topology.thread_count / thread_per_core; + cpuid_info.topology.core_count = cpuid_info.topology.thread_count / cpuid_info.topology.thread_per_core ; } else if (cpuid_info.max_cpuid >= 0x4) { cpuid(4, 0, ®[0], ®[1], ®[2], ®[3]);