1475008d6SBrandon Bergren /*-
2475008d6SBrandon Bergren * Copyright (c) 2001 Benno Rice
3475008d6SBrandon Bergren * All rights reserved.
4475008d6SBrandon Bergren *
5475008d6SBrandon Bergren * Redistribution and use in source and binary forms, with or without
6475008d6SBrandon Bergren * modification, are permitted provided that the following conditions
7475008d6SBrandon Bergren * are met:
8475008d6SBrandon Bergren * 1. Redistributions of source code must retain the above copyright
9475008d6SBrandon Bergren * notice, this list of conditions and the following disclaimer.
10475008d6SBrandon Bergren * 2. Redistributions in binary form must reproduce the above copyright
11475008d6SBrandon Bergren * notice, this list of conditions and the following disclaimer in the
12475008d6SBrandon Bergren * documentation and/or other materials provided with the distribution.
13475008d6SBrandon Bergren *
14475008d6SBrandon Bergren * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND
15475008d6SBrandon Bergren * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16475008d6SBrandon Bergren * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17475008d6SBrandon Bergren * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18475008d6SBrandon Bergren * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19475008d6SBrandon Bergren * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20475008d6SBrandon Bergren * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21475008d6SBrandon Bergren * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22475008d6SBrandon Bergren * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23475008d6SBrandon Bergren * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24475008d6SBrandon Bergren * SUCH DAMAGE.
25475008d6SBrandon Bergren */
26475008d6SBrandon Bergren
27475008d6SBrandon Bergren #include <sys/param.h>
28475008d6SBrandon Bergren #include <sys/types.h>
29475008d6SBrandon Bergren
30475008d6SBrandon Bergren #include <stand.h>
31475008d6SBrandon Bergren
32475008d6SBrandon Bergren #include "libofw.h"
33475008d6SBrandon Bergren #include "openfirm.h"
34475008d6SBrandon Bergren
35475008d6SBrandon Bergren struct ofw_mapping {
36475008d6SBrandon Bergren vm_offset_t va;
37475008d6SBrandon Bergren int len;
38475008d6SBrandon Bergren vm_offset_t pa;
39475008d6SBrandon Bergren int mode;
40475008d6SBrandon Bergren };
41475008d6SBrandon Bergren
42475008d6SBrandon Bergren struct ofw_mapping2 {
43475008d6SBrandon Bergren vm_offset_t va;
44475008d6SBrandon Bergren int len;
45475008d6SBrandon Bergren vm_offset_t pa_hi;
46475008d6SBrandon Bergren vm_offset_t pa_lo;
47475008d6SBrandon Bergren int mode;
48475008d6SBrandon Bergren };
49475008d6SBrandon Bergren
50475008d6SBrandon Bergren void
ofw_memmap(int acells)51475008d6SBrandon Bergren ofw_memmap(int acells)
52475008d6SBrandon Bergren {
53475008d6SBrandon Bergren struct ofw_mapping *mapptr;
54475008d6SBrandon Bergren struct ofw_mapping2 *mapptr2;
55475008d6SBrandon Bergren phandle_t mmup;
56475008d6SBrandon Bergren int nmapping, i;
57475008d6SBrandon Bergren u_char mappings[256 * sizeof(struct ofw_mapping2)];
58475008d6SBrandon Bergren char lbuf[80];
59475008d6SBrandon Bergren
60475008d6SBrandon Bergren mmup = OF_instance_to_package(mmu);
61475008d6SBrandon Bergren
62475008d6SBrandon Bergren bzero(mappings, sizeof(mappings));
63475008d6SBrandon Bergren
64475008d6SBrandon Bergren nmapping = OF_getprop(mmup, "translations", mappings, sizeof(mappings));
65475008d6SBrandon Bergren if (nmapping == -1) {
66475008d6SBrandon Bergren printf("Could not get memory map (%d)\n",
67475008d6SBrandon Bergren nmapping);
68475008d6SBrandon Bergren return;
69475008d6SBrandon Bergren }
70475008d6SBrandon Bergren
71475008d6SBrandon Bergren pager_open();
72475008d6SBrandon Bergren if (acells == 1) {
73475008d6SBrandon Bergren nmapping /= sizeof(struct ofw_mapping);
74475008d6SBrandon Bergren mapptr = (struct ofw_mapping *) mappings;
75475008d6SBrandon Bergren
76475008d6SBrandon Bergren printf("%17s\t%17s\t%8s\t%6s\n", "Virtual Range",
77475008d6SBrandon Bergren "Physical Range", "#Pages", "Mode");
78475008d6SBrandon Bergren
79475008d6SBrandon Bergren for (i = 0; i < nmapping; i++) {
80*3e91d826SBrandon Bergren sprintf(lbuf, "%08jx-%08jx\t%08jx-%08jx\t%8d\t%6x\n",
81*3e91d826SBrandon Bergren (uintmax_t)mapptr[i].va,
82*3e91d826SBrandon Bergren (uintmax_t)mapptr[i].va + mapptr[i].len,
83*3e91d826SBrandon Bergren (uintmax_t)mapptr[i].pa,
84*3e91d826SBrandon Bergren (uintmax_t)mapptr[i].pa + mapptr[i].len,
85475008d6SBrandon Bergren mapptr[i].len / 0x1000,
86475008d6SBrandon Bergren mapptr[i].mode);
87475008d6SBrandon Bergren if (pager_output(lbuf))
88475008d6SBrandon Bergren break;
89475008d6SBrandon Bergren }
90475008d6SBrandon Bergren } else {
91475008d6SBrandon Bergren nmapping /= sizeof(struct ofw_mapping2);
92475008d6SBrandon Bergren mapptr2 = (struct ofw_mapping2 *) mappings;
93475008d6SBrandon Bergren
94475008d6SBrandon Bergren printf("%17s\t%17s\t%8s\t%6s\n", "Virtual Range",
95475008d6SBrandon Bergren "Physical Range", "#Pages", "Mode");
96475008d6SBrandon Bergren
97475008d6SBrandon Bergren for (i = 0; i < nmapping; i++) {
98*3e91d826SBrandon Bergren sprintf(lbuf, "%08jx-%08jx\t%08jx-%08jx\t%8d\t%6x\n",
99*3e91d826SBrandon Bergren (uintmax_t)mapptr2[i].va,
100*3e91d826SBrandon Bergren (uintmax_t)mapptr2[i].va + mapptr2[i].len,
101*3e91d826SBrandon Bergren (uintmax_t)mapptr2[i].pa_lo,
102*3e91d826SBrandon Bergren (uintmax_t)mapptr2[i].pa_lo + mapptr2[i].len,
103475008d6SBrandon Bergren mapptr2[i].len / 0x1000,
104475008d6SBrandon Bergren mapptr2[i].mode);
105475008d6SBrandon Bergren if (pager_output(lbuf))
106475008d6SBrandon Bergren break;
107475008d6SBrandon Bergren }
108475008d6SBrandon Bergren }
109475008d6SBrandon Bergren pager_close();
110475008d6SBrandon Bergren }
111475008d6SBrandon Bergren
112