Author: adrian
Date: Tue Sep  1 05:15:45 2009
New Revision: 196726
URL: http://svn.freebsd.org/changeset/base/196726

Log:
  Merge in the pat_works work from sys/i386/i386/pmap.c - primarily to reduce
  diff size.

Modified:
  head/sys/i386/xen/pmap.c

Modified: head/sys/i386/xen/pmap.c
==============================================================================
--- head/sys/i386/xen/pmap.c    Tue Sep  1 03:44:25 2009        (r196725)
+++ head/sys/i386/xen/pmap.c    Tue Sep  1 05:15:45 2009        (r196726)
@@ -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_p
        }
        
        /* 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. */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to