Mercurial > illumos > illumos-gate
diff usr/src/uts/i86pc/os/cpuid.c @ 6964:3eb8a0c8b90a
6667592 Mismatch between intel_ctab array and processor specification for the cache descriptors
author | vd224797 |
---|---|
date | Thu, 26 Jun 2008 11:54:36 -0700 |
parents | f8848c7acc9e |
children | 5b3b6674ac91 |
line wrap: on
line diff
--- a/usr/src/uts/i86pc/os/cpuid.c Thu Jun 26 11:38:09 2008 -0700 +++ b/usr/src/uts/i86pc/os/cpuid.c Thu Jun 26 11:54:36 2008 -0700 @@ -2932,6 +2932,7 @@ static const char l3_cache_str[] = "l3-cache"; static const char itlb4k_str[] = "itlb-4K"; static const char dtlb4k_str[] = "dtlb-4K"; +static const char itlb2M_str[] = "itlb-2M"; static const char itlb4M_str[] = "itlb-4M"; static const char dtlb4M_str[] = "dtlb-4M"; static const char dtlb24_str[] = "dtlb0-2M-4M"; @@ -2951,7 +2952,14 @@ size_t ct_size; const char *ct_label; } intel_ctab[] = { - /* maintain descending order! */ + /* + * maintain descending order! + * + * Codes ignored - Reason + * ---------------------- + * 40H - intel_cpuid_4_cache_info() disambiguates l2/l3 cache + * f0H/f1H - Currently we do not interpret prefetch size by design + */ { 0xe4, 16, 64, 8*1024*1024, l3_cache_str}, { 0xe3, 16, 64, 4*1024*1024, l3_cache_str}, { 0xe2, 16, 64, 2*1024*1024, l3_cache_str}, @@ -2965,6 +2973,8 @@ { 0xd1, 4, 64, 1*1024*1024, l3_cache_str}, { 0xd0, 4, 64, 512*1024, l3_cache_str}, { 0xca, 4, 0, 512, sh_l2_tlb4k_str}, + { 0xc0, 4, 0, 8, dtlb44_str }, + { 0xba, 4, 0, 64, dtlb4k_str }, { 0xb4, 4, 0, 256, dtlb4k_str }, { 0xb3, 4, 0, 128, dtlb4k_str }, { 0xb2, 4, 0, 64, itlb4k_str }, @@ -2975,6 +2985,7 @@ { 0x84, 8, 32, 1024*1024, l2_cache_str}, { 0x83, 8, 32, 512*1024, l2_cache_str}, { 0x82, 8, 32, 256*1024, l2_cache_str}, + { 0x80, 8, 64, 512*1024, l2_cache_str}, { 0x7f, 2, 64, 512*1024, l2_cache_str}, { 0x7d, 8, 64, 2*1024*1024, sl2_cache_str}, { 0x7c, 8, 64, 1024*1024, sl2_cache_str}, @@ -2994,15 +3005,21 @@ { 0x5c, 0, 0, 128, dtlb44_str}, { 0x5b, 0, 0, 64, dtlb44_str}, { 0x5a, 4, 0, 32, dtlb24_str}, + { 0x59, 0, 0, 16, dtlb4k_str}, + { 0x57, 4, 0, 16, dtlb4k_str}, + { 0x56, 4, 0, 16, dtlb4M_str}, { 0x55, 0, 0, 7, itlb24_str}, { 0x52, 0, 0, 256, itlb424_str}, { 0x51, 0, 0, 128, itlb424_str}, { 0x50, 0, 0, 64, itlb424_str}, + { 0x4f, 0, 0, 32, itlb4k_str}, + { 0x4e, 24, 64, 6*1024*1024, l2_cache_str}, { 0x4d, 16, 64, 16*1024*1024, l3_cache_str}, { 0x4c, 12, 64, 12*1024*1024, l3_cache_str}, { 0x4b, 16, 64, 8*1024*1024, l3_cache_str}, { 0x4a, 12, 64, 6*1024*1024, l3_cache_str}, { 0x49, 16, 64, 4*1024*1024, l3_cache_str}, + { 0x48, 12, 64, 3*1024*1024, l2_cache_str}, { 0x47, 8, 64, 8*1024*1024, l3_cache_str}, { 0x46, 4, 64, 4*1024*1024, l3_cache_str}, { 0x45, 4, 32, 2*1024*1024, l2_cache_str}, @@ -3022,12 +3039,14 @@ { 0x25, 8, 64, 2048*1024, sl3_cache_str}, { 0x23, 8, 64, 1024*1024, sl3_cache_str}, { 0x22, 4, 64, 512*1024, sl3_cache_str}, + { 0x0e, 6, 64, 24*1024, l1_dcache_str}, { 0x0d, 4, 32, 16*1024, l1_dcache_str}, { 0x0c, 4, 32, 16*1024, l1_dcache_str}, { 0x0b, 4, 0, 4, itlb4M_str}, { 0x0a, 2, 32, 8*1024, l1_dcache_str}, { 0x08, 4, 32, 16*1024, l1_icache_str}, { 0x06, 4, 32, 8*1024, l1_icache_str}, + { 0x05, 4, 0, 32, dtlb4M_str}, { 0x04, 4, 0, 8, dtlb4M_str}, { 0x03, 4, 0, 64, dtlb4k_str}, { 0x02, 4, 0, 2, itlb4M_str}, @@ -3102,7 +3121,7 @@ void *arg, int (*func)(void *, const struct cachetab *)) { const struct cachetab *ct; - struct cachetab des_49_ct; + struct cachetab des_49_ct, des_b1_ct; uint8_t *dp; int i; @@ -3113,10 +3132,24 @@ * For overloaded descriptor 0x49 we use cpuid function 4 * if supported by the current processor, to create * cache information. + * For overloaded descriptor 0xb1 we use X86_PAE flag + * to disambiguate the cache information. */ if (*dp == 0x49 && cpi->cpi_maxeax >= 0x4 && intel_cpuid_4_cache_info(&des_49_ct, cpi) == 1) { ct = &des_49_ct; + } else if (*dp == 0xb1) { + des_b1_ct.ct_code = 0xb1; + des_b1_ct.ct_assoc = 4; + des_b1_ct.ct_line_size = 0; + if (x86_feature & X86_PAE) { + des_b1_ct.ct_size = 8; + des_b1_ct.ct_label = itlb2M_str; + } else { + des_b1_ct.ct_size = 4; + des_b1_ct.ct_label = itlb4M_str; + } + ct = &des_b1_ct; } else { if ((ct = find_cacheent(intel_ctab, *dp)) == NULL) { continue;