Add a little hack to the "dw/db/ds/dl" commands that allows you to dump the contents
of a physical memory location. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19898 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
80bca3d3c8
commit
7954a14f87
@ -1762,27 +1762,36 @@ vm_get_page_mapping(team_id aid, addr_t vaddr, addr_t *paddr)
|
|||||||
static int
|
static int
|
||||||
display_mem(int argc, char **argv)
|
display_mem(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
bool physical = false;
|
||||||
|
addr_t copyAddress;
|
||||||
int32 displayWidth;
|
int32 displayWidth;
|
||||||
int32 itemSize;
|
int32 itemSize;
|
||||||
int32 num = 1;
|
int32 num = -1;
|
||||||
addr_t address;
|
addr_t address;
|
||||||
int i, j;
|
int i = 1, j;
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc > 1 && argv[1][0] == '-') {
|
||||||
kprintf("usage: dl/dw/ds/db <address> [num]\n"
|
if (!strcmp(argv[1], "-p") || !strcmp(argv[1], "--physical")) {
|
||||||
|
physical = true;
|
||||||
|
i++;
|
||||||
|
} else
|
||||||
|
i = 99;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc < i + 1 || argc > i + 2) {
|
||||||
|
kprintf("usage: dl/dw/ds/db [-p|--physical] <address> [num]\n"
|
||||||
"\tdl - 8 bytes\n"
|
"\tdl - 8 bytes\n"
|
||||||
"\tdw - 4 bytes\n"
|
"\tdw - 4 bytes\n"
|
||||||
"\tds - 2 bytes\n"
|
"\tds - 2 bytes\n"
|
||||||
"\tdb - 1 byte\n");
|
"\tdb - 1 byte\n"
|
||||||
|
" -p or --physical only allows memory from a single page to be displayed.\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
address = strtoul(argv[1], NULL, 0);
|
address = strtoul(argv[i], NULL, 0);
|
||||||
|
|
||||||
if (argc >= 3) {
|
if (argc > i + 1)
|
||||||
num = -1;
|
num = atoi(argv[i + 1]);
|
||||||
num = atoi(argv[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// build the format string
|
// build the format string
|
||||||
if (strcmp(argv[0], "db") == 0) {
|
if (strcmp(argv[0], "db") == 0) {
|
||||||
@ -1802,6 +1811,33 @@ display_mem(int argc, char **argv)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (num <= 0)
|
||||||
|
num = displayWidth;
|
||||||
|
|
||||||
|
if (physical) {
|
||||||
|
int32 offset = address & (B_PAGE_SIZE - 1);
|
||||||
|
if (num * itemSize + offset > B_PAGE_SIZE) {
|
||||||
|
num = (B_PAGE_SIZE - offset) / itemSize;
|
||||||
|
kprintf("NOTE: number of bytes has been cut to page size\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
address = ROUNDOWN(address, B_PAGE_SIZE);
|
||||||
|
|
||||||
|
kernel_startup = true;
|
||||||
|
// vm_get_physical_page() needs to lock...
|
||||||
|
|
||||||
|
if (vm_get_physical_page(address, ©Address, PHYSICAL_PAGE_NO_WAIT) != B_OK) {
|
||||||
|
kprintf("getting the hardware page failed.");
|
||||||
|
kernel_startup = false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
kernel_startup = false;
|
||||||
|
address += offset;
|
||||||
|
copyAddress += offset;
|
||||||
|
} else
|
||||||
|
copyAddress = address;
|
||||||
|
|
||||||
for (i = 0; i < num; i++) {
|
for (i = 0; i < num; i++) {
|
||||||
uint32 value;
|
uint32 value;
|
||||||
|
|
||||||
@ -1814,7 +1850,7 @@ display_mem(int argc, char **argv)
|
|||||||
|
|
||||||
for (j = 0; j < displayed; j++) {
|
for (j = 0; j < displayed; j++) {
|
||||||
char c;
|
char c;
|
||||||
if (user_memcpy(&c, (char *)address + i * itemSize + j, 1) != B_OK) {
|
if (user_memcpy(&c, (char *)copyAddress + i * itemSize + j, 1) != B_OK) {
|
||||||
displayed = j;
|
displayed = j;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1831,7 +1867,7 @@ display_mem(int argc, char **argv)
|
|||||||
kprintf(" ");
|
kprintf(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user_memcpy(&value, (uint8 *)address + i * itemSize, itemSize) != B_OK) {
|
if (user_memcpy(&value, (uint8 *)copyAddress + i * itemSize, itemSize) != B_OK) {
|
||||||
kprintf("read fault");
|
kprintf("read fault");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1853,6 +1889,13 @@ display_mem(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
kprintf("\n");
|
kprintf("\n");
|
||||||
|
|
||||||
|
if (physical) {
|
||||||
|
copyAddress = ROUNDOWN(copyAddress, B_PAGE_SIZE);
|
||||||
|
kernel_startup = true;
|
||||||
|
vm_put_physical_page(copyAddress);
|
||||||
|
kernel_startup = false;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user