From 95cced34fbd37b40b9dd57e1a5538bccd57544e2 Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Sun, 25 Feb 2018 20:31:35 -0500 Subject: [PATCH] pc: Add x86_topo_ids_from_apicid() It's reverse of apicid_from_topo_ids() and will be used in follow up patches to fill in data structures for query-hotpluggable-cpus and for user friendly error reporting. Backports commit 9f3aab58539b4cc716e42e772be8116dc2e7d159 from qemu --- qemu/target-i386/topology.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/qemu/target-i386/topology.h b/qemu/target-i386/topology.h index f8b0ca4e..6c7ef3a1 100644 --- a/qemu/target-i386/topology.h +++ b/qemu/target-i386/topology.h @@ -92,6 +92,21 @@ static inline unsigned apicid_pkg_offset(unsigned nr_cores, unsigned nr_threads) apicid_core_width(nr_cores, nr_threads); } +/* Calculate thread/core/package IDs for a specific topology, + * based on APIC ID + */ +static inline void x86_topo_ids_from_apicid(apic_id_t apicid, + unsigned nr_cores, + unsigned nr_threads, + X86CPUTopoInfo *topo) +{ + topo->smt_id = apicid & + ~(0xFFFFFFFFUL << apicid_smt_width(nr_cores, nr_threads)); + topo->core_id = (apicid >> apicid_core_offset(nr_cores, nr_threads)) & + ~(0xFFFFFFFFUL << apicid_core_width(nr_cores, nr_threads)); + topo->pkg_id = apicid >> apicid_pkg_offset(nr_cores, nr_threads); +} + /* Make APIC ID for the CPU based on Pkg_ID, Core_ID, SMT_ID * * The caller must make sure core_id < nr_cores and smt_id < nr_threads.