"Sachin P. Sant" wrote: > Hi Dave > Recently there were changes made to kexec tools to support 64K page size. > With those changes vmcore file obtained from a kernel which supports 64K > page size cannot be analyzed using crash on a machine running with kernel > supporting 4K page size. > > The following changes in crash tool resolves the problem. > Look if the symbol __hash_page_64k exists. This symbol is defined only > for kernels with 64K PAGE SIZE support. If yes then the dump was taken > with a kernel supporting 64k page size. So use the vmcore page size[64K] > instead of getpagesize(). > > Thanks > -Sachin > > ------------------------------------------------------------------------------------------------------------------------ > * Recently there were changes made to kexec tools to support 64K page size. > With those changes vmcore file obtained from a kernel which supports 64K > page size cannot be analyzed using crash on a machine running with kernel > supporting 4K page size. > The following change were made in crash tool to solve the problem. > Look if the symbol __hash_page_64k exists. If yes then the dump was taken > with a kernel supporting 64k page size. So change the page size accordingly. > > Signed-Off-By: Sachin Sant <sachinp@xxxxxxxxxx> > -- > > diff -Naurp crash-4.0/defs.h crash-4.0-new/defs.h > --- crash-4.0/defs.h 2006-09-14 21:41:50.000000000 -0400 > +++ crash-4.0-new/defs.h 2006-09-14 21:48:37.000000000 -0400 > @@ -2297,6 +2297,7 @@ struct efi_memory_desc_t { > #define _64BIT_ > #define MACHINE_TYPE "PPC64" > > +#define PPC64_64K_PAGE_SIZE 65536 > #define PAGEBASE(X) (((ulong)(X)) & (ulong)machdep->pagemask) > > #define PTOV(X) ((unsigned long)(X)+(machdep->kvbase)) > diff -Naurp crash-4.0/ppc64.c crash-4.0-new/ppc64.c > --- crash-4.0/ppc64.c 2006-09-14 21:41:50.000000000 -0400 > +++ crash-4.0-new/ppc64.c 2006-09-14 21:50:26.000000000 -0400 > @@ -67,19 +67,6 @@ ppc64_init(int when) > machdep->verify_symbol = ppc64_verify_symbol; > if (pc->flags & KERNEL_DEBUG_QUERY) > return; > - machdep->pagesize = memory_page_size(); > - machdep->pageshift = ffs(machdep->pagesize) - 1; > - machdep->pageoffset = machdep->pagesize - 1; > - machdep->pagemask = ~((ulonglong)machdep->pageoffset); > - machdep->stacksize = 4 * machdep->pagesize; > - if ((machdep->pgd = (char *)malloc(PAGESIZE())) == NULL) > - error(FATAL, "cannot malloc pgd space."); > - if ((machdep->pmd = (char *)malloc(PAGESIZE())) == NULL) > - error(FATAL, "cannot malloc pmd space."); > - if ((machdep->ptbl = (char *)malloc(PAGESIZE())) == NULL) > - error(FATAL, "cannot malloc ptbl space."); > - if ((machdep->machspec->level4 = (char *)malloc(PAGESIZE())) == NULL) > - error(FATAL, "cannot malloc level4 space."); > machdep->last_pgd_read = 0; > machdep->last_pmd_read = 0; > machdep->last_ptbl_read = 0; > @@ -93,6 +80,40 @@ ppc64_init(int when) > break; > > case PRE_GDB: > + /* > + * Recently there were changes made to kexec tools > + * to support 64K page size. With those changes > + * vmcore file obtained from a kernel which supports > + * 64K page size cannot be analyzed using crash on a > + * machine running with kernel supporting 4K page size > + * > + * The following modifications are required in crash > + * tool to be in sync with kexec tools. > + * > + * Look if the following symbol exists. If yes then > + * the dump was taken with a kernel supporting 64k > + * page size. So change the page size accordingly. > + * > + * Also moved the following code block from > + * PRE_SYMTAB case here. > + */ > + if (symbol_exists("__hash_page_64K")) > + machdep->pagesize = PPC64_64K_PAGE_SIZE; > + else > + machdep->pagesize = memory_page_size(); > + machdep->pageshift = ffs(machdep->pagesize) - 1; > + machdep->pageoffset = machdep->pagesize - 1; > + machdep->pagemask = ~((ulonglong)machdep->pageoffset); > + machdep->stacksize = 4 * machdep->pagesize; > + if ((machdep->pgd = (char *)malloc(PAGESIZE())) == NULL) > + error(FATAL, "cannot malloc pgd space."); > + if ((machdep->pmd = (char *)malloc(PAGESIZE())) == NULL) > + error(FATAL, "cannot malloc pmd space."); > + if ((machdep->ptbl = (char *)malloc(PAGESIZE())) == NULL) > + error(FATAL, "cannot malloc ptbl space."); > + if ((machdep->machspec->level4 = (char *)malloc(PAGESIZE())) == NULL) > + error(FATAL, "cannot malloc level4 space."); > + > machdep->kvbase = symbol_value("_stext"); > machdep->identity_map_base = machdep->kvbase; > machdep->is_kvaddr = generic_is_kvaddr; The patch looks safe enough. A couple things I just noticed though... Is it true that the process stack size will be 256K? And the ppc64 hardware interrupt stack would be 512K? Based upon the machdep->pagesize value, these inititializations get done later: machdep->stacksize = 4 * machdep->pagesize; machdep->machspec->hwstacksize = 8 * machdep->pagesize; If they have not increased, won't the backtrace code get confused? Thanks, Dave -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility