On Fri, Jun 24, 2022 at 07:19:47PM +1000, Jonathan Gray wrote: > Rewrite amd64 printing of cache details. > Previously we looked at cpuid 0x80000005 for L1/TLB details > which Intel documents as reserved. > And cpuid 0x80000006 for L2 details. > > Intel also encode cache details in cpuid 4. > AMD have mostly the same encoding with cpuid 0x8000001d > 0x80000005/0x80000006 is used as a fallback in this diff > > The amount of cache visible to the thread is shown > and not which groups of cpus share a particular cache. > In the case of Alder Lake P, P cores have 1.25MB L2, each group of > 4 E cores shares a 2MB L2.
See below. -ml > > cpu0: AMD Ryzen 5 2600X Six-Core Processor, 3593.83 MHz, 17-08-02 > before: > cpu0: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB > 64b/line 8-way L2 cache > cpu0: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative > cpu0: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative > after: > 0x8000001d > cpu0: 32KB 64b/line 8-way D-cache, 64KB 64b/line 4-way I-cache, 512KB > 64b/line 8-way L2 cache, 8MB 64b/line 16-way L3 cache > 0x80000005 / 0x80000006 > cpu0: 32KB 64b/line 8-way D-cache, 64KB 64b/line 4-way I-cache > cpu0: 512KB 64b/line 8-way L2 cache > > cpu0: Intel(R) Core(TM) i7-5600U CPU @ 2.60GHz, 2494.54 MHz, 06-3d-04 > before: > cpu0: 256KB 64b/line 8-way L2 cache > after: > 4 > cpu0: 32KB 64b/line 8-way D-cache, 32KB 64b/line 8-way I-cache, 256KB > 64b/line 8-way L2 cache, 4MB 64b/line 16-way L3 cache > 0x80000005 / 0x80000006 > cpu1: 256KB 64b/line 8-way L2 cache > > cpu0: Intel(R) Core(TM)2 Duo CPU T7250 @ 2.00GHz, 798.17 MHz, 06-0f-0d > before: > cpu0: 2MB 64b/line 8-way L2 cache > after: > 4 > cpu0: 32KB 64b/line 8-way D-cache, 32KB 64b/line 8-way I-cache, 2MB 64b/line > 8-way L2 cache > 0x80000005 / 0x80000006 > cpu0: 2MB 64b/line 8-way L2 cache > > cpu0: 12th Gen Intel(R) Core(TM) i7-1260P, 1995.55 MHz, 06-9a-03 > before: > cpu0: 1MB 64b/line disabled L2 cache > cpu8: 2MB 64b/line 16-way L2 cache > after: > 4 > cpu0: 48KB 64b/line 12-way D-cache, 32KB 64b/line 8-way I-cache, 1MB 64b/line > 10-way L2 cache, 18MB 64b/line 12-way L3 cache > cpu8: 32KB 64b/line 8-way D-cache, 64KB 64b/line 8-way I-cache, 2MB 64b/line > 16-way L2 cache, 18MB 64b/line 12-way L3 cache > 0x80000005 / 0x80000006 > cpu0: 1MB 64b/line L2 cache > cpu8: 2MB 64b/line 16-way L2 cache > > diff --git sys/arch/amd64/amd64/cacheinfo.c sys/arch/amd64/amd64/cacheinfo.c > index 9a672186e9e..a80d1e4f553 100644 > --- sys/arch/amd64/amd64/cacheinfo.c > +++ sys/arch/amd64/amd64/cacheinfo.c > @@ -1,32 +1,19 @@ > /* $OpenBSD: cacheinfo.c,v 1.9 2020/12/22 03:42:03 jsg Exp $ */ > > -/*- > - * Copyright (c) 2000 The NetBSD Foundation, Inc. > - * All rights reserved. > +/* > + * Copyright (c) 2022 Jonathan Gray <j...@openbsd.org> > * > - * This code is derived from software contributed to The NetBSD Foundation > - * by Jason R. Thorpe. > + * Permission to use, copy, modify, and distribute this software for any > + * purpose with or without fee is hereby granted, provided that the above > + * copyright notice and this permission notice appear in all copies. > * > - * Redistribution and use in source and binary forms, with or without > - * modification, are permitted provided that the following conditions > - * are met: > - * 1. Redistributions of source code must retain the above copyright > - * notice, this list of conditions and the following disclaimer. > - * 2. Redistributions in binary form must reproduce the above copyright > - * notice, this list of conditions and the following disclaimer in the > - * documentation and/or other materials provided with the distribution. > - * > - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS > - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > LIMITED > - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR > - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS > - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF > - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS > - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN > - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) > - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > - * POSSIBILITY OF SUCH DAMAGE. > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > */ > > #include <sys/param.h> > @@ -35,232 +22,238 @@ > #include <machine/cpu.h> > #include <machine/specialreg.h> > > -static char *print_cache_config(struct cpu_info *, int, char *, char *); > -static char *print_tlb_config(struct cpu_info *, int, char *, char *); > +void > +amd_cpu_cacheinfo(struct cpu_info *ci) > +{ > + u_int eax, ebx, ecx, edx; > + > + /* used by vmm */ > + If this is the only user of these fields, we can just have vmm(4) issue CPUID on each guest CPUID for these features. I think I was just trying to save some cycles. I'll send out a diff to remove these fields unless you want to tackle it. The diff here is ok mlarkin in any case. > + if (ci->ci_pnfeatset >= 0x80000005) { > + CPUID(0x80000005, eax, ebx, ecx, edx); > + ci->ci_amdcacheinfo[0] = eax; > + ci->ci_amdcacheinfo[1] = ebx; > + ci->ci_amdcacheinfo[2] = ecx; > + ci->ci_amdcacheinfo[3] = edx; > + } > + > + if (ci->ci_pnfeatset >= 0x80000006) { > + CPUID(0x80000006, eax, ebx, ecx, edx); > + ci->ci_extcacheinfo[0] = eax; > + ci->ci_extcacheinfo[1] = ebx; > + ci->ci_extcacheinfo[2] = ecx; > + ci->ci_extcacheinfo[3] = edx; > + } > +} > > -static char * > -print_cache_config(struct cpu_info *ci, int cache_tag, char *name, char *sep) > +void > +amd64_print_l1_cacheinfo(struct cpu_info *ci) > { > - struct x86_cache_info *cai = &ci->ci_cinfo[cache_tag]; > + u_int ways, linesize, totalsize; > + u_int eax, ebx, ecx, edx; > > - if (cai->cai_totalsize == 0) > - return sep; > + if (ci->ci_pnfeatset < 0x80000006) > + return; > > - if (sep == NULL) > - printf("%s: ", ci->ci_dev->dv_xname); > - else > - printf("%s", sep); > + CPUID(0x80000005, eax, ebx, ecx, edx); > + > + if (ecx == 0) > + return; > > - if (cai->cai_string != NULL) > - printf("%s ", cai->cai_string); > - else if (cai->cai_totalsize >= 1024*1024) > - printf("%dMB %db/line ", cai->cai_totalsize / 1024 / 1024, > - cai->cai_linesize); > + /* L1D */ > + linesize = ecx & 0xff; > + ways = (ecx >> 16) & 0xff; > + totalsize = (ecx >> 24) & 0xff; /* KB */ > + > + printf("%s: ", ci->ci_dev->dv_xname); > + > + if (totalsize < 1024) > + printf("%dKB ", totalsize); > else > - printf("%dKB %db/line ", cai->cai_totalsize / 1024, > - cai->cai_linesize); > + printf("%dMB ", totalsize >> 10); > + printf("%db/line ", linesize); > > - switch (cai->cai_associativity) { > - case 0: > - printf("disabled"); > + switch (ways) { > + case 0x00: > + /* reserved */ > break; > - case 1: > + case 0x01: > printf("direct-mapped"); > break; > case 0xff: > printf("fully associative"); > break; > default: > - printf("%d-way", cai->cai_associativity); > + printf("%d-way", ways); > break; > } > + printf(" D-cache, "); > > - if (name != NULL) > - printf(" %s", name); > + /* L1C */ > + linesize = edx & 0xff; > + ways = (edx >> 16) & 0xff; > + totalsize = (edx >> 24) & 0xff; /* KB */ > + > + if (totalsize < 1024) > + printf("%dKB ", totalsize); > + else > + printf("%dMB ", totalsize >> 10); > + printf("%db/line ", linesize); > > - return ", "; > + switch (ways) { > + case 0x00: > + /* reserved */ > + break; > + case 0x01: > + printf("direct-mapped"); > + break; > + case 0xff: > + printf("fully associative"); > + break; > + default: > + printf("%d-way", ways); > + break; > + } > + printf(" I-cache\n"); > } > > -static char * > -print_tlb_config(struct cpu_info *ci, int cache_tag, char *name, char *sep) > +void > +amd64_print_l2_cacheinfo(struct cpu_info *ci) > { > - struct x86_cache_info *cai = &ci->ci_cinfo[cache_tag]; > + u_int ways, linesize, totalsize; > + u_int eax, ebx, ecx, edx; > > - if (cai->cai_totalsize == 0) > - return sep; > + if (ci->ci_pnfeatset < 0x80000006) > + return; > + > + CPUID(0x80000006, eax, ebx, ecx, edx); > + > + if (ecx == 0) > + return; > + > + printf("%s: ", ci->ci_dev->dv_xname); > > - if (sep == NULL) > - printf("%s: ", ci->ci_dev->dv_xname); > + linesize = ecx & 0xff; > + ways = (ecx >> 12) & 0x0f; > + totalsize = ((ecx >> 16) & 0xffff); /* KB */ > + > + if (totalsize < 1024) > + printf("%dKB ", totalsize); > else > - printf("%s", sep); > - if (name != NULL) > - printf("%s ", name); > - > - if (cai->cai_string != NULL) { > - printf("%s", cai->cai_string); > - } else { > - if (cai->cai_linesize >= 1024*1024) > - printf("%d %dMB entries ", cai->cai_totalsize, > - cai->cai_linesize / 1024 / 1024); > - else > - printf("%d %dKB entries ", cai->cai_totalsize, > - cai->cai_linesize / 1024); > - switch (cai->cai_associativity) { > - case 0: > - printf("disabled"); > - break; > - case 1: > - printf("direct-mapped"); > - break; > - case 0xff: > - printf("fully associative"); > - break; > - default: > - printf("%d-way", cai->cai_associativity); > - break; > - } > + printf("%dMB ", totalsize >> 10); > + printf("%db/line ", linesize); > + > + switch (ways) { > + case 0x00: > + printf("disabled"); > + break; > + case 0x01: > + printf("direct-mapped"); > + break; > + case 0x02: > + case 0x04: > + printf("%d-way", ways); > + break; > + case 0x06: > + printf("8-way"); > + break; > + case 0x03: > + case 0x05: > + case 0x09: > + /* reserved */ > + break; > + case 0x07: > + /* see cpuid 4 sub-leaf 2 */ > + break; > + case 0x08: > + printf("16-way"); > + break; > + case 0x0a: > + printf("32-way"); > + break; > + case 0x0c: > + printf("64-way"); > + break; > + case 0x0d: > + printf("96-way"); > + break; > + case 0x0e: > + printf("128-way"); > + break; > + case 0x0f: > + printf("fully associative"); > } > - return ", "; > + > + printf(" L2 cache\n"); > } > > -const struct x86_cache_info * > -cache_info_lookup(const struct x86_cache_info *cai, u_int8_t desc) > +void > +intel_print_cacheinfo(struct cpu_info *ci, u_int fn) > { > - int i; > + u_int ways, partitions, linesize, sets, totalsize; > + int type, level, leaf; > + u_int eax, ebx, ecx, edx; > > - for (i = 0; cai[i].cai_desc != 0; i++) { > - if (cai[i].cai_desc == desc) > - return (&cai[i]); > - } > + printf("%s: ", ci->ci_dev->dv_xname); > > - return (NULL); > -} > + for (leaf = 0; leaf < 10; leaf++) { > + CPUID_LEAF(fn, leaf, eax, ebx, ecx, edx); > + type = eax & 0x1f; > + if (type == 0) > + break; > + level = (eax >> 5) & 7; > + > + ways = (ebx >> 22) + 1; > + linesize = (ebx & 0xfff) + 1; > + partitions = ((ebx >> 12) & 0x3ff) + 1; > + sets = ecx + 1; > > + totalsize = ways * linesize * partitions * sets; > > -static const struct x86_cache_info amd_cpuid_l2cache_assoc_info[] = { > - { 0, 0x01, 1 }, > - { 0, 0x02, 2 }, > - { 0, 0x04, 4 }, > - { 0, 0x06, 8 }, > - { 0, 0x08, 16 }, > - { 0, 0x0a, 32 }, > - { 0, 0x0b, 48 }, > - { 0, 0x0c, 64 }, > - { 0, 0x0d, 96 }, > - { 0, 0x0e, 128 }, > - { 0, 0x0f, 0xff }, > - { 0, 0x00, 0 }, > -}; > + if (leaf > 0) > + printf(", "); > + > + if (totalsize < 1024*1024) > + printf("%dKB ", totalsize >> 10); > + else > + printf("%dMB ", totalsize >> 20); > + printf("%db/line %d-way ", linesize, ways); > + > + if (level == 1) { > + if (type == 1) > + printf("D"); > + else if (type == 2) > + printf("I"); > + else if (type == 3) > + printf("U"); > + printf("-cache"); > + } else { > + printf("L%d cache", level); > + } > + > + } > + printf("\n"); > +} > > void > -amd_cpu_cacheinfo(struct cpu_info *ci) > +x86_print_cacheinfo(struct cpu_info *ci) > { > - const struct x86_cache_info *cp; > - struct x86_cache_info *cai; > - int family, model; > - u_int descs[4]; > - > - family = ci->ci_family; > - model = ci->ci_model; > - > - /* > - * K5 model 0 has none of this info. > - */ > - if (family == 5 && model == 0) > - return; > + uint64_t msr; > > - /* > - * Determine L1 cache/TLB info. > - */ > - if (ci->ci_pnfeatset < 0x80000005) { > - /* No L1 cache info available. */ > + if (strcmp(cpu_vendor, "GenuineIntel") == 0 && > + rdmsr_safe(MSR_MISC_ENABLE, &msr) == 0 && > + (msr & MISC_ENABLE_LIMIT_CPUID_MAXVAL) == 0) { > + intel_print_cacheinfo(ci, 4); > return; > } > > - CPUID(0x80000005, descs[0], descs[1], descs[2], descs[3]); > - ci->ci_amdcacheinfo[0] = descs[0]; > - ci->ci_amdcacheinfo[1] = descs[1]; > - ci->ci_amdcacheinfo[2] = descs[2]; > - ci->ci_amdcacheinfo[3] = descs[3]; > - > - /* > - * K6-III and higher have large page TLBs. > - */ > - if ((family == 5 && model >= 9) || family >= 6) { > - 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 = &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 = &ci->ci_cinfo[CAI_ITLB]; > - cai->cai_totalsize = AMD_L1_EBX_ITLB_ENTRIES(descs[1]); > - cai->cai_associativity = AMD_L1_EBX_ITLB_ASSOC(descs[1]); > - cai->cai_linesize = (4 * 1024); > - > - cai = &ci->ci_cinfo[CAI_DTLB]; > - cai->cai_totalsize = AMD_L1_EBX_DTLB_ENTRIES(descs[1]); > - cai->cai_associativity = AMD_L1_EBX_DTLB_ASSOC(descs[1]); > - cai->cai_linesize = (4 * 1024); > - > - cai = &ci->ci_cinfo[CAI_DCACHE]; > - cai->cai_totalsize = AMD_L1_ECX_DC_SIZE(descs[2]); > - cai->cai_associativity = AMD_L1_ECX_DC_ASSOC(descs[2]); > - cai->cai_linesize = AMD_L1_EDX_IC_LS(descs[2]); > - > - cai = &ci->ci_cinfo[CAI_ICACHE]; > - cai->cai_totalsize = AMD_L1_EDX_IC_SIZE(descs[3]); > - cai->cai_associativity = AMD_L1_EDX_IC_ASSOC(descs[3]); > - cai->cai_linesize = AMD_L1_EDX_IC_LS(descs[3]); > - > - /* > - * Determine L2 cache/TLB info. > - */ > - if (ci->ci_pnfeatset < 0x80000006) { > - /* No L2 cache info available. */ > + if (strcmp(cpu_vendor, "AuthenticAMD") == 0 && > + (ecpu_ecxfeature & CPUIDECX_TOPEXT)) { > + intel_print_cacheinfo(ci, 0x8000001d); > return; > } > > - CPUID(0x80000006, descs[0], descs[1], descs[2], descs[3]); > - ci->ci_extcacheinfo[0] = descs[0]; > - ci->ci_extcacheinfo[1] = descs[1]; > - ci->ci_extcacheinfo[2] = descs[2]; > - ci->ci_extcacheinfo[3] = descs[3]; > - > - 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]); > - cai->cai_linesize = AMD_L2_ECX_C_LS(descs[2]); > - > - 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 */ > -} > - > -void > -x86_print_cacheinfo(struct cpu_info *ci) > -{ > - char *sep; > - > - sep = print_cache_config(ci, CAI_ICACHE, "I-cache", NULL); > - sep = print_cache_config(ci, CAI_DCACHE, "D-cache", sep); > - sep = print_cache_config(ci, CAI_L2CACHE, "L2 cache", sep); > - if (sep != NULL) > - printf("\n"); > - sep = print_tlb_config(ci, CAI_ITLB, "ITLB", NULL); > - sep = print_tlb_config(ci, CAI_ITLB2, NULL, sep); > - if (sep != NULL) > - printf("\n"); > - sep = print_tlb_config(ci, CAI_DTLB, "DTLB", NULL); > - sep = print_tlb_config(ci, CAI_DTLB2, NULL, sep); > - if (sep != NULL) > - printf("\n"); > + /* 0x80000005 / 0x80000006 */ > + amd64_print_l1_cacheinfo(ci); > + amd64_print_l2_cacheinfo(ci); > } > diff --git sys/arch/amd64/include/cacheinfo.h > sys/arch/amd64/include/cacheinfo.h > deleted file mode 100644 > index 3c3323b34f8..00000000000 > --- sys/arch/amd64/include/cacheinfo.h > +++ /dev/null > @@ -1,111 +0,0 @@ > -/* $OpenBSD: cacheinfo.h,v 1.3 2020/12/22 03:42:03 jsg Exp $ */ > -/* $NetBSD: cacheinfo.h,v 1.1 2003/04/25 21:54:30 fvdl Exp $ */ > - > -#ifndef _X86_CACHEINFO_H > -#define _X86_CACHEINFO_H > - > -struct x86_cache_info { > - uint8_t cai_index; > - uint8_t cai_desc; > - uint8_t cai_associativity; > - u_int cai_totalsize; /* #entries for TLB, bytes for cache */ > - u_int cai_linesize; /* or page size for TLB */ > - const char *cai_string; > -}; > - > -#define CAI_ITLB 0 /* Instruction TLB (4K pages) */ > -#define CAI_ITLB2 1 /* Instruction TLB (2/4M pages) > */ > -#define CAI_DTLB 2 /* Data TLB (4K pages) */ > -#define CAI_DTLB2 3 /* Data TLB (2/4M pages) */ > -#define CAI_ICACHE 4 /* Instruction cache */ > -#define CAI_DCACHE 5 /* Data cache */ > -#define CAI_L2CACHE 6 /* Level 2 cache */ > - > -#define CAI_COUNT 7 > - > -struct cpu_info; > - > -const struct x86_cache_info *cache_info_lookup(const struct x86_cache_info *, > - u_int8_t); > -void amd_cpu_cacheinfo(struct cpu_info *); > -void x86_print_cacheinfo(struct cpu_info *); > - > -/* > - * AMD Cache Info: > - * > - * Athlon, Duron: > - * > - * Function 8000.0005 L1 TLB/Cache Information > - * EAX -- L1 TLB 2/4MB pages > - * EBX -- L1 TLB 4K pages > - * ECX -- L1 D-cache > - * EDX -- L1 I-cache > - * > - * Function 8000.0006 L2 TLB/Cache Information > - * EAX -- L2 TLB 2/4MB pages > - * EBX -- L2 TLB 4K pages > - * ECX -- L2 Unified cache > - * EDX -- reserved > - * > - * K5, K6: > - * > - * Function 8000.0005 L1 TLB/Cache Information > - * EAX -- reserved > - * EBX -- TLB 4K pages > - * ECX -- L1 D-cache > - * EDX -- L1 I-cache > - * > - * K6-III: > - * > - * Function 8000.0006 L2 Cache Information > - * EAX -- reserved > - * EBX -- reserved > - * ECX -- L2 Unified cache > - * EDX -- reserved > - */ > - > -/* L1 TLB 2/4MB pages */ > -#define AMD_L1_EAX_DTLB_ASSOC(x) (((x) >> 24) & 0xff) > -#define AMD_L1_EAX_DTLB_ENTRIES(x) (((x) >> 16) & 0xff) > -#define AMD_L1_EAX_ITLB_ASSOC(x) (((x) >> 8) & 0xff) > -#define AMD_L1_EAX_ITLB_ENTRIES(x) ( (x) & 0xff) > - > -/* L1 TLB 4K pages */ > -#define AMD_L1_EBX_DTLB_ASSOC(x) (((x) >> 24) & 0xff) > -#define AMD_L1_EBX_DTLB_ENTRIES(x) (((x) >> 16) & 0xff) > -#define AMD_L1_EBX_ITLB_ASSOC(x) (((x) >> 8) & 0xff) > -#define AMD_L1_EBX_ITLB_ENTRIES(x) ( (x) & 0xff) > - > -/* L1 Data Cache */ > -#define AMD_L1_ECX_DC_SIZE(x) ((((x) >> 24) & 0xff) * 1024) > -#define AMD_L1_ECX_DC_ASSOC(x) (((x) >> 16) & 0xff) > -#define AMD_L1_ECX_DC_LPT(x) (((x) >> 8) & 0xff) > -#define AMD_L1_ECX_DC_LS(x) ( (x) & 0xff) > - > -/* L1 Instruction Cache */ > -#define AMD_L1_EDX_IC_SIZE(x) ((((x) >> 24) & 0xff) * 1024) > -#define AMD_L1_EDX_IC_ASSOC(x) (((x) >> 16) & 0xff) > -#define AMD_L1_EDX_IC_LPT(x) (((x) >> 8) & 0xff) > -#define AMD_L1_EDX_IC_LS(x) ( (x) & 0xff) > - > -/* Note for L2 TLB -- if the upper 16 bits are 0, it is a unified TLB */ > - > -/* L2 TLB 2/4MB pages */ > -#define AMD_L2_EAX_DTLB_ASSOC(x) (((x) >> 28) & 0xf) > -#define AMD_L2_EAX_DTLB_ENTRIES(x) (((x) >> 16) & 0xfff) > -#define AMD_L2_EAX_IUTLB_ASSOC(x) (((x) >> 12) & 0xf) > -#define AMD_L2_EAX_IUTLB_ENTRIES(x) ( (x) & 0xfff) > - > -/* L2 TLB 4K pages */ > -#define AMD_L2_EBX_DTLB_ASSOC(x) (((x) >> 28) & 0xf) > -#define AMD_L2_EBX_DTLB_ENTRIES(x) (((x) >> 16) & 0xfff) > -#define AMD_L2_EBX_IUTLB_ASSOC(x) (((x) >> 12) & 0xf) > -#define AMD_L2_EBX_IUTLB_ENTRIES(x) ( (x) & 0xfff) > - > -/* L2 Cache */ > -#define AMD_L2_ECX_C_SIZE(x) ((((x) >> 16) & 0xffff) * 1024) > -#define AMD_L2_ECX_C_ASSOC(x) (((x) >> 12) & 0xf) > -#define AMD_L2_ECX_C_LPT(x) (((x) >> 8) & 0xf) > -#define AMD_L2_ECX_C_LS(x) ( (x) & 0xff) > - > -#endif /* _X86_CACHEINFO_H */ > diff --git sys/arch/amd64/include/cpu.h sys/arch/amd64/include/cpu.h > index 0bf6cc41900..5c5cd76e06f 100644 > --- sys/arch/amd64/include/cpu.h > +++ sys/arch/amd64/include/cpu.h > @@ -44,7 +44,6 @@ > #ifdef _KERNEL > #include <machine/frame.h> > #include <machine/segments.h> /* USERMODE */ > -#include <machine/cacheinfo.h> > #include <machine/intrdefs.h> > #endif /* _KERNEL */ > > @@ -178,8 +177,6 @@ struct cpu_info { > > int ci_want_resched; > > - struct x86_cache_info ci_cinfo[CAI_COUNT]; > - > struct x86_64_tss *ci_tss; > void *ci_gdt; > > @@ -389,6 +386,10 @@ extern int cpu_meltdown; > extern u_int cpu_mwait_size; > extern u_int cpu_mwait_states; > > +/* cacheinfo.c */ > +void amd_cpu_cacheinfo(struct cpu_info *); > +void x86_print_cacheinfo(struct cpu_info *); > + > /* identcpu.c */ > void identifycpu(struct cpu_info *); > int cpu_amd64speed(int *); >