xref: /freebsd/stand/libofw/ofw_memory.c (revision 7c43148a974877188a930e4078a164f83da8e652)
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