svn commit: r292680 - in head/sys: powerpc/booke powerpc/include powerpc/ofw powerpc/powerpc sys

Justin Hibbits jhibbits at FreeBSD.org
Thu Dec 24 04:30:17 UTC 2015


Author: jhibbits
Date: Thu Dec 24 04:30:15 2015
New Revision: 292680
URL: https://svnweb.freebsd.org/changeset/base/292680

Log:
  Extend Book-E to support >4GB RAM
  
  Summary:
  With some additional changes for AIM, that could also support much
  larger physmem sizes.  Given that 32-bit AIM is more or less obsolete, though,
  it's not worth it at this time.
  
  Differential Revision: https://reviews.freebsd.org/D4345

Modified:
  head/sys/powerpc/booke/pmap.c
  head/sys/powerpc/include/param.h
  head/sys/powerpc/include/platform.h
  head/sys/powerpc/include/pmap.h
  head/sys/powerpc/ofw/ofw_machdep.c
  head/sys/powerpc/powerpc/machdep.c
  head/sys/powerpc/powerpc/platform.c
  head/sys/powerpc/powerpc/pmap_dispatch.c
  head/sys/sys/libkern.h

Modified: head/sys/powerpc/booke/pmap.c
==============================================================================
--- head/sys/powerpc/booke/pmap.c	Thu Dec 24 02:35:59 2015	(r292679)
+++ head/sys/powerpc/booke/pmap.c	Thu Dec 24 04:30:15 2015	(r292680)
@@ -1024,12 +1024,13 @@ pte_find(mmu_t mmu, pmap_t pmap, vm_offs
 static void
 mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend)
 {
-	vm_offset_t phys_kernelend;
+	vm_paddr_t phys_kernelend;
 	struct mem_region *mp, *mp1;
 	int cnt, i, j;
-	u_int s, e, sz;
+	vm_paddr_t s, e, sz;
+	vm_paddr_t physsz, hwphyssz;
 	u_int phys_avail_count;
-	vm_size_t physsz, hwphyssz, kstack0_sz;
+	vm_size_t kstack0_sz;
 	vm_offset_t kernel_pdir, kstack0, va;
 	vm_paddr_t kstack0_phys;
 	void *dpcpu;
@@ -1163,7 +1164,7 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset
 	for (mp = availmem_regions; mp->mr_size; mp++) {
 		s = mp->mr_start;
 		e = mp->mr_start + mp->mr_size;
-		debugf(" %08x-%08x -> ", s, e);
+		debugf(" %09jx-%09jx -> ", (uintmax_t)s, (uintmax_t)e);
 		/* Check whether this region holds all of the kernel. */
 		if (s < kernload && e > phys_kernelend) {
 			availmem_regions[cnt].mr_start = phys_kernelend;
@@ -1188,7 +1189,8 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset
 		if (e < s)
 			e = s;
 		sz = e - s;
-		debugf("%08x-%08x = %x\n", s, e, sz);
+		debugf("%09jx-%09jx = %jx\n",
+		    (uintmax_t)s, (uintmax_t)e, (uintmax_t)sz);
 
 		/* Check whether some memory is left here. */
 		if (sz == 0) {
@@ -1237,10 +1239,10 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset
 	for (i = 0, j = 0; i < availmem_regions_sz; i++, j += 2) {
 
 		debugf(" region: 0x%jx - 0x%jx (0x%jx)\n",
-		    availmem_regions[i].mr_start,
-		    availmem_regions[i].mr_start +
+		    (uintmax_t)availmem_regions[i].mr_start,
+		    (uintmax_t)availmem_regions[i].mr_start +
 		        availmem_regions[i].mr_size,
-		    availmem_regions[i].mr_size);
+		    (uintmax_t)availmem_regions[i].mr_size);
 
 		if (hwphyssz != 0 &&
 		    (physsz + availmem_regions[i].mr_size) >= hwphyssz) {

Modified: head/sys/powerpc/include/param.h
==============================================================================
--- head/sys/powerpc/include/param.h	Thu Dec 24 02:35:59 2015	(r292679)
+++ head/sys/powerpc/include/param.h	Thu Dec 24 04:30:15 2015	(r292680)
@@ -98,7 +98,7 @@
 
 #define	PAGE_SHIFT	12
 #define	PAGE_SIZE	(1L << PAGE_SHIFT)	/* Page size */
-#define	PAGE_MASK	(vm_offset_t)(PAGE_SIZE - 1)
+#define	PAGE_MASK	(PAGE_SIZE - 1)
 #define	NPTEPG		(PAGE_SIZE/(sizeof (pt_entry_t)))
 
 #define	MAXPAGESIZES	1		/* maximum number of supported page sizes */
@@ -116,15 +116,17 @@
 /*
  * Mach derived conversion macros
  */
-#define	trunc_page(x)		((unsigned long)(x) & ~(PAGE_MASK))
+#define	trunc_page(x)		((x) & ~(PAGE_MASK))
 #define	round_page(x)		(((x) + PAGE_MASK) & ~PAGE_MASK)
 
-#define	atop(x)			((unsigned long)(x) >> PAGE_SHIFT)
-#define	ptoa(x)			((unsigned long)(x) << PAGE_SHIFT)
+#define	atop(x)			((x) >> PAGE_SHIFT)
+#define	ptoa(x)			((x) << PAGE_SHIFT)
 
-#define	powerpc_btop(x)		((unsigned long)(x) >> PAGE_SHIFT)
-#define	powerpc_ptob(x)		((unsigned long)(x) << PAGE_SHIFT)
+#define	powerpc_btop(x)		((x) >> PAGE_SHIFT)
+#define	powerpc_ptob(x)		((x) << PAGE_SHIFT)
 
 #define	pgtok(x)		((x) * (PAGE_SIZE / 1024UL))
 
+#define btoc(x)			((vm_offset_t)(((x)+PAGE_MASK)>>PAGE_SHIFT))
+
 #endif /* !_POWERPC_INCLUDE_PARAM_H_ */

Modified: head/sys/powerpc/include/platform.h
==============================================================================
--- head/sys/powerpc/include/platform.h	Thu Dec 24 02:35:59 2015	(r292679)
+++ head/sys/powerpc/include/platform.h	Thu Dec 24 04:30:15 2015	(r292680)
@@ -39,8 +39,8 @@
 #include <machine/pcpu.h>
 
 struct mem_region {
-	vm_offset_t	mr_start;
-	vm_size_t	mr_size;
+	uint64_t	mr_start;
+	uint64_t	mr_size;
 };
 
 void	mem_regions(struct mem_region **, int *, struct mem_region **, int *);

Modified: head/sys/powerpc/include/pmap.h
==============================================================================
--- head/sys/powerpc/include/pmap.h	Thu Dec 24 02:35:59 2015	(r292679)
+++ head/sys/powerpc/include/pmap.h	Thu Dec 24 04:30:15 2015	(r292680)
@@ -250,7 +250,7 @@ boolean_t	pmap_mmu_install(char *name, i
 				 * For more Ram increase the lmb or this value.
 				 */
 
-extern	vm_offset_t phys_avail[PHYS_AVAIL_SZ];
+extern	vm_paddr_t phys_avail[PHYS_AVAIL_SZ];
 extern	vm_offset_t virtual_avail;
 extern	vm_offset_t virtual_end;
 

Modified: head/sys/powerpc/ofw/ofw_machdep.c
==============================================================================
--- head/sys/powerpc/ofw/ofw_machdep.c	Thu Dec 24 02:35:59 2015	(r292679)
+++ head/sys/powerpc/ofw/ofw_machdep.c	Thu Dec 24 04:30:15 2015	(r292680)
@@ -172,8 +172,8 @@ parse_ofw_memory(phandle_t node, const c
 	i = 0;
 	j = 0;
 	while (i < sz/sizeof(cell_t)) {
-	      #ifndef __powerpc64__
-		/* On 32-bit PPC, ignore regions starting above 4 GB */
+	      #if !defined(__powerpc64__) && !defined(BOOKE)
+		/* On 32-bit PPC (OEA), ignore regions starting above 4 GB */
 		if (address_cells > 1 && OFmem[i] > 0) {
 			i += address_cells + size_cells;
 			continue;
@@ -182,21 +182,18 @@ parse_ofw_memory(phandle_t node, const c
 
 		output[j].mr_start = OFmem[i++];
 		if (address_cells == 2) {
-			#ifdef __powerpc64__
 			output[j].mr_start <<= 32;
-			#endif
 			output[j].mr_start += OFmem[i++];
 		}
 			
 		output[j].mr_size = OFmem[i++];
 		if (size_cells == 2) {
-			#ifdef __powerpc64__
 			output[j].mr_size <<= 32;
-			#endif
 			output[j].mr_size += OFmem[i++];
 		}
 
-	      #ifndef __powerpc64__
+	      #if !defined(__powerpc64__) && !defined(BOOKE)
+		/* Book-E can support 36-bit addresses. */
 		/*
 		 * Check for memory regions extending above 32-bit
 		 * memory space, and restrict them to stay there.

Modified: head/sys/powerpc/powerpc/machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/machdep.c	Thu Dec 24 02:35:59 2015	(r292679)
+++ head/sys/powerpc/powerpc/machdep.c	Thu Dec 24 04:30:15 2015	(r292680)
@@ -176,8 +176,8 @@ cpu_startup(void *dummy)
 #ifdef PERFMON
 	perfmon_init();
 #endif
-	printf("real memory  = %lu (%lu MB)\n", ptoa(physmem),
-	    ptoa(physmem) / 1048576);
+	printf("real memory  = %ju (%ju MB)\n", ptoa((uintmax_t)physmem),
+	    ptoa((uintmax_t)physmem) / 1048576);
 	realmem = physmem;
 
 	if (bootverbose)
@@ -193,23 +193,25 @@ cpu_startup(void *dummy)
 
 		printf("Physical memory chunk(s):\n");
 		for (indx = 0; phys_avail[indx + 1] != 0; indx += 2) {
-			vm_offset_t size1 =
+			vm_paddr_t size1 =
 			    phys_avail[indx + 1] - phys_avail[indx];
 
 			#ifdef __powerpc64__
-			printf("0x%016lx - 0x%016lx, %ld bytes (%ld pages)\n",
+			printf("0x%016jx - 0x%016jx, %jd bytes (%jd pages)\n",
 			#else
-			printf("0x%08x - 0x%08x, %u bytes (%lu pages)\n",
+			printf("0x%09jx - 0x%09jx, %ju bytes (%ju pages)\n",
 			#endif
-			    phys_avail[indx], phys_avail[indx + 1] - 1, size1,
-			    size1 / PAGE_SIZE);
+			    (uintmax_t)phys_avail[indx],
+			    (uintmax_t)phys_avail[indx + 1] - 1,
+			    (uintmax_t)size1, (uintmax_t)size1 / PAGE_SIZE);
 		}
 	}
 
 	vm_ksubmap_init(&kmi);
 
-	printf("avail memory = %lu (%lu MB)\n", ptoa(vm_cnt.v_free_count),
-	    ptoa(vm_cnt.v_free_count) / 1048576);
+	printf("avail memory = %ju (%ju MB)\n",
+	    ptoa((uintmax_t)vm_cnt.v_free_count),
+	    ptoa((uintmax_t)vm_cnt.v_free_count) / 1048576);
 
 	/*
 	 * Set up buffers, so they can be used to read disk labels.

Modified: head/sys/powerpc/powerpc/platform.c
==============================================================================
--- head/sys/powerpc/powerpc/platform.c	Thu Dec 24 02:35:59 2015	(r292679)
+++ head/sys/powerpc/powerpc/platform.c	Thu Dec 24 04:30:15 2015	(r292680)
@@ -86,8 +86,8 @@ static void
 memr_merge(struct mem_region *from, struct mem_region *to)
 {
 	vm_offset_t end;
-	end = ulmax(to->mr_start + to->mr_size, from->mr_start + from->mr_size);
-	to->mr_start = ulmin(from->mr_start, to->mr_start);
+	end = uqmax(to->mr_start + to->mr_size, from->mr_start + from->mr_size);
+	to->mr_start = uqmin(from->mr_start, to->mr_start);
 	to->mr_size = end - to->mr_start;
 }
 

Modified: head/sys/powerpc/powerpc/pmap_dispatch.c
==============================================================================
--- head/sys/powerpc/powerpc/pmap_dispatch.c	Thu Dec 24 02:35:59 2015	(r292679)
+++ head/sys/powerpc/powerpc/pmap_dispatch.c	Thu Dec 24 04:30:15 2015	(r292680)
@@ -74,7 +74,7 @@ struct msgbuf *msgbufp;
 vm_offset_t    msgbuf_phys;
 
 vm_offset_t kernel_vm_end;
-vm_offset_t phys_avail[PHYS_AVAIL_SZ];
+vm_paddr_t phys_avail[PHYS_AVAIL_SZ];
 vm_offset_t virtual_avail;
 vm_offset_t virtual_end;
 

Modified: head/sys/sys/libkern.h
==============================================================================
--- head/sys/sys/libkern.h	Thu Dec 24 02:35:59 2015	(r292679)
+++ head/sys/sys/libkern.h	Thu Dec 24 04:30:15 2015	(r292680)
@@ -61,6 +61,8 @@ static __inline u_int max(u_int a, u_int
 static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); }
 static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); }
 static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); }
+static __inline u_quad_t uqmax(u_quad_t a, u_quad_t b) { return (a > b ? a : b); }
+static __inline u_quad_t uqmin(u_quad_t a, u_quad_t b) { return (a < b ? a : b); }
 static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); }
 static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); }
 static __inline off_t omax(off_t a, off_t b) { return (a > b ? a : b); }


More information about the svn-src-head mailing list