----- 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


--- 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, 
 			MKSTR(&paddr)));
--
Crash-utility mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to