Author: nwhitehorn
Date: Sun Nov 17 18:03:03 2013
New Revision: 258268
URL: http://svnweb.freebsd.org/changeset/base/258268

Log:
  Do not assume a value for #address-cells when parsing the OF translations
  map. This allows the kernel to get farther with OpenBIOS on 64-bit CPUs.

Modified:
  head/sys/powerpc/aim/mmu_oea64.c

Modified: head/sys/powerpc/aim/mmu_oea64.c
==============================================================================
--- head/sys/powerpc/aim/mmu_oea64.c    Sun Nov 17 17:53:55 2013        
(r258267)
+++ head/sys/powerpc/aim/mmu_oea64.c    Sun Nov 17 18:03:03 2013        
(r258268)
@@ -187,8 +187,7 @@ uintptr_t moea64_get_unique_vsid(void); 
 struct ofw_map {
        cell_t  om_va;
        cell_t  om_len;
-       cell_t  om_pa_hi;
-       cell_t  om_pa_lo;
+       uint64_t om_pa;
        cell_t  om_mode;
 };
 
@@ -478,13 +477,9 @@ om_cmp(const void *a, const void *b)
 
        mapa = a;
        mapb = b;
-       if (mapa->om_pa_hi < mapb->om_pa_hi)
+       if (mapa->om_pa < mapb->om_pa)
                return (-1);
-       else if (mapa->om_pa_hi > mapb->om_pa_hi)
-               return (1);
-       else if (mapa->om_pa_lo < mapb->om_pa_lo)
-               return (-1);
-       else if (mapa->om_pa_lo > mapb->om_pa_lo)
+       else if (mapa->om_pa > mapb->om_pa)
                return (1);
        else
                return (0);
@@ -493,26 +488,41 @@ om_cmp(const void *a, const void *b)
 static void
 moea64_add_ofw_mappings(mmu_t mmup, phandle_t mmu, size_t sz)
 {
-       struct ofw_map  translations[sz/sizeof(struct ofw_map)];
+       struct ofw_map  translations[sz/(4*sizeof(cell_t))]; /*>= 4 cells per */
+       pcell_t         acells, trans_cells[sz/sizeof(cell_t)];
        register_t      msr;
        vm_offset_t     off;
        vm_paddr_t      pa_base;
-       int             i;
+       int             i, j;
 
        bzero(translations, sz);
-       if (OF_getprop(mmu, "translations", translations, sz) == -1)
+       OF_getprop(OF_finddevice("/"), "#address-cells", &acells,
+           sizeof(acells));
+       if (OF_getprop(mmu, "translations", trans_cells, sz) == -1)
                panic("moea64_bootstrap: can't get ofw translations");
 
        CTR0(KTR_PMAP, "moea64_add_ofw_mappings: translations");
-       sz /= sizeof(*translations);
+       sz /= sizeof(cell_t);
+       for (i = 0, j = 0; i < sz; j++) {
+               translations[j].om_va = trans_cells[i++];
+               translations[j].om_len = trans_cells[i++];
+               translations[j].om_pa = trans_cells[i++];
+               if (acells == 2) {
+                       translations[j].om_pa <<= 32;
+                       translations[j].om_pa |= trans_cells[i++];
+               }
+               translations[j].om_mode = trans_cells[i++];
+       }
+       KASSERT(i == sz, ("Translations map has incorrect cell count (%d/%zd)",
+           i, sz));
+
+       sz = j;
        qsort(translations, sz, sizeof (*translations), om_cmp);
 
        for (i = 0; i < sz; i++) {
-               pa_base = translations[i].om_pa_lo;
-             #ifdef __powerpc64__
-               pa_base += (vm_offset_t)translations[i].om_pa_hi << 32;
-             #else
-               if (translations[i].om_pa_hi)
+               pa_base = translations[i].om_pa;
+             #ifndef __powerpc64__
+               if ((translations[i].om_pa >> 32) != 0)
                        panic("OFW translations above 32-bit boundary!");
              #endif
 
_______________________________________________
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