Hi Dave, Am Donnerstag, den 04.09.2008, 11:19 -0400 schrieb Dave Anderson: [snip] > My guess is that it might have something to do with the zero-based kernel > virtual address space on s390/s390x. > > I also guess that the trail would have been: > > cmd_kmem > dump_memory_nodes > dump_mem_sections > section_mem_map_addr > read_mem_section > > where read_mem_section() can legitimately return if the addr > passed is not kernel virtual address of a mem_section structure: > > char * > read_mem_section(ulong addr) > { > if (!IS_KVADDR(addr)) > return 0; > > readmem(addr, KVADDR, vt->mem_section, SIZE(mem_section), > "memory section", FAULT_ON_ERROR); > > return vt->mem_section; > } > > But the s390/s390x implementation of IS_KVADDR() accepts a kernel > virtual address of zero. It tries to read it and craps out. > Right. Looks like we should check for NULL pointer instead of using IS_KVADDR(). Since the mem_sec array is static, it is initialized with zeroes. When I change the check, everything works fine. What about the following patch... --- diff -Naurp crash-4.0-7.1/defs.h crash-4.0-7.1-sparse-mem-s390/defs.h --- crash-4.0-7.1/defs.h 2008-08-19 17:10:51.000000000 +0200 +++ crash-4.0-7.1-sparse-mem-s390/defs.h 2008-09-04 18:24:10.000000000 +0200 @@ -2636,6 +2636,9 @@ struct efi_memory_desc_t { #define TIF_SIGPENDING (2) +#define _SECTION_SIZE_BITS 25 +#define _MAX_PHYSMEM_BITS 31 + #endif /* S390 */ #ifdef S390X @@ -2658,6 +2661,9 @@ struct efi_memory_desc_t { #define TIF_SIGPENDING (2) +#define _SECTION_SIZE_BITS 28 +#define _MAX_PHYSMEM_BITS 42 + #endif /* S390X */ #ifdef PLATFORM diff -Naurp crash-4.0-7.1/memory.c crash-4.0-7.1-sparse-mem-s390/memory.c --- crash-4.0-7.1/memory.c 2008-08-19 17:10:51.000000000 +0200 +++ crash-4.0-7.1-sparse-mem-s390/memory.c 2008-09-05 14:48:10.000000000 +0200 @@ -12653,7 +12653,7 @@ sparse_mem_init(void) char * read_mem_section(ulong addr) { - if (!IS_KVADDR(addr)) + if (addr == 0) return 0; readmem(addr, KVADDR, vt->mem_section, SIZE(mem_section), @@ -12668,7 +12668,7 @@ nr_to_section(ulong nr) ulong addr; ulong *mem_sec = vt->mem_sec; - if (!IS_KVADDR(mem_sec[SECTION_NR_TO_ROOT(nr)])) + if (mem_sec[SECTION_NR_TO_ROOT(nr)] == 0) return 0; if (IS_SPARSEMEM_EX()) diff -Naurp crash-4.0-7.1/s390.c crash-4.0-7.1-sparse-mem-s390/s390.c --- crash-4.0-7.1/s390.c 2008-08-19 17:10:51.000000000 +0200 +++ crash-4.0-7.1-sparse-mem-s390/s390.c 2008-09-05 14:49:25.000000000 +0200 @@ -130,6 +130,8 @@ s390_init(int when) machdep->dump_irq = s390_dump_irq; if (!machdep->hz) machdep->hz = HZ; + machdep->section_size_bits = _SECTION_SIZE_BITS; + machdep->max_physmem_bits = _MAX_PHYSMEM_BITS; break; case POST_INIT: diff -Naurp crash-4.0-7.1/s390x.c crash-4.0-7.1-sparse-mem-s390/s390x.c --- crash-4.0-7.1/s390x.c 2008-08-19 17:10:51.000000000 +0200 +++ crash-4.0-7.1-sparse-mem-s390/s390x.c 2008-09-04 18:24:24.000000000 +0200 @@ -128,6 +128,8 @@ s390x_init(int when) machdep->dump_irq = s390x_dump_irq; if (!machdep->hz) machdep->hz = HZ; + machdep->section_size_bits = _SECTION_SIZE_BITS; + machdep->max_physmem_bits = _MAX_PHYSMEM_BITS; break; case POST_INIT: -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility