0001
0002 #ifndef _ASM_POWERPC_NOHASH_32_PTE_8xx_H
0003 #define _ASM_POWERPC_NOHASH_32_PTE_8xx_H
0004 #ifdef __KERNEL__
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 #define _PAGE_PRESENT 0x0001
0033 #define _PAGE_NO_CACHE 0x0002
0034 #define _PAGE_SH 0x0004
0035 #define _PAGE_SPS 0x0008
0036 #define _PAGE_DIRTY 0x0100
0037
0038
0039
0040
0041 #define _PAGE_GUARDED 0x0010
0042 #define _PAGE_ACCESSED 0x0020
0043 #define _PAGE_EXEC 0x0040
0044 #define _PAGE_SPECIAL 0x0080
0045
0046 #define _PAGE_NA 0x0200
0047 #define _PAGE_RO 0x0600
0048
0049 #define _PAGE_HUGE 0x0800
0050
0051
0052 #define _PAGE_COHERENT 0
0053 #define _PAGE_WRITETHRU 0
0054
0055 #define _PAGE_KERNEL_RO (_PAGE_SH | _PAGE_RO)
0056 #define _PAGE_KERNEL_ROX (_PAGE_SH | _PAGE_RO | _PAGE_EXEC)
0057 #define _PAGE_KERNEL_RW (_PAGE_SH | _PAGE_DIRTY)
0058 #define _PAGE_KERNEL_RWX (_PAGE_SH | _PAGE_DIRTY | _PAGE_EXEC)
0059
0060 #define _PMD_PRESENT 0x0001
0061 #define _PMD_PRESENT_MASK _PMD_PRESENT
0062 #define _PMD_BAD 0x0f90
0063 #define _PMD_PAGE_MASK 0x000c
0064 #define _PMD_PAGE_8M 0x000c
0065 #define _PMD_PAGE_512K 0x0004
0066 #define _PMD_ACCESSED 0x0020
0067 #define _PMD_USER 0x0040
0068
0069 #define _PTE_NONE_MASK 0
0070
0071 #ifdef CONFIG_PPC_16K_PAGES
0072 #define _PAGE_PSIZE _PAGE_SPS
0073 #else
0074 #define _PAGE_PSIZE 0
0075 #endif
0076
0077 #define _PAGE_BASE_NC (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_PSIZE)
0078 #define _PAGE_BASE (_PAGE_BASE_NC)
0079
0080
0081 #define PAGE_NONE __pgprot(_PAGE_BASE | _PAGE_NA)
0082 #define PAGE_SHARED __pgprot(_PAGE_BASE)
0083 #define PAGE_SHARED_X __pgprot(_PAGE_BASE | _PAGE_EXEC)
0084 #define PAGE_COPY __pgprot(_PAGE_BASE | _PAGE_RO)
0085 #define PAGE_COPY_X __pgprot(_PAGE_BASE | _PAGE_RO | _PAGE_EXEC)
0086 #define PAGE_READONLY __pgprot(_PAGE_BASE | _PAGE_RO)
0087 #define PAGE_READONLY_X __pgprot(_PAGE_BASE | _PAGE_RO | _PAGE_EXEC)
0088
0089 #ifndef __ASSEMBLY__
0090 static inline pte_t pte_wrprotect(pte_t pte)
0091 {
0092 return __pte(pte_val(pte) | _PAGE_RO);
0093 }
0094
0095 #define pte_wrprotect pte_wrprotect
0096
0097 static inline int pte_write(pte_t pte)
0098 {
0099 return !(pte_val(pte) & _PAGE_RO);
0100 }
0101
0102 #define pte_write pte_write
0103
0104 static inline pte_t pte_mkwrite(pte_t pte)
0105 {
0106 return __pte(pte_val(pte) & ~_PAGE_RO);
0107 }
0108
0109 #define pte_mkwrite pte_mkwrite
0110
0111 static inline bool pte_user(pte_t pte)
0112 {
0113 return !(pte_val(pte) & _PAGE_SH);
0114 }
0115
0116 #define pte_user pte_user
0117
0118 static inline pte_t pte_mkprivileged(pte_t pte)
0119 {
0120 return __pte(pte_val(pte) | _PAGE_SH);
0121 }
0122
0123 #define pte_mkprivileged pte_mkprivileged
0124
0125 static inline pte_t pte_mkuser(pte_t pte)
0126 {
0127 return __pte(pte_val(pte) & ~_PAGE_SH);
0128 }
0129
0130 #define pte_mkuser pte_mkuser
0131
0132 static inline pte_t pte_mkhuge(pte_t pte)
0133 {
0134 return __pte(pte_val(pte) | _PAGE_SPS | _PAGE_HUGE);
0135 }
0136
0137 #define pte_mkhuge pte_mkhuge
0138
0139 static inline pte_basic_t pte_update(struct mm_struct *mm, unsigned long addr, pte_t *p,
0140 unsigned long clr, unsigned long set, int huge);
0141
0142 static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
0143 {
0144 pte_update(mm, addr, ptep, 0, _PAGE_RO, 0);
0145 }
0146 #define ptep_set_wrprotect ptep_set_wrprotect
0147
0148 static inline void __ptep_set_access_flags(struct vm_area_struct *vma, pte_t *ptep,
0149 pte_t entry, unsigned long address, int psize)
0150 {
0151 unsigned long set = pte_val(entry) & (_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_EXEC);
0152 unsigned long clr = ~pte_val(entry) & _PAGE_RO;
0153 int huge = psize > mmu_virtual_psize ? 1 : 0;
0154
0155 pte_update(vma->vm_mm, address, ptep, clr, set, huge);
0156
0157 flush_tlb_page(vma, address);
0158 }
0159 #define __ptep_set_access_flags __ptep_set_access_flags
0160
0161 static inline unsigned long pgd_leaf_size(pgd_t pgd)
0162 {
0163 if (pgd_val(pgd) & _PMD_PAGE_8M)
0164 return SZ_8M;
0165 return SZ_4M;
0166 }
0167
0168 #define pgd_leaf_size pgd_leaf_size
0169
0170 static inline unsigned long pte_leaf_size(pte_t pte)
0171 {
0172 pte_basic_t val = pte_val(pte);
0173
0174 if (val & _PAGE_HUGE)
0175 return SZ_512K;
0176 if (val & _PAGE_SPS)
0177 return SZ_16K;
0178 return SZ_4K;
0179 }
0180
0181 #define pte_leaf_size pte_leaf_size
0182
0183 #endif
0184
0185 #endif
0186 #endif