Module Name: src Committed By: msaitoh Date: Sat Oct 19 16:32:43 UTC 2024
Modified Files: src/usr.sbin/cpuctl/arch: i386.c Log Message: cpuctl(x86): Calculate L2 TLB size using with CPUID_AMDEXT2_L2TLBSIZEX32. It's required to calculate L2 TLB size correctly on Zen5. To generate a diff of this commit: cvs rdiff -u -r1.145 -r1.146 src/usr.sbin/cpuctl/arch/i386.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/cpuctl/arch/i386.c diff -u src/usr.sbin/cpuctl/arch/i386.c:1.145 src/usr.sbin/cpuctl/arch/i386.c:1.146 --- src/usr.sbin/cpuctl/arch/i386.c:1.145 Sat Oct 19 06:36:38 2024 +++ src/usr.sbin/cpuctl/arch/i386.c Sat Oct 19 16:32:43 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: i386.c,v 1.145 2024/10/19 06:36:38 msaitoh Exp $ */ +/* $NetBSD: i386.c,v 1.146 2024/10/19 16:32:43 msaitoh Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: i386.c,v 1.145 2024/10/19 06:36:38 msaitoh Exp $"); +__RCSID("$NetBSD: i386.c,v 1.146 2024/10/19 16:32:43 msaitoh Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -1186,6 +1186,7 @@ amd_cpu_cacheinfo(struct cpu_info *ci) struct x86_cache_info *cai; u_int descs[4]; u_int lfunc; + bool l2tlbx32 = false; /* K5 model 0 has none of this info. */ if (ci->ci_family == 5 && ci->ci_model == 0) @@ -1238,10 +1239,15 @@ amd_cpu_cacheinfo(struct cpu_info *ci) return; /* Determine L2 cache/TLB info. */ + if (lfunc >= 0x80000021) { + x86_cpuid(0x80000021, descs); + l2tlbx32 = descs[0] & CPUID_AMDEXT2_L2TLBSIZEX32; + } x86_cpuid(0x80000006, descs); cai = &ci->ci_cinfo[CAI_L2_ITLB]; - cai->cai_totalsize = AMD_L2_EBX_IUTLB_ENTRIES(descs[1]); + cai->cai_totalsize = + AMD_L2_EBX_IUTLB_ENTRIES(descs[1]) * (l2tlbx32 ? 32 : 1); cai->cai_associativity = AMD_L2_EBX_IUTLB_ASSOC(descs[1]); cai->cai_linesize = (4 * 1024); cp = cpu_cacheinfo_lookup(amd_cpuid_l2l3cache_assoc_info, @@ -1252,7 +1258,8 @@ amd_cpu_cacheinfo(struct cpu_info *ci) cai->cai_associativity = 0; /* XXX Unknown/reserved */ cai = &ci->ci_cinfo[CAI_L2_ITLB2]; - cai->cai_totalsize = AMD_L2_EAX_IUTLB_ENTRIES(descs[0]); + cai->cai_totalsize = + AMD_L2_EAX_IUTLB_ENTRIES(descs[0]) * (l2tlbx32 ? 32 : 1); cai->cai_associativity = AMD_L2_EAX_IUTLB_ASSOC(descs[0]); cai->cai_linesize = largepagesize; cp = cpu_cacheinfo_lookup(amd_cpuid_l2l3cache_assoc_info, @@ -1263,7 +1270,8 @@ amd_cpu_cacheinfo(struct cpu_info *ci) cai->cai_associativity = 0; /* XXX Unknown/reserved */ cai = &ci->ci_cinfo[CAI_L2_DTLB]; - cai->cai_totalsize = AMD_L2_EBX_DTLB_ENTRIES(descs[1]); + cai->cai_totalsize = + AMD_L2_EBX_DTLB_ENTRIES(descs[1]) * (l2tlbx32 ? 32 : 1); cai->cai_associativity = AMD_L2_EBX_DTLB_ASSOC(descs[1]); cai->cai_linesize = (4 * 1024); cp = cpu_cacheinfo_lookup(amd_cpuid_l2l3cache_assoc_info, @@ -1274,7 +1282,8 @@ amd_cpu_cacheinfo(struct cpu_info *ci) cai->cai_associativity = 0; /* XXX Unknown/reserved */ cai = &ci->ci_cinfo[CAI_L2_DTLB2]; - cai->cai_totalsize = AMD_L2_EAX_DTLB_ENTRIES(descs[0]); + cai->cai_totalsize = + AMD_L2_EAX_DTLB_ENTRIES(descs[0]) * (l2tlbx32 ? 32 : 1); cai->cai_associativity = AMD_L2_EAX_DTLB_ASSOC(descs[0]); cai->cai_linesize = largepagesize; cp = cpu_cacheinfo_lookup(amd_cpuid_l2l3cache_assoc_info,