.. | .. |
---|
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 |
---|