]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ARM: factor out allocation routine from __create_mapping()
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Tue, 15 Sep 2015 12:59:14 +0000 (14:59 +0200)
committerard <ard.biesheuvel@linaro.org>
Sun, 13 Dec 2015 18:18:29 +0000 (19:18 +0100)
To allow __create_mapping() to be used for populating UEFI Runtime
Services page tables, factor out the allocation routine 'early_alloc'
and pass it down as a function pointer into alloc_init_[pud|pmd|pte].
This way, new users of __create_mapping() can supply another allocation
function.

Tested-by: Ryan Harkin <ryan.harkin@linaro.org>
Reviewed-by: Matt Fleming <matt@codeblueprint.co.uk>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
arch/arm/mm/mmu.c

index 3100de92148b06779b4500618c2e4e3ac7dd2d71..87dc49dbe231b48489722c950c6c6c73bbaf770c 100644 (file)
@@ -724,21 +724,30 @@ static void __init *early_alloc(unsigned long sz)
        return early_alloc_aligned(sz, sz);
 }
 
-static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, unsigned long prot)
+static pte_t * __init pte_alloc(pmd_t *pmd, unsigned long addr,
+                               unsigned long prot,
+                               void *(*alloc)(unsigned long sz))
 {
        if (pmd_none(*pmd)) {
-               pte_t *pte = early_alloc(PTE_HWTABLE_OFF + PTE_HWTABLE_SIZE);
+               pte_t *pte = alloc(PTE_HWTABLE_OFF + PTE_HWTABLE_SIZE);
                __pmd_populate(pmd, __pa(pte), prot);
        }
        BUG_ON(pmd_bad(*pmd));
        return pte_offset_kernel(pmd, addr);
 }
 
+static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr,
+                                     unsigned long prot)
+{
+       return pte_alloc(pmd, addr, prot, early_alloc);
+}
+
 static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr,
                                  unsigned long end, unsigned long pfn,
-                                 const struct mem_type *type)
+                                 const struct mem_type *type,
+                                 void *(*alloc)(unsigned long sz))
 {
-       pte_t *pte = early_pte_alloc(pmd, addr, type->prot_l1);
+       pte_t *pte = pte_alloc(pmd, addr, type->prot_l1, alloc);
        do {
                set_pte_ext(pte, pfn_pte(pfn, __pgprot(type->prot_pte)), 0);
                pfn++;
@@ -774,7 +783,8 @@ static void __init __map_init_section(pmd_t *pmd, unsigned long addr,
 
 static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
                                      unsigned long end, phys_addr_t phys,
-                                     const struct mem_type *type)
+                                     const struct mem_type *type,
+                                     void *(*alloc)(unsigned long sz))
 {
        pmd_t *pmd = pmd_offset(pud, addr);
        unsigned long next;
@@ -795,7 +805,7 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
                        __map_init_section(pmd, addr, next, phys, type);
                } else {
                        alloc_init_pte(pmd, addr, next,
-                                               __phys_to_pfn(phys), type);
+                                      __phys_to_pfn(phys), type, alloc);
                }
 
                phys += next - addr;
@@ -805,14 +815,15 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
 
 static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
                                  unsigned long end, phys_addr_t phys,
-                                 const struct mem_type *type)
+                                 const struct mem_type *type,
+                                 void *(*alloc)(unsigned long sz))
 {
        pud_t *pud = pud_offset(pgd, addr);
        unsigned long next;
 
        do {
                next = pud_addr_end(addr, end);
-               alloc_init_pmd(pud, addr, next, phys, type);
+               alloc_init_pmd(pud, addr, next, phys, type, alloc);
                phys += next - addr;
        } while (pud++, addr = next, addr != end);
 }
@@ -877,7 +888,8 @@ static void __init create_36bit_mapping(struct mm_struct *mm,
 }
 #endif /* !CONFIG_ARM_LPAE */
 
-static void __init __create_mapping(struct mm_struct *mm, struct map_desc *md)
+static void __init __create_mapping(struct mm_struct *mm, struct map_desc *md,
+                                   void *(*alloc)(unsigned long sz))
 {
        unsigned long addr, length, end;
        phys_addr_t phys;
@@ -911,7 +923,7 @@ static void __init __create_mapping(struct mm_struct *mm, struct map_desc *md)
        do {
                unsigned long next = pgd_addr_end(addr, end);
 
-               alloc_init_pud(pgd, addr, next, phys, type);
+               alloc_init_pud(pgd, addr, next, phys, type, alloc);
 
                phys += next - addr;
                addr = next;
@@ -940,7 +952,7 @@ static void __init create_mapping(struct map_desc *md)
                        (long long)__pfn_to_phys((u64)md->pfn), md->virtual);
        }
 
-       __create_mapping(&init_mm, md);
+       __create_mapping(&init_mm, md, early_alloc);
 }
 
 /*