On 2018/06/20 05:53, Leo Unglaub wrote: > Hi, > I applied your code on my AMD Ryzen 7 1700X. Below is the dmesg. I hope this > helps, if you have any other AMD Ryzen related stuff that needs testing > please let me know.
So there's no convenient "smt id" returned.. > > cpu0 at mainbus0: apid 0 (boot processor) > > cpu0: eax 0x00000000 ebx 0x00000100 ecx 0x00000000 > > cpu0: smt 0, core 0, package 0 > > cpu1 at mainbus0: apid 1 (application processor) > > cpu1: eax 0x00000001 ebx 0x00000100 ecx 0x00000000 > > cpu1: smt 0, core 1, package 0 > > cpu2 at mainbus0: apid 2 (application processor) > > cpu2: eax 0x00000002 ebx 0x00000101 ecx 0x00000000 > > cpu2: smt 0, core 2, package 0 > > cpu3 at mainbus0: apid 3 (application processor) > > cpu3: eax 0x00000003 ebx 0x00000101 ecx 0x00000000 > > cpu3: smt 0, core 3, package 0 > > cpu4 at mainbus0: apid 4 (application processor) > > cpu4: eax 0x00000004 ebx 0x00000102 ecx 0x00000000 > > cpu4: smt 0, core 4, package 0 > > cpu5 at mainbus0: apid 5 (application processor) > > cpu5: eax 0x00000005 ebx 0x00000102 ecx 0x00000000 > > cpu5: smt 0, core 5, package 0 > > cpu6 at mainbus0: apid 6 (application processor) > > cpu6: eax 0x00000006 ebx 0x00000103 ecx 0x00000000 > > cpu6: smt 0, core 6, package 0 > > cpu7 at mainbus0: apid 7 (application processor) > > cpu7: eax 0x00000007 ebx 0x00000103 ecx 0x00000000 > > cpu7: smt 0, core 7, package 0 > > cpu8 at mainbus0: apid 8 (application processor) > > cpu8: eax 0x00000008 ebx 0x00000104 ecx 0x00000000 > > cpu8: smt 0, core 8, package 0 > > cpu9 at mainbus0: apid 9 (application processor) > > cpu9: eax 0x00000009 ebx 0x00000104 ecx 0x00000000 > > cpu9: smt 0, core 9, package 0 > > cpu10 at mainbus0: apid 10 (application processor) > > cpu10: eax 0x0000000a ebx 0x00000105 ecx 0x00000000 > > cpu10: smt 0, core 10, package 0 > > cpu11 at mainbus0: apid 11 (application processor) > > cpu11: eax 0x0000000b ebx 0x00000105 ecx 0x00000000 > > cpu11: smt 0, core 11, package 0 > > cpu12 at mainbus0: apid 12 (application processor) > > cpu12: eax 0x0000000c ebx 0x00000106 ecx 0x00000000 > > cpu12: smt 0, core 12, package 0 > > cpu13 at mainbus0: apid 13 (application processor) > > cpu13: eax 0x0000000d ebx 0x00000106 ecx 0x00000000 > > cpu13: smt 0, core 13, package 0 > > cpu14 at mainbus0: apid 14 (application processor) > > cpu14: eax 0x0000000e ebx 0x00000107 ecx 0x00000000 > > cpu14: smt 0, core 14, package 0 > > cpu15 at mainbus0: apid 15 (application processor) > > cpu15: eax 0x0000000f ebx 0x00000107 ecx 0x00000000 > > cpu15: smt 0, core 15, package 0 The reacharound is a bit ugly, but would something like this do the trick? I don't have a suitable AMD to test, but have tested the mechanism on an i7 with HT and it does what's expected. Index: identcpu.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/identcpu.c,v retrieving revision 1.96 diff -u -p -r1.96 identcpu.c --- identcpu.c 7 Jun 2018 04:07:28 -0000 1.96 +++ identcpu.c 20 Jun 2018 09:26:08 -0000 @@ -792,17 +792,32 @@ cpu_topology(struct cpu_info *ci) if (ci->ci_pnfeatset < 0x80000008) goto no_topology; - CPUID(0x80000008, eax, ebx, ecx, edx); - core_bits = (ecx >> 12) & 0xf; - if (core_bits == 0) - goto no_topology; - /* So coreidsize 2 gives 3, 3 gives 7... */ - core_mask = (1 << core_bits) - 1; - /* Core id is the least significant considering mask */ - ci->ci_core_id = apicid & core_mask; - /* Pkg id is the upper remaining bits */ - ci->ci_pkg_id = apicid & ~core_mask; - ci->ci_pkg_id >>= core_bits; + if (ci->ci_pnfeatset >= 0x8000001e) { + struct cpu_info *ci_other; + CPU_INFO_ITERATOR cii; + + CPUID(0x8000001e, eax, ebx, ecx, edx); + ci->ci_core_id = ebx & 0xff; + ci->ci_pkg_id = ecx & 0xff; + ci->ci_smt_id = 0; + CPU_INFO_FOREACH(cii, ci_other) { + if (ci != ci_other && + ci_other->ci_core_id == ci->ci_core_id) + ci->ci_smt_id++; + } + } else { + CPUID(0x80000008, eax, ebx, ecx, edx); + core_bits = (ecx >> 12) & 0xf; + if (core_bits == 0) + goto no_topology; + /* So coreidsize 2 gives 3, 3 gives 7... */ + core_mask = (1 << core_bits) - 1; + /* Core id is the least significant considering mask */ + ci->ci_core_id = apicid & core_mask; + /* Pkg id is the upper remaining bits */ + ci->ci_pkg_id = apicid & ~core_mask; + ci->ci_pkg_id >>= core_bits; + } } else if (strcmp(cpu_vendor, "GenuineIntel") == 0) { /* We only support leaf 1/4 detection */ if (cpuid_level < 4)