95
95
96
96
#else
97
97
/*
98
- * When using the RI/XI bit support, we have 13 bits of flags below
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.
98
+ * Below are the "Normal" R4K cases
103
99
*/
104
100
105
101
/*
106
102
* The following bits are implemented in software
107
103
*/
108
104
#define _PAGE_PRESENT_SHIFT 0
109
105
#define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT)
110
- #define _PAGE_READ_SHIFT (cpu_has_rixi ? _PAGE_PRESENT_SHIFT : _PAGE_PRESENT_SHIFT + 1)
111
- #define _PAGE_READ ({BUG_ON(cpu_has_rixi); 1 << _PAGE_READ_SHIFT; })
106
+ /* R2 or later cores check for RI/XI support to determine _PAGE_READ */
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
113
#define _PAGE_WRITE_SHIFT (_PAGE_READ_SHIFT + 1)
113
114
#define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT)
115
+ #endif
114
116
#define _PAGE_ACCESSED_SHIFT (_PAGE_WRITE_SHIFT + 1)
115
117
#define _PAGE_ACCESSED (1 << _PAGE_ACCESSED_SHIFT)
116
118
#define _PAGE_MODIFIED_SHIFT (_PAGE_ACCESSED_SHIFT + 1)
117
119
#define _PAGE_MODIFIED (1 << _PAGE_MODIFIED_SHIFT)
118
120
119
- #ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
120
- /* huge tlb page */
121
+ #if defined( CONFIG_64BIT ) && defined( CONFIG_MIPS_HUGE_TLB_SUPPORT )
122
+ /* Huge TLB page */
121
123
#define _PAGE_HUGE_SHIFT (_PAGE_MODIFIED_SHIFT + 1)
122
124
#define _PAGE_HUGE (1 << _PAGE_HUGE_SHIFT)
123
125
#define _PAGE_SPLITTING_SHIFT (_PAGE_HUGE_SHIFT + 1)
124
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
131
#else
126
- #define _PAGE_HUGE_SHIFT (_PAGE_MODIFIED_SHIFT )
127
- #define _PAGE_HUGE ({BUG(); 1; }) /* Dummy value */
128
- #define _PAGE_SPLITTING_SHIFT (_PAGE_HUGE_SHIFT)
129
- #define _PAGE_SPLITTING ({BUG(); 1; }) /* Dummy value */
130
- #endif
132
+ #define _PAGE_GLOBAL_SHIFT (_PAGE_SPLITTING_SHIFT + 1 )
133
+ #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT)
134
+ #endif /* CONFIG_CPU_MIPSR2 */
135
+
136
+ #endif /* CONFIG_64BIT && CONFIG_MIPS_HUGE_TLB_SUPPORT */
131
137
132
- /* Page cannot be executed */
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; })
138
+ #ifdef CONFIG_CPU_MIPSR2
139
+ /* XI - page cannot be executed */
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 */
137
- #define _PAGE_NO_READ_SHIFT (cpu_has_rixi ? _PAGE_NO_EXEC_SHIFT + 1 : _PAGE_NO_EXEC_SHIFT)
138
- #define _PAGE_NO_READ ({BUG_ON(!cpu_has_rixi); 1 << _PAGE_NO_READ_SHIFT; })
145
+ /* RI - page cannot be read */
146
+ #define _PAGE_READ_SHIFT (_PAGE_NO_EXEC_SHIFT + 1)
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
151
#define _PAGE_GLOBAL_SHIFT (_PAGE_NO_READ_SHIFT + 1)
141
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
159
#define _PAGE_VALID_SHIFT (_PAGE_GLOBAL_SHIFT + 1)
143
160
#define _PAGE_VALID (1 << _PAGE_VALID_SHIFT)
144
161
#define _PAGE_DIRTY_SHIFT (_PAGE_VALID_SHIFT + 1)
150
167
151
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
177
#define _PAGE_SILENT_READ _PAGE_VALID
154
178
#define _PAGE_SILENT_WRITE _PAGE_DIRTY
155
179
156
180
#define _PFN_MASK (~((1 << (_PFN_SHIFT)) - 1))
157
181
158
- #ifndef _PAGE_NO_READ
159
- #define _PAGE_NO_READ ({BUG(); 0; })
160
- #define _PAGE_NO_READ_SHIFT ({BUG(); 0; })
161
- #endif
162
- #ifndef _PAGE_NO_EXEC
163
- #define _PAGE_NO_EXEC ({BUG(); 0; })
164
- #endif
182
+ /*
183
+ * The final layouts of the PTE bits are:
184
+ *
185
+ * 64-bit, R1 or earlier: CCC D V G [S H] M A W R P
186
+ * 32-bit, R1 or earler: CCC D V G M A W R P
187
+ * 64-bit, R2 or later: CCC D V G RI/R XI [S H] M A W P
188
+ * 32-bit, R2 or later: CCC D V G RI/R XI M A W P
189
+ */
165
190
166
191
167
192
#ifndef __ASSEMBLY__
171
196
*/
172
197
static inline uint64_t pte_to_entrylo (unsigned long pte_val )
173
198
{
199
+ #ifdef CONFIG_CPU_MIPSR2
174
200
if (cpu_has_rixi ) {
175
201
int sa ;
176
202
#ifdef CONFIG_32BIT
@@ -186,6 +212,7 @@ static inline uint64_t pte_to_entrylo(unsigned long pte_val)
186
212
return (pte_val >> _PAGE_GLOBAL_SHIFT ) |
187
213
((pte_val & (_PAGE_NO_EXEC | _PAGE_NO_READ )) << sa );
188
214
}
215
+ #endif
189
216
190
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
272
#define _CACHE_UNCACHED_ACCELERATED (7<<_CACHE_SHIFT)
246
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
276
#define __WRITEABLE (_PAGE_SILENT_WRITE | _PAGE_WRITE | _PAGE_MODIFIED)
250
277
251
278
#define _PAGE_CHG_MASK (_PAGE_ACCESSED | _PAGE_MODIFIED | \
0 commit comments