[PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables
Masaki Tachibana
mas-tachibana at vf.jp.nec.com
Mon May 7 03:19:45 EDT 2018
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.
> +#define PMD_SIZE (1UL << PMD_SHIFT)
> +#define PMD_MASK (~(PMD_SIZE - 1))
Thanks
Tachibana
> -----Original Message-----
> From: kexec [mailto:kexec-bounces at lists.infradead.org] On Behalf Of Baoquan He
> Sent: Friday, March 02, 2018 2:49 PM
> To: kexec at lists.infradead.org
> Cc: douly.fnst at cn.fujitsu.com; indou.takao at jp.fujitsu.com; Hayashi Masahiko() <mas-hayashi at tg.jp.nec.com>;
> Tachibana Masaki() <mas-tachibana at vf.jp.nec.com>
> Subject: [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables
>
> From: Dou Liyang <douly.fnst at cn.fujitsu.com>
>
> 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 at cn.fujitsu.com>
> ---
> 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 at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
More information about the kexec
mailing list