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:
parent
6c38071288
commit
e60ab831db
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=214493
@ -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", ®, sizeof(reg));
|
||||
sz /= sizeof(struct ofw_reg);
|
||||
sz = OF_getprop(memoryp, "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", ®2, 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.
|
||||
*/
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user