1 #include <linux/vmalloc.h>
2 #include <asm/pgalloc.h>
4 /* called with the page_table_lock held */
6 remap_area_pte(pte_t * pte, unsigned long address, unsigned long size,
7 unsigned long phys_addr, unsigned long flags)
18 if (!pte_none(*pte)) {
19 printk("remap_area_pte: page already exists\n");
23 mk_pte_phys(phys_addr,
24 __pgprot(_PAGE_VALID | _PAGE_ASM |
25 _PAGE_KRE | _PAGE_KWE | flags)));
27 phys_addr += PAGE_SIZE;
29 } while (address && (address < end));
32 /* called with the page_table_lock held */
34 remap_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size,
35 unsigned long phys_addr, unsigned long flags)
39 address &= ~PGDIR_MASK;
47 pte_t * pte = pte_alloc(&init_mm, pmd, address);
50 remap_area_pte(pte, address, end - address,
51 address + phys_addr, flags);
52 address = (address + PMD_SIZE) & PMD_MASK;
54 } while (address && (address < end));
59 __alpha_remap_area_pages(unsigned long address, unsigned long phys_addr,
60 unsigned long size, unsigned long flags)
64 unsigned long end = address + size;
67 dir = pgd_offset(&init_mm, address);
71 spin_lock(&init_mm.page_table_lock);
74 pmd = pmd_alloc(&init_mm, dir, address);
78 if (remap_area_pmd(pmd, address, end - address,
79 phys_addr + address, flags))
82 address = (address + PGDIR_SIZE) & PGDIR_MASK;
84 } while (address && (address < end));
85 spin_unlock(&init_mm.page_table_lock);