diff options
Diffstat (limited to 'arch/mips')
-rw-r--r-- | arch/mips/include/asm/pgtable-bits.h | 83 | ||||
-rw-r--r-- | arch/mips/include/asm/pgtable.h | 38 | ||||
-rw-r--r-- | arch/mips/mm/tlbex.c | 4 |
3 files changed, 76 insertions, 49 deletions
diff --git a/arch/mips/include/asm/pgtable-bits.h b/arch/mips/include/asm/pgtable-bits.h index 91747c282bb3..8e432a8ec4fe 100644 --- a/arch/mips/include/asm/pgtable-bits.h +++ b/arch/mips/include/asm/pgtable-bits.h | |||
@@ -95,11 +95,7 @@ | |||
95 | 95 | ||
96 | #else | 96 | #else |
97 | /* | 97 | /* |
98 | * When using the RI/XI bit support, we have 13 bits of flags below | 98 | * 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 | */ | 99 | */ |
104 | 100 | ||
105 | /* | 101 | /* |
@@ -107,38 +103,59 @@ | |||
107 | */ | 103 | */ |
108 | #define _PAGE_PRESENT_SHIFT 0 | 104 | #define _PAGE_PRESENT_SHIFT 0 |
109 | #define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT) | 105 | #define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT) |
110 | #define _PAGE_READ_SHIFT (cpu_has_rixi ? _PAGE_PRESENT_SHIFT : _PAGE_PRESENT_SHIFT + 1) | 106 | /* 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; }) | 107 | #ifdef CONFIG_CPU_MIPSR2 |
108 | #define _PAGE_WRITE_SHIFT (_PAGE_PRESENT_SHIFT + 1) | ||
109 | #define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT) | ||
110 | #else | ||
111 | #define _PAGE_READ_SHIFT (_PAGE_PRESENT_SHIFT + 1) | ||
112 | #define _PAGE_READ (1 << _PAGE_READ_SHIFT) | ||
112 | #define _PAGE_WRITE_SHIFT (_PAGE_READ_SHIFT + 1) | 113 | #define _PAGE_WRITE_SHIFT (_PAGE_READ_SHIFT + 1) |
113 | #define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT) | 114 | #define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT) |
115 | #endif | ||
114 | #define _PAGE_ACCESSED_SHIFT (_PAGE_WRITE_SHIFT + 1) | 116 | #define _PAGE_ACCESSED_SHIFT (_PAGE_WRITE_SHIFT + 1) |
115 | #define _PAGE_ACCESSED (1 << _PAGE_ACCESSED_SHIFT) | 117 | #define _PAGE_ACCESSED (1 << _PAGE_ACCESSED_SHIFT) |
116 | #define _PAGE_MODIFIED_SHIFT (_PAGE_ACCESSED_SHIFT + 1) | 118 | #define _PAGE_MODIFIED_SHIFT (_PAGE_ACCESSED_SHIFT + 1) |
117 | #define _PAGE_MODIFIED (1 << _PAGE_MODIFIED_SHIFT) | 119 | #define _PAGE_MODIFIED (1 << _PAGE_MODIFIED_SHIFT) |
118 | 120 | ||
119 | #ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT | 121 | #if defined(CONFIG_64BIT) && defined(CONFIG_MIPS_HUGE_TLB_SUPPORT) |
120 | /* huge tlb page */ | 122 | /* Huge TLB page */ |
121 | #define _PAGE_HUGE_SHIFT (_PAGE_MODIFIED_SHIFT + 1) | 123 | #define _PAGE_HUGE_SHIFT (_PAGE_MODIFIED_SHIFT + 1) |
122 | #define _PAGE_HUGE (1 << _PAGE_HUGE_SHIFT) | 124 | #define _PAGE_HUGE (1 << _PAGE_HUGE_SHIFT) |
123 | #define _PAGE_SPLITTING_SHIFT (_PAGE_HUGE_SHIFT + 1) | 125 | #define _PAGE_SPLITTING_SHIFT (_PAGE_HUGE_SHIFT + 1) |
124 | #define _PAGE_SPLITTING (1 << _PAGE_SPLITTING_SHIFT) | 126 | #define _PAGE_SPLITTING (1 << _PAGE_SPLITTING_SHIFT) |
127 | |||
128 | /* Only R2 or newer cores have the XI bit */ | ||
129 | #ifdef CONFIG_CPU_MIPSR2 | ||
130 | #define _PAGE_NO_EXEC_SHIFT (_PAGE_SPLITTING_SHIFT + 1) | ||
125 | #else | 131 | #else |
126 | #define _PAGE_HUGE_SHIFT (_PAGE_MODIFIED_SHIFT) | 132 | #define _PAGE_GLOBAL_SHIFT (_PAGE_SPLITTING_SHIFT + 1) |
127 | #define _PAGE_HUGE ({BUG(); 1; }) /* Dummy value */ | 133 | #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) |
128 | #define _PAGE_SPLITTING_SHIFT (_PAGE_HUGE_SHIFT) | 134 | #endif /* CONFIG_CPU_MIPSR2 */ |
129 | #define _PAGE_SPLITTING ({BUG(); 1; }) /* Dummy value */ | 135 | |
130 | #endif | 136 | #endif /* CONFIG_64BIT && CONFIG_MIPS_HUGE_TLB_SUPPORT */ |
131 | 137 | ||
132 | /* Page cannot be executed */ | 138 | #ifdef CONFIG_CPU_MIPSR2 |
133 | #define _PAGE_NO_EXEC_SHIFT (cpu_has_rixi ? _PAGE_SPLITTING_SHIFT + 1 : _PAGE_SPLITTING_SHIFT) | 139 | /* XI - page cannot be executed */ |
134 | #define _PAGE_NO_EXEC ({BUG_ON(!cpu_has_rixi); 1 << _PAGE_NO_EXEC_SHIFT; }) | 140 | #ifndef _PAGE_NO_EXEC_SHIFT |
141 | #define _PAGE_NO_EXEC_SHIFT (_PAGE_MODIFIED_SHIFT + 1) | ||
142 | #endif | ||
143 | #define _PAGE_NO_EXEC (cpu_has_rixi ? (1 << _PAGE_NO_EXEC_SHIFT) : 0) | ||
135 | 144 | ||
136 | /* Page cannot be read */ | 145 | /* RI - page cannot be read */ |
137 | #define _PAGE_NO_READ_SHIFT (cpu_has_rixi ? _PAGE_NO_EXEC_SHIFT + 1 : _PAGE_NO_EXEC_SHIFT) | 146 | #define _PAGE_READ_SHIFT (_PAGE_NO_EXEC_SHIFT + 1) |
138 | #define _PAGE_NO_READ ({BUG_ON(!cpu_has_rixi); 1 << _PAGE_NO_READ_SHIFT; }) | 147 | #define _PAGE_READ (cpu_has_rixi ? 0 : (1 << _PAGE_READ_SHIFT)) |
148 | #define _PAGE_NO_READ_SHIFT _PAGE_READ_SHIFT | ||
149 | #define _PAGE_NO_READ (cpu_has_rixi ? (1 << _PAGE_READ_SHIFT) : 0) | ||
139 | 150 | ||
140 | #define _PAGE_GLOBAL_SHIFT (_PAGE_NO_READ_SHIFT + 1) | 151 | #define _PAGE_GLOBAL_SHIFT (_PAGE_NO_READ_SHIFT + 1) |
141 | #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) | 152 | #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) |
153 | |||
154 | #else /* !CONFIG_CPU_MIPSR2 */ | ||
155 | #define _PAGE_GLOBAL_SHIFT (_PAGE_MODIFIED_SHIFT + 1) | ||
156 | #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) | ||
157 | #endif /* CONFIG_CPU_MIPSR2 */ | ||
158 | |||
142 | #define _PAGE_VALID_SHIFT (_PAGE_GLOBAL_SHIFT + 1) | 159 | #define _PAGE_VALID_SHIFT (_PAGE_GLOBAL_SHIFT + 1) |
143 | #define _PAGE_VALID (1 << _PAGE_VALID_SHIFT) | 160 | #define _PAGE_VALID (1 << _PAGE_VALID_SHIFT) |
144 | #define _PAGE_DIRTY_SHIFT (_PAGE_VALID_SHIFT + 1) | 161 | #define _PAGE_DIRTY_SHIFT (_PAGE_VALID_SHIFT + 1) |
@@ -150,18 +167,26 @@ | |||
150 | 167 | ||
151 | #endif /* defined(CONFIG_PHYS_ADDR_T_64BIT && defined(CONFIG_CPU_MIPS32) */ | 168 | #endif /* defined(CONFIG_PHYS_ADDR_T_64BIT && defined(CONFIG_CPU_MIPS32) */ |
152 | 169 | ||
170 | #ifndef _PAGE_NO_EXEC | ||
171 | #define _PAGE_NO_EXEC 0 | ||
172 | #endif | ||
173 | #ifndef _PAGE_NO_READ | ||
174 | #define _PAGE_NO_READ 0 | ||
175 | #endif | ||
176 | |||
153 | #define _PAGE_SILENT_READ _PAGE_VALID | 177 | #define _PAGE_SILENT_READ _PAGE_VALID |
154 | #define _PAGE_SILENT_WRITE _PAGE_DIRTY | 178 | #define _PAGE_SILENT_WRITE _PAGE_DIRTY |
155 | 179 | ||
156 | #define _PFN_MASK (~((1 << (_PFN_SHIFT)) - 1)) | 180 | #define _PFN_MASK (~((1 << (_PFN_SHIFT)) - 1)) |
157 | 181 | ||
158 | #ifndef _PAGE_NO_READ | 182 | /* |
159 | #define _PAGE_NO_READ ({BUG(); 0; }) | 183 | * The final layouts of the PTE bits are: |
160 | #define _PAGE_NO_READ_SHIFT ({BUG(); 0; }) | 184 | * |
161 | #endif | 185 | * 64-bit, R1 or earlier: CCC D V G [S H] M A W R P |
162 | #ifndef _PAGE_NO_EXEC | 186 | * 32-bit, R1 or earler: CCC D V G M A W R P |
163 | #define _PAGE_NO_EXEC ({BUG(); 0; }) | 187 | * 64-bit, R2 or later: CCC D V G RI/R XI [S H] M A W P |
164 | #endif | 188 | * 32-bit, R2 or later: CCC D V G RI/R XI M A W P |
189 | */ | ||
165 | 190 | ||
166 | 191 | ||
167 | #ifndef __ASSEMBLY__ | 192 | #ifndef __ASSEMBLY__ |
@@ -171,6 +196,7 @@ | |||
171 | */ | 196 | */ |
172 | static inline uint64_t pte_to_entrylo(unsigned long pte_val) | 197 | static inline uint64_t pte_to_entrylo(unsigned long pte_val) |
173 | { | 198 | { |
199 | #ifdef CONFIG_CPU_MIPSR2 | ||
174 | if (cpu_has_rixi) { | 200 | if (cpu_has_rixi) { |
175 | int sa; | 201 | int sa; |
176 | #ifdef CONFIG_32BIT | 202 | #ifdef CONFIG_32BIT |
@@ -186,6 +212,7 @@ static inline uint64_t pte_to_entrylo(unsigned long pte_val) | |||
186 | return (pte_val >> _PAGE_GLOBAL_SHIFT) | | 212 | return (pte_val >> _PAGE_GLOBAL_SHIFT) | |
187 | ((pte_val & (_PAGE_NO_EXEC | _PAGE_NO_READ)) << sa); | 213 | ((pte_val & (_PAGE_NO_EXEC | _PAGE_NO_READ)) << sa); |
188 | } | 214 | } |
215 | #endif | ||
189 | 216 | ||
190 | return pte_val >> _PAGE_GLOBAL_SHIFT; | 217 | return pte_val >> _PAGE_GLOBAL_SHIFT; |
191 | } | 218 | } |
@@ -245,7 +272,7 @@ static inline uint64_t pte_to_entrylo(unsigned long pte_val) | |||
245 | #define _CACHE_UNCACHED_ACCELERATED (7<<_CACHE_SHIFT) | 272 | #define _CACHE_UNCACHED_ACCELERATED (7<<_CACHE_SHIFT) |
246 | #endif | 273 | #endif |
247 | 274 | ||
248 | #define __READABLE (_PAGE_SILENT_READ | _PAGE_ACCESSED | (cpu_has_rixi ? 0 : _PAGE_READ)) | 275 | #define __READABLE (_PAGE_SILENT_READ | _PAGE_READ | _PAGE_ACCESSED) |
249 | #define __WRITEABLE (_PAGE_SILENT_WRITE | _PAGE_WRITE | _PAGE_MODIFIED) | 276 | #define __WRITEABLE (_PAGE_SILENT_WRITE | _PAGE_WRITE | _PAGE_MODIFIED) |
250 | 277 | ||
251 | #define _PAGE_CHG_MASK (_PAGE_ACCESSED | _PAGE_MODIFIED | \ | 278 | #define _PAGE_CHG_MASK (_PAGE_ACCESSED | _PAGE_MODIFIED | \ |
diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h index bef782c4a44b..e1fec0237ce2 100644 --- a/arch/mips/include/asm/pgtable.h +++ b/arch/mips/include/asm/pgtable.h | |||
@@ -24,17 +24,17 @@ struct mm_struct; | |||
24 | struct vm_area_struct; | 24 | struct vm_area_struct; |
25 | 25 | ||
26 | #define PAGE_NONE __pgprot(_PAGE_PRESENT | _CACHE_CACHABLE_NONCOHERENT) | 26 | #define PAGE_NONE __pgprot(_PAGE_PRESENT | _CACHE_CACHABLE_NONCOHERENT) |
27 | #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | (cpu_has_rixi ? 0 : _PAGE_READ) | \ | 27 | #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | _PAGE_READ | \ |
28 | _page_cachable_default) | 28 | _page_cachable_default) |
29 | #define PAGE_COPY __pgprot(_PAGE_PRESENT | (cpu_has_rixi ? 0 : _PAGE_READ) | \ | 29 | #define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_NO_EXEC | \ |
30 | (cpu_has_rixi ? _PAGE_NO_EXEC : 0) | _page_cachable_default) | 30 | _page_cachable_default) |
31 | #define PAGE_READONLY __pgprot(_PAGE_PRESENT | (cpu_has_rixi ? 0 : _PAGE_READ) | \ | 31 | #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_READ | \ |
32 | _page_cachable_default) | 32 | _page_cachable_default) |
33 | #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \ | 33 | #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \ |
34 | _PAGE_GLOBAL | _page_cachable_default) | 34 | _PAGE_GLOBAL | _page_cachable_default) |
35 | #define PAGE_KERNEL_NC __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \ | 35 | #define PAGE_KERNEL_NC __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \ |
36 | _PAGE_GLOBAL | _CACHE_CACHABLE_NONCOHERENT) | 36 | _PAGE_GLOBAL | _CACHE_CACHABLE_NONCOHERENT) |
37 | #define PAGE_USERIO __pgprot(_PAGE_PRESENT | (cpu_has_rixi ? 0 : _PAGE_READ) | _PAGE_WRITE | \ | 37 | #define PAGE_USERIO __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \ |
38 | _page_cachable_default) | 38 | _page_cachable_default) |
39 | #define PAGE_KERNEL_UNCACHED __pgprot(_PAGE_PRESENT | __READABLE | \ | 39 | #define PAGE_KERNEL_UNCACHED __pgprot(_PAGE_PRESENT | __READABLE | \ |
40 | __WRITEABLE | _PAGE_GLOBAL | _CACHE_UNCACHED) | 40 | __WRITEABLE | _PAGE_GLOBAL | _CACHE_UNCACHED) |
@@ -332,13 +332,13 @@ static inline pte_t pte_mkdirty(pte_t pte) | |||
332 | static inline pte_t pte_mkyoung(pte_t pte) | 332 | static inline pte_t pte_mkyoung(pte_t pte) |
333 | { | 333 | { |
334 | pte_val(pte) |= _PAGE_ACCESSED; | 334 | pte_val(pte) |= _PAGE_ACCESSED; |
335 | if (cpu_has_rixi) { | 335 | #ifdef CONFIG_CPU_MIPSR2 |
336 | if (!(pte_val(pte) & _PAGE_NO_READ)) | 336 | if (!(pte_val(pte) & _PAGE_NO_READ)) |
337 | pte_val(pte) |= _PAGE_SILENT_READ; | 337 | pte_val(pte) |= _PAGE_SILENT_READ; |
338 | } else { | 338 | else |
339 | if (pte_val(pte) & _PAGE_READ) | 339 | #endif |
340 | pte_val(pte) |= _PAGE_SILENT_READ; | 340 | if (pte_val(pte) & _PAGE_READ) |
341 | } | 341 | pte_val(pte) |= _PAGE_SILENT_READ; |
342 | return pte; | 342 | return pte; |
343 | } | 343 | } |
344 | 344 | ||
@@ -534,13 +534,13 @@ static inline pmd_t pmd_mkyoung(pmd_t pmd) | |||
534 | { | 534 | { |
535 | pmd_val(pmd) |= _PAGE_ACCESSED; | 535 | pmd_val(pmd) |= _PAGE_ACCESSED; |
536 | 536 | ||
537 | if (cpu_has_rixi) { | 537 | #ifdef CONFIG_CPU_MIPSR2 |
538 | if (!(pmd_val(pmd) & _PAGE_NO_READ)) | 538 | if (!(pmd_val(pmd) & _PAGE_NO_READ)) |
539 | pmd_val(pmd) |= _PAGE_SILENT_READ; | 539 | pmd_val(pmd) |= _PAGE_SILENT_READ; |
540 | } else { | 540 | else |
541 | if (pmd_val(pmd) & _PAGE_READ) | 541 | #endif |
542 | pmd_val(pmd) |= _PAGE_SILENT_READ; | 542 | if (pmd_val(pmd) & _PAGE_READ) |
543 | } | 543 | pmd_val(pmd) |= _PAGE_SILENT_READ; |
544 | 544 | ||
545 | return pmd; | 545 | return pmd; |
546 | } | 546 | } |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index d75ff73a2012..20d985901e44 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
@@ -231,14 +231,14 @@ static void output_pgtable_bits_defines(void) | |||
231 | pr_define("_PAGE_HUGE_SHIFT %d\n", _PAGE_HUGE_SHIFT); | 231 | pr_define("_PAGE_HUGE_SHIFT %d\n", _PAGE_HUGE_SHIFT); |
232 | pr_define("_PAGE_SPLITTING_SHIFT %d\n", _PAGE_SPLITTING_SHIFT); | 232 | pr_define("_PAGE_SPLITTING_SHIFT %d\n", _PAGE_SPLITTING_SHIFT); |
233 | #endif | 233 | #endif |
234 | #ifdef CONFIG_CPU_MIPSR2 | ||
234 | if (cpu_has_rixi) { | 235 | if (cpu_has_rixi) { |
235 | #ifdef _PAGE_NO_EXEC_SHIFT | 236 | #ifdef _PAGE_NO_EXEC_SHIFT |
236 | pr_define("_PAGE_NO_EXEC_SHIFT %d\n", _PAGE_NO_EXEC_SHIFT); | 237 | pr_define("_PAGE_NO_EXEC_SHIFT %d\n", _PAGE_NO_EXEC_SHIFT); |
237 | #endif | ||
238 | #ifdef _PAGE_NO_READ_SHIFT | ||
239 | pr_define("_PAGE_NO_READ_SHIFT %d\n", _PAGE_NO_READ_SHIFT); | 238 | pr_define("_PAGE_NO_READ_SHIFT %d\n", _PAGE_NO_READ_SHIFT); |
240 | #endif | 239 | #endif |
241 | } | 240 | } |
241 | #endif | ||
242 | pr_define("_PAGE_GLOBAL_SHIFT %d\n", _PAGE_GLOBAL_SHIFT); | 242 | pr_define("_PAGE_GLOBAL_SHIFT %d\n", _PAGE_GLOBAL_SHIFT); |
243 | pr_define("_PAGE_VALID_SHIFT %d\n", _PAGE_VALID_SHIFT); | 243 | pr_define("_PAGE_VALID_SHIFT %d\n", _PAGE_VALID_SHIFT); |
244 | pr_define("_PAGE_DIRTY_SHIFT %d\n", _PAGE_DIRTY_SHIFT); | 244 | pr_define("_PAGE_DIRTY_SHIFT %d\n", _PAGE_DIRTY_SHIFT); |