Skip to content

Commit f6bdaab

Browse files
Ahmed S. DarwishIngo Molnar
authored andcommitted
x86/cpu: Properly parse CPUID leaf 0x2 TLB descriptor 0x63
CPUID leaf 0x2's one-byte TLB descriptors report the number of entries for specific TLB types, among other properties. Typically, each emitted descriptor implies the same number of entries for its respective TLB type(s). An emitted 0x63 descriptor is an exception: it implies 4 data TLB entries for 1GB pages and 32 data TLB entries for 2MB or 4MB pages. For the TLB descriptors parsing code, the entry count for 1GB pages is encoded at the intel_tlb_table[] mapping, but the 2MB/4MB entry count is totally ignored. Update leaf 0x2's parsing logic 0x2 to account for 32 data TLB entries for 2MB/4MB pages implied by the 0x63 descriptor. Fixes: e0ba94f ("x86/tlb_info: get last level TLB entry number of CPU") Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de> Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: stable@kernel.org Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Link: https://lore.kernel.org/r/20250304085152.51092-4-darwi@linutronix.de
1 parent 1881148 commit f6bdaab

File tree

1 file changed

+34
-16
lines changed

1 file changed

+34
-16
lines changed

arch/x86/kernel/cpu/intel.c

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -635,26 +635,37 @@ static unsigned int intel_size_cache(struct cpuinfo_x86 *c, unsigned int size)
635635
}
636636
#endif
637637

638-
#define TLB_INST_4K 0x01
639-
#define TLB_INST_4M 0x02
640-
#define TLB_INST_2M_4M 0x03
638+
#define TLB_INST_4K 0x01
639+
#define TLB_INST_4M 0x02
640+
#define TLB_INST_2M_4M 0x03
641641

642-
#define TLB_INST_ALL 0x05
643-
#define TLB_INST_1G 0x06
642+
#define TLB_INST_ALL 0x05
643+
#define TLB_INST_1G 0x06
644644

645-
#define TLB_DATA_4K 0x11
646-
#define TLB_DATA_4M 0x12
647-
#define TLB_DATA_2M_4M 0x13
648-
#define TLB_DATA_4K_4M 0x14
645+
#define TLB_DATA_4K 0x11
646+
#define TLB_DATA_4M 0x12
647+
#define TLB_DATA_2M_4M 0x13
648+
#define TLB_DATA_4K_4M 0x14
649649

650-
#define TLB_DATA_1G 0x16
650+
#define TLB_DATA_1G 0x16
651+
#define TLB_DATA_1G_2M_4M 0x17
651652

652-
#define TLB_DATA0_4K 0x21
653-
#define TLB_DATA0_4M 0x22
654-
#define TLB_DATA0_2M_4M 0x23
653+
#define TLB_DATA0_4K 0x21
654+
#define TLB_DATA0_4M 0x22
655+
#define TLB_DATA0_2M_4M 0x23
655656

656-
#define STLB_4K 0x41
657-
#define STLB_4K_2M 0x42
657+
#define STLB_4K 0x41
658+
#define STLB_4K_2M 0x42
659+
660+
/*
661+
* All of leaf 0x2's one-byte TLB descriptors implies the same number of
662+
* entries for their respective TLB types. The 0x63 descriptor is an
663+
* exception: it implies 4 dTLB entries for 1GB pages 32 dTLB entries
664+
* for 2MB or 4MB pages. Encode descriptor 0x63 dTLB entry count for
665+
* 2MB/4MB pages here, as its count for dTLB 1GB pages is already at the
666+
* intel_tlb_table[] mapping.
667+
*/
668+
#define TLB_0x63_2M_4M_ENTRIES 32
658669

659670
static const struct _tlb_table intel_tlb_table[] = {
660671
{ 0x01, TLB_INST_4K, 32, " TLB_INST 4 KByte pages, 4-way set associative" },
@@ -676,7 +687,8 @@ static const struct _tlb_table intel_tlb_table[] = {
676687
{ 0x5c, TLB_DATA_4K_4M, 128, " TLB_DATA 4 KByte and 4 MByte pages" },
677688
{ 0x5d, TLB_DATA_4K_4M, 256, " TLB_DATA 4 KByte and 4 MByte pages" },
678689
{ 0x61, TLB_INST_4K, 48, " TLB_INST 4 KByte pages, full associative" },
679-
{ 0x63, TLB_DATA_1G, 4, " TLB_DATA 1 GByte pages, 4-way set associative" },
690+
{ 0x63, TLB_DATA_1G_2M_4M, 4, " TLB_DATA 1 GByte pages, 4-way set associative"
691+
" (plus 32 entries TLB_DATA 2 MByte or 4 MByte pages, not encoded here)" },
680692
{ 0x6b, TLB_DATA_4K, 256, " TLB_DATA 4 KByte pages, 8-way associative" },
681693
{ 0x6c, TLB_DATA_2M_4M, 128, " TLB_DATA 2 MByte or 4 MByte pages, 8-way associative" },
682694
{ 0x6d, TLB_DATA_1G, 16, " TLB_DATA 1 GByte pages, fully associative" },
@@ -776,6 +788,12 @@ static void intel_tlb_lookup(const unsigned char desc)
776788
if (tlb_lld_4m[ENTRIES] < intel_tlb_table[k].entries)
777789
tlb_lld_4m[ENTRIES] = intel_tlb_table[k].entries;
778790
break;
791+
case TLB_DATA_1G_2M_4M:
792+
if (tlb_lld_2m[ENTRIES] < TLB_0x63_2M_4M_ENTRIES)
793+
tlb_lld_2m[ENTRIES] = TLB_0x63_2M_4M_ENTRIES;
794+
if (tlb_lld_4m[ENTRIES] < TLB_0x63_2M_4M_ENTRIES)
795+
tlb_lld_4m[ENTRIES] = TLB_0x63_2M_4M_ENTRIES;
796+
fallthrough;
779797
case TLB_DATA_1G:
780798
if (tlb_lld_1g[ENTRIES] < intel_tlb_table[k].entries)
781799
tlb_lld_1g[ENTRIES] = intel_tlb_table[k].entries;

0 commit comments

Comments
 (0)