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");
}