| .. | .. |
|---|
| 2 | 2 | #ifndef _ALPHA_PGTABLE_H |
|---|
| 3 | 3 | #define _ALPHA_PGTABLE_H |
|---|
| 4 | 4 | |
|---|
| 5 | | -#include <asm-generic/4level-fixup.h> |
|---|
| 5 | +#include <asm-generic/pgtable-nopud.h> |
|---|
| 6 | 6 | |
|---|
| 7 | 7 | /* |
|---|
| 8 | 8 | * This file contains the functions and defines necessary to modify and use |
|---|
| .. | .. |
|---|
| 226 | 226 | extern inline void pmd_set(pmd_t * pmdp, pte_t * ptep) |
|---|
| 227 | 227 | { pmd_val(*pmdp) = _PAGE_TABLE | ((((unsigned long) ptep) - PAGE_OFFSET) << (32-PAGE_SHIFT)); } |
|---|
| 228 | 228 | |
|---|
| 229 | | -extern inline void pgd_set(pgd_t * pgdp, pmd_t * pmdp) |
|---|
| 230 | | -{ pgd_val(*pgdp) = _PAGE_TABLE | ((((unsigned long) pmdp) - PAGE_OFFSET) << (32-PAGE_SHIFT)); } |
|---|
| 229 | +extern inline void pud_set(pud_t * pudp, pmd_t * pmdp) |
|---|
| 230 | +{ pud_val(*pudp) = _PAGE_TABLE | ((((unsigned long) pmdp) - PAGE_OFFSET) << (32-PAGE_SHIFT)); } |
|---|
| 231 | 231 | |
|---|
| 232 | 232 | |
|---|
| 233 | 233 | extern inline unsigned long |
|---|
| .. | .. |
|---|
| 238 | 238 | |
|---|
| 239 | 239 | #ifndef CONFIG_DISCONTIGMEM |
|---|
| 240 | 240 | #define pmd_page(pmd) (mem_map + ((pmd_val(pmd) & _PFN_MASK) >> 32)) |
|---|
| 241 | | -#define pgd_page(pgd) (mem_map + ((pgd_val(pgd) & _PFN_MASK) >> 32)) |
|---|
| 241 | +#define pud_page(pud) (mem_map + ((pud_val(pud) & _PFN_MASK) >> 32)) |
|---|
| 242 | 242 | #endif |
|---|
| 243 | 243 | |
|---|
| 244 | | -extern inline unsigned long pgd_page_vaddr(pgd_t pgd) |
|---|
| 245 | | -{ return PAGE_OFFSET + ((pgd_val(pgd) & _PFN_MASK) >> (32-PAGE_SHIFT)); } |
|---|
| 244 | +extern inline pmd_t *pud_pgtable(pud_t pgd) |
|---|
| 245 | +{ |
|---|
| 246 | + return (pmd_t *)(PAGE_OFFSET + ((pud_val(pgd) & _PFN_MASK) >> (32-PAGE_SHIFT))); |
|---|
| 247 | +} |
|---|
| 246 | 248 | |
|---|
| 247 | 249 | extern inline int pte_none(pte_t pte) { return !pte_val(pte); } |
|---|
| 248 | 250 | extern inline int pte_present(pte_t pte) { return pte_val(pte) & _PAGE_VALID; } |
|---|
| .. | .. |
|---|
| 256 | 258 | extern inline int pmd_present(pmd_t pmd) { return pmd_val(pmd) & _PAGE_VALID; } |
|---|
| 257 | 259 | extern inline void pmd_clear(pmd_t * pmdp) { pmd_val(*pmdp) = 0; } |
|---|
| 258 | 260 | |
|---|
| 259 | | -extern inline int pgd_none(pgd_t pgd) { return !pgd_val(pgd); } |
|---|
| 260 | | -extern inline int pgd_bad(pgd_t pgd) { return (pgd_val(pgd) & ~_PFN_MASK) != _PAGE_TABLE; } |
|---|
| 261 | | -extern inline int pgd_present(pgd_t pgd) { return pgd_val(pgd) & _PAGE_VALID; } |
|---|
| 262 | | -extern inline void pgd_clear(pgd_t * pgdp) { pgd_val(*pgdp) = 0; } |
|---|
| 261 | +extern inline int pud_none(pud_t pud) { return !pud_val(pud); } |
|---|
| 262 | +extern inline int pud_bad(pud_t pud) { return (pud_val(pud) & ~_PFN_MASK) != _PAGE_TABLE; } |
|---|
| 263 | +extern inline int pud_present(pud_t pud) { return pud_val(pud) & _PAGE_VALID; } |
|---|
| 264 | +extern inline void pud_clear(pud_t * pudp) { pud_val(*pudp) = 0; } |
|---|
| 263 | 265 | |
|---|
| 264 | 266 | /* |
|---|
| 265 | 267 | * The following only work if pte_present() is true. |
|---|
| .. | .. |
|---|
| 268 | 270 | extern inline int pte_write(pte_t pte) { return !(pte_val(pte) & _PAGE_FOW); } |
|---|
| 269 | 271 | extern inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } |
|---|
| 270 | 272 | extern inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } |
|---|
| 271 | | -extern inline int pte_special(pte_t pte) { return 0; } |
|---|
| 272 | 273 | |
|---|
| 273 | 274 | extern inline pte_t pte_wrprotect(pte_t pte) { pte_val(pte) |= _PAGE_FOW; return pte; } |
|---|
| 274 | 275 | extern inline pte_t pte_mkclean(pte_t pte) { pte_val(pte) &= ~(__DIRTY_BITS); return pte; } |
|---|
| .. | .. |
|---|
| 276 | 277 | extern inline pte_t pte_mkwrite(pte_t pte) { pte_val(pte) &= ~_PAGE_FOW; return pte; } |
|---|
| 277 | 278 | extern inline pte_t pte_mkdirty(pte_t pte) { pte_val(pte) |= __DIRTY_BITS; return pte; } |
|---|
| 278 | 279 | extern inline pte_t pte_mkyoung(pte_t pte) { pte_val(pte) |= __ACCESS_BITS; return pte; } |
|---|
| 279 | | -extern inline pte_t pte_mkspecial(pte_t pte) { return pte; } |
|---|
| 280 | | - |
|---|
| 281 | | -#define PAGE_DIR_OFFSET(tsk,address) pgd_offset((tsk),(address)) |
|---|
| 282 | | - |
|---|
| 283 | | -/* to find an entry in a kernel page-table-directory */ |
|---|
| 284 | | -#define pgd_offset_k(address) pgd_offset(&init_mm, (address)) |
|---|
| 285 | | - |
|---|
| 286 | | -/* to find an entry in a page-table-directory. */ |
|---|
| 287 | | -#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) |
|---|
| 288 | | -#define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address)) |
|---|
| 289 | 280 | |
|---|
| 290 | 281 | /* |
|---|
| 291 | | - * The smp_read_barrier_depends() in the following functions are required to |
|---|
| 292 | | - * order the load of *dir (the pointer in the top level page table) with any |
|---|
| 293 | | - * subsequent load of the returned pmd_t *ret (ret is data dependent on *dir). |
|---|
| 282 | + * The smp_rmb() in the following functions are required to order the load of |
|---|
| 283 | + * *dir (the pointer in the top level page table) with any subsequent load of |
|---|
| 284 | + * the returned pmd_t *ret (ret is data dependent on *dir). |
|---|
| 294 | 285 | * |
|---|
| 295 | 286 | * If this ordering is not enforced, the CPU might load an older value of |
|---|
| 296 | 287 | * *ret, which may be uninitialized data. See mm/memory.c:__pte_alloc for |
|---|
| .. | .. |
|---|
| 301 | 292 | */ |
|---|
| 302 | 293 | |
|---|
| 303 | 294 | /* Find an entry in the second-level page table.. */ |
|---|
| 304 | | -extern inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address) |
|---|
| 295 | +extern inline pmd_t * pmd_offset(pud_t * dir, unsigned long address) |
|---|
| 305 | 296 | { |
|---|
| 306 | | - pmd_t *ret = (pmd_t *) pgd_page_vaddr(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1)); |
|---|
| 307 | | - smp_read_barrier_depends(); /* see above */ |
|---|
| 297 | + pmd_t *ret = pud_pgtable(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1)); |
|---|
| 298 | + smp_rmb(); /* see above */ |
|---|
| 308 | 299 | return ret; |
|---|
| 309 | 300 | } |
|---|
| 301 | +#define pmd_offset pmd_offset |
|---|
| 310 | 302 | |
|---|
| 311 | 303 | /* Find an entry in the third-level page table.. */ |
|---|
| 312 | 304 | extern inline pte_t * pte_offset_kernel(pmd_t * dir, unsigned long address) |
|---|
| 313 | 305 | { |
|---|
| 314 | 306 | pte_t *ret = (pte_t *) pmd_page_vaddr(*dir) |
|---|
| 315 | 307 | + ((address >> PAGE_SHIFT) & (PTRS_PER_PAGE - 1)); |
|---|
| 316 | | - smp_read_barrier_depends(); /* see above */ |
|---|
| 308 | + smp_rmb(); /* see above */ |
|---|
| 317 | 309 | return ret; |
|---|
| 318 | 310 | } |
|---|
| 319 | | - |
|---|
| 320 | | -#define pte_offset_map(dir,addr) pte_offset_kernel((dir),(addr)) |
|---|
| 321 | | -#define pte_unmap(pte) do { } while (0) |
|---|
| 311 | +#define pte_offset_kernel pte_offset_kernel |
|---|
| 322 | 312 | |
|---|
| 323 | 313 | extern pgd_t swapper_pg_dir[1024]; |
|---|
| 324 | 314 | |
|---|
| .. | .. |
|---|
| 356 | 346 | printk("%s:%d: bad pgd %016lx.\n", __FILE__, __LINE__, pgd_val(e)) |
|---|
| 357 | 347 | |
|---|
| 358 | 348 | extern void paging_init(void); |
|---|
| 359 | | - |
|---|
| 360 | | -#include <asm-generic/pgtable.h> |
|---|
| 361 | | - |
|---|
| 362 | | -/* |
|---|
| 363 | | - * No page table caches to initialise |
|---|
| 364 | | - */ |
|---|
| 365 | | -#define pgtable_cache_init() do { } while (0) |
|---|
| 366 | 349 | |
|---|
| 367 | 350 | /* We have our own get_unmapped_area to cope with ADDR_LIMIT_32BIT. */ |
|---|
| 368 | 351 | #define HAVE_ARCH_UNMAPPED_AREA |
|---|