summaryrefslogtreecommitdiffstats
path: root/sys/boot/ofw/libofw/ofw_memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/boot/ofw/libofw/ofw_memory.c')
-rw-r--r--sys/boot/ofw/libofw/ofw_memory.c76
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 *
OpenPOWER on IntegriCloud