diff options
Diffstat (limited to 'sys/boot/ofw/libofw/ofw_memory.c')
-rw-r--r-- | sys/boot/ofw/libofw/ofw_memory.c | 76 |
1 files changed, 58 insertions, 18 deletions
diff --git a/sys/boot/ofw/libofw/ofw_memory.c b/sys/boot/ofw/libofw/ofw_memory.c index c23ab8e..5239fa2 100644 --- a/sys/boot/ofw/libofw/ofw_memory.c +++ b/sys/boot/ofw/libofw/ofw_memory.c @@ -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; + + 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++) { - 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); + 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 * |