[Crash-utility] [PATCH] [PPC32] Fix vmalloc address translation for BookE

Dave Anderson anderson at redhat.com
Wed Jan 18 14:41:47 UTC 2012



----- Original Message -----
> (2012/01/16 14:15), Suzuki K. Poulose wrote:
> > This patch fixes the vmalloc address translation for BookE.This
> > patch is based on the PPC44x definitions and may not work fine for
> > other systems.
> > 
> > crash>  mod
> > mod: cannot access vmalloc'd module memory
> > crash>
> > 
> > 
> > After the patch :
> > 
> > crash>  mod
> >   MODULE   NAME        SIZE  OBJECT FILE
> > d1018fd8  mbcache     6023  (not loaded)  [CONFIG_KALLSYMS]
> > d1077190  jbd        58360  (not loaded)  [CONFIG_KALLSYMS]
> > d107ca98  llc         4525  (not loaded)  [CONFIG_KALLSYMS]
> > d1130de4  ext3      203186  (not loaded)  [CONFIG_KALLSYMS]
> > d114bbac  squashfs   26129  (not loaded)  [CONFIG_KALLSYMS]
> > 
> > 
> > On ppc44x, the virtual-address is split as below :
> > 
> > Bits   |0      10|11      19|20         31|
> > 	-----------------------------------
> >         |   PGD   |    PMD   | PAGE_OFFSET  |
> >          -----------------------------------
> > 
> > The PAGE_BASE_ADDR is a 64bit value(of type phys_addr_t).
> > 
> > Note : I am not sure how do we distinguish the different values (PGDIR_SHIFT etc)
> > for different PPC32 systems. Since there are a lot of different platforms
> > under PPC32, we need some mechanism to dynamically determine the PGDIR, PTE
> > shift values. One option is to put the information in the VMCOREINFO.
> 
> Hi Suzuki,
> 
> How about using powerpc_base_platform symbol?
> 
>  *PTRRELOC(&powerpc_base_platform) = t->platform;
> 
> $ grep -rIw platform arch/powerpc/kernel/cputable.c
> /* The platform string corresponding to the real PVR */
>                 .platform               = "power3",
>                 .platform               = "power3",
>                 .platform               = "rs64",
>                 .platform               = "rs64",
>                 .platform               = "rs64",
>                 .platform               = "rs64",
>                 .platform               = "power4",
>                 .platform               = "power4",
>        :
>        :
> 
> This kconfig based platform string data can be read
>   base_platform = symbol_value("powerpc_base_platform symbols");
>   read_string(base_platform, buf, buffer-size);
> at ppc_init(POST_GDB).
> 
> I think platform can be distinguished with following naming rules.
>  - CONFIG_40x=y: platform is "ppc403"
>  - CONFIG_44x=y: platform is "ppc440"
> 
> Thanks,
> Toshi

That makes good sense.  Suzuki, are you re-working the patch
with Toshi's suggestion?

Dave

  
> > Or we should hard code these values for each platform and
> > compile a crash for a particular platform.
> > 
> > Thoughts ?
> > 
> > Signed-off-by: Suzuki K. Poulose<suzuki at in.ibm.com>
> > ---
> > 
> >   defs.h |    4 ++--
> >   ppc.c  |   20 ++++++++++++--------
> >   2 files changed, 14 insertions(+), 10 deletions(-)
> > 
> > diff --git a/defs.h b/defs.h
> > index 82d51e5..844f369 100755
> > --- a/defs.h
> > +++ b/defs.h
> > @@ -2603,8 +2603,8 @@ struct load_module {
> >   #define VTOP(X)            ((unsigned long)(X)-(machdep->kvbase))
> >   #define IS_VMALLOC_ADDR(X) (vt->vmalloc_start&&  (ulong)(X)>=
> >   vt->vmalloc_start)
> > 
> > -#define PGDIR_SHIFT   (22)
> > -#define PTRS_PER_PTE  (1024)
> > +#define PGDIR_SHIFT   (21)
> > +#define PTRS_PER_PTE  (512)
> >   #define PTRS_PER_PGD  (1024)
> > 
> >   #define _PAGE_PRESENT   0x001   /* software: pte contains a
> >   translation */
> > diff --git a/ppc.c b/ppc.c
> > index 2a10fac..6a1db2a 100755
> > --- a/ppc.c
> > +++ b/ppc.c
> > @@ -381,8 +381,8 @@ ppc_kvtop(struct task_context *tc, ulong
> > kvaddr, physaddr_t *paddr, int verbose)
> >   	ulong *page_dir;
> >   	ulong *page_middle;
> >   	ulong *page_table;
> > -        ulong pgd_pte;
> > -        ulong pte;
> > +	ulong pgd_pte;
> > +	unsigned long long pte;	/* PTE is 64 bit */
> > 
> >   	if (!IS_KVADDR(kvaddr))
> >   		return FALSE;
> > @@ -404,9 +404,13 @@ ppc_kvtop(struct task_context *tc, ulong
> > kvaddr, physaddr_t *paddr, int verbose)
> >   		fprintf(fp, "PAGE DIRECTORY: %lx\n", (ulong)pgd);
> > 
> >   	page_dir = pgd + (kvaddr>>  PGDIR_SHIFT);
> > -
> > -        FILL_PGD(PAGEBASE(pgd), KVADDR, PAGESIZE());
> > -        pgd_pte = ULONG(machdep->pgd + PAGEOFFSET(page_dir));
> > +	/*
> > +	 * The (kvaddr>>  PGDIR_SHIFT) may exceed PAGESIZE().
> > +	 * Use PAGEBASE(page_dir) to read the page containing the
> > +	 * translation.
> > +	 */
> > +        FILL_PGD(PAGEBASE(page_dir), KVADDR, PAGESIZE());
> > +        pgd_pte = ULONG((unsigned long)machdep->pgd +
> > PAGEOFFSET(page_dir));
> > 
> >   	if (verbose)
> >   		fprintf(fp, "  PGD: %lx =>  %lx\n", (ulong)page_dir, pgd_pte);
> > @@ -417,7 +421,7 @@ ppc_kvtop(struct task_context *tc, ulong
> > kvaddr, physaddr_t *paddr, int verbose)
> >   	page_middle = (ulong *)pgd_pte;
> > 
> >   	if (machdep->flags&  CPU_BOOKE)
> > -		page_table = page_middle + (BTOP(kvaddr)&  (PTRS_PER_PTE - 1));
> > +		page_table = (unsigned long long *)page_middle + (BTOP(kvaddr)&
> >  (PTRS_PER_PTE - 1));
> >   	else {
> >   		page_table = (ulong *)((pgd_pte&  (ulong)machdep->pagemask) +
> >   		machdep->kvbase);
> >   		page_table += ((ulong)BTOP(kvaddr)&  (PTRS_PER_PTE-1));
> > @@ -428,10 +432,10 @@ ppc_kvtop(struct task_context *tc, ulong
> > kvaddr, physaddr_t *paddr, int verbose)
> >   			(ulong)page_table);
> > 
> >           FILL_PTBL(PAGEBASE(page_table), KVADDR, PAGESIZE());
> > -        pte = ULONG(machdep->ptbl + PAGEOFFSET(page_table));
> > +        pte = ULONGLONG((unsigned long)machdep->ptbl +
> > PAGEOFFSET(page_table));
> > 
> >   	if (verbose)
> > -		fprintf(fp, "  PTE: %lx =>  %lx\n", (ulong)page_table, pte);
> > +		fprintf(fp, "  PTE: %lx =>  %llx\n", (ulong)page_table, pte);
> > 
> >   	if (!(pte&  _PAGE_PRESENT)) {
> >   		if (pte&&  verbose) {
> > 
> > 
> 
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
> 




More information about the Crash-utility mailing list