We do not need four levels of page tables in either 32-bit or 64-bit ARM, so remove the useless indirection. Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> --- lib/arm/asm/page.h | 4 ---- lib/arm/asm/pgtable.h | 22 ++++++++-------------- lib/arm/mmu.c | 3 +-- lib/arm64/asm/page.h | 12 +++--------- lib/arm64/asm/pgtable-hwdef.h | 17 ++--------------- lib/arm64/asm/pgtable.h | 10 ++-------- 6 files changed, 16 insertions(+), 52 deletions(-) diff --git a/lib/arm/asm/page.h b/lib/arm/asm/page.h index 3802641..fc1b30e 100644 --- a/lib/arm/asm/page.h +++ b/lib/arm/asm/page.h @@ -34,10 +34,6 @@ typedef struct { pteval_t pgprot; } pgprot_t; #define __pgd(x) ((pgd_t) { (x) } ) #define __pgprot(x) ((pgprot_t) { (x) } ) -typedef struct { pgd_t pgd; } pud_t; -#define pud_val(x) (pgd_val((x).pgd)) -#define __pud(x) ((pud_t) { __pgd(x) } ) - #ifndef __virt_to_phys #define __phys_to_virt(x) ((unsigned long) (x)) #define __virt_to_phys(x) (x) diff --git a/lib/arm/asm/pgtable.h b/lib/arm/asm/pgtable.h index a38f5da..27603db 100644 --- a/lib/arm/asm/pgtable.h +++ b/lib/arm/asm/pgtable.h @@ -4,7 +4,6 @@ * Adapted from arch/arm/include/asm/pgtable.h * arch/arm/include/asm/pgtable-3level.h * arch/arm/include/asm/pgalloc.h - * include/asm-generic/pgtable-nopud.h * * Note: some Linux function APIs have been modified. Nothing crazy, * but if a function took, for example, an mm_struct, then @@ -16,7 +15,6 @@ */ #define pgd_none(pgd) (!pgd_val(pgd)) -#define pud_none(pud) (!pud_val(pud)) #define pmd_none(pmd) (!pmd_val(pmd)) #define pte_none(pte) (!pte_val(pte)) @@ -32,19 +30,15 @@ static inline pgd_t *pgd_alloc(void) return pgd; } -#define pud_offset(pgd, addr) ((pud_t *)pgd) -#define pud_free(pud) -#define pud_alloc(pgd, addr) pud_offset(pgd, addr) - -static inline pmd_t *pud_page_vaddr(pud_t pud) +static inline pmd_t *pgd_page_vaddr(pgd_t pgd) { - return __va(pud_val(pud) & PHYS_MASK & (s32)PAGE_MASK); + return __va(pgd_val(pgd) & PHYS_MASK & (s32)PAGE_MASK); } #define pmd_index(addr) \ (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) -#define pmd_offset(pud, addr) \ - (pud_page_vaddr(*(pud)) + pmd_index(addr)) +#define pmd_offset(pgd, addr) \ + (pgd_page_vaddr(*(pgd)) + pmd_index(addr)) #define pmd_free(pmd) free(pmd) static inline pmd_t *pmd_alloc_one(void) @@ -53,13 +47,13 @@ static inline pmd_t *pmd_alloc_one(void) memset(pmd, 0, PTRS_PER_PMD * sizeof(pmd_t)); return pmd; } -static inline pmd_t *pmd_alloc(pud_t *pud, unsigned long addr) +static inline pmd_t *pmd_alloc(pgd_t *pgd, unsigned long addr) { - if (pud_none(*pud)) { + if (pgd_none(*pgd)) { pmd_t *pmd = pmd_alloc_one(); - pud_val(*pud) = __pa(pmd) | PMD_TYPE_TABLE; + pgd_val(*pgd) = __pa(pmd) | PMD_TYPE_TABLE; } - return pmd_offset(pud, addr); + return pmd_offset(pgd, addr); } static inline pte_t *pmd_page_vaddr(pmd_t pmd) diff --git a/lib/arm/mmu.c b/lib/arm/mmu.c index 227e25b..4e7581d 100644 --- a/lib/arm/mmu.c +++ b/lib/arm/mmu.c @@ -81,8 +81,7 @@ void mmu_set_range_ptes(pgd_t *pgtable, unsigned long virt_offset, for (; vaddr < virt_end; vaddr += PAGE_SIZE, paddr += PAGE_SIZE) { pgd_t *pgd = pgd_offset(pgtable, vaddr); - pud_t *pud = pud_alloc(pgd, vaddr); - pmd_t *pmd = pmd_alloc(pud, vaddr); + pmd_t *pmd = pmd_alloc(pgd, vaddr); pte_t *pte = pte_alloc(pmd, vaddr); pte_val(*pte) = paddr; diff --git a/lib/arm64/asm/page.h b/lib/arm64/asm/page.h index 35ea0ed..01b4cf6 100644 --- a/lib/arm64/asm/page.h +++ b/lib/arm64/asm/page.h @@ -3,7 +3,6 @@ /* * Adapted from * arch/arm64/include/asm/pgtable-types.h - * include/asm-generic/pgtable-nopud.h * include/asm-generic/pgtable-nopmd.h * * Copyright (C) 2017, Red Hat Inc, Andrew Jones <drjones@xxxxxxxxxx> @@ -28,7 +27,6 @@ typedef u64 pteval_t; typedef u64 pmdval_t; -typedef u64 pudval_t; typedef u64 pgdval_t; typedef struct { pteval_t pte; } pte_t; typedef struct { pgdval_t pgd; } pgd_t; @@ -42,13 +40,9 @@ typedef struct { pteval_t pgprot; } pgprot_t; #define __pgd(x) ((pgd_t) { (x) } ) #define __pgprot(x) ((pgprot_t) { (x) } ) -typedef struct { pgd_t pgd; } pud_t; -#define pud_val(x) (pgd_val((x).pgd)) -#define __pud(x) ((pud_t) { __pgd(x) } ) - -typedef struct { pud_t pud; } pmd_t; -#define pmd_val(x) (pud_val((x).pud)) -#define __pmd(x) ((pmd_t) { __pud(x) } ) +typedef struct { pgd_t pgd; } pmd_t; +#define pmd_val(x) (pgd_val((x).pgd)) +#define __pmd(x) ((pmd_t) { __pgd(x) } ) #ifndef __virt_to_phys #define __phys_to_virt(x) ((unsigned long) (x)) diff --git a/lib/arm64/asm/pgtable-hwdef.h b/lib/arm64/asm/pgtable-hwdef.h index 8e9c295..045a3ce 100644 --- a/lib/arm64/asm/pgtable-hwdef.h +++ b/lib/arm64/asm/pgtable-hwdef.h @@ -22,13 +22,8 @@ #define PGDIR_MASK (~(PGDIR_SIZE-1)) #define PTRS_PER_PGD (1 << (VA_BITS - PGDIR_SHIFT)) -/* From include/asm-generic/pgtable-nopud.h */ -#define PUD_SHIFT PGDIR_SHIFT -#define PTRS_PER_PUD 1 -#define PUD_SIZE (UL(1) << PUD_SHIFT) -#define PUD_MASK (~(PUD_SIZE-1)) /* From include/asm-generic/pgtable-nopmd.h */ -#define PMD_SHIFT PUD_SHIFT +#define PMD_SHIFT PGDIR_SHIFT #define PTRS_PER_PMD 1 #define PMD_SIZE (UL(1) << PMD_SHIFT) #define PMD_MASK (~(PMD_SIZE-1)) @@ -43,15 +38,7 @@ /* * Hardware page table definitions. * - * Level 1 descriptor (PUD). - */ -#define PUD_TYPE_TABLE (_AT(pudval_t, 3) << 0) -#define PUD_TABLE_BIT (_AT(pgdval_t, 1) << 1) -#define PUD_TYPE_MASK (_AT(pgdval_t, 3) << 0) -#define PUD_TYPE_SECT (_AT(pgdval_t, 1) << 0) - -/* - * Level 2 descriptor (PMD). + * Level 1 descriptor (PMD). */ #define PMD_TYPE_MASK (_AT(pmdval_t, 3) << 0) #define PMD_TYPE_FAULT (_AT(pmdval_t, 0) << 0) diff --git a/lib/arm64/asm/pgtable.h b/lib/arm64/asm/pgtable.h index 217cdb6..14d7e3c 100644 --- a/lib/arm64/asm/pgtable.h +++ b/lib/arm64/asm/pgtable.h @@ -3,7 +3,6 @@ /* * Adapted from arch/arm64/include/asm/pgtable.h * include/asm-generic/pgtable-nopmd.h - * include/asm-generic/pgtable-nopud.h * include/linux/mm.h * * Note: some Linux function APIs have been modified. Nothing crazy, @@ -20,7 +19,6 @@ #include <asm/pgtable-hwdef.h> #define pgd_none(pgd) (!pgd_val(pgd)) -#define pud_none(pud) (!pud_val(pud)) #define pmd_none(pmd) (!pmd_val(pmd)) #define pte_none(pte) (!pte_val(pte)) @@ -36,13 +34,9 @@ static inline pgd_t *pgd_alloc(void) return pgd; } -#define pud_offset(pgd, addr) ((pud_t *)pgd) -#define pud_free(pud) -#define pud_alloc(pgd, addr) pud_offset(pgd, addr) - -#define pmd_offset(pud, addr) ((pmd_t *)pud) +#define pmd_offset(pgd, addr) ((pmd_t *)pgd) #define pmd_free(pmd) -#define pmd_alloc(pud, addr) pmd_offset(pud, addr) +#define pmd_alloc(pgd, addr) pmd_offset(pgd, addr) static inline pte_t *pmd_page_vaddr(pmd_t pmd) { -- 2.14.2