Hi Dave
I have tested your solution and it works fine and solves the problem I have seen. It is
also in several ways better than my solution, so please include it in the next release.
Thanks
Jan
Jan Karlsson
Senior Software Engineer
MIB
Sony Mobile Communications
Tel: +46703062174
sonymobile.com
-----Original Message-----
From: crash-utility-bounces(a)redhat.com [mailto:crash-utility-bounces@redhat.com] On Behalf
Of Dave Anderson
Sent: fredag den 6 juli 2012 17:40
To: Discussion list for crash utility usage, maintenance and development
Subject: Re: [Crash-utility] ptov command
----- Original Message -----
Below you find my version of the ptov function. I have just added a
few lines and placed them under "#if defined(ARM)". The test is
reasonable for ARM so I would appreciate if you include it. For other
platforms please do whatever you like.
Jan
void
cmd_ptov(void)
{
int c;
ulong vaddr;
physaddr_t paddr;
#if defined(ARM)
physaddr_t paddr_tst;
#endif
char buf1[BUFSIZE];
char buf2[BUFSIZE];
int others;
while ((c = getopt(argcnt, args, "")) != EOF) {
switch(c)
{
default:
argerrs++;
break;
}
}
if (argerrs || !args[optind])
cmd_usage(pc->curcmd, SYNOPSIS);
others = 0;
while (args[optind]) {
paddr = htoll(args[optind], FAULT_ON_ERROR, NULL);
vaddr = PTOV(paddr);
#if defined(ARM)
if (kvtop(0, vaddr, &paddr_tst, 0) && paddr_tst==paddr) { #endif
fprintf(fp, "%s%s %s\n", others++ ? "\n" : "",
mkstring(buf1, VADDR_PRLEN, LJUST, "VIRTUAL"),
mkstring(buf2, VADDR_PRLEN, LJUST, "PHYSICAL"));
fprintf(fp, "%s %s\n",
mkstring(buf1, VADDR_PRLEN, LJUST|LONG_HEX, MKSTR(vaddr)),
mkstring(buf2, VADDR_PRLEN, LJUST|LONGLONG_HEX,
MKSTR(&paddr)));
#if defined(ARM)
} else {
fprintf(fp, "Unknown virtual address for physical address
0x%08llx\n", paddr);
}
#endif
optind++;
}
}
I hate the "#ifdef ARM" sections and the error message doesn't fit into
multiple-argument usage. How's this work for you?
--- crash-6.0.8/memory.c.orig 2012-07-06 11:28:13.000000000 -0400
+++ crash-6.0.8/memory.c 2012-07-06 11:32:02.000000000 -0400
@@ -2975,9 +2975,9 @@
void
cmd_ptov(void)
{
- int c;
+ int c, unknown;
ulong vaddr;
- physaddr_t paddr;
+ physaddr_t paddr, paddr_test;
char buf1[BUFSIZE];
char buf2[BUFSIZE];
int others;
@@ -2999,10 +2999,14 @@
paddr = htoll(args[optind], FAULT_ON_ERROR, NULL);
vaddr = PTOV(paddr);
+ unknown = BITS32() && (!kvtop(0, vaddr, &paddr_test, 0) ||
+ (paddr_test != paddr));
+
fprintf(fp, "%s%s %s\n", others++ ? "\n" :
"",
mkstring(buf1, VADDR_PRLEN, LJUST, "VIRTUAL"),
mkstring(buf2, VADDR_PRLEN, LJUST, "PHYSICAL"));
- fprintf(fp, "%s %s\n",
+ fprintf(fp, "%s %s\n", unknown ?
+ mkstring(buf1, VADDR_PRLEN, LJUST, "unknown") :
mkstring(buf1, VADDR_PRLEN, LJUST|LONG_HEX, MKSTR(vaddr)),
mkstring(buf2, VADDR_PRLEN, LJUST|LONGLONG_HEX,
With one my sample ARM dumps, it looks like this:
crash> kmem -p
PAGE PHYSICAL MAPPING INDEX CNT FLAGS
c0b47000 80000000 0 0 0 0
c0b47020 80001000 0 0 0 0
c0b47040 80002000 0 0 0 0
... [ cut ] ...
c0d46fa0 8fffd000 0 0 1 400
c0d46fc0 8fffe000 0 0 1 400
c0d46fe0 8ffff000 0 0 1 400
crash>
crash> ptov 7ffff000 80000000 8ffff000 9000000
VIRTUAL PHYSICAL
unknown 7ffff000
VIRTUAL PHYSICAL
c0000000 80000000
VIRTUAL PHYSICAL
cffff000 8ffff000
VIRTUAL PHYSICAL
unknown 9000000
crash>
Dave