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.

MFC after:	1 month
This commit is contained in:
Nathan Whitehorn 2010-10-28 23:46:05 +00:00
parent 6c38071288
commit e60ab831db
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=214493
3 changed files with 35 additions and 28 deletions

View File

@ -41,7 +41,7 @@ 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];
@ -64,25 +64,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);
sz = OF_getprop(memoryp, "reg", &reg, sizeof(reg));
sz /= sizeof(reg[0]);
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);
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 +100,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,
@ -120,6 +111,11 @@ main(int (*openfirm)(void *))
*/
init_heap();
/*
* Set up console.
*/
cons_probe();
/*
* March through the device switch probing for things.
*/

View File

@ -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;

View File

@ -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@0");
if (memory == -1)
OF_exit();
}
if (OF_getprop(chosen, "mmu", &mmu, sizeof(mmu)) == -1)
OF_exit();
}