diff options
Diffstat (limited to 'arch/arm/include/asm/pgalloc.h')
| -rw-r--r-- | arch/arm/include/asm/pgalloc.h | 26 | 
1 files changed, 25 insertions, 1 deletions
diff --git a/arch/arm/include/asm/pgalloc.h b/arch/arm/include/asm/pgalloc.h index 3e08fd3fbb6..943504f53f5 100644 --- a/arch/arm/include/asm/pgalloc.h +++ b/arch/arm/include/asm/pgalloc.h @@ -25,12 +25,34 @@  #define _PAGE_USER_TABLE	(PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER))  #define _PAGE_KERNEL_TABLE	(PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) +#ifdef CONFIG_ARM_LPAE + +static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) +{ +	return (pmd_t *)get_zeroed_page(GFP_KERNEL | __GFP_REPEAT); +} + +static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) +{ +	BUG_ON((unsigned long)pmd & (PAGE_SIZE-1)); +	free_page((unsigned long)pmd); +} + +static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) +{ +	set_pud(pud, __pud(__pa(pmd) | PMD_TYPE_TABLE)); +} + +#else	/* !CONFIG_ARM_LPAE */ +  /*   * Since we have only two-level page tables, these are trivial   */  #define pmd_alloc_one(mm,addr)		({ BUG(); ((pmd_t *)2); })  #define pmd_free(mm, pmd)		do { } while (0) -#define pgd_populate(mm,pmd,pte)	BUG() +#define pud_populate(mm,pmd,pte)	BUG() + +#endif	/* CONFIG_ARM_LPAE */  extern pgd_t *pgd_alloc(struct mm_struct *mm);  extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); @@ -109,7 +131,9 @@ static inline void __pmd_populate(pmd_t *pmdp, phys_addr_t pte,  {  	pmdval_t pmdval = (pte + PTE_HWTABLE_OFF) | prot;  	pmdp[0] = __pmd(pmdval); +#ifndef CONFIG_ARM_LPAE  	pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); +#endif  	flush_pmd_entry(pmdp);  }  |