Author: nwhitehorn
Date: Sun Feb  8 16:50:00 2015
New Revision: 278389
URL: https://svnweb.freebsd.org/changeset/base/278389

Log:
  Add some error checking on the supplied page size list. This makes sure
  that we (a) get the correct large page size to provide to pmap and (b)
  we can alert the user if running under incorrectly-configured PowerKVM
  on POWER7 and POWER8 systems.
  
  MFC after:    1 week

Modified:
  head/sys/powerpc/pseries/mmu_phyp.c

Modified: head/sys/powerpc/pseries/mmu_phyp.c
==============================================================================
--- head/sys/powerpc/pseries/mmu_phyp.c Sun Feb  8 16:30:44 2015        
(r278388)
+++ head/sys/powerpc/pseries/mmu_phyp.c Sun Feb  8 16:50:00 2015        
(r278389)
@@ -102,6 +102,7 @@ mphyp_bootstrap(mmu_t mmup, vm_offset_t 
        char buf[8];
        uint32_t prop[2];
        uint32_t nptlp, shift = 0, slb_encoding = 0;
+       uint32_t lp_size, lp_encoding;
        phandle_t dev, node, root;
        int idx, len, res;
 
@@ -148,9 +149,9 @@ mphyp_bootstrap(mmu_t mmup, vm_offset_t 
                 * We have to use a variable length array on the stack
                 * since we have very limited stack space.
                 */
-               cell_t arr[len/sizeof(cell_t)];
-               res = OF_getprop(node, "ibm,segment-page-sizes", &arr,
-                                sizeof(arr));
+               pcell_t arr[len/sizeof(cell_t)];
+               res = OF_getencprop(node, "ibm,segment-page-sizes", arr,
+                   sizeof(arr));
                len /= 4;
                idx = 0;
                while (len > 0) {
@@ -160,18 +161,26 @@ mphyp_bootstrap(mmu_t mmup, vm_offset_t 
                        idx += 3;
                        len -= 3;
                        while (len > 0 && nptlp) {
+                               lp_size = arr[idx];
+                               lp_encoding = arr[idx+1];
+                               if (slb_encoding == SLBV_L && lp_encoding == 0)
+                                       break;
+
                                idx += 2;
                                len -= 2;
                                nptlp--;
                        }
+                       if (nptlp && slb_encoding == SLBV_L && lp_encoding == 0)
+                               break;
                }
 
-               /* For now we allow shift only to be <= 0x18. */
-               if (shift >= 0x18)
-                   shift = 0x18;
+               if (len == 0)
+                       panic("Standard large pages (SLB[L] = 1, PTE[LP] = 0) "
+                           "not supported by this system. Please enable huge "
+                           "page backing if running under PowerKVM.");
 
                moea64_large_page_shift = shift;
-               moea64_large_page_size = 1ULL << shift;
+               moea64_large_page_size = 1ULL << lp_size;
        }
 
        moea64_mid_bootstrap(mmup, kernelstart, kernelend);
_______________________________________________
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