Dave Anderson wrote:
"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@in.ibm.com>
> --
>
> 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


The kernel's asm-powerpc/thread_info.h file doesn't
show any change in stack size, which I didn't expect
it would anyway:

  #ifdef __KERNEL__

  /* We have 8k stacks on ppc32 and 16k on ppc64 */

  #ifdef CONFIG_PPC64
  #define THREAD_SHIFT            14
  #else
  #define THREAD_SHIFT            13
  #endif

  #define THREAD_SIZE             (1 << THREAD_SHIFT)

and the hardware interrupt stack seems to only be in
the paca_struct in 2.4 kernels.

I think we can safely hardwire those two values anyway,
right?

Dave