Author: kib Date: Thu Feb 28 19:19:02 2019 New Revision: 344663 URL: https://svnweb.freebsd.org/changeset/base/344663
Log: Invalidate cache for the PDPTE page when using PAE paging but PAT is not supported. According to SDM rev. 69 vol. 3, for PDPTE registers loads: - when PAT is not supported, access to the PDPTE page is performed as UC, see 4.9.1; - when PAT is supported, the access is WB, see 4.9.2. So potentially CPU might load stale memory as PDPTEs if both PAT and self-snoop are not implemented. To be safe, add total local cache flush to pmap_cold() before initial load of cr3, and flush PDPTE page in pmap_pinit(), if PAT is not implemented. Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D19365 Modified: head/sys/i386/i386/pmap.c Modified: head/sys/i386/i386/pmap.c ============================================================================== --- head/sys/i386/i386/pmap.c Thu Feb 28 18:12:14 2019 (r344662) +++ head/sys/i386/i386/pmap.c Thu Feb 28 19:19:02 2019 (r344663) @@ -564,6 +564,8 @@ __CONCAT(PMTYPE, cold)(void) /* Now enable paging */ #ifdef PMAP_PAE_COMP cr3 = (u_int)IdlePDPT; + if ((cpu_feature & CPUID_PAT) == 0) + wbinvd(); #else cr3 = (u_int)IdlePTD; #endif @@ -2040,6 +2042,14 @@ __CONCAT(PMTYPE, pinit)(pmap_t pmap) } pmap_qenter((vm_offset_t)pmap->pm_pdir, pmap->pm_ptdpg, NPGPTD); +#ifdef PMAP_PAE_COMP + if ((cpu_feature & CPUID_PAT) == 0) { + pmap_invalidate_cache_range( + trunc_page((vm_offset_t)pmap->pm_pdpt), + round_page((vm_offset_t)pmap->pm_pdpt + + NPGPTD * sizeof(pdpt_entry_t))); + } +#endif for (i = 0; i < NPGPTD; i++) if ((pmap->pm_ptdpg[i]->flags & PG_ZERO) == 0) _______________________________________________ svn-src-all@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"