[PATCH] arm64: fix two level pmd calculation

Atsushi Kumagai ats-kumagai at wm.jp.nec.com
Mon Apr 18 18:38:54 PDT 2016


Hello Pratyush,

>While reviewing commit "a9085b70501c arm64: Fix for ARM64 3 level
>translation tables" we missed that, it breaks pmd_offset calculation for 2
>level translation table. Because of that we get following error messages:
>
>---------------------------------------------------------------------
>vtop_arm64: Can't read pmd
>---------------------------------------------------------------------
>
>Current patches fixes it.
>
>As a side effect of above fix, it also fixes following compilation warning
>introduced in above commit.
>
>---------------------------------------------------------------------
>arch/arm64.c: In function ‘pmd_offset’:
>arch/arm64.c:119:3: warning: implicit declaration of function
>‘get_page_shift_arm64’ [-Wimplicit-function-declaration]
>   return pmd_offset_pgtbl_lvl_3(pud, vaddr);
>   ^
>arch/arm64.c: In function ‘vtop_arm64’:
>arch/arm64.c:246:9: warning: unused variable ‘puda’ [-Wunused-variable]
>  pud_t *puda, pudv;
>         ^
>---------------------------------------------------------------------
>
>Signed-off-by: Pratyush Anand <panand at redhat.com>
>---

Thanks, I'll merge this patch into v1.6.0.

>
>Actually we need some cleanup around plat specific config calculation. That
>will help to add support of different page table level and sizes without
>any quirk. However, that needs kernel changes [1] in arm64 kexec code. Our
>plan is to introduce that kernel changes once arm64 kexec kernel patches
>are upstreamed. Once, modification in kernel is done then we can have
>makedumpfile modifications [2, 3] to support more page table levels.
>
>[1] https://github.com/pratyushanand/linux/commit/3d9a2e96bd49c69637b88f61cbefa9736e029370
>[2] https://github.com/pratyushanand/makedumpfile/commit/9432d817ee37583e87e7182b1f86a9da42d883bc
>[3] https://github.com/pratyushanand/makedumpfile/commit/231e997b96de2a124a553e2fdd8380bd8e703493

Sounds like a good plan, I'll wait for that.

Thanks,
Atsushi Kumagai

> arch/arm64.c | 22 ++++++++++++----------
> 1 file changed, 12 insertions(+), 10 deletions(-)
>
>diff --git a/arch/arm64.c b/arch/arm64.c
>index ab20389fa673..f7540262a6ae 100644
>--- a/arch/arm64.c
>+++ b/arch/arm64.c
>@@ -110,15 +110,6 @@ static int pgtable_level;
> static int va_bits;
> static int page_shift;
>
>-pmd_t *
>-pmd_offset(pud_t *pud, unsigned long vaddr)
>-{
>-	if (pgtable_level == 2) {
>-		return pmd_offset_pgtbl_lvl_2(pud, vaddr);
>-	} else {
>-		return pmd_offset_pgtbl_lvl_3(pud, vaddr);
>-	}
>-}
> int
> get_pgtable_level_arm64(void)
> {
>@@ -137,6 +128,16 @@ get_page_shift_arm64(void)
> 	return page_shift;
> }
>
>+pmd_t *
>+pmd_offset(pud_t *puda, pud_t *pudv, unsigned long vaddr)
>+{
>+	if (pgtable_level == 2) {
>+		return pmd_offset_pgtbl_lvl_2(puda, vaddr);
>+	} else {
>+		return pmd_offset_pgtbl_lvl_3(pudv, vaddr);
>+	}
>+}
>+
> #define PAGE_OFFSET_39 (0xffffffffffffffffUL << 39)
> #define PAGE_OFFSET_42 (0xffffffffffffffffUL << 42)
> static int calculate_plat_config(void)
>@@ -294,8 +295,9 @@ vtop_arm64(unsigned long vaddr)
> 	}
>
> 	pudv.pgd = pgdv;
>+	puda = (pud_t *)pgda;
>
>-	pmda = pmd_offset(&pudv, vaddr);
>+	pmda = pmd_offset(puda, &pudv, vaddr);
> 	if (!readmem(VADDR, (unsigned long long)pmda, &pmdv, sizeof(pmdv))) {
> 		ERRMSG("Can't read pmd\n");
> 		return NOT_PADDR;
>--
>2.5.0



More information about the kexec mailing list