Signed-off-by: Qian Wen <qian.wen@intel.com>
---
Changes v1 -> v2:
- Revise the commit message and comment to more clearer.
- Rebased to v8.1.0-rc2.
---
target/i386/cpu.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 97ad229d8b..6e1d88fbd7 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -6008,6 +6008,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
uint32_t die_offset;
uint32_t limit;
uint32_t signature[3];
+ uint32_t threads_per_socket;
X86CPUTopoInfo topo_info;
topo_info.dies_per_pkg = env->nr_dies;
@@ -6049,8 +6050,19 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
*ecx |= CPUID_EXT_OSXSAVE;
}
*edx = env->features[FEAT_1_EDX];
- if (cs->nr_cores * cs->nr_threads > 1) {
- *ebx |= (cs->nr_cores * cs->nr_threads) << 16;
+ /*
+ * Only bits [23:16] represent the maximum number of addressable
+ * IDs for logical processors in this physical package.
+ * When thread_per_socket > 255, it will 1) overwrite bits[31:24]
+ * which is apic_id, 2) bits [23:16] get truncated.
+ */
+ threads_per_socket = cs->nr_cores * cs->nr_threads;
+ if (threads_per_socket > 255) {
+ threads_per_socket = 255;
+ }
+
+ if (threads_per_socket > 1) {
+ *ebx |= threads_per_socket << 16;
*edx |= CPUID_HT;
}
if (!cpu->enable_pmu) {