diff options
Diffstat (limited to 'arch/mips/include/asm/pgtable-bits.h')
-rw-r--r-- | arch/mips/include/asm/pgtable-bits.h | 96 |
1 files changed, 66 insertions, 30 deletions
diff --git a/arch/mips/include/asm/pgtable-bits.h b/arch/mips/include/asm/pgtable-bits.h index 91747c282bb3..18ae5ddef118 100644 --- a/arch/mips/include/asm/pgtable-bits.h +++ b/arch/mips/include/asm/pgtable-bits.h | |||
@@ -37,7 +37,11 @@ | |||
37 | /* | 37 | /* |
38 | * The following bits are implemented by the TLB hardware | 38 | * The following bits are implemented by the TLB hardware |
39 | */ | 39 | */ |
40 | #define _PAGE_GLOBAL_SHIFT 0 | 40 | #define _PAGE_NO_EXEC_SHIFT 0 |
41 | #define _PAGE_NO_EXEC (1 << _PAGE_NO_EXEC_SHIFT) | ||
42 | #define _PAGE_NO_READ_SHIFT (_PAGE_NO_EXEC_SHIFT + 1) | ||
43 | #define _PAGE_NO_READ (1 << _PAGE_NO_READ_SHIFT) | ||
44 | #define _PAGE_GLOBAL_SHIFT (_PAGE_NO_READ_SHIFT + 1) | ||
41 | #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) | 45 | #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) |
42 | #define _PAGE_VALID_SHIFT (_PAGE_GLOBAL_SHIFT + 1) | 46 | #define _PAGE_VALID_SHIFT (_PAGE_GLOBAL_SHIFT + 1) |
43 | #define _PAGE_VALID (1 << _PAGE_VALID_SHIFT) | 47 | #define _PAGE_VALID (1 << _PAGE_VALID_SHIFT) |
@@ -49,7 +53,7 @@ | |||
49 | /* | 53 | /* |
50 | * The following bits are implemented in software | 54 | * The following bits are implemented in software |
51 | */ | 55 | */ |
52 | #define _PAGE_PRESENT_SHIFT (_CACHE_SHIFT + 3) | 56 | #define _PAGE_PRESENT_SHIFT (24) |
53 | #define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT) | 57 | #define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT) |
54 | #define _PAGE_READ_SHIFT (_PAGE_PRESENT_SHIFT + 1) | 58 | #define _PAGE_READ_SHIFT (_PAGE_PRESENT_SHIFT + 1) |
55 | #define _PAGE_READ (1 << _PAGE_READ_SHIFT) | 59 | #define _PAGE_READ (1 << _PAGE_READ_SHIFT) |
@@ -62,6 +66,11 @@ | |||
62 | 66 | ||
63 | #define _PFN_SHIFT (PAGE_SHIFT - 12 + _CACHE_SHIFT + 3) | 67 | #define _PFN_SHIFT (PAGE_SHIFT - 12 + _CACHE_SHIFT + 3) |
64 | 68 | ||
69 | /* | ||
70 | * Bits for extended EntryLo0/EntryLo1 registers | ||
71 | */ | ||
72 | #define _PFNX_MASK 0xffffff | ||
73 | |||
65 | #elif defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX) | 74 | #elif defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX) |
66 | 75 | ||
67 | /* | 76 | /* |
@@ -95,11 +104,7 @@ | |||
95 | 104 | ||
96 | #else | 105 | #else |
97 | /* | 106 | /* |
98 | * When using the RI/XI bit support, we have 13 bits of flags below | 107 | * Below are the "Normal" R4K cases |
99 | * the physical address. The RI/XI bits are placed such that a SRL 5 | ||
100 | * can strip off the software bits, then a ROTR 2 can move the RI/XI | ||
101 | * into bits [63:62]. This also limits physical address to 56 bits, | ||
102 | * which is more than we need right now. | ||
103 | */ | 108 | */ |
104 | 109 | ||
105 | /* | 110 | /* |
@@ -107,38 +112,59 @@ | |||
107 | */ | 112 | */ |
108 | #define _PAGE_PRESENT_SHIFT 0 | 113 | #define _PAGE_PRESENT_SHIFT 0 |
109 | #define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT) | 114 | #define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT) |
110 | #define _PAGE_READ_SHIFT (cpu_has_rixi ? _PAGE_PRESENT_SHIFT : _PAGE_PRESENT_SHIFT + 1) | 115 | /* R2 or later cores check for RI/XI support to determine _PAGE_READ */ |
111 | #define _PAGE_READ ({BUG_ON(cpu_has_rixi); 1 << _PAGE_READ_SHIFT; }) | 116 | #ifdef CONFIG_CPU_MIPSR2 |
117 | #define _PAGE_WRITE_SHIFT (_PAGE_PRESENT_SHIFT + 1) | ||
118 | #define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT) | ||
119 | #else | ||
120 | #define _PAGE_READ_SHIFT (_PAGE_PRESENT_SHIFT + 1) | ||
121 | #define _PAGE_READ (1 << _PAGE_READ_SHIFT) | ||
112 | #define _PAGE_WRITE_SHIFT (_PAGE_READ_SHIFT + 1) | 122 | #define _PAGE_WRITE_SHIFT (_PAGE_READ_SHIFT + 1) |
113 | #define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT) | 123 | #define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT) |
124 | #endif | ||
114 | #define _PAGE_ACCESSED_SHIFT (_PAGE_WRITE_SHIFT + 1) | 125 | #define _PAGE_ACCESSED_SHIFT (_PAGE_WRITE_SHIFT + 1) |
115 | #define _PAGE_ACCESSED (1 << _PAGE_ACCESSED_SHIFT) | 126 | #define _PAGE_ACCESSED (1 << _PAGE_ACCESSED_SHIFT) |
116 | #define _PAGE_MODIFIED_SHIFT (_PAGE_ACCESSED_SHIFT + 1) | 127 | #define _PAGE_MODIFIED_SHIFT (_PAGE_ACCESSED_SHIFT + 1) |
117 | #define _PAGE_MODIFIED (1 << _PAGE_MODIFIED_SHIFT) | 128 | #define _PAGE_MODIFIED (1 << _PAGE_MODIFIED_SHIFT) |
118 | 129 | ||
119 | #ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT | 130 | #if defined(CONFIG_64BIT) && defined(CONFIG_MIPS_HUGE_TLB_SUPPORT) |
120 | /* huge tlb page */ | 131 | /* Huge TLB page */ |
121 | #define _PAGE_HUGE_SHIFT (_PAGE_MODIFIED_SHIFT + 1) | 132 | #define _PAGE_HUGE_SHIFT (_PAGE_MODIFIED_SHIFT + 1) |
122 | #define _PAGE_HUGE (1 << _PAGE_HUGE_SHIFT) | 133 | #define _PAGE_HUGE (1 << _PAGE_HUGE_SHIFT) |
123 | #define _PAGE_SPLITTING_SHIFT (_PAGE_HUGE_SHIFT + 1) | 134 | #define _PAGE_SPLITTING_SHIFT (_PAGE_HUGE_SHIFT + 1) |
124 | #define _PAGE_SPLITTING (1 << _PAGE_SPLITTING_SHIFT) | 135 | #define _PAGE_SPLITTING (1 << _PAGE_SPLITTING_SHIFT) |
136 | |||
137 | /* Only R2 or newer cores have the XI bit */ | ||
138 | #ifdef CONFIG_CPU_MIPSR2 | ||
139 | #define _PAGE_NO_EXEC_SHIFT (_PAGE_SPLITTING_SHIFT + 1) | ||
125 | #else | 140 | #else |
126 | #define _PAGE_HUGE_SHIFT (_PAGE_MODIFIED_SHIFT) | 141 | #define _PAGE_GLOBAL_SHIFT (_PAGE_SPLITTING_SHIFT + 1) |
127 | #define _PAGE_HUGE ({BUG(); 1; }) /* Dummy value */ | 142 | #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) |
128 | #define _PAGE_SPLITTING_SHIFT (_PAGE_HUGE_SHIFT) | 143 | #endif /* CONFIG_CPU_MIPSR2 */ |
129 | #define _PAGE_SPLITTING ({BUG(); 1; }) /* Dummy value */ | ||
130 | #endif | ||
131 | 144 | ||
132 | /* Page cannot be executed */ | 145 | #endif /* CONFIG_64BIT && CONFIG_MIPS_HUGE_TLB_SUPPORT */ |
133 | #define _PAGE_NO_EXEC_SHIFT (cpu_has_rixi ? _PAGE_SPLITTING_SHIFT + 1 : _PAGE_SPLITTING_SHIFT) | ||
134 | #define _PAGE_NO_EXEC ({BUG_ON(!cpu_has_rixi); 1 << _PAGE_NO_EXEC_SHIFT; }) | ||
135 | 146 | ||
136 | /* Page cannot be read */ | 147 | #ifdef CONFIG_CPU_MIPSR2 |
137 | #define _PAGE_NO_READ_SHIFT (cpu_has_rixi ? _PAGE_NO_EXEC_SHIFT + 1 : _PAGE_NO_EXEC_SHIFT) | 148 | /* XI - page cannot be executed */ |
138 | #define _PAGE_NO_READ ({BUG_ON(!cpu_has_rixi); 1 << _PAGE_NO_READ_SHIFT; }) | 149 | #ifndef _PAGE_NO_EXEC_SHIFT |
150 | #define _PAGE_NO_EXEC_SHIFT (_PAGE_MODIFIED_SHIFT + 1) | ||
151 | #endif | ||
152 | #define _PAGE_NO_EXEC (cpu_has_rixi ? (1 << _PAGE_NO_EXEC_SHIFT) : 0) | ||
153 | |||
154 | /* RI - page cannot be read */ | ||
155 | #define _PAGE_READ_SHIFT (_PAGE_NO_EXEC_SHIFT + 1) | ||
156 | #define _PAGE_READ (cpu_has_rixi ? 0 : (1 << _PAGE_READ_SHIFT)) | ||
157 | #define _PAGE_NO_READ_SHIFT _PAGE_READ_SHIFT | ||
158 | #define _PAGE_NO_READ (cpu_has_rixi ? (1 << _PAGE_READ_SHIFT) : 0) | ||
139 | 159 | ||
140 | #define _PAGE_GLOBAL_SHIFT (_PAGE_NO_READ_SHIFT + 1) | 160 | #define _PAGE_GLOBAL_SHIFT (_PAGE_NO_READ_SHIFT + 1) |
141 | #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) | 161 | #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) |
162 | |||
163 | #else /* !CONFIG_CPU_MIPSR2 */ | ||
164 | #define _PAGE_GLOBAL_SHIFT (_PAGE_MODIFIED_SHIFT + 1) | ||
165 | #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) | ||
166 | #endif /* CONFIG_CPU_MIPSR2 */ | ||
167 | |||
142 | #define _PAGE_VALID_SHIFT (_PAGE_GLOBAL_SHIFT + 1) | 168 | #define _PAGE_VALID_SHIFT (_PAGE_GLOBAL_SHIFT + 1) |
143 | #define _PAGE_VALID (1 << _PAGE_VALID_SHIFT) | 169 | #define _PAGE_VALID (1 << _PAGE_VALID_SHIFT) |
144 | #define _PAGE_DIRTY_SHIFT (_PAGE_VALID_SHIFT + 1) | 170 | #define _PAGE_DIRTY_SHIFT (_PAGE_VALID_SHIFT + 1) |
@@ -150,18 +176,26 @@ | |||
150 | 176 | ||
151 | #endif /* defined(CONFIG_PHYS_ADDR_T_64BIT && defined(CONFIG_CPU_MIPS32) */ | 177 | #endif /* defined(CONFIG_PHYS_ADDR_T_64BIT && defined(CONFIG_CPU_MIPS32) */ |
152 | 178 | ||
179 | #ifndef _PAGE_NO_EXEC | ||
180 | #define _PAGE_NO_EXEC 0 | ||
181 | #endif | ||
182 | #ifndef _PAGE_NO_READ | ||
183 | #define _PAGE_NO_READ 0 | ||
184 | #endif | ||
185 | |||
153 | #define _PAGE_SILENT_READ _PAGE_VALID | 186 | #define _PAGE_SILENT_READ _PAGE_VALID |
154 | #define _PAGE_SILENT_WRITE _PAGE_DIRTY | 187 | #define _PAGE_SILENT_WRITE _PAGE_DIRTY |
155 | 188 | ||
156 | #define _PFN_MASK (~((1 << (_PFN_SHIFT)) - 1)) | 189 | #define _PFN_MASK (~((1 << (_PFN_SHIFT)) - 1)) |
157 | 190 | ||
158 | #ifndef _PAGE_NO_READ | 191 | /* |
159 | #define _PAGE_NO_READ ({BUG(); 0; }) | 192 | * The final layouts of the PTE bits are: |
160 | #define _PAGE_NO_READ_SHIFT ({BUG(); 0; }) | 193 | * |
161 | #endif | 194 | * 64-bit, R1 or earlier: CCC D V G [S H] M A W R P |
162 | #ifndef _PAGE_NO_EXEC | 195 | * 32-bit, R1 or earler: CCC D V G M A W R P |
163 | #define _PAGE_NO_EXEC ({BUG(); 0; }) | 196 | * 64-bit, R2 or later: CCC D V G RI/R XI [S H] M A W P |
164 | #endif | 197 | * 32-bit, R2 or later: CCC D V G RI/R XI M A W P |
198 | */ | ||
165 | 199 | ||
166 | 200 | ||
167 | #ifndef __ASSEMBLY__ | 201 | #ifndef __ASSEMBLY__ |
@@ -171,6 +205,7 @@ | |||
171 | */ | 205 | */ |
172 | static inline uint64_t pte_to_entrylo(unsigned long pte_val) | 206 | static inline uint64_t pte_to_entrylo(unsigned long pte_val) |
173 | { | 207 | { |
208 | #ifdef CONFIG_CPU_MIPSR2 | ||
174 | if (cpu_has_rixi) { | 209 | if (cpu_has_rixi) { |
175 | int sa; | 210 | int sa; |
176 | #ifdef CONFIG_32BIT | 211 | #ifdef CONFIG_32BIT |
@@ -186,6 +221,7 @@ static inline uint64_t pte_to_entrylo(unsigned long pte_val) | |||
186 | return (pte_val >> _PAGE_GLOBAL_SHIFT) | | 221 | return (pte_val >> _PAGE_GLOBAL_SHIFT) | |
187 | ((pte_val & (_PAGE_NO_EXEC | _PAGE_NO_READ)) << sa); | 222 | ((pte_val & (_PAGE_NO_EXEC | _PAGE_NO_READ)) << sa); |
188 | } | 223 | } |
224 | #endif | ||
189 | 225 | ||
190 | return pte_val >> _PAGE_GLOBAL_SHIFT; | 226 | return pte_val >> _PAGE_GLOBAL_SHIFT; |
191 | } | 227 | } |
@@ -245,7 +281,7 @@ static inline uint64_t pte_to_entrylo(unsigned long pte_val) | |||
245 | #define _CACHE_UNCACHED_ACCELERATED (7<<_CACHE_SHIFT) | 281 | #define _CACHE_UNCACHED_ACCELERATED (7<<_CACHE_SHIFT) |
246 | #endif | 282 | #endif |
247 | 283 | ||
248 | #define __READABLE (_PAGE_SILENT_READ | _PAGE_ACCESSED | (cpu_has_rixi ? 0 : _PAGE_READ)) | 284 | #define __READABLE (_PAGE_SILENT_READ | _PAGE_READ | _PAGE_ACCESSED) |
249 | #define __WRITEABLE (_PAGE_SILENT_WRITE | _PAGE_WRITE | _PAGE_MODIFIED) | 285 | #define __WRITEABLE (_PAGE_SILENT_WRITE | _PAGE_WRITE | _PAGE_MODIFIED) |
250 | 286 | ||
251 | #define _PAGE_CHG_MASK (_PAGE_ACCESSED | _PAGE_MODIFIED | \ | 287 | #define _PAGE_CHG_MASK (_PAGE_ACCESSED | _PAGE_MODIFIED | \ |