svn commit: r215919 - in stable/8/sys/boot/ofw: common libofw
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Sat Nov 27 00:36:11 UTC 2010
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", ®, 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", ®2, sizeof(reg2));
- sz /= sizeof(struct ofw_reg2);
+ sz = OF_getprop(memoryp, "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("/memory at 0");
+ if (memory == -1)
+ OF_exit();
+ }
if (OF_getprop(chosen, "mmu", &mmu, sizeof(mmu)) == -1)
OF_exit();
}
More information about the svn-src-stable
mailing list