Author: nwhitehorn
Date: Sat Nov 27 00:36:11 2010
New Revision: 215919
URL: http://svn.freebsd.org/changeset/base/215919

Log:
  MFC r214493,214495:
  Fix some memory management issues discovered when trying to boot the PPC
  OF loader on systems where address cells and size cells are both 2 (the
  Mambo simulator) and fix an error where cons_probe() was called before
  init_heap() but used malloc() to set environment variables.

Modified:
  stable/8/sys/boot/ofw/common/main.c
  stable/8/sys/boot/ofw/libofw/ofw_memory.c
  stable/8/sys/boot/ofw/libofw/openfirm.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/boot/ofw/common/main.c
==============================================================================
--- stable/8/sys/boot/ofw/common/main.c Sat Nov 27 00:26:19 2010        
(r215918)
+++ stable/8/sys/boot/ofw/common/main.c Sat Nov 27 00:36:11 2010        
(r215919)
@@ -41,19 +41,23 @@ extern char bootprog_rev[];
 extern char bootprog_date[];
 extern char bootprog_maker[];
 
-u_int32_t      acells;
+u_int32_t      acells, scells;
 
 static char bootargs[128];
 
 #define        HEAP_SIZE       0x80000
 
+#define OF_puts(fd, text) OF_write(fd, text, strlen(text))
+
 void
 init_heap(void)
 {
        void    *base;
+       ihandle_t stdout;
 
        if ((base = ofw_alloc_heap(HEAP_SIZE)) == (void *)0xffffffff) {
-               printf("Heap memory claim failed!\n");
+               OF_getprop(chosen, "stdout", &stdout, sizeof(stdout));
+               OF_puts(stdout, "Heap memory claim failed!\n");
                OF_enter();
        }
 
@@ -64,25 +68,20 @@ uint64_t
 memsize(void)
 {
        phandle_t       memoryp;
-       struct ofw_reg  reg[4];
-       struct ofw_reg2 reg2[8];
-       int             i;
-       u_int64_t       sz, memsz;
+       cell_t          reg[24];
+       int             i, sz;
+       u_int64_t       memsz;
 
+       memsz = 0;
        memoryp = OF_instance_to_package(memory);
 
-       if (acells == 1) {
-               sz = OF_getprop(memoryp, "reg", &reg, sizeof(reg));
-               sz /= sizeof(struct ofw_reg);
-
-               for (i = 0, memsz = 0; i < sz; i++)
-                       memsz += reg[i].size;
-       } else if (acells == 2) {
-               sz = OF_getprop(memoryp, "reg", &reg2, sizeof(reg2));
-               sz /= sizeof(struct ofw_reg2);
+       sz = OF_getprop(memoryp, "reg", &reg, sizeof(reg));
+       sz /= sizeof(reg[0]);
 
-               for (i = 0, memsz = 0; i < sz; i++)
-                       memsz += reg2[i].size;
+       for (i = 0; i < sz; i += (acells + scells)) {
+               if (scells > 1)
+                       memsz += (uint64_t)reg[i + acells] << 32;
+               memsz += reg[i + acells + scells - 1];
        }
 
        return (memsz);
@@ -105,13 +104,9 @@ main(int (*openfirm)(void *))
 
        root = OF_finddevice("/");
 
-       acells = 1;
+       scells = acells = 1;
        OF_getprop(root, "#address-cells", &acells, sizeof(acells));
-
-       /*
-         * Set up console.
-         */
-       cons_probe();
+       OF_getprop(root, "#size-cells", &scells, sizeof(scells));
 
        /*
         * Initialise the heap as early as possible.  Once this is done,
@@ -121,6 +116,11 @@ main(int (*openfirm)(void *))
        init_heap();
 
        /*
+         * Set up console.
+         */
+       cons_probe();
+
+       /*
         * March through the device switch probing for things.
         */
        for (i = 0; devsw[i] != NULL; i++)

Modified: stable/8/sys/boot/ofw/libofw/ofw_memory.c
==============================================================================
--- stable/8/sys/boot/ofw/libofw/ofw_memory.c   Sat Nov 27 00:26:19 2010        
(r215918)
+++ stable/8/sys/boot/ofw/libofw/ofw_memory.c   Sat Nov 27 00:36:11 2010        
(r215919)
@@ -118,13 +118,19 @@ ofw_memmap(int acells)
 void *
 ofw_alloc_heap(unsigned int size)
 {
-       phandle_t       memoryp;
-       struct          ofw_reg available;
+       phandle_t       memoryp, root;
+       cell_t          available[4];
+       cell_t          acells;
+
+       root = OF_finddevice("/");
+       acells = 1;
+       OF_getprop(root, "#address-cells", &acells, sizeof(acells));
 
        memoryp = OF_instance_to_package(memory);
-       OF_getprop(memoryp, "available", &available, sizeof(available));
+       OF_getprop(memoryp, "available", available, sizeof(available));
 
-       heap_base = OF_claim((void *)available.base, size, sizeof(register_t));
+       heap_base = OF_claim((void *)available[acells-1], size,
+           sizeof(register_t));
 
        if (heap_base != (void *)-1) {
                heap_size = size;

Modified: stable/8/sys/boot/ofw/libofw/openfirm.c
==============================================================================
--- stable/8/sys/boot/ofw/libofw/openfirm.c     Sat Nov 27 00:26:19 2010        
(r215918)
+++ stable/8/sys/boot/ofw/libofw/openfirm.c     Sat Nov 27 00:36:11 2010        
(r215919)
@@ -80,8 +80,13 @@ OF_init(int (*openfirm)(void *))
 
        if ((chosen = OF_finddevice("/chosen")) == -1)
                OF_exit();
-       if (OF_getprop(chosen, "memory", &memory, sizeof(memory)) == -1)
-               OF_exit();
+       if (OF_getprop(chosen, "memory", &memory, sizeof(memory)) == -1) {
+               memory = OF_open("/memory");
+               if (memory == -1)
+                       memory = OF_open("/mem...@0");
+               if (memory == -1)
+                       OF_exit();
+       }
        if (OF_getprop(chosen, "mmu", &mmu, sizeof(mmu)) == -1)
                OF_exit();
 }
_______________________________________________
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