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@xxxxxxxxxxxxx> 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; }