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); }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to