diff options
Diffstat (limited to 'arch/mips/include/asm/pgtable.h')
-rw-r--r-- | arch/mips/include/asm/pgtable.h | 191 |
1 files changed, 18 insertions, 173 deletions
diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h index ec50d52cfb7..b2202a68cf0 100644 --- a/arch/mips/include/asm/pgtable.h +++ b/arch/mips/include/asm/pgtable.h | |||
@@ -8,7 +8,6 @@ | |||
8 | #ifndef _ASM_PGTABLE_H | 8 | #ifndef _ASM_PGTABLE_H |
9 | #define _ASM_PGTABLE_H | 9 | #define _ASM_PGTABLE_H |
10 | 10 | ||
11 | #include <linux/mmzone.h> | ||
12 | #ifdef CONFIG_32BIT | 11 | #ifdef CONFIG_32BIT |
13 | #include <asm/pgtable-32.h> | 12 | #include <asm/pgtable-32.h> |
14 | #endif | 13 | #endif |
@@ -23,15 +22,15 @@ struct mm_struct; | |||
23 | struct vm_area_struct; | 22 | struct vm_area_struct; |
24 | 23 | ||
25 | #define PAGE_NONE __pgprot(_PAGE_PRESENT | _CACHE_CACHABLE_NONCOHERENT) | 24 | #define PAGE_NONE __pgprot(_PAGE_PRESENT | _CACHE_CACHABLE_NONCOHERENT) |
26 | #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | (cpu_has_rixi ? 0 : _PAGE_READ) | \ | 25 | #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | (kernel_uses_smartmips_rixi ? 0 : _PAGE_READ) | \ |
27 | _page_cachable_default) | 26 | _page_cachable_default) |
28 | #define PAGE_COPY __pgprot(_PAGE_PRESENT | (cpu_has_rixi ? 0 : _PAGE_READ) | \ | 27 | #define PAGE_COPY __pgprot(_PAGE_PRESENT | (kernel_uses_smartmips_rixi ? 0 : _PAGE_READ) | \ |
29 | (cpu_has_rixi ? _PAGE_NO_EXEC : 0) | _page_cachable_default) | 28 | (kernel_uses_smartmips_rixi ? _PAGE_NO_EXEC : 0) | _page_cachable_default) |
30 | #define PAGE_READONLY __pgprot(_PAGE_PRESENT | (cpu_has_rixi ? 0 : _PAGE_READ) | \ | 29 | #define PAGE_READONLY __pgprot(_PAGE_PRESENT | (kernel_uses_smartmips_rixi ? 0 : _PAGE_READ) | \ |
31 | _page_cachable_default) | 30 | _page_cachable_default) |
32 | #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \ | 31 | #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \ |
33 | _PAGE_GLOBAL | _page_cachable_default) | 32 | _PAGE_GLOBAL | _page_cachable_default) |
34 | #define PAGE_USERIO __pgprot(_PAGE_PRESENT | (cpu_has_rixi ? 0 : _PAGE_READ) | _PAGE_WRITE | \ | 33 | #define PAGE_USERIO __pgprot(_PAGE_PRESENT | (kernel_uses_smartmips_rixi ? 0 : _PAGE_READ) | _PAGE_WRITE | \ |
35 | _page_cachable_default) | 34 | _page_cachable_default) |
36 | #define PAGE_KERNEL_UNCACHED __pgprot(_PAGE_PRESENT | __READABLE | \ | 35 | #define PAGE_KERNEL_UNCACHED __pgprot(_PAGE_PRESENT | __READABLE | \ |
37 | __WRITEABLE | _PAGE_GLOBAL | _CACHE_UNCACHED) | 36 | __WRITEABLE | _PAGE_GLOBAL | _CACHE_UNCACHED) |
@@ -77,7 +76,16 @@ extern unsigned long zero_page_mask; | |||
77 | 76 | ||
78 | #define ZERO_PAGE(vaddr) \ | 77 | #define ZERO_PAGE(vaddr) \ |
79 | (virt_to_page((void *)(empty_zero_page + (((unsigned long)(vaddr)) & zero_page_mask)))) | 78 | (virt_to_page((void *)(empty_zero_page + (((unsigned long)(vaddr)) & zero_page_mask)))) |
80 | #define __HAVE_COLOR_ZERO_PAGE | 79 | |
80 | #define is_zero_pfn is_zero_pfn | ||
81 | static inline int is_zero_pfn(unsigned long pfn) | ||
82 | { | ||
83 | extern unsigned long zero_pfn; | ||
84 | unsigned long offset_from_zero_pfn = pfn - zero_pfn; | ||
85 | return offset_from_zero_pfn <= (zero_page_mask >> PAGE_SHIFT); | ||
86 | } | ||
87 | |||
88 | #define my_zero_pfn(addr) page_to_pfn(ZERO_PAGE(addr)) | ||
81 | 89 | ||
82 | extern void paging_init(void); | 90 | extern void paging_init(void); |
83 | 91 | ||
@@ -86,12 +94,7 @@ extern void paging_init(void); | |||
86 | * and a page entry and page directory to the page they refer to. | 94 | * and a page entry and page directory to the page they refer to. |
87 | */ | 95 | */ |
88 | #define pmd_phys(pmd) virt_to_phys((void *)pmd_val(pmd)) | 96 | #define pmd_phys(pmd) virt_to_phys((void *)pmd_val(pmd)) |
89 | 97 | #define pmd_page(pmd) (pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT)) | |
90 | #define __pmd_page(pmd) (pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT)) | ||
91 | #ifndef CONFIG_TRANSPARENT_HUGEPAGE | ||
92 | #define pmd_page(pmd) __pmd_page(pmd) | ||
93 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | ||
94 | |||
95 | #define pmd_page_vaddr(pmd) pmd_val(pmd) | 98 | #define pmd_page_vaddr(pmd) pmd_val(pmd) |
96 | 99 | ||
97 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32) | 100 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32) |
@@ -104,6 +107,7 @@ static inline void set_pte(pte_t *ptep, pte_t pte) | |||
104 | ptep->pte_high = pte.pte_high; | 107 | ptep->pte_high = pte.pte_high; |
105 | smp_wmb(); | 108 | smp_wmb(); |
106 | ptep->pte_low = pte.pte_low; | 109 | ptep->pte_low = pte.pte_low; |
110 | //printk("pte_high %x pte_low %x\n", ptep->pte_high, ptep->pte_low); | ||
107 | 111 | ||
108 | if (pte.pte_low & _PAGE_GLOBAL) { | 112 | if (pte.pte_low & _PAGE_GLOBAL) { |
109 | pte_t *buddy = ptep_buddy(ptep); | 113 | pte_t *buddy = ptep_buddy(ptep); |
@@ -295,7 +299,7 @@ static inline pte_t pte_mkdirty(pte_t pte) | |||
295 | static inline pte_t pte_mkyoung(pte_t pte) | 299 | static inline pte_t pte_mkyoung(pte_t pte) |
296 | { | 300 | { |
297 | pte_val(pte) |= _PAGE_ACCESSED; | 301 | pte_val(pte) |= _PAGE_ACCESSED; |
298 | if (cpu_has_rixi) { | 302 | if (kernel_uses_smartmips_rixi) { |
299 | if (!(pte_val(pte) & _PAGE_NO_READ)) | 303 | if (!(pte_val(pte) & _PAGE_NO_READ)) |
300 | pte_val(pte) |= _PAGE_SILENT_READ; | 304 | pte_val(pte) |= _PAGE_SILENT_READ; |
301 | } else { | 305 | } else { |
@@ -371,14 +375,6 @@ static inline void update_mmu_cache(struct vm_area_struct *vma, | |||
371 | __update_cache(vma, address, pte); | 375 | __update_cache(vma, address, pte); |
372 | } | 376 | } |
373 | 377 | ||
374 | static inline void update_mmu_cache_pmd(struct vm_area_struct *vma, | ||
375 | unsigned long address, pmd_t *pmdp) | ||
376 | { | ||
377 | pte_t pte = *(pte_t *)pmdp; | ||
378 | |||
379 | __update_tlb(vma, address, pte); | ||
380 | } | ||
381 | |||
382 | #define kern_addr_valid(addr) (1) | 378 | #define kern_addr_valid(addr) (1) |
383 | 379 | ||
384 | #ifdef CONFIG_64BIT_PHYS_ADDR | 380 | #ifdef CONFIG_64BIT_PHYS_ADDR |
@@ -398,157 +394,6 @@ static inline int io_remap_pfn_range(struct vm_area_struct *vma, | |||
398 | remap_pfn_range(vma, vaddr, pfn, size, prot) | 394 | remap_pfn_range(vma, vaddr, pfn, size, prot) |
399 | #endif | 395 | #endif |
400 | 396 | ||
401 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
402 | |||
403 | extern int has_transparent_hugepage(void); | ||
404 | |||
405 | static inline int pmd_trans_huge(pmd_t pmd) | ||
406 | { | ||
407 | return !!(pmd_val(pmd) & _PAGE_HUGE); | ||
408 | } | ||
409 | |||
410 | static inline pmd_t pmd_mkhuge(pmd_t pmd) | ||
411 | { | ||
412 | pmd_val(pmd) |= _PAGE_HUGE; | ||
413 | |||
414 | return pmd; | ||
415 | } | ||
416 | |||
417 | static inline int pmd_trans_splitting(pmd_t pmd) | ||
418 | { | ||
419 | return !!(pmd_val(pmd) & _PAGE_SPLITTING); | ||
420 | } | ||
421 | |||
422 | static inline pmd_t pmd_mksplitting(pmd_t pmd) | ||
423 | { | ||
424 | pmd_val(pmd) |= _PAGE_SPLITTING; | ||
425 | |||
426 | return pmd; | ||
427 | } | ||
428 | |||
429 | extern void set_pmd_at(struct mm_struct *mm, unsigned long addr, | ||
430 | pmd_t *pmdp, pmd_t pmd); | ||
431 | |||
432 | #define __HAVE_ARCH_PMDP_SPLITTING_FLUSH | ||
433 | /* Extern to avoid header file madness */ | ||
434 | extern void pmdp_splitting_flush(struct vm_area_struct *vma, | ||
435 | unsigned long address, | ||
436 | pmd_t *pmdp); | ||
437 | |||
438 | #define __HAVE_ARCH_PMD_WRITE | ||
439 | static inline int pmd_write(pmd_t pmd) | ||
440 | { | ||
441 | return !!(pmd_val(pmd) & _PAGE_WRITE); | ||
442 | } | ||
443 | |||
444 | static inline pmd_t pmd_wrprotect(pmd_t pmd) | ||
445 | { | ||
446 | pmd_val(pmd) &= ~(_PAGE_WRITE | _PAGE_SILENT_WRITE); | ||
447 | return pmd; | ||
448 | } | ||
449 | |||
450 | static inline pmd_t pmd_mkwrite(pmd_t pmd) | ||
451 | { | ||
452 | pmd_val(pmd) |= _PAGE_WRITE; | ||
453 | if (pmd_val(pmd) & _PAGE_MODIFIED) | ||
454 | pmd_val(pmd) |= _PAGE_SILENT_WRITE; | ||
455 | |||
456 | return pmd; | ||
457 | } | ||
458 | |||
459 | static inline int pmd_dirty(pmd_t pmd) | ||
460 | { | ||
461 | return !!(pmd_val(pmd) & _PAGE_MODIFIED); | ||
462 | } | ||
463 | |||
464 | static inline pmd_t pmd_mkclean(pmd_t pmd) | ||
465 | { | ||
466 | pmd_val(pmd) &= ~(_PAGE_MODIFIED | _PAGE_SILENT_WRITE); | ||
467 | return pmd; | ||
468 | } | ||
469 | |||
470 | static inline pmd_t pmd_mkdirty(pmd_t pmd) | ||
471 | { | ||
472 | pmd_val(pmd) |= _PAGE_MODIFIED; | ||
473 | if (pmd_val(pmd) & _PAGE_WRITE) | ||
474 | pmd_val(pmd) |= _PAGE_SILENT_WRITE; | ||
475 | |||
476 | return pmd; | ||
477 | } | ||
478 | |||
479 | static inline int pmd_young(pmd_t pmd) | ||
480 | { | ||
481 | return !!(pmd_val(pmd) & _PAGE_ACCESSED); | ||
482 | } | ||
483 | |||
484 | static inline pmd_t pmd_mkold(pmd_t pmd) | ||
485 | { | ||
486 | pmd_val(pmd) &= ~(_PAGE_ACCESSED|_PAGE_SILENT_READ); | ||
487 | |||
488 | return pmd; | ||
489 | } | ||
490 | |||
491 | static inline pmd_t pmd_mkyoung(pmd_t pmd) | ||
492 | { | ||
493 | pmd_val(pmd) |= _PAGE_ACCESSED; | ||
494 | |||
495 | if (cpu_has_rixi) { | ||
496 | if (!(pmd_val(pmd) & _PAGE_NO_READ)) | ||
497 | pmd_val(pmd) |= _PAGE_SILENT_READ; | ||
498 | } else { | ||
499 | if (pmd_val(pmd) & _PAGE_READ) | ||
500 | pmd_val(pmd) |= _PAGE_SILENT_READ; | ||
501 | } | ||
502 | |||
503 | return pmd; | ||
504 | } | ||
505 | |||
506 | /* Extern to avoid header file madness */ | ||
507 | extern pmd_t mk_pmd(struct page *page, pgprot_t prot); | ||
508 | |||
509 | static inline unsigned long pmd_pfn(pmd_t pmd) | ||
510 | { | ||
511 | return pmd_val(pmd) >> _PFN_SHIFT; | ||
512 | } | ||
513 | |||
514 | static inline struct page *pmd_page(pmd_t pmd) | ||
515 | { | ||
516 | if (pmd_trans_huge(pmd)) | ||
517 | return pfn_to_page(pmd_pfn(pmd)); | ||
518 | |||
519 | return pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT); | ||
520 | } | ||
521 | |||
522 | static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot) | ||
523 | { | ||
524 | pmd_val(pmd) = (pmd_val(pmd) & _PAGE_CHG_MASK) | pgprot_val(newprot); | ||
525 | return pmd; | ||
526 | } | ||
527 | |||
528 | static inline pmd_t pmd_mknotpresent(pmd_t pmd) | ||
529 | { | ||
530 | pmd_val(pmd) &= ~(_PAGE_PRESENT | _PAGE_VALID | _PAGE_DIRTY); | ||
531 | |||
532 | return pmd; | ||
533 | } | ||
534 | |||
535 | /* | ||
536 | * The generic version pmdp_get_and_clear uses a version of pmd_clear() with a | ||
537 | * different prototype. | ||
538 | */ | ||
539 | #define __HAVE_ARCH_PMDP_GET_AND_CLEAR | ||
540 | static inline pmd_t pmdp_get_and_clear(struct mm_struct *mm, | ||
541 | unsigned long address, pmd_t *pmdp) | ||
542 | { | ||
543 | pmd_t old = *pmdp; | ||
544 | |||
545 | pmd_clear(pmdp); | ||
546 | |||
547 | return old; | ||
548 | } | ||
549 | |||
550 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | ||
551 | |||
552 | #include <asm-generic/pgtable.h> | 397 | #include <asm-generic/pgtable.h> |
553 | 398 | ||
554 | /* | 399 | /* |