Download raw body.
print intel core type info in dmesg
On Wed, Jul 23, 2025 at 05:47:21PM +1000, David Gwynne wrote:
> i sent an old version of this around a year or two ago, which devolved
> into a discussion around how annoying the repeated cpu info is in dmesg.
> that's since been addressed, so i'm trying this out again.
>
> if an intel cpu provides information about the type of cpu, this adds it
> to the topology line in dmesg output. this is particularly interesting
> on hybrid systems.
>
> there are MSRs on recent amd chips that can tell zen 4 vs 4c or 5 vs 5c
> cores apart, but i dont have one to test with.
>
do you have a diff for amd that someone can test? and/or where are these
documented?
-ml
> Index: amd64/identcpu.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/amd64/identcpu.c,v
> diff -u -p -r1.151 identcpu.c
> --- amd64/identcpu.c 26 Jun 2025 12:17:27 -0000 1.151
> +++ amd64/identcpu.c 23 Jul 2025 07:31:25 -0000
> @@ -831,6 +843,7 @@ cpu_topology(struct cpu_info *ci)
> u_int32_t apicid, max_apicid = 0, max_coreid = 0;
> u_int32_t smt_bits = 0, core_bits, pkg_bits = 0;
> u_int32_t smt_mask = 0, core_mask, pkg_mask = 0;
> + const char *type = NULL;
>
> /* We need at least apicid at CPUID 1 */
> if (ci->ci_cpuid_level < 1)
> @@ -890,20 +903,35 @@ cpu_topology(struct cpu_info *ci)
> ci->ci_smt_id = apicid & smt_mask;
> ci->ci_core_id = (apicid & core_mask) >> smt_bits;
> ci->ci_pkg_id = (apicid & pkg_mask) >> pkg_bits;
> +
> + if (cpuid_level >= 0x1a) {
> + CPUID_LEAF(0x1a, 0, eax, ebx, ecx, edx);
> + switch ((eax >> 24) & 0xff) {
> + case 0x20:
> + type = "efficiency";
> + break;
> + case 0x40:
> + type = "performance";
> + break;
> + }
> + }
> } else
> goto no_topology;
> #ifdef DEBUG
> printf("cpu%d: smt %u, core %u, pkg %u "
> "(apicid 0x%x, max_apicid 0x%x, max_coreid 0x%x, smt_bits 0x%x, smt_mask 0x%x, "
> - "core_bits 0x%x, core_mask 0x%x, pkg_bits 0x%x, pkg_mask 0x%x)\n",
> + "core_bits 0x%x, core_mask 0x%x, pkg_bits 0x%x, pkg_mask 0x%x)",
> ci->ci_cpuid, ci->ci_smt_id, ci->ci_core_id, ci->ci_pkg_id,
> apicid, max_apicid, max_coreid, smt_bits, smt_mask, core_bits,
> core_mask, pkg_bits, pkg_mask);
> #else
> - printf("cpu%d: smt %u, core %u, package %u\n", ci->ci_cpuid,
> + printf("cpu%d: smt %u, core %u, package %u", ci->ci_cpuid,
> ci->ci_smt_id, ci->ci_core_id, ci->ci_pkg_id);
>
> #endif
> + if (type != NULL)
> + printf(", %s core", type);
> + printf("\n");
> return;
> /* We can't map, so consider ci_core_id as ci_cpuid */
> no_topology:
>
print intel core type info in dmesg