Kazuo Moriwaka wrote:
Hi Dave,
> The problem is that the return vmalloc address of zero eventually
> gets stored in vt->vmalloc_start, which, among a few other places,
> is used here:
>
> #define IS_VMALLOC_ADDR(X) ((ulong)(X) >= vt->vmalloc_start)
>
> Can you verify that setting it to zero will not cause problems in
> the macro above, and the other places that it's used directly?
Thank you for your advice. I rushed..
> Upon a quick examination, it does looks safe enough in the relevant
> vtop routines, but for example, the search command's use of next_kpage()
> looks like it might fail.
>
> Perhaps IS_VMALLOC_ADDRESS() itself should also verify
> that vt->vmalloc_start is non-zero, and the other places that
> use vt->vmalloc_start directly should be verified. (Of course
> we don't need to do this kind of check for the processors
> that have hardwired vmalloc addresses).
I checked all places which use vt->vmalloc_start directory,
and fixing IS_VMALLOC_ADDRESS looks enough.
All places are:
1. IS_VMALLOC_ADDRESS
2. in memory.c: they looks work fine with zero.
3. each architectures .c: just check if(!vt->vmalloc_start). They'll work.
thanks,
--
Kazuo Moriwaka <moriwaka(a)valinux.co.jp>
OK, this looks reasonable. The only issue is that the vtop command
will not do the page-table translation on unity-mapped kernel addresses
at all. But this is such a rare situation that it's fine with me if it's fine
with you.
Queued for next release.
Thanks,
Dave
diff -ru crash-4.0-2.31.orig/defs.h crash-4.0-2.31/defs.h
--- crash-4.0-2.31.orig/defs.h 2006-06-27 23:15:32.000000000 +0900
+++ crash-4.0-2.31/defs.h 2006-07-11 11:17:31.000000000 +0900
@@ -1813,7 +1813,7 @@
#define MACHINE_TYPE "X86"
#define PTOV(X) ((unsigned long)(X)+(machdep->kvbase))
#define VTOP(X) ((unsigned long)(X)-(machdep->kvbase))
-#define IS_VMALLOC_ADDR(X) ((ulong)(X) >= vt->vmalloc_start)
+#define IS_VMALLOC_ADDR(X) (vt->vmalloc_start && (ulong)(X) >=
vt->vmalloc_start)
#define KVBASE_MASK (0x7fffff)
#define PGDIR_SHIFT_2LEVEL (22)
@@ -2011,7 +2011,7 @@
#define PTOV(X) ((unsigned long)(X)+(machdep->kvbase))
#define VTOP(X) ((unsigned long)(X)-(machdep->kvbase))
-#define IS_VMALLOC_ADDR(X) ((ulong)(X) >= vt->vmalloc_start)
+#define IS_VMALLOC_ADDR(X) (vt->vmalloc_start && (ulong)(X) >=
vt->vmalloc_start)
#define KSEG_BASE_48_BIT (0xffff800000000000)
#define KSEG_BASE (0xfffffc0000000000)
#define _PFN_MASK (0xFFFFFFFF00000000)
@@ -2056,7 +2056,7 @@
#define PTOV(X) ((unsigned long)(X)+(machdep->kvbase))
#define VTOP(X) ((unsigned long)(X)-(machdep->kvbase))
-#define IS_VMALLOC_ADDR(X) ((ulong)(X) >= vt->vmalloc_start)
+#define IS_VMALLOC_ADDR(X) (vt->vmalloc_start && (ulong)(X) >=
vt->vmalloc_start)
#define PGDIR_SHIFT (22)
#define PTRS_PER_PTE (1024)
@@ -2240,7 +2240,7 @@
#define PTOV(X) ((unsigned long)(X)+(machdep->kvbase))
#define VTOP(X) ((unsigned long)(X)-(machdep->kvbase))
-#define IS_VMALLOC_ADDR(X) ((ulong)(X) >= vt->vmalloc_start)
+#define IS_VMALLOC_ADDR(X) (vt->vmalloc_start && (ulong)(X) >=
vt->vmalloc_start)
#define KERNELBASE machdep->pageoffset
#define PGDIR_SHIFT (machdep->pageshift + (machdep->pageshift -3) +
(machdep->pageshift - 2))
@@ -2343,7 +2343,7 @@
#define PTOV(X) ((unsigned long)(X)+(machdep->kvbase))
#define VTOP(X) ((unsigned long)(X)-(machdep->kvbase))
-#define IS_VMALLOC_ADDR(X) ((ulong)(X) >= vt->vmalloc_start)
+#define IS_VMALLOC_ADDR(X) (vt->vmalloc_start && (ulong)(X) >=
vt->vmalloc_start)
#define PTRS_PER_PTE 512
#define PTRS_PER_PMD 1024
#define PTRS_PER_PGD 2048
diff -ru crash-4.0-2.31.orig/memory.c crash-4.0-2.31/memory.c
--- crash-4.0-2.31.orig/memory.c 2006-06-27 23:15:32.000000000 +0900
+++ crash-4.0-2.31/memory.c 2006-07-11 11:20:12.000000000 +0900
@@ -11049,10 +11049,13 @@
ulong vmlist, addr;
get_symbol_data("vmlist", sizeof(void *), &vmlist);
-
- if (!readmem(vmlist+OFFSET(vm_struct_addr), KVADDR, &addr,
- sizeof(void *), "first vmlist addr", RETURN_ON_ERROR))
- non_matching_kernel();
+ if (vmlist != 0x0) {
+ if (!readmem(vmlist+OFFSET(vm_struct_addr), KVADDR, &addr,
+ sizeof(void *), "first vmlist addr", RETURN_ON_ERROR))
+ non_matching_kernel();
+ } else {
+ addr = 0;
+ }
return addr;
}
--
Crash-utility mailing list
Crash-utility(a)redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility