G5 support: handle the case where the OpenFirmware memory array uses

64 bits for the phys address, but only 32 for the virtual address.
This commit is contained in:
Peter Grehan 2004-08-02 03:05:09 +00:00
parent 016927054b
commit d4a57a3131
3 changed files with 90 additions and 29 deletions

View File

@ -42,6 +42,7 @@ extern char bootprog_date[];
extern char bootprog_maker[];
phandle_t chosen;
u_int32_t acells;
static char bootargs[128];
@ -60,31 +61,40 @@ init_heap(void)
setheap(base, (void *)((int)base + HEAP_SIZE));
}
uint32_t
uint64_t
memsize(void)
{
ihandle_t meminstance;
phandle_t memory;
struct ofw_reg reg[4];
struct ofw_reg2 reg2[8];
int i;
int sz, memsz;
u_int64_t sz, memsz;
OF_getprop(chosen, "memory", &meminstance, sizeof(meminstance));
memory = OF_instance_to_package(meminstance);
sz = OF_getprop(memory, "reg", &reg, sizeof(reg));
if (acells == 1) {
sz = OF_getprop(memory, "reg", &reg, sizeof(reg));
sz /= sizeof(struct ofw_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(memory, "reg", &reg2, sizeof(reg2));
sz /= sizeof(struct ofw_reg2);
for (i = 0, memsz = 0; i < sz; i++)
memsz += reg2[i].size;
}
for (i = 0, memsz = 0; i < sz; i++)
memsz += reg[i].size;
return (memsz);
}
int
main(int (*openfirm)(void *))
{
phandle_t root;
int i;
char bootpath[64];
char *ch;
@ -96,8 +106,12 @@ main(int (*openfirm)(void *))
*/
OF_init(openfirm);
root = OF_finddevice("/");
chosen = OF_finddevice("/chosen");
acells = 1;
OF_getprop(root, "#address-cells", &acells, sizeof(acells));
/*
* Set up console.
*/
@ -125,7 +139,7 @@ main(int (*openfirm)(void *))
printf("\n");
printf("%s, Revision %s\n", bootprog_name, bootprog_rev);
printf("(%s, %s)\n", bootprog_maker, bootprog_date);
printf("Memory: %dKB\n", memsize() / 1024);
printf("Memory: %lldKB\n", memsize() / 1024);
OF_getprop(chosen, "bootpath", bootpath, 64);
ch = index(bootpath, ':');
@ -142,7 +156,7 @@ main(int (*openfirm)(void *))
bargc = 0;
parse(&bargc, &bargv, bootargs);
if (bargc == 1)
env_setenv("currdev", EV_VOLATILE, bargv[0], ofw_setcurrdev,
env_setenv("currdev", EV_VOLATILE, bargv[0], ofw_setcurrdev,
env_nounset);
else
env_setenv("currdev", EV_VOLATILE, bootpath,
@ -180,6 +194,6 @@ int
command_memmap(int argc, char **argv)
{
ofw_memmap();
ofw_memmap(acells);
return (CMD_OK);
}

View File

@ -50,7 +50,7 @@ ssize_t ofw_readin(const int fd, vm_offset_t dest, const size_t len);
extern int ofw_boot(void);
extern int ofw_autoload(void);
void ofw_memmap(void);
void ofw_memmap(int);
void *ofw_alloc_heap(unsigned int);
void ofw_release_heap(void);
@ -70,4 +70,11 @@ struct ofw_reg
cell_t size;
};
struct ofw_reg2
{
cell_t base_hi;
cell_t base_lo;
cell_t size;
};
extern int (*openfirmware)(void *);

View File

@ -45,34 +45,74 @@ struct ofw_mapping {
int mode;
};
struct ofw_mapping2 {
vm_offset_t va;
int len;
vm_offset_t pa_hi;
vm_offset_t pa_lo;
int mode;
};
void
ofw_memmap(void)
ofw_memmap(int acells)
{
phandle_t mmup;
int nmapping, i;
struct ofw_mapping mappings[256];
mmup = OF_instance_to_package(mmu);
bzero(mappings, sizeof(mappings));
nmapping = OF_getprop(mmup, "translations", mappings, sizeof(mappings));
struct ofw_mapping *mapptr;
struct ofw_mapping2 *mapptr2;
phandle_t mmup;
int nmapping, i;
u_char mappings[256 * sizeof(struct ofw_mapping2)];
char lbuf[80];
mmup = OF_instance_to_package(mmu);
bzero(mappings, sizeof(mappings));
nmapping = OF_getprop(mmup, "translations", mappings, sizeof(mappings));
if (nmapping == -1) {
printf("Could not get memory map (%d)\n",
nmapping);
return;
}
nmapping /= sizeof(struct ofw_mapping);
printf("%17s %17s %8s %6s\n", "Virtual Range", "Physical Range",
"#Pages", "Mode");
pager_open();
if (acells == 1) {
nmapping /= sizeof(struct ofw_mapping);
mapptr = (struct ofw_mapping *) mappings;
for (i = 0; i < nmapping; i++) {
printf("%08x-%08x %08x-%08x %8d %6x\n", mappings[i].pa,
mappings[i].pa + mappings[i].len, mappings[i].va,
mappings[i].va + mappings[i].len, mappings[i].len / 0x1000,
mappings[i].mode);
printf("%17s\t%17s\t%8s\t%6s\n", "Virtual Range",
"Physical Range", "#Pages", "Mode");
for (i = 0; i < nmapping; i++) {
sprintf(lbuf, "%08x-%08x\t%08x-%08x\t%8d\t%6x\n",
mapptr[i].va,
mapptr[i].va + mapptr[i].len,
mapptr[i].pa,
mapptr[i].pa + mapptr[i].len,
mapptr[i].len / 0x1000,
mapptr[i].mode);
if (pager_output(lbuf))
break;
}
} else {
nmapping /= sizeof(struct ofw_mapping2);
mapptr2 = (struct ofw_mapping2 *) mappings;
printf("%17s\t%17s\t%8s\t%6s\n", "Virtual Range",
"Physical Range", "#Pages", "Mode");
for (i = 0; i < nmapping; i++) {
sprintf(lbuf, "%08x-%08x\t%08x-%08x\t%8d\t%6x\n",
mapptr2[i].va,
mapptr2[i].va + mapptr2[i].len,
mapptr2[i].pa_lo,
mapptr2[i].pa_lo + mapptr2[i].len,
mapptr2[i].len / 0x1000,
mapptr2[i].mode);
if (pager_output(lbuf))
break;
}
}
pager_close();
}
void *