Skip to content

Commit cae5875

Browse files
mrutland-armAlex Shi
authored andcommitted
arm64: mm: add __{pud,pgd}_populate
We currently have __pmd_populate for creating a pmd table entry given the physical address of a pte, but don't have equivalents for the pud or pgd levels of table. To enable us to manipulate tables which are mapped outside of the linear mapping (where we have a PA, but not a linear map VA), it is useful to have these functions. This patch adds __{pud,pgd}_populate. As these should not be called when the kernel uses folded {pmd,pud}s, in these cases they expand to BUILD_BUG(). So long as the appropriate checks are made on the {pud,pgd} entry prior to attempting population, these should be optimized out at compile time. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Tested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Tested-by: Jeremy Linton <jeremy.linton@arm.com> Cc: Laura Abbott <labbott@fedoraproject.org> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> (cherry picked from commit 1e531cce68c92b46c7d29f36a72f9a3e5886678f) Signed-off-by: Alex Shi <alex.shi@linaro.org>
1 parent de93e05 commit cae5875

1 file changed

Lines changed: 22 additions & 4 deletions

File tree

arch/arm64/include/asm/pgalloc.h

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,20 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
4242
free_page((unsigned long)pmd);
4343
}
4444

45-
static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
45+
static inline void __pud_populate(pud_t *pud, phys_addr_t pmd, pudval_t prot)
4646
{
47-
set_pud(pud, __pud(__pa(pmd) | PMD_TYPE_TABLE));
47+
set_pud(pud, __pud(pmd | prot));
4848
}
4949

50+
static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
51+
{
52+
__pud_populate(pud, __pa(pmd), PMD_TYPE_TABLE);
53+
}
54+
#else
55+
static inline void __pud_populate(pud_t *pud, phys_addr_t pmd, pudval_t prot)
56+
{
57+
BUILD_BUG();
58+
}
5059
#endif /* CONFIG_PGTABLE_LEVELS > 2 */
5160

5261
#if CONFIG_PGTABLE_LEVELS > 3
@@ -62,11 +71,20 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud)
6271
free_page((unsigned long)pud);
6372
}
6473

65-
static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud)
74+
static inline void __pgd_populate(pgd_t *pgdp, phys_addr_t pud, pgdval_t prot)
6675
{
67-
set_pgd(pgd, __pgd(__pa(pud) | PUD_TYPE_TABLE));
76+
set_pgd(pgdp, __pgd(pud | prot));
6877
}
6978

79+
static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud)
80+
{
81+
__pgd_populate(pgd, __pa(pud), PUD_TYPE_TABLE);
82+
}
83+
#else
84+
static inline void __pgd_populate(pgd_t *pgdp, phys_addr_t pud, pgdval_t prot)
85+
{
86+
BUILD_BUG();
87+
}
7088
#endif /* CONFIG_PGTABLE_LEVELS > 3 */
7189

7290
extern pgd_t *pgd_alloc(struct mm_struct *mm);

0 commit comments

Comments
 (0)