Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM: early_pte_alloc()

Provide a common function for allocating early PTE tables.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

+13 -13
+13 -13
arch/arm/mm/mmu.c
··· 492 492 return alloc_bootmem_low_pages(sz); 493 493 } 494 494 495 + static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, unsigned long prot) 496 + { 497 + if (pmd_none(*pmd)) { 498 + pte_t *pte = early_alloc(2 * PTRS_PER_PTE * sizeof(pte_t)); 499 + __pmd_populate(pmd, __pa(pte) | prot); 500 + } 501 + BUG_ON(pmd_bad(*pmd)); 502 + return pte_offset_kernel(pmd, addr); 503 + } 504 + 495 505 static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr, 496 506 unsigned long end, unsigned long pfn, 497 507 const struct mem_type *type) 498 508 { 499 - pte_t *pte; 500 - 501 - if (pmd_none(*pmd)) { 502 - pte = early_alloc(2 * PTRS_PER_PTE * sizeof(pte_t)); 503 - __pmd_populate(pmd, __pa(pte) | type->prot_l1); 504 - } 505 - 506 - pte = pte_offset_kernel(pmd, addr); 509 + pte_t *pte = early_pte_alloc(pmd, addr, type->prot_l1); 507 510 do { 508 511 set_pte_ext(pte, pfn_pte(pfn, __pgprot(type->prot_pte)), 0); 509 512 pfn++; ··· 952 949 static void __init kmap_init(void) 953 950 { 954 951 #ifdef CONFIG_HIGHMEM 955 - pmd_t *pmd = pmd_off_k(PKMAP_BASE); 956 - pte_t *pte = early_alloc(2 * PTRS_PER_PTE * sizeof(pte_t)); 957 - BUG_ON(!pmd_none(*pmd) || !pte); 958 - __pmd_populate(pmd, __pa(pte) | _PAGE_KERNEL_TABLE); 959 - pkmap_page_table = pte + PTRS_PER_PTE; 952 + pkmap_page_table = early_pte_alloc(pmd_off_k(PKMAP_BASE), 953 + PKMAP_BASE, _PAGE_KERNEL_TABLE); 960 954 #endif 961 955 } 962 956