if (!sft)
                sft = get_count_order(ecx.cpu_nthreads + 1);
 
-       topology_set_dom(tscan, TOPO_SMT_DOMAIN, sft, ecx.cpu_nthreads + 1);
+       /*
+        * cpu_nthreads describes the number of threads in the package
+        * sft is the number of APIC ID bits per package
+        *
+        * As the number of actual threads per core is not described in
+        * this leaf, just set the CORE domain shift and let the later
+        * parsers set SMT shift. Assume one thread per core by default
+        * which is correct if there are no other CPUID leafs to parse.
+        */
+       topology_update_dom(tscan, TOPO_SMT_DOMAIN, 0, 1);
+       topology_set_dom(tscan, TOPO_CORE_DOMAIN, sft, ecx.cpu_nthreads + 1);
        return true;
 }
 
-static void store_node(struct topo_scan *tscan, unsigned int nr_nodes, u16 node_id)
+static void store_node(struct topo_scan *tscan, u16 nr_nodes, u16 node_id)
 {
        /*
         * Starting with Fam 17h the DIE domain could probably be used to
        tscan->c->topo.initial_apicid = leaf.ext_apic_id;
 
        /*
-        * If leaf 0xb is available, then SMT shift is set already. If not
-        * take it from ecx.threads_per_core and use topo_update_dom() -
-        * topology_set_dom() would propagate and overwrite the already
-        * propagated CORE level.
+        * If leaf 0xb is available, then the domain shifts are set
+        * already and nothing to do here.
         */
        if (!has_0xb) {
+               /*
+                * Leaf 0x80000008 set the CORE domain shift already.
+                * Update the SMT domain, but do not propagate it.
+                */
                unsigned int nthreads = leaf.core_nthreads + 1;
 
                topology_update_dom(tscan, TOPO_SMT_DOMAIN, get_count_order(nthreads), nthreads);