From mboxrd@z Thu Jan 1 00:00:00 1970 From: Babu Moger Subject: [PATCH v9 5/7] i386: Add support for CPUID_8000_001E for AMD Date: Mon, 14 May 2018 11:41:54 -0500 Message-ID: <20180514164156.27034-6-babu.moger@amd.com> References: <20180514164156.27034-1-babu.moger@amd.com> Mime-Version: 1.0 Content-Type: text/plain Cc: geoff@hostfission.com, babu.moger@amd.com, kash@tripleback.net, qemu-devel@nongnu.org, kvm@vger.kernel.org To: mst@redhat.com, marcel.apfelbaum@gmail.com, pbonzini@redhat.com, rth@twiddle.net, ehabkost@redhat.com, mtosatti@redhat.com Return-path: In-Reply-To: <20180514164156.27034-1-babu.moger@amd.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+gceq-qemu-devel2=m.gmane.org@nongnu.org Sender: "Qemu-devel" List-Id: kvm.vger.kernel.org Populate threads/core_id/apic_ids/socket_id when CPUID_EXT3_TOPOEXT feature is supported. This is required to support hyperthreading feature on AMD CPUs. This is supported via CPUID_8000_001E extended functions. Signed-off-by: Babu Moger Tested-by: Geoffrey McRae --- include/hw/i386/topology.h | 6 ++++++ target/i386/cpu.c | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/include/hw/i386/topology.h b/include/hw/i386/topology.h index 1ebaee0f76..4af746e50c 100644 --- a/include/hw/i386/topology.h +++ b/include/hw/i386/topology.h @@ -145,4 +145,10 @@ static inline apic_id_t x86_apicid_from_cpu_idx(unsigned nr_cores, return apicid_from_topo_ids(nr_cores, nr_threads, &topo); } +/* Definitions used on CPUID Leaf 0x8000001E */ +#define EXTENDED_APIC_ID(threads, socket_id, core_id, thread_id) \ + ((threads) ? \ + ((socket_id << 6) | (core_id << 1) | thread_id) : \ + ((socket_id << 6) | core_id)) + #endif /* HW_I386_TOPOLOGY_H */ diff --git a/target/i386/cpu.c b/target/i386/cpu.c index c06a9f5ebe..18a7872b7d 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -4071,6 +4071,14 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, break; } break; + case 0x8000001E: + assert(cpu->core_id <= 255); + *eax = EXTENDED_APIC_ID((cs->nr_threads - 1), + cpu->socket_id, cpu->core_id, cpu->thread_id); + *ebx = (cs->nr_threads - 1) << 8 | cpu->core_id; + *ecx = cpu->socket_id; + *edx = 0; + break; case 0xC0000000: *eax = env->cpuid_xlevel2; *ebx = 0; -- 2.17.0