diff options
Diffstat (limited to 'include/asm-x86_64/pgtable.h')
-rw-r--r-- | include/asm-x86_64/pgtable.h | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/include/asm-x86_64/pgtable.h b/include/asm-x86_64/pgtable.h index 730bd6028416..599993f6ba84 100644 --- a/include/asm-x86_64/pgtable.h +++ b/include/asm-x86_64/pgtable.h | |||
@@ -1,25 +1,25 @@ | |||
1 | #ifndef _X86_64_PGTABLE_H | 1 | #ifndef _X86_64_PGTABLE_H |
2 | #define _X86_64_PGTABLE_H | 2 | #define _X86_64_PGTABLE_H |
3 | 3 | ||
4 | #include <asm/const.h> | ||
5 | #ifndef __ASSEMBLY__ | ||
6 | |||
4 | /* | 7 | /* |
5 | * This file contains the functions and defines necessary to modify and use | 8 | * This file contains the functions and defines necessary to modify and use |
6 | * the x86-64 page table tree. | 9 | * the x86-64 page table tree. |
7 | */ | 10 | */ |
8 | #include <asm/processor.h> | 11 | #include <asm/processor.h> |
9 | #include <asm/fixmap.h> | ||
10 | #include <asm/bitops.h> | 12 | #include <asm/bitops.h> |
11 | #include <linux/threads.h> | 13 | #include <linux/threads.h> |
12 | #include <asm/pda.h> | 14 | #include <asm/pda.h> |
13 | 15 | ||
14 | extern pud_t level3_kernel_pgt[512]; | 16 | extern pud_t level3_kernel_pgt[512]; |
15 | extern pud_t level3_physmem_pgt[512]; | ||
16 | extern pud_t level3_ident_pgt[512]; | 17 | extern pud_t level3_ident_pgt[512]; |
17 | extern pmd_t level2_kernel_pgt[512]; | 18 | extern pmd_t level2_kernel_pgt[512]; |
18 | extern pgd_t init_level4_pgt[]; | 19 | extern pgd_t init_level4_pgt[]; |
19 | extern pgd_t boot_level4_pgt[]; | ||
20 | extern unsigned long __supported_pte_mask; | 20 | extern unsigned long __supported_pte_mask; |
21 | 21 | ||
22 | #define swapper_pg_dir init_level4_pgt | 22 | #define swapper_pg_dir ((pgd_t *)NULL) |
23 | 23 | ||
24 | extern void paging_init(void); | 24 | extern void paging_init(void); |
25 | extern void clear_kernel_mapping(unsigned long addr, unsigned long size); | 25 | extern void clear_kernel_mapping(unsigned long addr, unsigned long size); |
@@ -29,7 +29,9 @@ extern void clear_kernel_mapping(unsigned long addr, unsigned long size); | |||
29 | * for zero-mapped memory areas etc.. | 29 | * for zero-mapped memory areas etc.. |
30 | */ | 30 | */ |
31 | extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)]; | 31 | extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)]; |
32 | #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page)) | 32 | #define ZERO_PAGE(vaddr) (pfn_to_page(__pa_symbol(&empty_zero_page) >> PAGE_SHIFT)) |
33 | |||
34 | #endif /* !__ASSEMBLY__ */ | ||
33 | 35 | ||
34 | /* | 36 | /* |
35 | * PGDIR_SHIFT determines what a top-level page table entry can map | 37 | * PGDIR_SHIFT determines what a top-level page table entry can map |
@@ -55,6 +57,8 @@ extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)]; | |||
55 | */ | 57 | */ |
56 | #define PTRS_PER_PTE 512 | 58 | #define PTRS_PER_PTE 512 |
57 | 59 | ||
60 | #ifndef __ASSEMBLY__ | ||
61 | |||
58 | #define pte_ERROR(e) \ | 62 | #define pte_ERROR(e) \ |
59 | printk("%s:%d: bad pte %p(%016lx).\n", __FILE__, __LINE__, &(e), pte_val(e)) | 63 | printk("%s:%d: bad pte %p(%016lx).\n", __FILE__, __LINE__, &(e), pte_val(e)) |
60 | #define pmd_ERROR(e) \ | 64 | #define pmd_ERROR(e) \ |
@@ -118,22 +122,23 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long | |||
118 | 122 | ||
119 | #define pte_pgprot(a) (__pgprot((a).pte & ~PHYSICAL_PAGE_MASK)) | 123 | #define pte_pgprot(a) (__pgprot((a).pte & ~PHYSICAL_PAGE_MASK)) |
120 | 124 | ||
121 | #define PMD_SIZE (1UL << PMD_SHIFT) | 125 | #endif /* !__ASSEMBLY__ */ |
126 | |||
127 | #define PMD_SIZE (_AC(1,UL) << PMD_SHIFT) | ||
122 | #define PMD_MASK (~(PMD_SIZE-1)) | 128 | #define PMD_MASK (~(PMD_SIZE-1)) |
123 | #define PUD_SIZE (1UL << PUD_SHIFT) | 129 | #define PUD_SIZE (_AC(1,UL) << PUD_SHIFT) |
124 | #define PUD_MASK (~(PUD_SIZE-1)) | 130 | #define PUD_MASK (~(PUD_SIZE-1)) |
125 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | 131 | #define PGDIR_SIZE (_AC(1,UL) << PGDIR_SHIFT) |
126 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) | 132 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) |
127 | 133 | ||
128 | #define USER_PTRS_PER_PGD ((TASK_SIZE-1)/PGDIR_SIZE+1) | 134 | #define USER_PTRS_PER_PGD ((TASK_SIZE-1)/PGDIR_SIZE+1) |
129 | #define FIRST_USER_ADDRESS 0 | 135 | #define FIRST_USER_ADDRESS 0 |
130 | 136 | ||
131 | #ifndef __ASSEMBLY__ | 137 | #define MAXMEM 0x3fffffffffff |
132 | #define MAXMEM 0x3fffffffffffUL | 138 | #define VMALLOC_START 0xffffc20000000000 |
133 | #define VMALLOC_START 0xffffc20000000000UL | 139 | #define VMALLOC_END 0xffffe1ffffffffff |
134 | #define VMALLOC_END 0xffffe1ffffffffffUL | 140 | #define MODULES_VADDR 0xffffffff88000000 |
135 | #define MODULES_VADDR 0xffffffff88000000UL | 141 | #define MODULES_END 0xfffffffffff00000 |
136 | #define MODULES_END 0xfffffffffff00000UL | ||
137 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) | 142 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) |
138 | 143 | ||
139 | #define _PAGE_BIT_PRESENT 0 | 144 | #define _PAGE_BIT_PRESENT 0 |
@@ -159,7 +164,7 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long | |||
159 | #define _PAGE_GLOBAL 0x100 /* Global TLB entry */ | 164 | #define _PAGE_GLOBAL 0x100 /* Global TLB entry */ |
160 | 165 | ||
161 | #define _PAGE_PROTNONE 0x080 /* If not present */ | 166 | #define _PAGE_PROTNONE 0x080 /* If not present */ |
162 | #define _PAGE_NX (1UL<<_PAGE_BIT_NX) | 167 | #define _PAGE_NX (_AC(1,UL)<<_PAGE_BIT_NX) |
163 | 168 | ||
164 | #define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY) | 169 | #define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY) |
165 | #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) | 170 | #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) |
@@ -221,6 +226,8 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long | |||
221 | #define __S110 PAGE_SHARED_EXEC | 226 | #define __S110 PAGE_SHARED_EXEC |
222 | #define __S111 PAGE_SHARED_EXEC | 227 | #define __S111 PAGE_SHARED_EXEC |
223 | 228 | ||
229 | #ifndef __ASSEMBLY__ | ||
230 | |||
224 | static inline unsigned long pgd_bad(pgd_t pgd) | 231 | static inline unsigned long pgd_bad(pgd_t pgd) |
225 | { | 232 | { |
226 | return pgd_val(pgd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER); | 233 | return pgd_val(pgd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER); |
@@ -403,11 +410,9 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | |||
403 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | 410 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) |
404 | 411 | ||
405 | extern spinlock_t pgd_lock; | 412 | extern spinlock_t pgd_lock; |
406 | extern struct page *pgd_list; | 413 | extern struct list_head pgd_list; |
407 | void vmalloc_sync_all(void); | 414 | void vmalloc_sync_all(void); |
408 | 415 | ||
409 | #endif /* !__ASSEMBLY__ */ | ||
410 | |||
411 | extern int kern_addr_valid(unsigned long addr); | 416 | extern int kern_addr_valid(unsigned long addr); |
412 | 417 | ||
413 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | 418 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ |
@@ -437,5 +442,6 @@ extern int kern_addr_valid(unsigned long addr); | |||
437 | #define __HAVE_ARCH_PTEP_SET_WRPROTECT | 442 | #define __HAVE_ARCH_PTEP_SET_WRPROTECT |
438 | #define __HAVE_ARCH_PTE_SAME | 443 | #define __HAVE_ARCH_PTE_SAME |
439 | #include <asm-generic/pgtable.h> | 444 | #include <asm-generic/pgtable.h> |
445 | #endif /* !__ASSEMBLY__ */ | ||
440 | 446 | ||
441 | #endif /* _X86_64_PGTABLE_H */ | 447 | #endif /* _X86_64_PGTABLE_H */ |