Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Feb 2015 16:50:01 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r278389 - head/sys/powerpc/pseries
Message-ID:  <201502081650.t18Go1W8079148@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201502081650.t18Go1W8079148>