-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmemory_display.c
103 lines (94 loc) · 2.17 KB
/
memory_display.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <common.h>
#include <errno.h>
#include <abort.h>
#define DISP_LINE_LEN 16
int memory_display(const void *addr, loff_t offs, unsigned nbytes, int size, int swab)
{
unsigned long linebytes, i;
unsigned char *cp;
/* Print the lines.
*
* We buffer all read data, so we can make sure data is read only
* once, and all accesses are with the specified bus width.
*/
do {
unsigned char linebuf[DISP_LINE_LEN];
uint64_t *ullp = (uint64_t *)linebuf;
uint32_t *uip = (uint32_t *)linebuf;
uint16_t *usp = (uint16_t *)linebuf;
uint8_t *ucp = (uint8_t *)linebuf;
unsigned count = 52;
printf("%08llx:", offs);
linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes;
for (i = 0; i < linebytes; i += size) {
if (size == 8) {
uint64_t res;
data_abort_mask();
res = *((uint64_t *)addr);
if (swab)
res = __swab64(res);
if (data_abort_unmask()) {
res = 0xffffffffffffffffULL;
count -= printf(" xxxxxxxxxxxxxxxx");
} else {
count -= printf(" %016llx", res);
}
*ullp++ = res;
} else if (size == 4) {
uint32_t res;
data_abort_mask();
res = *((uint32_t *)addr);
if (swab)
res = __swab32(res);
if (data_abort_unmask()) {
res = 0xffffffff;
count -= printf(" xxxxxxxx");
} else {
count -= printf(" %08x", res);
}
*uip++ = res;
} else if (size == 2) {
uint16_t res;
data_abort_mask();
res = *((uint16_t *)addr);
if (swab)
res = __swab16(res);
if (data_abort_unmask()) {
res = 0xffff;
count -= printf(" xxxx");
} else {
count -= printf(" %04x", res);
}
*usp++ = res;
} else {
uint8_t res;
data_abort_mask();
res = *((uint8_t *)addr);
if (data_abort_unmask()) {
res = 0xff;
count -= printf(" xx");
} else {
count -= printf(" %02x", res);
}
*ucp++ = res;
}
addr += size;
offs += size;
}
while (count--)
putchar(' ');
cp = linebuf;
for (i = 0; i < linebytes; i++) {
if ((*cp < 0x20) || (*cp > 0x7e))
putchar('.');
else
printf("%c", *cp);
cp++;
}
putchar('\n');
nbytes -= linebytes;
if (ctrlc())
return -EINTR;
} while (nbytes > 0);
return 0;
}