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,

Reply via email to