.. | .. |
---|
128 | 128 | .if ((start) % (size) != 0); \ |
---|
129 | 129 | .error "Fixed section exception vector misalignment"; \ |
---|
130 | 130 | .endif; \ |
---|
131 | | - .if ((size) != 0x20) && ((size) != 0x80) && ((size) != 0x100); \ |
---|
| 131 | + .if ((size) != 0x20) && ((size) != 0x80) && ((size) != 0x100) && ((size) != 0x1000); \ |
---|
132 | 132 | .error "Fixed section exception vector bad size"; \ |
---|
133 | 133 | .endif; \ |
---|
134 | 134 | .if (start) < sname##_start; \ |
---|
.. | .. |
---|
168 | 168 | (label##_absolute) |
---|
169 | 169 | |
---|
170 | 170 | #define ABS_ADDR(label) (label - fs_label + fs_start) |
---|
171 | | - |
---|
172 | | -/* |
---|
173 | | - * Following are the BOOK3S exception handler helper macros. |
---|
174 | | - * Handlers come in a number of types, and each type has a number of varieties. |
---|
175 | | - * |
---|
176 | | - * EXC_REAL_* - real, unrelocated exception vectors |
---|
177 | | - * EXC_VIRT_* - virt (AIL), unrelocated exception vectors |
---|
178 | | - * TRAMP_REAL_* - real, unrelocated helpers (virt can call these) |
---|
179 | | - * TRAMP_VIRT_* - virt, unreloc helpers (in practice, real can use) |
---|
180 | | - * TRAMP_KVM - KVM handlers that get put into real, unrelocated |
---|
181 | | - * EXC_COMMON - virt, relocated common handlers |
---|
182 | | - * |
---|
183 | | - * The EXC handlers are given a name, and branch to name_common, or the |
---|
184 | | - * appropriate KVM or masking function. Vector handler verieties are as |
---|
185 | | - * follows: |
---|
186 | | - * |
---|
187 | | - * EXC_{REAL|VIRT}_BEGIN/END - used to open-code the exception |
---|
188 | | - * |
---|
189 | | - * EXC_{REAL|VIRT} - standard exception |
---|
190 | | - * |
---|
191 | | - * EXC_{REAL|VIRT}_suffix |
---|
192 | | - * where _suffix is: |
---|
193 | | - * - _MASKABLE - maskable exception |
---|
194 | | - * - _OOL - out of line with trampoline to common handler |
---|
195 | | - * - _HV - HV exception |
---|
196 | | - * |
---|
197 | | - * There can be combinations, e.g., EXC_VIRT_OOL_MASKABLE_HV |
---|
198 | | - * |
---|
199 | | - * The one unusual case is __EXC_REAL_OOL_HV_DIRECT, which is |
---|
200 | | - * an OOL vector that branches to a specified handler rather than the usual |
---|
201 | | - * trampoline that goes to common. It, and other underscore macros, should |
---|
202 | | - * be used with care. |
---|
203 | | - * |
---|
204 | | - * KVM handlers come in the following verieties: |
---|
205 | | - * TRAMP_KVM |
---|
206 | | - * TRAMP_KVM_SKIP |
---|
207 | | - * TRAMP_KVM_HV |
---|
208 | | - * TRAMP_KVM_HV_SKIP |
---|
209 | | - * |
---|
210 | | - * COMMON handlers come in the following verieties: |
---|
211 | | - * EXC_COMMON_BEGIN/END - used to open-code the handler |
---|
212 | | - * EXC_COMMON |
---|
213 | | - * EXC_COMMON_ASYNC |
---|
214 | | - * |
---|
215 | | - * TRAMP_REAL and TRAMP_VIRT can be used with BEGIN/END. KVM |
---|
216 | | - * and OOL handlers are implemented as types of TRAMP and TRAMP_VIRT handlers. |
---|
217 | | - */ |
---|
218 | | - |
---|
219 | | -#define EXC_REAL_BEGIN(name, start, size) \ |
---|
220 | | - FIXED_SECTION_ENTRY_BEGIN_LOCATION(real_vectors, exc_real_##start##_##name, start, size) |
---|
221 | | - |
---|
222 | | -#define EXC_REAL_END(name, start, size) \ |
---|
223 | | - FIXED_SECTION_ENTRY_END_LOCATION(real_vectors, exc_real_##start##_##name, start, size) |
---|
224 | | - |
---|
225 | | -#define EXC_VIRT_BEGIN(name, start, size) \ |
---|
226 | | - FIXED_SECTION_ENTRY_BEGIN_LOCATION(virt_vectors, exc_virt_##start##_##name, start, size) |
---|
227 | | - |
---|
228 | | -#define EXC_VIRT_END(name, start, size) \ |
---|
229 | | - FIXED_SECTION_ENTRY_END_LOCATION(virt_vectors, exc_virt_##start##_##name, start, size) |
---|
230 | | - |
---|
231 | | -#define EXC_COMMON_BEGIN(name) \ |
---|
232 | | - USE_TEXT_SECTION(); \ |
---|
233 | | - .balign IFETCH_ALIGN_BYTES; \ |
---|
234 | | - .global name; \ |
---|
235 | | - _ASM_NOKPROBE_SYMBOL(name); \ |
---|
236 | | - DEFINE_FIXED_SYMBOL(name); \ |
---|
237 | | -name: |
---|
238 | | - |
---|
239 | | -#define TRAMP_REAL_BEGIN(name) \ |
---|
240 | | - FIXED_SECTION_ENTRY_BEGIN(real_trampolines, name) |
---|
241 | | - |
---|
242 | | -#define TRAMP_VIRT_BEGIN(name) \ |
---|
243 | | - FIXED_SECTION_ENTRY_BEGIN(virt_trampolines, name) |
---|
244 | | - |
---|
245 | | -#ifdef CONFIG_KVM_BOOK3S_64_HANDLER |
---|
246 | | -#define TRAMP_KVM_BEGIN(name) \ |
---|
247 | | - TRAMP_VIRT_BEGIN(name) |
---|
248 | | -#else |
---|
249 | | -#define TRAMP_KVM_BEGIN(name) |
---|
250 | | -#endif |
---|
251 | | - |
---|
252 | | -#define EXC_REAL_NONE(start, size) \ |
---|
253 | | - FIXED_SECTION_ENTRY_BEGIN_LOCATION(real_vectors, exc_real_##start##_##unused, start, size); \ |
---|
254 | | - FIXED_SECTION_ENTRY_END_LOCATION(real_vectors, exc_real_##start##_##unused, start, size) |
---|
255 | | - |
---|
256 | | -#define EXC_VIRT_NONE(start, size) \ |
---|
257 | | - FIXED_SECTION_ENTRY_BEGIN_LOCATION(virt_vectors, exc_virt_##start##_##unused, start, size); \ |
---|
258 | | - FIXED_SECTION_ENTRY_END_LOCATION(virt_vectors, exc_virt_##start##_##unused, start, size); |
---|
259 | | - |
---|
260 | | - |
---|
261 | | -#define EXC_REAL(name, start, size) \ |
---|
262 | | - EXC_REAL_BEGIN(name, start, size); \ |
---|
263 | | - STD_EXCEPTION(start, name##_common); \ |
---|
264 | | - EXC_REAL_END(name, start, size); |
---|
265 | | - |
---|
266 | | -#define EXC_VIRT(name, start, size, realvec) \ |
---|
267 | | - EXC_VIRT_BEGIN(name, start, size); \ |
---|
268 | | - STD_RELON_EXCEPTION(start, realvec, name##_common); \ |
---|
269 | | - EXC_VIRT_END(name, start, size); |
---|
270 | | - |
---|
271 | | -#define EXC_REAL_MASKABLE(name, start, size, bitmask) \ |
---|
272 | | - EXC_REAL_BEGIN(name, start, size); \ |
---|
273 | | - MASKABLE_EXCEPTION(start, name##_common, bitmask); \ |
---|
274 | | - EXC_REAL_END(name, start, size); |
---|
275 | | - |
---|
276 | | -#define EXC_VIRT_MASKABLE(name, start, size, realvec, bitmask) \ |
---|
277 | | - EXC_VIRT_BEGIN(name, start, size); \ |
---|
278 | | - MASKABLE_RELON_EXCEPTION(realvec, name##_common, bitmask); \ |
---|
279 | | - EXC_VIRT_END(name, start, size); |
---|
280 | | - |
---|
281 | | -#define EXC_REAL_HV(name, start, size) \ |
---|
282 | | - EXC_REAL_BEGIN(name, start, size); \ |
---|
283 | | - STD_EXCEPTION_HV(start, start, name##_common); \ |
---|
284 | | - EXC_REAL_END(name, start, size); |
---|
285 | | - |
---|
286 | | -#define EXC_VIRT_HV(name, start, size, realvec) \ |
---|
287 | | - EXC_VIRT_BEGIN(name, start, size); \ |
---|
288 | | - STD_RELON_EXCEPTION_HV(start, realvec, name##_common); \ |
---|
289 | | - EXC_VIRT_END(name, start, size); |
---|
290 | | - |
---|
291 | | -#define __EXC_REAL_OOL(name, start, size) \ |
---|
292 | | - EXC_REAL_BEGIN(name, start, size); \ |
---|
293 | | - __OOL_EXCEPTION(start, label, tramp_real_##name); \ |
---|
294 | | - EXC_REAL_END(name, start, size); |
---|
295 | | - |
---|
296 | | -#define __TRAMP_REAL_OOL(name, vec) \ |
---|
297 | | - TRAMP_REAL_BEGIN(tramp_real_##name); \ |
---|
298 | | - STD_EXCEPTION_OOL(vec, name##_common); |
---|
299 | | - |
---|
300 | | -#define EXC_REAL_OOL(name, start, size) \ |
---|
301 | | - __EXC_REAL_OOL(name, start, size); \ |
---|
302 | | - __TRAMP_REAL_OOL(name, start); |
---|
303 | | - |
---|
304 | | -#define __EXC_REAL_OOL_MASKABLE(name, start, size) \ |
---|
305 | | - __EXC_REAL_OOL(name, start, size); |
---|
306 | | - |
---|
307 | | -#define __TRAMP_REAL_OOL_MASKABLE(name, vec, bitmask) \ |
---|
308 | | - TRAMP_REAL_BEGIN(tramp_real_##name); \ |
---|
309 | | - MASKABLE_EXCEPTION_OOL(vec, name##_common, bitmask); |
---|
310 | | - |
---|
311 | | -#define EXC_REAL_OOL_MASKABLE(name, start, size, bitmask) \ |
---|
312 | | - __EXC_REAL_OOL_MASKABLE(name, start, size); \ |
---|
313 | | - __TRAMP_REAL_OOL_MASKABLE(name, start, bitmask); |
---|
314 | | - |
---|
315 | | -#define __EXC_REAL_OOL_HV_DIRECT(name, start, size, handler) \ |
---|
316 | | - EXC_REAL_BEGIN(name, start, size); \ |
---|
317 | | - __OOL_EXCEPTION(start, label, handler); \ |
---|
318 | | - EXC_REAL_END(name, start, size); |
---|
319 | | - |
---|
320 | | -#define __EXC_REAL_OOL_HV(name, start, size) \ |
---|
321 | | - __EXC_REAL_OOL(name, start, size); |
---|
322 | | - |
---|
323 | | -#define __TRAMP_REAL_OOL_HV(name, vec) \ |
---|
324 | | - TRAMP_REAL_BEGIN(tramp_real_##name); \ |
---|
325 | | - STD_EXCEPTION_HV_OOL(vec, name##_common); \ |
---|
326 | | - |
---|
327 | | -#define EXC_REAL_OOL_HV(name, start, size) \ |
---|
328 | | - __EXC_REAL_OOL_HV(name, start, size); \ |
---|
329 | | - __TRAMP_REAL_OOL_HV(name, start); |
---|
330 | | - |
---|
331 | | -#define __EXC_REAL_OOL_MASKABLE_HV(name, start, size) \ |
---|
332 | | - __EXC_REAL_OOL(name, start, size); |
---|
333 | | - |
---|
334 | | -#define __TRAMP_REAL_OOL_MASKABLE_HV(name, vec, bitmask) \ |
---|
335 | | - TRAMP_REAL_BEGIN(tramp_real_##name); \ |
---|
336 | | - MASKABLE_EXCEPTION_HV_OOL(vec, name##_common, bitmask); \ |
---|
337 | | - |
---|
338 | | -#define EXC_REAL_OOL_MASKABLE_HV(name, start, size, bitmask) \ |
---|
339 | | - __EXC_REAL_OOL_MASKABLE_HV(name, start, size); \ |
---|
340 | | - __TRAMP_REAL_OOL_MASKABLE_HV(name, start, bitmask); |
---|
341 | | - |
---|
342 | | -#define __EXC_VIRT_OOL(name, start, size) \ |
---|
343 | | - EXC_VIRT_BEGIN(name, start, size); \ |
---|
344 | | - __OOL_EXCEPTION(start, label, tramp_virt_##name); \ |
---|
345 | | - EXC_VIRT_END(name, start, size); |
---|
346 | | - |
---|
347 | | -#define __TRAMP_VIRT_OOL(name, realvec) \ |
---|
348 | | - TRAMP_VIRT_BEGIN(tramp_virt_##name); \ |
---|
349 | | - STD_RELON_EXCEPTION_OOL(realvec, name##_common); |
---|
350 | | - |
---|
351 | | -#define EXC_VIRT_OOL(name, start, size, realvec) \ |
---|
352 | | - __EXC_VIRT_OOL(name, start, size); \ |
---|
353 | | - __TRAMP_VIRT_OOL(name, realvec); |
---|
354 | | - |
---|
355 | | -#define __EXC_VIRT_OOL_MASKABLE(name, start, size) \ |
---|
356 | | - __EXC_VIRT_OOL(name, start, size); |
---|
357 | | - |
---|
358 | | -#define __TRAMP_VIRT_OOL_MASKABLE(name, realvec, bitmask) \ |
---|
359 | | - TRAMP_VIRT_BEGIN(tramp_virt_##name); \ |
---|
360 | | - MASKABLE_RELON_EXCEPTION_OOL(realvec, name##_common, bitmask); |
---|
361 | | - |
---|
362 | | -#define EXC_VIRT_OOL_MASKABLE(name, start, size, realvec, bitmask) \ |
---|
363 | | - __EXC_VIRT_OOL_MASKABLE(name, start, size); \ |
---|
364 | | - __TRAMP_VIRT_OOL_MASKABLE(name, realvec, bitmask); |
---|
365 | | - |
---|
366 | | -#define __EXC_VIRT_OOL_HV(name, start, size) \ |
---|
367 | | - __EXC_VIRT_OOL(name, start, size); |
---|
368 | | - |
---|
369 | | -#define __TRAMP_VIRT_OOL_HV(name, realvec) \ |
---|
370 | | - TRAMP_VIRT_BEGIN(tramp_virt_##name); \ |
---|
371 | | - STD_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \ |
---|
372 | | - |
---|
373 | | -#define EXC_VIRT_OOL_HV(name, start, size, realvec) \ |
---|
374 | | - __EXC_VIRT_OOL_HV(name, start, size); \ |
---|
375 | | - __TRAMP_VIRT_OOL_HV(name, realvec); |
---|
376 | | - |
---|
377 | | -#define __EXC_VIRT_OOL_MASKABLE_HV(name, start, size) \ |
---|
378 | | - __EXC_VIRT_OOL(name, start, size); |
---|
379 | | - |
---|
380 | | -#define __TRAMP_VIRT_OOL_MASKABLE_HV(name, realvec, bitmask) \ |
---|
381 | | - TRAMP_VIRT_BEGIN(tramp_virt_##name); \ |
---|
382 | | - MASKABLE_RELON_EXCEPTION_HV_OOL(realvec, name##_common, bitmask);\ |
---|
383 | | - |
---|
384 | | -#define EXC_VIRT_OOL_MASKABLE_HV(name, start, size, realvec, bitmask) \ |
---|
385 | | - __EXC_VIRT_OOL_MASKABLE_HV(name, start, size); \ |
---|
386 | | - __TRAMP_VIRT_OOL_MASKABLE_HV(name, realvec, bitmask); |
---|
387 | | - |
---|
388 | | -#define TRAMP_KVM(area, n) \ |
---|
389 | | - TRAMP_KVM_BEGIN(do_kvm_##n); \ |
---|
390 | | - KVM_HANDLER(area, EXC_STD, n); \ |
---|
391 | | - |
---|
392 | | -#define TRAMP_KVM_SKIP(area, n) \ |
---|
393 | | - TRAMP_KVM_BEGIN(do_kvm_##n); \ |
---|
394 | | - KVM_HANDLER_SKIP(area, EXC_STD, n); \ |
---|
395 | | - |
---|
396 | | -/* |
---|
397 | | - * HV variant exceptions get the 0x2 bit added to their trap number. |
---|
398 | | - */ |
---|
399 | | -#define TRAMP_KVM_HV(area, n) \ |
---|
400 | | - TRAMP_KVM_BEGIN(do_kvm_H##n); \ |
---|
401 | | - KVM_HANDLER(area, EXC_HV, n + 0x2); \ |
---|
402 | | - |
---|
403 | | -#define TRAMP_KVM_HV_SKIP(area, n) \ |
---|
404 | | - TRAMP_KVM_BEGIN(do_kvm_H##n); \ |
---|
405 | | - KVM_HANDLER_SKIP(area, EXC_HV, n + 0x2); \ |
---|
406 | | - |
---|
407 | | -#define EXC_COMMON(name, realvec, hdlr) \ |
---|
408 | | - EXC_COMMON_BEGIN(name); \ |
---|
409 | | - STD_EXCEPTION_COMMON(realvec, name, hdlr); \ |
---|
410 | | - |
---|
411 | | -#define EXC_COMMON_ASYNC(name, realvec, hdlr) \ |
---|
412 | | - EXC_COMMON_BEGIN(name); \ |
---|
413 | | - STD_EXCEPTION_COMMON_ASYNC(realvec, name, hdlr); \ |
---|
414 | 171 | |
---|
415 | 172 | #endif /* __ASSEMBLY__ */ |
---|
416 | 173 | |
---|