mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-03 09:00:21 +00:00
Merge in the pat_works work from sys/i386/i386/pmap.c - primarily to reduce
diff size.
This commit is contained in:
parent
f8d44dbb74
commit
fa52c6106b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=196726
@ -223,6 +223,8 @@ static uma_zone_t pdptzone;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static int pat_works; /* Is page attribute table sane? */
|
||||
|
||||
/*
|
||||
* Data for the pv entry allocation mechanism
|
||||
*/
|
||||
@ -514,33 +516,36 @@ pmap_init_pat(void)
|
||||
if (!(cpu_feature & CPUID_PAT))
|
||||
return;
|
||||
|
||||
#ifdef PAT_WORKS
|
||||
/*
|
||||
* Leave the indices 0-3 at the default of WB, WT, UC, and UC-.
|
||||
* Program 4 and 5 as WP and WC.
|
||||
* Leave 6 and 7 as UC and UC-.
|
||||
*/
|
||||
pat_msr = rdmsr(MSR_PAT);
|
||||
pat_msr &= ~(PAT_MASK(4) | PAT_MASK(5));
|
||||
pat_msr |= PAT_VALUE(4, PAT_WRITE_PROTECTED) |
|
||||
PAT_VALUE(5, PAT_WRITE_COMBINING);
|
||||
#else
|
||||
/*
|
||||
* Due to some Intel errata, we can only safely use the lower 4
|
||||
* PAT entries. Thus, just replace PAT Index 2 with WC instead
|
||||
* of UC-.
|
||||
*
|
||||
* Intel Pentium III Processor Specification Update
|
||||
* Errata E.27 (Upper Four PAT Entries Not Usable With Mode B
|
||||
* or Mode C Paging)
|
||||
*
|
||||
* Intel Pentium IV Processor Specification Update
|
||||
* Errata N46 (PAT Index MSB May Be Calculated Incorrectly)
|
||||
*/
|
||||
pat_msr = rdmsr(MSR_PAT);
|
||||
pat_msr &= ~PAT_MASK(2);
|
||||
pat_msr |= PAT_VALUE(2, PAT_WRITE_COMBINING);
|
||||
#endif
|
||||
if (cpu_vendor_id != CPU_VENDOR_INTEL ||
|
||||
(I386_CPU_FAMILY(cpu_id) == 6 && I386_CPU_MODEL(cpu_id) >= 0xe)) {
|
||||
/*
|
||||
* Leave the indices 0-3 at the default of WB, WT, UC, and UC-.
|
||||
* Program 4 and 5 as WP and WC.
|
||||
* Leave 6 and 7 as UC and UC-.
|
||||
*/
|
||||
pat_msr = rdmsr(MSR_PAT);
|
||||
pat_msr &= ~(PAT_MASK(4) | PAT_MASK(5));
|
||||
pat_msr |= PAT_VALUE(4, PAT_WRITE_PROTECTED) |
|
||||
PAT_VALUE(5, PAT_WRITE_COMBINING);
|
||||
pat_works = 1;
|
||||
} else {
|
||||
/*
|
||||
* Due to some Intel errata, we can only safely use the lower 4
|
||||
* PAT entries. Thus, just replace PAT Index 2 with WC instead
|
||||
* of UC-.
|
||||
*
|
||||
* Intel Pentium III Processor Specification Update
|
||||
* Errata E.27 (Upper Four PAT Entries Not Usable With Mode B
|
||||
* or Mode C Paging)
|
||||
*
|
||||
* Intel Pentium IV Processor Specification Update
|
||||
* Errata N46 (PAT Index MSB May Be Calculated Incorrectly)
|
||||
*/
|
||||
pat_msr = rdmsr(MSR_PAT);
|
||||
pat_msr &= ~PAT_MASK(2);
|
||||
pat_msr |= PAT_VALUE(2, PAT_WRITE_COMBINING);
|
||||
pat_works = 0;
|
||||
}
|
||||
wrmsr(MSR_PAT, pat_msr);
|
||||
}
|
||||
|
||||
@ -769,44 +774,48 @@ pmap_cache_bits(int mode, boolean_t is_pde)
|
||||
}
|
||||
|
||||
/* Map the caching mode to a PAT index. */
|
||||
switch (mode) {
|
||||
#ifdef PAT_WORKS
|
||||
case PAT_UNCACHEABLE:
|
||||
pat_index = 3;
|
||||
break;
|
||||
case PAT_WRITE_THROUGH:
|
||||
pat_index = 1;
|
||||
break;
|
||||
case PAT_WRITE_BACK:
|
||||
pat_index = 0;
|
||||
break;
|
||||
case PAT_UNCACHED:
|
||||
pat_index = 2;
|
||||
break;
|
||||
case PAT_WRITE_COMBINING:
|
||||
pat_index = 5;
|
||||
break;
|
||||
case PAT_WRITE_PROTECTED:
|
||||
pat_index = 4;
|
||||
break;
|
||||
#else
|
||||
case PAT_UNCACHED:
|
||||
case PAT_UNCACHEABLE:
|
||||
case PAT_WRITE_PROTECTED:
|
||||
pat_index = 3;
|
||||
break;
|
||||
case PAT_WRITE_THROUGH:
|
||||
pat_index = 1;
|
||||
break;
|
||||
case PAT_WRITE_BACK:
|
||||
pat_index = 0;
|
||||
break;
|
||||
case PAT_WRITE_COMBINING:
|
||||
pat_index = 2;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
panic("Unknown caching mode %d\n", mode);
|
||||
if (pat_works) {
|
||||
switch (mode) {
|
||||
case PAT_UNCACHEABLE:
|
||||
pat_index = 3;
|
||||
break;
|
||||
case PAT_WRITE_THROUGH:
|
||||
pat_index = 1;
|
||||
break;
|
||||
case PAT_WRITE_BACK:
|
||||
pat_index = 0;
|
||||
break;
|
||||
case PAT_UNCACHED:
|
||||
pat_index = 2;
|
||||
break;
|
||||
case PAT_WRITE_COMBINING:
|
||||
pat_index = 5;
|
||||
break;
|
||||
case PAT_WRITE_PROTECTED:
|
||||
pat_index = 4;
|
||||
break;
|
||||
default:
|
||||
panic("Unknown caching mode %d\n", mode);
|
||||
}
|
||||
} else {
|
||||
switch (mode) {
|
||||
case PAT_UNCACHED:
|
||||
case PAT_UNCACHEABLE:
|
||||
case PAT_WRITE_PROTECTED:
|
||||
pat_index = 3;
|
||||
break;
|
||||
case PAT_WRITE_THROUGH:
|
||||
pat_index = 1;
|
||||
break;
|
||||
case PAT_WRITE_BACK:
|
||||
pat_index = 0;
|
||||
break;
|
||||
case PAT_WRITE_COMBINING:
|
||||
pat_index = 2;
|
||||
break;
|
||||
default:
|
||||
panic("Unknown caching mode %d\n", mode);
|
||||
}
|
||||
}
|
||||
|
||||
/* Map the 3-bit index value into the PAT, PCD, and PWT bits. */
|
||||
|
Loading…
Reference in New Issue
Block a user