Module Name:    src
Committed By:   chs
Date:           Sun Dec  4 17:00:10 UTC 2011

Modified Files:
        src/sys/arch/x86/include: cacheinfo.h
        src/usr.sbin/cpuctl/arch: i386.c

Log Message:
add info on L2 TLBs and 1GB pages.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/x86/include/cacheinfo.h
cvs rdiff -u -r1.25 -r1.26 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/sys/arch/x86/include/cacheinfo.h
diff -u src/sys/arch/x86/include/cacheinfo.h:1.12 src/sys/arch/x86/include/cacheinfo.h:1.13
--- src/sys/arch/x86/include/cacheinfo.h:1.12	Wed May 13 23:26:38 2009
+++ src/sys/arch/x86/include/cacheinfo.h	Sun Dec  4 17:00:10 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cacheinfo.h,v 1.12 2009/05/13 23:26:38 pgoyette Exp $	*/
+/*	$NetBSD: cacheinfo.h,v 1.13 2011/12/04 17:00:10 chs Exp $	*/
 
 #ifndef _X86_CACHEINFO_H_
 #define _X86_CACHEINFO_H_
@@ -26,8 +26,12 @@ struct x86_cache_info {
 #define	CAI_L1_1GBDTLB	9		/* L1 1GB Page data TLB */
 #define CAI_L2_1GBITLB	10		/* L2 1GB Page instruction TLB */
 #define CAI_L2_1GBDTLB	11		/* L2 1GB Page data TLB */
+#define CAI_L2_ITLB	12		/* L2 Instruction TLB (4K pages) */
+#define CAI_L2_ITLB2	13		/* L2 Instruction TLB (2/4M pages) */
+#define CAI_L2_DTLB	14		/* L2 Data TLB (4K pages) */
+#define CAI_L2_DTLB2	15		/* L2 Data TLB (2/4M pages) */
 
-#define	CAI_COUNT	12
+#define	CAI_COUNT	16
 
 /*
  * AMD Cache Info:

Index: src/usr.sbin/cpuctl/arch/i386.c
diff -u src/usr.sbin/cpuctl/arch/i386.c:1.25 src/usr.sbin/cpuctl/arch/i386.c:1.26
--- src/usr.sbin/cpuctl/arch/i386.c:1.25	Tue May  3 09:06:22 2011
+++ src/usr.sbin/cpuctl/arch/i386.c	Sun Dec  4 17:00:10 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: i386.c,v 1.25 2011/05/03 09:06:22 jruoho Exp $	*/
+/*	$NetBSD: i386.c,v 1.26 2011/12/04 17:00:10 chs 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.25 2011/05/03 09:06:22 jruoho Exp $");
+__RCSID("$NetBSD: i386.c,v 1.26 2011/12/04 17:00:10 chs Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -182,6 +182,7 @@ static const char * const amd_brand[] = 
 static int cpu_vendor;
 static char cpu_brand_string[49];
 static char amd_brand_name[48];
+static int use_pae, largepagesize;
 
 static void via_cpu_probe(struct cpu_info *);
 static void amd_family6_probe(struct cpu_info *);
@@ -1380,6 +1381,9 @@ identifycpu(const char *cpuname)
 
 	sz = sizeof(ci->ci_tsc_freq);
 	(void)sysctlbyname("machdep.tsc_freq", &ci->ci_tsc_freq, &sz, NULL, 0);
+	sz = sizeof(use_pae);
+	(void)sysctlbyname("machdep.pae", &use_pae, &sz, NULL, 0);
+	largepagesize = (use_pae ? 2 * 1024 * 1024 : 4 * 1024 * 1024);
 
 	snprintf(cpu_model, sizeof(cpu_model), "%s%s%s%s%s%s%s (%s-class)",
 	    vendorname,
@@ -1669,12 +1673,12 @@ amd_cpu_cacheinfo(struct cpu_info *ci)
 		cai = &ci->ci_cinfo[CAI_ITLB2];
 		cai->cai_totalsize = AMD_L1_EAX_ITLB_ENTRIES(descs[0]);
 		cai->cai_associativity = AMD_L1_EAX_ITLB_ASSOC(descs[0]);
-		cai->cai_linesize = (4 * 1024 * 1024);
+		cai->cai_linesize = largepagesize;
 
 		cai = &ci->ci_cinfo[CAI_DTLB2];
 		cai->cai_totalsize = AMD_L1_EAX_DTLB_ENTRIES(descs[0]);
 		cai->cai_associativity = AMD_L1_EAX_DTLB_ASSOC(descs[0]);
-		cai->cai_linesize = (4 * 1024 * 1024);
+		cai->cai_linesize = largepagesize;
 	}
 
 	cai = &ci->ci_cinfo[CAI_ITLB];
@@ -1707,6 +1711,50 @@ amd_cpu_cacheinfo(struct cpu_info *ci)
 
 	x86_cpuid(0x80000006, descs);
 
+	cai = &ci->ci_cinfo[CAI_L2_ITLB];
+	cai->cai_totalsize = AMD_L2_EBX_IUTLB_ENTRIES(descs[1]);
+	cai->cai_associativity = AMD_L2_EBX_IUTLB_ASSOC(descs[1]);
+	cai->cai_linesize = (4 * 1024);
+	cp = cache_info_lookup(amd_cpuid_l2cache_assoc_info,
+	    cai->cai_associativity);
+	if (cp != NULL)
+		cai->cai_associativity = cp->cai_associativity;
+	else
+		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_associativity = AMD_L2_EAX_IUTLB_ASSOC(descs[0]);
+	cai->cai_linesize = largepagesize;
+	cp = cache_info_lookup(amd_cpuid_l2cache_assoc_info,
+	    cai->cai_associativity);
+	if (cp != NULL)
+		cai->cai_associativity = cp->cai_associativity;
+	else
+		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_associativity = AMD_L2_EBX_DTLB_ASSOC(descs[1]);
+	cai->cai_linesize = (4 * 1024);
+	cp = cache_info_lookup(amd_cpuid_l2cache_assoc_info,
+	    cai->cai_associativity);
+	if (cp != NULL)
+		cai->cai_associativity = cp->cai_associativity;
+	else
+		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_associativity = AMD_L2_EAX_DTLB_ASSOC(descs[0]);
+	cai->cai_linesize = largepagesize;
+	cp = cache_info_lookup(amd_cpuid_l2cache_assoc_info,
+	    cai->cai_associativity);
+	if (cp != NULL)
+		cai->cai_associativity = cp->cai_associativity;
+	else
+		cai->cai_associativity = 0;	/* XXX Unknown/reserved */
+
 	cai = &ci->ci_cinfo[CAI_L2CACHE];
 	cai->cai_totalsize = AMD_L2_ECX_C_SIZE(descs[2]);
 	cai->cai_associativity = AMD_L2_ECX_C_ASSOC(descs[2]);
@@ -1735,6 +1783,60 @@ amd_cpu_cacheinfo(struct cpu_info *ci)
 		else
 			cai->cai_associativity = 0;	/* XXX Unkn/Rsvd */
 	}
+
+	/*
+	 * Determine 1GB TLB info.
+	 */
+	if (lfunc < 0x80000019) {
+		/* No 1GB TLB info available. */
+		return;
+	}
+
+	x86_cpuid(0x80000019, descs);
+
+	cai = &ci->ci_cinfo[CAI_L1_1GBITLB];
+	cai->cai_totalsize = AMD_L1_1GB_EAX_IUTLB_ENTRIES(descs[0]);
+	cai->cai_associativity = AMD_L1_1GB_EAX_IUTLB_ASSOC(descs[0]);
+	cai->cai_linesize = (1024 * 1024 * 1024);
+	cp = cache_info_lookup(amd_cpuid_l2cache_assoc_info,
+	    cai->cai_associativity);
+	if (cp != NULL)
+		cai->cai_associativity = cp->cai_associativity;
+	else
+		cai->cai_associativity = 0;	/* XXX Unknown/reserved */
+
+	cai = &ci->ci_cinfo[CAI_L1_1GBDTLB];
+	cai->cai_totalsize = AMD_L1_1GB_EAX_DTLB_ENTRIES(descs[0]);
+	cai->cai_associativity = AMD_L1_1GB_EAX_DTLB_ASSOC(descs[0]);
+	cai->cai_linesize = (1024 * 1024 * 1024);
+	cp = cache_info_lookup(amd_cpuid_l2cache_assoc_info,
+	    cai->cai_associativity);
+	if (cp != NULL)
+		cai->cai_associativity = cp->cai_associativity;
+	else
+		cai->cai_associativity = 0;	/* XXX Unknown/reserved */
+
+	cai = &ci->ci_cinfo[CAI_L2_1GBITLB];
+	cai->cai_totalsize = AMD_L2_1GB_EBX_IUTLB_ENTRIES(descs[1]);
+	cai->cai_associativity = AMD_L2_1GB_EBX_IUTLB_ASSOC(descs[1]);
+	cai->cai_linesize = (1024 * 1024 * 1024);
+	cp = cache_info_lookup(amd_cpuid_l2cache_assoc_info,
+	    cai->cai_associativity);
+	if (cp != NULL)
+		cai->cai_associativity = cp->cai_associativity;
+	else
+		cai->cai_associativity = 0;	/* XXX Unknown/reserved */
+
+	cai = &ci->ci_cinfo[CAI_L2_1GBDTLB];
+	cai->cai_totalsize = AMD_L2_1GB_EBX_DUTLB_ENTRIES(descs[1]);
+	cai->cai_associativity = AMD_L2_1GB_EBX_DUTLB_ASSOC(descs[1]);
+	cai->cai_linesize = (1024 * 1024 * 1024);
+	cp = cache_info_lookup(amd_cpuid_l2cache_assoc_info,
+	    cai->cai_associativity);
+	if (cp != NULL)
+		cai->cai_associativity = cp->cai_associativity;
+	else
+		cai->cai_associativity = 0;	/* XXX Unknown/reserved */
 }
 
 static void
@@ -1832,6 +1934,11 @@ x86_print_cacheinfo(struct cpu_info *ci)
 		if (sep != NULL)
 			aprint_verbose("\n");
 	}
+	if (ci->ci_cinfo[CAI_L3CACHE].cai_totalsize != 0) {
+		sep = print_cache_config(ci, CAI_L3CACHE, "L3 cache", NULL);
+		if (sep != NULL)
+			aprint_verbose("\n");
+	}
 	if (ci->ci_cinfo[CAI_ITLB].cai_totalsize != 0) {
 		sep = print_tlb_config(ci, CAI_ITLB, "ITLB", NULL);
 		sep = print_tlb_config(ci, CAI_ITLB2, NULL, sep);
@@ -1844,8 +1951,35 @@ x86_print_cacheinfo(struct cpu_info *ci)
 		if (sep != NULL)
 			aprint_verbose("\n");
 	}
-	if (ci->ci_cinfo[CAI_L3CACHE].cai_totalsize != 0) {
-		sep = print_cache_config(ci, CAI_L3CACHE, "L3 cache", NULL);
+	if (ci->ci_cinfo[CAI_L2_ITLB].cai_totalsize != 0) {
+		sep = print_tlb_config(ci, CAI_L2_ITLB, "L2 ITLB", NULL);
+		sep = print_tlb_config(ci, CAI_L2_ITLB2, NULL, sep);
+		if (sep != NULL)
+			aprint_verbose("\n");
+	}
+	if (ci->ci_cinfo[CAI_L2_DTLB].cai_totalsize != 0) {
+		sep = print_tlb_config(ci, CAI_L2_DTLB, "L2 DTLB", NULL);
+		sep = print_tlb_config(ci, CAI_L2_DTLB2, NULL, sep);
+		if (sep != NULL)
+			aprint_verbose("\n");
+	}
+	if (ci->ci_cinfo[CAI_L1_1GBITLB].cai_totalsize != 0) {
+		sep = print_tlb_config(ci, CAI_L1_1GBITLB, "L1 1GB page ITLB", NULL);
+		if (sep != NULL)
+			aprint_verbose("\n");
+	}
+	if (ci->ci_cinfo[CAI_L1_1GBDTLB].cai_totalsize != 0) {
+		sep = print_tlb_config(ci, CAI_L1_1GBDTLB, "L1 1GB page DTLB", NULL);
+		if (sep != NULL)
+			aprint_verbose("\n");
+	}
+	if (ci->ci_cinfo[CAI_L2_1GBITLB].cai_totalsize != 0) {
+		sep = print_tlb_config(ci, CAI_L2_1GBITLB, "L2 1GB page ITLB", NULL);
+		if (sep != NULL)
+			aprint_verbose("\n");
+	}
+	if (ci->ci_cinfo[CAI_L2_1GBDTLB].cai_totalsize != 0) {
+		sep = print_tlb_config(ci, CAI_L2_1GBDTLB, "L2 1GB page DTLB", NULL);
 		if (sep != NULL)
 			aprint_verbose("\n");
 	}

Reply via email to