----- Original Message ----- ... > > So just do the same thing -- no verbose expanation is required. > > There are two ways to fix this : > > 1) Fix dump_mem_map*() to print the header only when there is > information to dump. > > --- a/memory.c > +++ b/memory.c > @@ -4637,13 +4637,6 @@ dump_mem_map_SPARSEMEM(struct meminfo *mi) > continue; > } > > - if (print_hdr) { > - if (!(pc->curcmd_flags & HEADER_PRINTED)) > - fprintf(fp, "%s", hdr); > - print_hdr = FALSE; > - pc->curcmd_flags |= HEADER_PRINTED; > - } > - > pp = section_mem_map_addr(section); > pp = sparse_decode_mem_map(pp, section_nr); > phys = (physaddr_t) section_nr * PAGES_PER_SECTION() > * PAGESIZE(); > @@ -4854,6 +4847,13 @@ dump_mem_map_SPARSEMEM(struct meminfo *mi) > } > > if (bufferindex > buffersize) { > + if (print_hdr) { > + if (!(pc->curcmd_flags & HEADER_PRINTED)) > + fprintf(fp, "%s", hdr); > + print_hdr = FALSE; > + pc->curcmd_flags |= HEADER_PRINTED; > + } > + > fprintf(fp, "%s", outputbuffer); > bufferindex = 0; > } > @@ -4867,6 +4867,13 @@ dump_mem_map_SPARSEMEM(struct meminfo *mi) > } > > if (bufferindex > 0) { > + if (print_hdr) { > + if (!(pc->curcmd_flags & HEADER_PRINTED)) > + fprintf(fp, "%s", hdr); > + print_hdr = FALSE; > + pc->curcmd_flags |= HEADER_PRINTED; > + } > + > fprintf(fp, "%s", outputbuffer); > } > > Similarly for the dump_mem_map(). > > 2) Fix ppc_pgd_vtop() to return FALSE if the paddr > machdep->memsize > > --- a/ppc.c > +++ b/ppc.c > @@ -438,6 +438,10 @@ ppc_pgd_vtop(ulong *pgd, ulong vaddr, physaddr_t > *paddr, int verbose) > > *paddr = PAGEBASE(pte) + PAGEOFFSET(vaddr); > > + if (*paddr > machdep->memsize) > + /* We don't have pages above System RAM */ > + return FALSE; > + > return TRUE; > > no_page: > > I prefer the (1). What do you think ? Hi Suzuki, Hmmm -- with respect to (1), I suppose that would work, although given that both x86 and x86_64 pass through dump_mem_map_SPARSEMEM() without printing the header in a non-existent-page case, I don't understand why ppc is different? And I'm thinking that a more general solution might be to change do_vtop() here, and not even bother calling the relevant dump_mem_map() function if there's no page struct associated with it: --- memory.c 10 Feb 2012 16:41:38 -0000 1.273 +++ memory.c 16 Feb 2012 14:18:03 -0000 @@ -2796,7 +2796,7 @@ do_vtop(ulong vaddr, struct task_context *tc, ulong vtop_flags) { physaddr_t paddr; - ulong vma; + ulong vma, pageptr; int page_exists; struct meminfo meminfo; char buf1[BUFSIZE]; @@ -2930,7 +2930,7 @@ fprintf(fp, "\n"); - if (page_exists) { + if (page_exists && phys_to_page(paddr, &pageptr)) { if ((pc->flags & DEVMEM) && (paddr >= VTOP(vt->high_memory))) return; BZERO(&meminfo, sizeof(struct meminfo)); And w/respect to (2), wouldn't that just cause the generic kvtop() to fail? And if so, it kind of re-defines the meaning of kvtop(), even though its current callers pretty much expect to receive a legitimate physical memory address. But if a virtual address resolves to a PTE with any legitimate address in it, then kvtop() should return whatever's there. But I'm still wondering what makes ppc behave differently in dump_mem_map_SPARSEMEM()? Dave -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility