diff options
Diffstat (limited to 'include/asm-x86_64/pgtable.h')
| -rw-r--r-- | include/asm-x86_64/pgtable.h | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/include/asm-x86_64/pgtable.h b/include/asm-x86_64/pgtable.h index 31e83c3bd022..6899e770b173 100644 --- a/include/asm-x86_64/pgtable.h +++ b/include/asm-x86_64/pgtable.h | |||
| @@ -21,12 +21,9 @@ extern unsigned long __supported_pte_mask; | |||
| 21 | 21 | ||
| 22 | #define swapper_pg_dir init_level4_pgt | 22 | #define swapper_pg_dir init_level4_pgt |
| 23 | 23 | ||
| 24 | extern int nonx_setup(char *str); | ||
| 25 | extern void paging_init(void); | 24 | extern void paging_init(void); |
| 26 | extern void clear_kernel_mapping(unsigned long addr, unsigned long size); | 25 | extern void clear_kernel_mapping(unsigned long addr, unsigned long size); |
| 27 | 26 | ||
| 28 | extern unsigned long pgkern_mask; | ||
| 29 | |||
| 30 | /* | 27 | /* |
| 31 | * ZERO_PAGE is a global shared page that is always zero: used | 28 | * ZERO_PAGE is a global shared page that is always zero: used |
| 32 | * for zero-mapped memory areas etc.. | 29 | * for zero-mapped memory areas etc.. |
| @@ -101,9 +98,6 @@ static inline void pgd_clear (pgd_t * pgd) | |||
| 101 | set_pgd(pgd, __pgd(0)); | 98 | set_pgd(pgd, __pgd(0)); |
| 102 | } | 99 | } |
| 103 | 100 | ||
| 104 | #define pud_page(pud) \ | ||
| 105 | ((unsigned long) __va(pud_val(pud) & PHYSICAL_PAGE_MASK)) | ||
| 106 | |||
| 107 | #define ptep_get_and_clear(mm,addr,xp) __pte(xchg(&(xp)->pte, 0)) | 101 | #define ptep_get_and_clear(mm,addr,xp) __pte(xchg(&(xp)->pte, 0)) |
| 108 | 102 | ||
| 109 | struct mm_struct; | 103 | struct mm_struct; |
| @@ -268,7 +262,7 @@ static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot) | |||
| 268 | #define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT) | 262 | #define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT) |
| 269 | static inline int pte_user(pte_t pte) { return pte_val(pte) & _PAGE_USER; } | 263 | static inline int pte_user(pte_t pte) { return pte_val(pte) & _PAGE_USER; } |
| 270 | static inline int pte_read(pte_t pte) { return pte_val(pte) & _PAGE_USER; } | 264 | static inline int pte_read(pte_t pte) { return pte_val(pte) & _PAGE_USER; } |
| 271 | static inline int pte_exec(pte_t pte) { return pte_val(pte) & _PAGE_USER; } | 265 | static inline int pte_exec(pte_t pte) { return !(pte_val(pte) & _PAGE_NX); } |
| 272 | static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } | 266 | static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } |
| 273 | static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } | 267 | static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } |
| 274 | static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; } | 268 | static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; } |
| @@ -281,11 +275,12 @@ static inline pte_t pte_mkclean(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & | |||
| 281 | static inline pte_t pte_mkold(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_ACCESSED)); return pte; } | 275 | static inline pte_t pte_mkold(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_ACCESSED)); return pte; } |
| 282 | static inline pte_t pte_wrprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_RW)); return pte; } | 276 | static inline pte_t pte_wrprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_RW)); return pte; } |
| 283 | static inline pte_t pte_mkread(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_USER)); return pte; } | 277 | static inline pte_t pte_mkread(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_USER)); return pte; } |
| 284 | static inline pte_t pte_mkexec(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_USER)); return pte; } | 278 | static inline pte_t pte_mkexec(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_NX)); return pte; } |
| 285 | static inline pte_t pte_mkdirty(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; } | 279 | static inline pte_t pte_mkdirty(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; } |
| 286 | static inline pte_t pte_mkyoung(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; } | 280 | static inline pte_t pte_mkyoung(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; } |
| 287 | static inline pte_t pte_mkwrite(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_RW)); return pte; } | 281 | static inline pte_t pte_mkwrite(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_RW)); return pte; } |
| 288 | static inline pte_t pte_mkhuge(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_PSE)); return pte; } | 282 | static inline pte_t pte_mkhuge(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_PSE)); return pte; } |
| 283 | static inline pte_t pte_clrhuge(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_PSE)); return pte; } | ||
| 289 | 284 | ||
| 290 | struct vm_area_struct; | 285 | struct vm_area_struct; |
| 291 | 286 | ||
| @@ -326,7 +321,8 @@ static inline int pmd_large(pmd_t pte) { | |||
| 326 | /* | 321 | /* |
| 327 | * Level 4 access. | 322 | * Level 4 access. |
| 328 | */ | 323 | */ |
| 329 | #define pgd_page(pgd) ((unsigned long) __va((unsigned long)pgd_val(pgd) & PTE_MASK)) | 324 | #define pgd_page_vaddr(pgd) ((unsigned long) __va((unsigned long)pgd_val(pgd) & PTE_MASK)) |
| 325 | #define pgd_page(pgd) (pfn_to_page(pgd_val(pgd) >> PAGE_SHIFT)) | ||
| 330 | #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) | 326 | #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) |
| 331 | #define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr)) | 327 | #define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr)) |
| 332 | #define pgd_offset_k(address) (init_level4_pgt + pgd_index(address)) | 328 | #define pgd_offset_k(address) (init_level4_pgt + pgd_index(address)) |
| @@ -335,22 +331,18 @@ static inline int pmd_large(pmd_t pte) { | |||
| 335 | 331 | ||
| 336 | /* PUD - Level3 access */ | 332 | /* PUD - Level3 access */ |
| 337 | /* to find an entry in a page-table-directory. */ | 333 | /* to find an entry in a page-table-directory. */ |
| 334 | #define pud_page_vaddr(pud) ((unsigned long) __va(pud_val(pud) & PHYSICAL_PAGE_MASK)) | ||
| 335 | #define pud_page(pud) (pfn_to_page(pud_val(pud) >> PAGE_SHIFT)) | ||
| 338 | #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1)) | 336 | #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1)) |
| 339 | #define pud_offset(pgd, address) ((pud_t *) pgd_page(*(pgd)) + pud_index(address)) | 337 | #define pud_offset(pgd, address) ((pud_t *) pgd_page_vaddr(*(pgd)) + pud_index(address)) |
| 340 | #define pud_offset_k(pgd, addr) pud_offset(pgd, addr) | ||
| 341 | #define pud_present(pud) (pud_val(pud) & _PAGE_PRESENT) | 338 | #define pud_present(pud) (pud_val(pud) & _PAGE_PRESENT) |
| 342 | 339 | ||
| 343 | static inline pud_t *__pud_offset_k(pud_t *pud, unsigned long address) | ||
| 344 | { | ||
| 345 | return pud + pud_index(address); | ||
| 346 | } | ||
| 347 | |||
| 348 | /* PMD - Level 2 access */ | 340 | /* PMD - Level 2 access */ |
| 349 | #define pmd_page_kernel(pmd) ((unsigned long) __va(pmd_val(pmd) & PTE_MASK)) | 341 | #define pmd_page_vaddr(pmd) ((unsigned long) __va(pmd_val(pmd) & PTE_MASK)) |
| 350 | #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) | 342 | #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) |
| 351 | 343 | ||
| 352 | #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) | 344 | #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) |
| 353 | #define pmd_offset(dir, address) ((pmd_t *) pud_page(*(dir)) + \ | 345 | #define pmd_offset(dir, address) ((pmd_t *) pud_page_vaddr(*(dir)) + \ |
| 354 | pmd_index(address)) | 346 | pmd_index(address)) |
| 355 | #define pmd_none(x) (!pmd_val(x)) | 347 | #define pmd_none(x) (!pmd_val(x)) |
| 356 | #define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) | 348 | #define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) |
| @@ -388,7 +380,7 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | |||
| 388 | 380 | ||
| 389 | #define pte_index(address) \ | 381 | #define pte_index(address) \ |
| 390 | (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | 382 | (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) |
| 391 | #define pte_offset_kernel(dir, address) ((pte_t *) pmd_page_kernel(*(dir)) + \ | 383 | #define pte_offset_kernel(dir, address) ((pte_t *) pmd_page_vaddr(*(dir)) + \ |
| 392 | pte_index(address)) | 384 | pte_index(address)) |
| 393 | 385 | ||
| 394 | /* x86-64 always has all page tables mapped. */ | 386 | /* x86-64 always has all page tables mapped. */ |
