.. | .. |
---|
7 | 7 | */ |
---|
8 | 8 | #include <linux/init.h> |
---|
9 | 9 | #include <linux/mm.h> |
---|
10 | | -#include <linux/bootmem.h> |
---|
| 10 | +#include <linux/memblock.h> |
---|
11 | 11 | #include <linux/highmem.h> |
---|
12 | 12 | #include <asm/fixmap.h> |
---|
13 | | -#include <asm/pgtable.h> |
---|
14 | 13 | #include <asm/pgalloc.h> |
---|
| 14 | +#include <asm/tlbflush.h> |
---|
15 | 15 | |
---|
16 | 16 | void pgd_init(unsigned long page) |
---|
17 | 17 | { |
---|
.. | .. |
---|
30 | 30 | } |
---|
31 | 31 | } |
---|
32 | 32 | |
---|
| 33 | +#if defined(CONFIG_TRANSPARENT_HUGEPAGE) |
---|
| 34 | +pmd_t mk_pmd(struct page *page, pgprot_t prot) |
---|
| 35 | +{ |
---|
| 36 | + pmd_t pmd; |
---|
| 37 | + |
---|
| 38 | + pmd_val(pmd) = (page_to_pfn(page) << _PFN_SHIFT) | pgprot_val(prot); |
---|
| 39 | + |
---|
| 40 | + return pmd; |
---|
| 41 | +} |
---|
| 42 | + |
---|
| 43 | + |
---|
| 44 | +void set_pmd_at(struct mm_struct *mm, unsigned long addr, |
---|
| 45 | + pmd_t *pmdp, pmd_t pmd) |
---|
| 46 | +{ |
---|
| 47 | + *pmdp = pmd; |
---|
| 48 | + flush_tlb_all(); |
---|
| 49 | +} |
---|
| 50 | +#endif /* defined(CONFIG_TRANSPARENT_HUGEPAGE) */ |
---|
| 51 | + |
---|
33 | 52 | void __init pagetable_init(void) |
---|
34 | 53 | { |
---|
35 | 54 | unsigned long vaddr; |
---|
36 | 55 | pgd_t *pgd_base; |
---|
37 | 56 | #ifdef CONFIG_HIGHMEM |
---|
38 | 57 | pgd_t *pgd; |
---|
| 58 | + p4d_t *p4d; |
---|
39 | 59 | pud_t *pud; |
---|
40 | 60 | pmd_t *pmd; |
---|
41 | 61 | pte_t *pte; |
---|
.. | .. |
---|
61 | 81 | vaddr = PKMAP_BASE; |
---|
62 | 82 | fixrange_init(vaddr & PMD_MASK, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base); |
---|
63 | 83 | |
---|
64 | | - pgd = swapper_pg_dir + __pgd_offset(vaddr); |
---|
65 | | - pud = pud_offset(pgd, vaddr); |
---|
| 84 | + pgd = swapper_pg_dir + pgd_index(vaddr); |
---|
| 85 | + p4d = p4d_offset(pgd, vaddr); |
---|
| 86 | + pud = pud_offset(p4d, vaddr); |
---|
66 | 87 | pmd = pmd_offset(pud, vaddr); |
---|
67 | 88 | pte = pte_offset_kernel(pmd, vaddr); |
---|
68 | 89 | pkmap_page_table = pte; |
---|