[Crash-utility] [PATCH] arm64: incorrect translation, physical address include flags

Dave Anderson anderson at redhat.com
Tue Sep 8 17:37:13 UTC 2015


A fix is queued for crash-7.1.4:

  https://github.com/crash-utility/crash/commit/0901bd175398a88dc424d5a47d3ca71644c0c163

Thanks,
  Dave



----- Original Message -----
> > -----Original Message-----
> > ----- Original Message -----
> > > Hi
> > >
> > > We have seen a problem when translating virtual to physical addresses.
> > > It appears that upper flags are not cleared.
> > >
> > > Example below, observe that physical address is incorrect for 'PAGE:',
> > > it include flags in upper bits. This value is also returned from
> > > arm64_vtop_3level_4k().
> > >
> > > crash> vtop ffffffc081000000
> > > VIRTUAL           PHYSICAL
> > > ffffffc081000000  81000000
> > >
> > > PAGE DIRECTORY: ffffffc00007d000
> > >    PGD: ffffffc00007d810 => 61fe003
> > >    PMD: ffffffc0061fe040 => 20000081000711
> > >   PAGE: 20000081000000  (2MB)
> > >
> > >      PTE        PHYSICAL  FLAGS
> > > 20000081000711  81000000  (VALID|SHARED|AF|PXN)
> > >
> > > vtop: WARNING: sparsemem: invalid section number: 8388610
> > > ---
> > >  arm64.c | 1 +
> > >  1 file changed, 1 insertion(+)
> > >
> > > diff --git a/arm64.c b/arm64.c
> > > index d1d75c4..2320df9 100644
> > > --- a/arm64.c
> > > +++ b/arm64.c
> > > @@ -802,6 +802,7 @@ arm64_vtop_3level_4k(ulong pgd, ulong vaddr,
> > > physaddr_t *paddr, int verbose)
> > >
> > >  	if ((pmd_val & PMD_TYPE_MASK) == PMD_TYPE_SECT) {
> > >  		ulong sectionbase = pmd_val &
> > SECTION_PAGE_MASK_2MB;
> > > +		sectionbase &= PHYS_MASK;
> > >  		if (verbose) {
> > >  			fprintf(fp, "  PAGE: %lx  (2MB)\n\n",
> > sectionbase);
> > >  			arm64_translate_pte(pmd_val, 0, 0);
> > > --
> > > 1.9.1
> > >
> > > --
> > > Crash-utility mailing list
> > > Crash-utility at redhat.com
> > > https://www.redhat.com/mailman/listinfo/crash-utility
> > 
> > Hi Johan,
> > 
> > I also see it with 64k pages when the referenced memory is in the high
> > ranges.
> > But there are actually two issues here, because the
> > SECTION_PAGE_MASK_2MB and SECTION_PAGE_MASK_512MB macros are
> > incorrectly being defined as 32-bit values.
> > 
> > How does this patch work for you?:
> > 
> > 
> > --- a/arm64.c
> > +++ b/arm64.c
> > @@ -702,8 +702,8 @@ arm64_uvtop(struct task_context *tc, ulong uvaddr,
> > physaddr_t *paddr, int verbos
> >  #define PMD_TYPE_MASK   3
> >  #define PMD_TYPE_SECT   1
> >  #define PMD_TYPE_TABLE  2
> > -#define SECTION_PAGE_MASK_2MB    (~((MEGABYTES(2))-1))
> > -#define SECTION_PAGE_MASK_512MB  (~((MEGABYTES(512))-1))
> > +#define SECTION_PAGE_MASK_2MB    ((long)(~((MEGABYTES(2))-1)))
> > +#define SECTION_PAGE_MASK_512MB  ((long)(~((MEGABYTES(512))-1)))
> > 
> >  static int
> >  arm64_vtop_2level_64k(ulong pgd, ulong vaddr, physaddr_t *paddr, int
> > verbose) @@ -729,7 +729,7 @@ arm64_vtop_2level_64k(ulong pgd, ulong
> > vaddr, physaddr_t *paddr, int verbose)
> >          */
> > 
> >         if ((pgd_val & PMD_TYPE_MASK) == PMD_TYPE_SECT) {
> > -               ulong sectionbase = pgd_val & SECTION_PAGE_MASK_512MB;
> > +               ulong sectionbase = (pgd_val & SECTION_PAGE_MASK_512MB)
> > + & PHYS_MASK;
> >                 if (verbose) {
> >                         fprintf(fp, "  PAGE: %lx  (512MB)\n\n",
> > sectionbase);
> >                         arm64_translate_pte(pgd_val, 0, 0); @@ -801,7
> > +801,7 @@ arm64_vtop_3level_4k(ulong pgd, ulong vaddr, physaddr_t
> > *paddr, int verbose)
> >                 goto no_page;
> > 
> >         if ((pmd_val & PMD_TYPE_MASK) == PMD_TYPE_SECT) {
> > -               ulong sectionbase = pmd_val & SECTION_PAGE_MASK_2MB;
> > +               ulong sectionbase = (pmd_val & SECTION_PAGE_MASK_2MB) &
> > + PHYS_MASK;
> >                 if (verbose) {
> >                         fprintf(fp, "  PAGE: %lx  (2MB)\n\n",
> > sectionbase);
> >                         arm64_translate_pte(pmd_val, 0, 0);
> > 
> > 
> 
> Hi Dave
> 
> This patch seems to be working fine.
> 
> Thanks
> Johan
> 
> 
> --
> 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