@@ -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
659670static 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 ;
@@ -799,7 +817,7 @@ static void intel_detect_tlb(struct cpuinfo_x86 *c)
799817 cpuid (2 , & regs [0 ], & regs [1 ], & regs [2 ], & regs [3 ]);
800818
801819 /* If bit 31 is set, this is an unknown format */
802- for (j = 0 ; j < 3 ; j ++ )
820+ for (j = 0 ; j < 4 ; j ++ )
803821 if (regs [j ] & (1 << 31 ))
804822 regs [j ] = 0 ;
805823
0 commit comments