----- 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@xxxxxxxxxx> > > --- > > > > 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@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/crash-utility > -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility