On 05/07/18 at 07:19am, Masaki Tachibana wrote: > Hi Baoquan, > > Sorry for the late reply. > > > > +#define PUD_SIZE (1UL << PUD_SHIFT) > > +#define PUD_MASK (~(PUD_SHIFT - 1)) > Is this (~(PUD_SIZE - 1)) ? > If so, I will correct this. This patch is from Dou, while I think you are right. Please help change it directly. > > > +#define PMD_SIZE (1UL << PMD_SHIFT) > > +#define PMD_MASK (~(PMD_SIZE - 1)) > > > Thanks > Tachibana > > > > -----Original Message----- > > From: kexec [mailto:kexec-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Baoquan He > > Sent: Friday, March 02, 2018 2:49 PM > > To: kexec@xxxxxxxxxxxxxxxxxxx > > Cc: douly.fnst@xxxxxxxxxxxxxx; indou.takao@xxxxxxxxxxxxxx; Hayashi Masahiko() <mas-hayashi@xxxxxxxxxxxxx>; > > Tachibana Masaki() <mas-tachibana@xxxxxxxxxxxxx> > > Subject: [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables > > > > From: Dou Liyang <douly.fnst@xxxxxxxxxxxxxx> > > > > Due to the changing of 4-level page tables implementation in kernel, makedumpfile > > left behind some of the redundant macros. this make the translation not clear and > > hard to expand the code to support 5-level page tables. > > > > Remove the PML4* and PGDIR_* and unify the macro to get the index of PGD. > > > > Signed-off-by: Dou Liyang <douly.fnst@xxxxxxxxxxxxxx> > > --- > > arch/x86_64.c | 59 +++++++++++++++++++++++++++++++++++----------------------- > > makedumpfile.h | 21 +++++++++------------ > > 2 files changed, 45 insertions(+), 35 deletions(-) > > > > diff --git a/arch/x86_64.c b/arch/x86_64.c > > index 1f24415..cbe45c2 100644 > > --- a/arch/x86_64.c > > +++ b/arch/x86_64.c > > @@ -257,7 +257,7 @@ get_versiondep_info_x86_64(void) > > unsigned long long > > __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable) > > { > > - unsigned long page_dir, pml4, pgd_paddr, pgd_pte, pmd_paddr, pmd_pte; > > + unsigned long page_dir, pgd, pud_paddr, pud_pte, pmd_paddr, pmd_pte; > > unsigned long pte_paddr, pte; > > > > /* > > @@ -269,43 +269,43 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable) > > if (page_dir == NOT_PADDR) > > return NOT_PADDR; > > } > > - page_dir += pml4_index(vaddr) * sizeof(unsigned long); > > - if (!readmem(PADDR, page_dir, &pml4, sizeof pml4)) { > > - ERRMSG("Can't get pml4 (page_dir:%lx).\n", page_dir); > > + page_dir += pgd_index(vaddr) * sizeof(unsigned long); > > + if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) { > > + ERRMSG("Can't get pgd (page_dir:%lx).\n", page_dir); > > return NOT_PADDR; > > } > > if (info->vaddr_for_vtop == vaddr) > > - MSG(" PGD : %16lx => %16lx\n", page_dir, pml4); > > + MSG(" PGD : %16lx => %16lx\n", page_dir, pgd); > > > > - if (!(pml4 & _PAGE_PRESENT)) { > > - ERRMSG("Can't get a valid pml4.\n"); > > + if (!(pgd & _PAGE_PRESENT)) { > > + ERRMSG("Can't get a valid pgd.\n"); > > return NOT_PADDR; > > } > > > > /* > > * Get PUD. > > */ > > - pgd_paddr = pml4 & ENTRY_MASK; > > - pgd_paddr += pgd_index(vaddr) * sizeof(unsigned long); > > - if (!readmem(PADDR, pgd_paddr, &pgd_pte, sizeof pgd_pte)) { > > - ERRMSG("Can't get pgd_pte (pgd_paddr:%lx).\n", pgd_paddr); > > + pud_paddr = pgd & ENTRY_MASK; > > + pud_paddr += pud_index(vaddr) * sizeof(unsigned long); > > + if (!readmem(PADDR, pud_paddr, &pud_pte, sizeof pud_pte)) { > > + ERRMSG("Can't get pud_pte (pud_paddr:%lx).\n", pud_paddr); > > return NOT_PADDR; > > } > > if (info->vaddr_for_vtop == vaddr) > > - MSG(" PUD : %16lx => %16lx\n", pgd_paddr, pgd_pte); > > + MSG(" PUD : %16lx => %16lx\n", pud_paddr, pud_pte); > > > > - if (!(pgd_pte & _PAGE_PRESENT)) { > > - ERRMSG("Can't get a valid pgd_pte.\n"); > > + if (!(pud_pte & _PAGE_PRESENT)) { > > + ERRMSG("Can't get a valid pud_pte.\n"); > > return NOT_PADDR; > > } > > - if (pgd_pte & _PAGE_PSE) /* 1GB pages */ > > - return (pgd_pte & ENTRY_MASK & PGDIR_MASK) + > > - (vaddr & ~PGDIR_MASK); > > + if (pud_pte & _PAGE_PSE) /* 1GB pages */ > > + return (pud_pte & ENTRY_MASK & PUD_MASK) + > > + (vaddr & ~PUD_MASK); > > > > /* > > * Get PMD. > > */ > > - pmd_paddr = pgd_pte & ENTRY_MASK; > > + pmd_paddr = pud_pte & ENTRY_MASK; > > pmd_paddr += pmd_index(vaddr) * sizeof(unsigned long); > > if (!readmem(PADDR, pmd_paddr, &pmd_pte, sizeof pmd_pte)) { > > ERRMSG("Can't get pmd_pte (pmd_paddr:%lx).\n", pmd_paddr); > > @@ -391,15 +391,22 @@ kvtop_xen_x86_64(unsigned long kvaddr) > > > > if ((dirp = kvtop_xen_x86_64(SYMBOL(pgd_l4))) == NOT_PADDR) > > return NOT_PADDR; > > - dirp += pml4_index(kvaddr) * sizeof(unsigned long long); > > + > > + /* > > + * Get PGD. > > + */ > > + dirp += pgd_index(kvaddr) * sizeof(unsigned long long); > > if (!readmem(PADDR, dirp, &entry, sizeof(entry))) > > return NOT_PADDR; > > > > if (!(entry & _PAGE_PRESENT)) > > return NOT_PADDR; > > > > + /* > > + * Get PUD. > > + */ > > dirp = entry & ENTRY_MASK; > > - dirp += pgd_index(kvaddr) * sizeof(unsigned long long); > > + dirp += pud_index(kvaddr) * sizeof(unsigned long long); > > if (!readmem(PADDR, dirp, &entry, sizeof(entry))) > > return NOT_PADDR; > > > > @@ -407,9 +414,12 @@ kvtop_xen_x86_64(unsigned long kvaddr) > > return NOT_PADDR; > > > > if (entry & _PAGE_PSE) /* 1GB pages */ > > - return (entry & ENTRY_MASK & PGDIR_MASK) + > > - (kvaddr & ~PGDIR_MASK); > > + return (entry & ENTRY_MASK & PUD_MASK) + > > + (kvaddr & ~PUD_MASK); > > > > + /* > > + * Get PMD. > > + */ > > dirp = entry & ENTRY_MASK; > > dirp += pmd_index(kvaddr) * sizeof(unsigned long long); > > if (!readmem(PADDR, dirp, &entry, sizeof(entry))) > > @@ -422,6 +432,9 @@ kvtop_xen_x86_64(unsigned long kvaddr) > > return (entry & ENTRY_MASK & PMD_MASK) + > > (kvaddr & ~PMD_MASK); > > > > + /* > > + * Get PTE. > > + */ > > dirp = entry & ENTRY_MASK; > > dirp += pte_index(kvaddr) * sizeof(unsigned long long); > > if (!readmem(PADDR, dirp, &entry, sizeof(entry))) > > @@ -596,7 +609,7 @@ find_vmemmap_x86_64() > > * for max_paddr >> 12 page structures > > */ > > high_pfn = max_paddr >> 12; > > - pgd_index = pgd4_index(vaddr_base); > > + pgd_index = pgd_index(vaddr_base); > > pgd_addr = vaddr_to_paddr(init_level4_pgt); /* address of pgd */ > > pgd_addr += pgd_index * sizeof(unsigned long); > > page_structs_per_pud = (PTRS_PER_PUD * PTRS_PER_PMD * info->page_size) / > > diff --git a/makedumpfile.h b/makedumpfile.h > > index 01eece2..088dfc3 100644 > > --- a/makedumpfile.h > > +++ b/makedumpfile.h > > @@ -602,25 +602,22 @@ unsigned long get_kvbase_arm64(void); > > /* > > * 4 Levels paging > > */ > > -#define PML4_SHIFT (39) > > -#define PTRS_PER_PML4 (512) > > -#define PGDIR_SHIFT (30) > > -#define PGDIR_SIZE (1UL << PGDIR_SHIFT) > > -#define PGDIR_MASK (~(PGDIR_SIZE - 1)) > > -#define PTRS_PER_PGD (512) > > #define PGD_SHIFT (39) > > #define PUD_SHIFT (30) > > #define PMD_SHIFT (21) > > -#define PMD_SIZE (1UL << PMD_SHIFT) > > -#define PMD_MASK (~(PMD_SIZE - 1)) > > +#define PTE_SHIFT (12) > > + > > +#define PTRS_PER_PGD (512) > > #define PTRS_PER_PUD (512) > > #define PTRS_PER_PMD (512) > > #define PTRS_PER_PTE (512) > > -#define PTE_SHIFT (12) > > > > -#define pml4_index(address) (((address) >> PML4_SHIFT) & (PTRS_PER_PML4 - 1)) > > -#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) > > -#define pgd4_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1)) > > +#define PUD_SIZE (1UL << PUD_SHIFT) > > +#define PUD_MASK (~(PUD_SHIFT - 1)) > > +#define PMD_SIZE (1UL << PMD_SHIFT) > > +#define PMD_MASK (~(PMD_SIZE - 1)) > > + > > +#define pgd_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1)) > > #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)) > > #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) > > #define pte_index(address) (((address) >> PTE_SHIFT) & (PTRS_PER_PTE - 1)) > > -- > > 2.13.6 > > > > > > _______________________________________________ > > kexec mailing list > > kexec@xxxxxxxxxxxxxxxxxxx > > http://lists.infradead.org/mailman/listinfo/kexec > > > > _______________________________________________ > kexec mailing list > kexec@xxxxxxxxxxxxxxxxxxx > http://lists.infradead.org/mailman/listinfo/kexec _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec