diff options
Diffstat (limited to 'include/asm-x86/pgtable_64.h')
| -rw-r--r-- | include/asm-x86/pgtable_64.h | 285 |
1 files changed, 0 insertions, 285 deletions
diff --git a/include/asm-x86/pgtable_64.h b/include/asm-x86/pgtable_64.h deleted file mode 100644 index fde9770e53d1..000000000000 --- a/include/asm-x86/pgtable_64.h +++ /dev/null | |||
| @@ -1,285 +0,0 @@ | |||
| 1 | #ifndef ASM_X86__PGTABLE_64_H | ||
| 2 | #define ASM_X86__PGTABLE_64_H | ||
| 3 | |||
| 4 | #include <linux/const.h> | ||
| 5 | #ifndef __ASSEMBLY__ | ||
| 6 | |||
| 7 | /* | ||
| 8 | * This file contains the functions and defines necessary to modify and use | ||
| 9 | * the x86-64 page table tree. | ||
| 10 | */ | ||
| 11 | #include <asm/processor.h> | ||
| 12 | #include <linux/bitops.h> | ||
| 13 | #include <linux/threads.h> | ||
| 14 | #include <asm/pda.h> | ||
| 15 | |||
| 16 | extern pud_t level3_kernel_pgt[512]; | ||
| 17 | extern pud_t level3_ident_pgt[512]; | ||
| 18 | extern pmd_t level2_kernel_pgt[512]; | ||
| 19 | extern pmd_t level2_fixmap_pgt[512]; | ||
| 20 | extern pmd_t level2_ident_pgt[512]; | ||
| 21 | extern pgd_t init_level4_pgt[]; | ||
| 22 | |||
| 23 | #define swapper_pg_dir init_level4_pgt | ||
| 24 | |||
| 25 | extern void paging_init(void); | ||
| 26 | |||
| 27 | #endif /* !__ASSEMBLY__ */ | ||
| 28 | |||
| 29 | #define SHARED_KERNEL_PMD 0 | ||
| 30 | |||
| 31 | /* | ||
| 32 | * PGDIR_SHIFT determines what a top-level page table entry can map | ||
| 33 | */ | ||
| 34 | #define PGDIR_SHIFT 39 | ||
| 35 | #define PTRS_PER_PGD 512 | ||
| 36 | |||
| 37 | /* | ||
| 38 | * 3rd level page | ||
| 39 | */ | ||
| 40 | #define PUD_SHIFT 30 | ||
| 41 | #define PTRS_PER_PUD 512 | ||
| 42 | |||
| 43 | /* | ||
| 44 | * PMD_SHIFT determines the size of the area a middle-level | ||
| 45 | * page table can map | ||
| 46 | */ | ||
| 47 | #define PMD_SHIFT 21 | ||
| 48 | #define PTRS_PER_PMD 512 | ||
| 49 | |||
| 50 | /* | ||
| 51 | * entries per page directory level | ||
| 52 | */ | ||
| 53 | #define PTRS_PER_PTE 512 | ||
| 54 | |||
| 55 | #ifndef __ASSEMBLY__ | ||
| 56 | |||
| 57 | #define pte_ERROR(e) \ | ||
| 58 | printk("%s:%d: bad pte %p(%016lx).\n", \ | ||
| 59 | __FILE__, __LINE__, &(e), pte_val(e)) | ||
| 60 | #define pmd_ERROR(e) \ | ||
| 61 | printk("%s:%d: bad pmd %p(%016lx).\n", \ | ||
| 62 | __FILE__, __LINE__, &(e), pmd_val(e)) | ||
| 63 | #define pud_ERROR(e) \ | ||
| 64 | printk("%s:%d: bad pud %p(%016lx).\n", \ | ||
| 65 | __FILE__, __LINE__, &(e), pud_val(e)) | ||
| 66 | #define pgd_ERROR(e) \ | ||
| 67 | printk("%s:%d: bad pgd %p(%016lx).\n", \ | ||
| 68 | __FILE__, __LINE__, &(e), pgd_val(e)) | ||
| 69 | |||
| 70 | #define pgd_none(x) (!pgd_val(x)) | ||
| 71 | #define pud_none(x) (!pud_val(x)) | ||
| 72 | |||
| 73 | struct mm_struct; | ||
| 74 | |||
| 75 | void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte); | ||
| 76 | |||
| 77 | |||
| 78 | static inline void native_pte_clear(struct mm_struct *mm, unsigned long addr, | ||
| 79 | pte_t *ptep) | ||
| 80 | { | ||
| 81 | *ptep = native_make_pte(0); | ||
| 82 | } | ||
| 83 | |||
| 84 | static inline void native_set_pte(pte_t *ptep, pte_t pte) | ||
| 85 | { | ||
| 86 | *ptep = pte; | ||
| 87 | } | ||
| 88 | |||
| 89 | static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte) | ||
| 90 | { | ||
| 91 | native_set_pte(ptep, pte); | ||
| 92 | } | ||
| 93 | |||
| 94 | static inline pte_t native_ptep_get_and_clear(pte_t *xp) | ||
| 95 | { | ||
| 96 | #ifdef CONFIG_SMP | ||
| 97 | return native_make_pte(xchg(&xp->pte, 0)); | ||
| 98 | #else | ||
| 99 | /* native_local_ptep_get_and_clear, | ||
| 100 | but duplicated because of cyclic dependency */ | ||
| 101 | pte_t ret = *xp; | ||
| 102 | native_pte_clear(NULL, 0, xp); | ||
| 103 | return ret; | ||
| 104 | #endif | ||
| 105 | } | ||
| 106 | |||
| 107 | static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd) | ||
| 108 | { | ||
| 109 | *pmdp = pmd; | ||
| 110 | } | ||
| 111 | |||
| 112 | static inline void native_pmd_clear(pmd_t *pmd) | ||
| 113 | { | ||
| 114 | native_set_pmd(pmd, native_make_pmd(0)); | ||
| 115 | } | ||
| 116 | |||
| 117 | static inline void native_set_pud(pud_t *pudp, pud_t pud) | ||
| 118 | { | ||
| 119 | *pudp = pud; | ||
| 120 | } | ||
| 121 | |||
| 122 | static inline void native_pud_clear(pud_t *pud) | ||
| 123 | { | ||
| 124 | native_set_pud(pud, native_make_pud(0)); | ||
| 125 | } | ||
| 126 | |||
| 127 | static inline void native_set_pgd(pgd_t *pgdp, pgd_t pgd) | ||
| 128 | { | ||
| 129 | *pgdp = pgd; | ||
| 130 | } | ||
| 131 | |||
| 132 | static inline void native_pgd_clear(pgd_t *pgd) | ||
| 133 | { | ||
| 134 | native_set_pgd(pgd, native_make_pgd(0)); | ||
| 135 | } | ||
| 136 | |||
| 137 | #define pte_same(a, b) ((a).pte == (b).pte) | ||
| 138 | |||
| 139 | #endif /* !__ASSEMBLY__ */ | ||
| 140 | |||
| 141 | #define PMD_SIZE (_AC(1, UL) << PMD_SHIFT) | ||
| 142 | #define PMD_MASK (~(PMD_SIZE - 1)) | ||
| 143 | #define PUD_SIZE (_AC(1, UL) << PUD_SHIFT) | ||
| 144 | #define PUD_MASK (~(PUD_SIZE - 1)) | ||
| 145 | #define PGDIR_SIZE (_AC(1, UL) << PGDIR_SHIFT) | ||
| 146 | #define PGDIR_MASK (~(PGDIR_SIZE - 1)) | ||
| 147 | |||
| 148 | |||
| 149 | #define MAXMEM _AC(0x00003fffffffffff, UL) | ||
| 150 | #define VMALLOC_START _AC(0xffffc20000000000, UL) | ||
| 151 | #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) | ||
| 152 | #define VMEMMAP_START _AC(0xffffe20000000000, UL) | ||
| 153 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) | ||
| 154 | #define MODULES_END _AC(0xffffffffff000000, UL) | ||
| 155 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) | ||
| 156 | |||
| 157 | #ifndef __ASSEMBLY__ | ||
| 158 | |||
| 159 | static inline int pgd_bad(pgd_t pgd) | ||
| 160 | { | ||
| 161 | return (pgd_val(pgd) & ~(PTE_PFN_MASK | _PAGE_USER)) != _KERNPG_TABLE; | ||
| 162 | } | ||
| 163 | |||
| 164 | static inline int pud_bad(pud_t pud) | ||
| 165 | { | ||
| 166 | return (pud_val(pud) & ~(PTE_PFN_MASK | _PAGE_USER)) != _KERNPG_TABLE; | ||
| 167 | } | ||
| 168 | |||
| 169 | static inline int pmd_bad(pmd_t pmd) | ||
| 170 | { | ||
| 171 | return (pmd_val(pmd) & ~(PTE_PFN_MASK | _PAGE_USER)) != _KERNPG_TABLE; | ||
| 172 | } | ||
| 173 | |||
| 174 | #define pte_none(x) (!pte_val((x))) | ||
| 175 | #define pte_present(x) (pte_val((x)) & (_PAGE_PRESENT | _PAGE_PROTNONE)) | ||
| 176 | |||
| 177 | #define pages_to_mb(x) ((x) >> (20 - PAGE_SHIFT)) /* FIXME: is this right? */ | ||
| 178 | |||
| 179 | /* | ||
| 180 | * Macro to mark a page protection value as "uncacheable". | ||
| 181 | */ | ||
| 182 | #define pgprot_noncached(prot) \ | ||
| 183 | (__pgprot(pgprot_val((prot)) | _PAGE_PCD | _PAGE_PWT)) | ||
| 184 | |||
| 185 | /* | ||
| 186 | * Conversion functions: convert a page and protection to a page entry, | ||
| 187 | * and a page entry and page directory to the page they refer to. | ||
| 188 | */ | ||
| 189 | |||
| 190 | /* | ||
| 191 | * Level 4 access. | ||
| 192 | */ | ||
| 193 | #define pgd_page_vaddr(pgd) \ | ||
| 194 | ((unsigned long)__va((unsigned long)pgd_val((pgd)) & PTE_PFN_MASK)) | ||
| 195 | #define pgd_page(pgd) (pfn_to_page(pgd_val((pgd)) >> PAGE_SHIFT)) | ||
| 196 | #define pgd_present(pgd) (pgd_val(pgd) & _PAGE_PRESENT) | ||
| 197 | static inline int pgd_large(pgd_t pgd) { return 0; } | ||
| 198 | #define mk_kernel_pgd(address) __pgd((address) | _KERNPG_TABLE) | ||
| 199 | |||
| 200 | /* PUD - Level3 access */ | ||
| 201 | /* to find an entry in a page-table-directory. */ | ||
| 202 | #define pud_page_vaddr(pud) \ | ||
| 203 | ((unsigned long)__va(pud_val((pud)) & PHYSICAL_PAGE_MASK)) | ||
| 204 | #define pud_page(pud) (pfn_to_page(pud_val((pud)) >> PAGE_SHIFT)) | ||
| 205 | #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)) | ||
| 206 | #define pud_offset(pgd, address) \ | ||
| 207 | ((pud_t *)pgd_page_vaddr(*(pgd)) + pud_index((address))) | ||
| 208 | #define pud_present(pud) (pud_val((pud)) & _PAGE_PRESENT) | ||
| 209 | |||
| 210 | static inline int pud_large(pud_t pte) | ||
| 211 | { | ||
| 212 | return (pud_val(pte) & (_PAGE_PSE | _PAGE_PRESENT)) == | ||
| 213 | (_PAGE_PSE | _PAGE_PRESENT); | ||
| 214 | } | ||
| 215 | |||
| 216 | /* PMD - Level 2 access */ | ||
| 217 | #define pmd_page_vaddr(pmd) ((unsigned long) __va(pmd_val((pmd)) & PTE_PFN_MASK)) | ||
| 218 | #define pmd_page(pmd) (pfn_to_page(pmd_val((pmd)) >> PAGE_SHIFT)) | ||
| 219 | |||
| 220 | #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) | ||
| 221 | #define pmd_offset(dir, address) ((pmd_t *)pud_page_vaddr(*(dir)) + \ | ||
| 222 | pmd_index(address)) | ||
| 223 | #define pmd_none(x) (!pmd_val((x))) | ||
| 224 | #define pmd_present(x) (pmd_val((x)) & _PAGE_PRESENT) | ||
| 225 | #define pfn_pmd(nr, prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val((prot)))) | ||
| 226 | #define pmd_pfn(x) ((pmd_val((x)) & __PHYSICAL_MASK) >> PAGE_SHIFT) | ||
| 227 | |||
| 228 | #define pte_to_pgoff(pte) ((pte_val((pte)) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT) | ||
| 229 | #define pgoff_to_pte(off) ((pte_t) { .pte = ((off) << PAGE_SHIFT) | \ | ||
| 230 | _PAGE_FILE }) | ||
| 231 | #define PTE_FILE_MAX_BITS __PHYSICAL_MASK_SHIFT | ||
| 232 | |||
| 233 | /* PTE - Level 1 access. */ | ||
| 234 | |||
| 235 | /* page, protection -> pte */ | ||
| 236 | #define mk_pte(page, pgprot) pfn_pte(page_to_pfn((page)), (pgprot)) | ||
| 237 | |||
| 238 | #define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | ||
| 239 | #define pte_offset_kernel(dir, address) ((pte_t *) pmd_page_vaddr(*(dir)) + \ | ||
| 240 | pte_index((address))) | ||
| 241 | |||
| 242 | /* x86-64 always has all page tables mapped. */ | ||
| 243 | #define pte_offset_map(dir, address) pte_offset_kernel((dir), (address)) | ||
| 244 | #define pte_offset_map_nested(dir, address) pte_offset_kernel((dir), (address)) | ||
| 245 | #define pte_unmap(pte) /* NOP */ | ||
| 246 | #define pte_unmap_nested(pte) /* NOP */ | ||
| 247 | |||
| 248 | #define update_mmu_cache(vma, address, pte) do { } while (0) | ||
| 249 | |||
| 250 | extern int direct_gbpages; | ||
| 251 | |||
| 252 | /* Encode and de-code a swap entry */ | ||
| 253 | #define __swp_type(x) (((x).val >> 1) & 0x3f) | ||
| 254 | #define __swp_offset(x) ((x).val >> 8) | ||
| 255 | #define __swp_entry(type, offset) ((swp_entry_t) { ((type) << 1) | \ | ||
| 256 | ((offset) << 8) }) | ||
| 257 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val((pte)) }) | ||
| 258 | #define __swp_entry_to_pte(x) ((pte_t) { .pte = (x).val }) | ||
| 259 | |||
| 260 | extern int kern_addr_valid(unsigned long addr); | ||
| 261 | extern void cleanup_highmap(void); | ||
| 262 | |||
| 263 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | ||
| 264 | remap_pfn_range(vma, vaddr, pfn, size, prot) | ||
| 265 | |||
| 266 | #define HAVE_ARCH_UNMAPPED_AREA | ||
| 267 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN | ||
| 268 | |||
| 269 | #define pgtable_cache_init() do { } while (0) | ||
| 270 | #define check_pgt_cache() do { } while (0) | ||
| 271 | |||
| 272 | #define PAGE_AGP PAGE_KERNEL_NOCACHE | ||
| 273 | #define HAVE_PAGE_AGP 1 | ||
| 274 | |||
| 275 | /* fs/proc/kcore.c */ | ||
| 276 | #define kc_vaddr_to_offset(v) ((v) & __VIRTUAL_MASK) | ||
| 277 | #define kc_offset_to_vaddr(o) \ | ||
| 278 | (((o) & (1UL << (__VIRTUAL_MASK_SHIFT - 1))) \ | ||
| 279 | ? ((o) | ~__VIRTUAL_MASK) \ | ||
| 280 | : (o)) | ||
| 281 | |||
| 282 | #define __HAVE_ARCH_PTE_SAME | ||
| 283 | #endif /* !__ASSEMBLY__ */ | ||
| 284 | |||
| 285 | #endif /* ASM_X86__PGTABLE_64_H */ | ||
