Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/stand/libofw/ofw_memory.c
34677 views
1
/*-
2
* Copyright (c) 2001 Benno Rice
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*/
26
27
#include <sys/param.h>
28
#include <sys/types.h>
29
30
#include <stand.h>
31
32
#include "libofw.h"
33
#include "openfirm.h"
34
35
struct ofw_mapping {
36
vm_offset_t va;
37
int len;
38
vm_offset_t pa;
39
int mode;
40
};
41
42
struct ofw_mapping2 {
43
vm_offset_t va;
44
int len;
45
vm_offset_t pa_hi;
46
vm_offset_t pa_lo;
47
int mode;
48
};
49
50
void
51
ofw_memmap(int acells)
52
{
53
struct ofw_mapping *mapptr;
54
struct ofw_mapping2 *mapptr2;
55
phandle_t mmup;
56
int nmapping, i;
57
u_char mappings[256 * sizeof(struct ofw_mapping2)];
58
char lbuf[80];
59
60
mmup = OF_instance_to_package(mmu);
61
62
bzero(mappings, sizeof(mappings));
63
64
nmapping = OF_getprop(mmup, "translations", mappings, sizeof(mappings));
65
if (nmapping == -1) {
66
printf("Could not get memory map (%d)\n",
67
nmapping);
68
return;
69
}
70
71
pager_open();
72
if (acells == 1) {
73
nmapping /= sizeof(struct ofw_mapping);
74
mapptr = (struct ofw_mapping *) mappings;
75
76
printf("%17s\t%17s\t%8s\t%6s\n", "Virtual Range",
77
"Physical Range", "#Pages", "Mode");
78
79
for (i = 0; i < nmapping; i++) {
80
sprintf(lbuf, "%08jx-%08jx\t%08jx-%08jx\t%8d\t%6x\n",
81
(uintmax_t)mapptr[i].va,
82
(uintmax_t)mapptr[i].va + mapptr[i].len,
83
(uintmax_t)mapptr[i].pa,
84
(uintmax_t)mapptr[i].pa + mapptr[i].len,
85
mapptr[i].len / 0x1000,
86
mapptr[i].mode);
87
if (pager_output(lbuf))
88
break;
89
}
90
} else {
91
nmapping /= sizeof(struct ofw_mapping2);
92
mapptr2 = (struct ofw_mapping2 *) mappings;
93
94
printf("%17s\t%17s\t%8s\t%6s\n", "Virtual Range",
95
"Physical Range", "#Pages", "Mode");
96
97
for (i = 0; i < nmapping; i++) {
98
sprintf(lbuf, "%08jx-%08jx\t%08jx-%08jx\t%8d\t%6x\n",
99
(uintmax_t)mapptr2[i].va,
100
(uintmax_t)mapptr2[i].va + mapptr2[i].len,
101
(uintmax_t)mapptr2[i].pa_lo,
102
(uintmax_t)mapptr2[i].pa_lo + mapptr2[i].len,
103
mapptr2[i].len / 0x1000,
104
mapptr2[i].mode);
105
if (pager_output(lbuf))
106
break;
107
}
108
}
109
pager_close();
110
}
111
112
113