aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/include
diff options
context:
space:
mode:
authorMichael Ellerman <mpe@ellerman.id.au>2016-09-30 05:43:18 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2016-10-03 22:06:36 -0400
commitda2bc4644c75d992427c45c5ade3bdf18ca1b52d (patch)
tree412a6767cf27d5fd6e09f3a85cc17efcab35bf2f /arch/powerpc/include
parent5045ea37377ce8cca6890d32b127ad6770e6dce5 (diff)
powerpc/64s: Add new exception vector macros
Create arch/powerpc/include/asm/head-64.h with macros that specify an exception vector (name, type, location), which will be used to label and lay out exceptions into the object file. Naming is moved out of exception-64s.h, which is used to specify the implementation of exception handlers. objdump of generated code in exception vectors is unchanged except for names. Alignment directives scattered around are annoying, but done this way so that disassembly can verify identical instruction generation before and after patch. These get cleaned up in future patch. We change the way KVMTEST works, explicitly passing EXC_HV or EXC_STD rather than overloading the trap number. This removes the need to have SOFTEN values for the overloaded trap numbers, eg. 0x502. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/include')
-rw-r--r--arch/powerpc/include/asm/exception-64s.h135
-rw-r--r--arch/powerpc/include/asm/head-64.h163
2 files changed, 217 insertions, 81 deletions
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index 5032a80e8f6a..72f2b1e3f343 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -34,6 +34,7 @@
34 * exception handlers (including pSeries LPAR) and iSeries LPAR 34 * exception handlers (including pSeries LPAR) and iSeries LPAR
35 * implementations as possible. 35 * implementations as possible.
36 */ 36 */
37#include <asm/head-64.h>
37 38
38#define EX_R9 0 39#define EX_R9 0
39#define EX_R10 8 40#define EX_R10 8
@@ -191,10 +192,10 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
191 EXCEPTION_PROLOG_1(area, extra, vec); \ 192 EXCEPTION_PROLOG_1(area, extra, vec); \
192 EXCEPTION_PROLOG_PSERIES_1(label, h); 193 EXCEPTION_PROLOG_PSERIES_1(label, h);
193 194
194#define __KVMTEST(n) \ 195#define __KVMTEST(h, n) \
195 lbz r10,HSTATE_IN_GUEST(r13); \ 196 lbz r10,HSTATE_IN_GUEST(r13); \
196 cmpwi r10,0; \ 197 cmpwi r10,0; \
197 bne do_kvm_##n 198 bne do_kvm_##h##n
198 199
199#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE 200#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
200/* 201/*
@@ -207,8 +208,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
207#define kvmppc_interrupt kvmppc_interrupt_pr 208#define kvmppc_interrupt kvmppc_interrupt_pr
208#endif 209#endif
209 210
210#define __KVM_HANDLER(area, h, n) \ 211#define __KVM_HANDLER_PROLOG(area, n) \
211do_kvm_##n: \
212 BEGIN_FTR_SECTION_NESTED(947) \ 212 BEGIN_FTR_SECTION_NESTED(947) \
213 ld r10,area+EX_CFAR(r13); \ 213 ld r10,area+EX_CFAR(r13); \
214 std r10,HSTATE_CFAR(r13); \ 214 std r10,HSTATE_CFAR(r13); \
@@ -221,21 +221,23 @@ do_kvm_##n: \
221 stw r9,HSTATE_SCRATCH1(r13); \ 221 stw r9,HSTATE_SCRATCH1(r13); \
222 ld r9,area+EX_R9(r13); \ 222 ld r9,area+EX_R9(r13); \
223 std r12,HSTATE_SCRATCH0(r13); \ 223 std r12,HSTATE_SCRATCH0(r13); \
224
225#define __KVM_HANDLER(area, h, n) \
226 __KVM_HANDLER_PROLOG(area, n) \
224 li r12,n; \ 227 li r12,n; \
225 b kvmppc_interrupt 228 b kvmppc_interrupt
226 229
227#define __KVM_HANDLER_SKIP(area, h, n) \ 230#define __KVM_HANDLER_SKIP(area, h, n) \
228do_kvm_##n: \
229 cmpwi r10,KVM_GUEST_MODE_SKIP; \ 231 cmpwi r10,KVM_GUEST_MODE_SKIP; \
230 ld r10,area+EX_R10(r13); \ 232 ld r10,area+EX_R10(r13); \
231 beq 89f; \ 233 beq 89f; \
232 stw r9,HSTATE_SCRATCH1(r13); \ 234 stw r9,HSTATE_SCRATCH1(r13); \
233 BEGIN_FTR_SECTION_NESTED(948) \ 235 BEGIN_FTR_SECTION_NESTED(948) \
234 ld r9,area+EX_PPR(r13); \ 236 ld r9,area+EX_PPR(r13); \
235 std r9,HSTATE_PPR(r13); \ 237 std r9,HSTATE_PPR(r13); \
236 END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,948); \ 238 END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,948); \
237 ld r9,area+EX_R9(r13); \ 239 ld r9,area+EX_R9(r13); \
238 std r12,HSTATE_SCRATCH0(r13); \ 240 std r12,HSTATE_SCRATCH0(r13); \
239 li r12,n; \ 241 li r12,n; \
240 b kvmppc_interrupt; \ 242 b kvmppc_interrupt; \
24189: mtocrf 0x80,r9; \ 24389: mtocrf 0x80,r9; \
@@ -243,12 +245,12 @@ do_kvm_##n: \
243 b kvmppc_skip_##h##interrupt 245 b kvmppc_skip_##h##interrupt
244 246
245#ifdef CONFIG_KVM_BOOK3S_64_HANDLER 247#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
246#define KVMTEST(n) __KVMTEST(n) 248#define KVMTEST(h, n) __KVMTEST(h, n)
247#define KVM_HANDLER(area, h, n) __KVM_HANDLER(area, h, n) 249#define KVM_HANDLER(area, h, n) __KVM_HANDLER(area, h, n)
248#define KVM_HANDLER_SKIP(area, h, n) __KVM_HANDLER_SKIP(area, h, n) 250#define KVM_HANDLER_SKIP(area, h, n) __KVM_HANDLER_SKIP(area, h, n)
249 251
250#else 252#else
251#define KVMTEST(n) 253#define KVMTEST(h, n)
252#define KVM_HANDLER(area, h, n) 254#define KVM_HANDLER(area, h, n)
253#define KVM_HANDLER_SKIP(area, h, n) 255#define KVM_HANDLER_SKIP(area, h, n)
254#endif 256#endif
@@ -332,94 +334,79 @@ do_kvm_##n: \
332/* 334/*
333 * Exception vectors. 335 * Exception vectors.
334 */ 336 */
335#define STD_EXCEPTION_PSERIES(vec, label) \ 337#define STD_EXCEPTION_PSERIES(vec, label) \
336 . = vec; \
337 .globl label##_pSeries; \
338label##_pSeries: \
339 SET_SCRATCH0(r13); /* save r13 */ \ 338 SET_SCRATCH0(r13); /* save r13 */ \
340 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ 339 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label, \
341 EXC_STD, KVMTEST, vec) 340 EXC_STD, KVMTEST_PR, vec); \
342 341
343/* Version of above for when we have to branch out-of-line */ 342/* Version of above for when we have to branch out-of-line */
343#define __OOL_EXCEPTION(vec, label, hdlr) \
344 SET_SCRATCH0(r13) \
345 EXCEPTION_PROLOG_0(PACA_EXGEN) \
346 b hdlr;
347
344#define STD_EXCEPTION_PSERIES_OOL(vec, label) \ 348#define STD_EXCEPTION_PSERIES_OOL(vec, label) \
345 .globl label##_pSeries; \ 349 EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, vec); \
346label##_pSeries: \ 350 EXCEPTION_PROLOG_PSERIES_1(label, EXC_STD)
347 EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST, vec); \ 351
348 EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_STD) 352#define STD_EXCEPTION_HV(loc, vec, label) \
349
350#define STD_EXCEPTION_HV(loc, vec, label) \
351 . = loc; \
352 .globl label##_hv; \
353label##_hv: \
354 SET_SCRATCH0(r13); /* save r13 */ \ 353 SET_SCRATCH0(r13); /* save r13 */ \
355 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ 354 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label, \
356 EXC_HV, KVMTEST, vec) 355 EXC_HV, KVMTEST_HV, vec);
357 356
358/* Version of above for when we have to branch out-of-line */ 357#define STD_EXCEPTION_HV_OOL(vec, label) \
359#define STD_EXCEPTION_HV_OOL(vec, label) \ 358 EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_HV, vec); \
360 .globl label##_hv; \ 359 EXCEPTION_PROLOG_PSERIES_1(label, EXC_HV)
361label##_hv: \
362 EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST, vec); \
363 EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_HV)
364 360
365#define STD_RELON_EXCEPTION_PSERIES(loc, vec, label) \ 361#define STD_RELON_EXCEPTION_PSERIES(loc, vec, label) \
366 . = loc; \
367 .globl label##_relon_pSeries; \
368label##_relon_pSeries: \
369 /* No guest interrupts come through here */ \ 362 /* No guest interrupts come through here */ \
370 SET_SCRATCH0(r13); /* save r13 */ \ 363 SET_SCRATCH0(r13); /* save r13 */ \
371 EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ 364 EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label, EXC_STD, NOTEST, vec);
372 EXC_STD, NOTEST, vec)
373 365
374#define STD_RELON_EXCEPTION_PSERIES_OOL(vec, label) \ 366#define STD_RELON_EXCEPTION_PSERIES_OOL(vec, label) \
375 .globl label##_relon_pSeries; \
376label##_relon_pSeries: \
377 EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, vec); \ 367 EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, vec); \
378 EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, EXC_STD) 368 EXCEPTION_RELON_PROLOG_PSERIES_1(label, EXC_STD)
379 369
380#define STD_RELON_EXCEPTION_HV(loc, vec, label) \ 370#define STD_RELON_EXCEPTION_HV(loc, vec, label) \
381 . = loc; \
382 .globl label##_relon_hv; \
383label##_relon_hv: \
384 /* No guest interrupts come through here */ \ 371 /* No guest interrupts come through here */ \
385 SET_SCRATCH0(r13); /* save r13 */ \ 372 SET_SCRATCH0(r13); /* save r13 */ \
386 EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ 373 EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label, EXC_HV, NOTEST, vec);
387 EXC_HV, NOTEST, vec)
388 374
389#define STD_RELON_EXCEPTION_HV_OOL(vec, label) \ 375#define STD_RELON_EXCEPTION_HV_OOL(vec, label) \
390 .globl label##_relon_hv; \
391label##_relon_hv: \
392 EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, vec); \ 376 EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, vec); \
393 EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, EXC_HV) 377 EXCEPTION_RELON_PROLOG_PSERIES_1(label, EXC_HV)
394 378
395/* This associate vector numbers with bits in paca->irq_happened */ 379/* This associate vector numbers with bits in paca->irq_happened */
396#define SOFTEN_VALUE_0x500 PACA_IRQ_EE 380#define SOFTEN_VALUE_0x500 PACA_IRQ_EE
397#define SOFTEN_VALUE_0x502 PACA_IRQ_EE
398#define SOFTEN_VALUE_0x900 PACA_IRQ_DEC 381#define SOFTEN_VALUE_0x900 PACA_IRQ_DEC
399#define SOFTEN_VALUE_0x982 PACA_IRQ_DEC 382#define SOFTEN_VALUE_0x980 PACA_IRQ_DEC
400#define SOFTEN_VALUE_0xa00 PACA_IRQ_DBELL 383#define SOFTEN_VALUE_0xa00 PACA_IRQ_DBELL
401#define SOFTEN_VALUE_0xe80 PACA_IRQ_DBELL 384#define SOFTEN_VALUE_0xe80 PACA_IRQ_DBELL
402#define SOFTEN_VALUE_0xe82 PACA_IRQ_DBELL
403#define SOFTEN_VALUE_0xe60 PACA_IRQ_HMI 385#define SOFTEN_VALUE_0xe60 PACA_IRQ_HMI
404#define SOFTEN_VALUE_0xe62 PACA_IRQ_HMI
405#define SOFTEN_VALUE_0xea0 PACA_IRQ_EE 386#define SOFTEN_VALUE_0xea0 PACA_IRQ_EE
406#define SOFTEN_VALUE_0xea2 PACA_IRQ_EE
407 387
408#define __SOFTEN_TEST(h, vec) \ 388#define __SOFTEN_TEST(h, vec) \
409 lbz r10,PACASOFTIRQEN(r13); \ 389 lbz r10,PACASOFTIRQEN(r13); \
410 cmpwi r10,0; \ 390 cmpwi r10,0; \
411 li r10,SOFTEN_VALUE_##vec; \ 391 li r10,SOFTEN_VALUE_##vec; \
412 beq masked_##h##interrupt 392 beq masked_##h##interrupt
393
413#define _SOFTEN_TEST(h, vec) __SOFTEN_TEST(h, vec) 394#define _SOFTEN_TEST(h, vec) __SOFTEN_TEST(h, vec)
414 395
415#define SOFTEN_TEST_PR(vec) \ 396#define SOFTEN_TEST_PR(vec) \
416 KVMTEST(vec); \ 397 KVMTEST(EXC_STD, vec); \
417 _SOFTEN_TEST(EXC_STD, vec) 398 _SOFTEN_TEST(EXC_STD, vec)
418 399
419#define SOFTEN_TEST_HV(vec) \ 400#define SOFTEN_TEST_HV(vec) \
420 KVMTEST(vec); \ 401 KVMTEST(EXC_HV, vec); \
421 _SOFTEN_TEST(EXC_HV, vec) 402 _SOFTEN_TEST(EXC_HV, vec)
422 403
404#define KVMTEST_PR(vec) \
405 KVMTEST(EXC_STD, vec)
406
407#define KVMTEST_HV(vec) \
408 KVMTEST(EXC_HV, vec)
409
423#define SOFTEN_NOTEST_PR(vec) _SOFTEN_TEST(EXC_STD, vec) 410#define SOFTEN_NOTEST_PR(vec) _SOFTEN_TEST(EXC_STD, vec)
424#define SOFTEN_NOTEST_HV(vec) _SOFTEN_TEST(EXC_HV, vec) 411#define SOFTEN_NOTEST_HV(vec) _SOFTEN_TEST(EXC_HV, vec)
425 412
@@ -427,58 +414,47 @@ label##_relon_hv: \
427 SET_SCRATCH0(r13); /* save r13 */ \ 414 SET_SCRATCH0(r13); /* save r13 */ \
428 EXCEPTION_PROLOG_0(PACA_EXGEN); \ 415 EXCEPTION_PROLOG_0(PACA_EXGEN); \
429 __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \ 416 __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \
430 EXCEPTION_PROLOG_PSERIES_1(label##_common, h); 417 EXCEPTION_PROLOG_PSERIES_1(label, h);
431 418
432#define _MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \ 419#define _MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \
433 __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) 420 __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra)
434 421
435#define MASKABLE_EXCEPTION_PSERIES(loc, vec, label) \ 422#define MASKABLE_EXCEPTION_PSERIES(loc, vec, label) \
436 . = loc; \
437 .globl label##_pSeries; \
438label##_pSeries: \
439 _MASKABLE_EXCEPTION_PSERIES(vec, label, \ 423 _MASKABLE_EXCEPTION_PSERIES(vec, label, \
440 EXC_STD, SOFTEN_TEST_PR) 424 EXC_STD, SOFTEN_TEST_PR)
441 425
426#define MASKABLE_EXCEPTION_PSERIES_OOL(vec, label) \
427 EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_PR, vec); \
428 EXCEPTION_PROLOG_PSERIES_1(label, EXC_STD)
429
442#define MASKABLE_EXCEPTION_HV(loc, vec, label) \ 430#define MASKABLE_EXCEPTION_HV(loc, vec, label) \
443 . = loc; \
444 .globl label##_hv; \
445label##_hv: \
446 _MASKABLE_EXCEPTION_PSERIES(vec, label, \ 431 _MASKABLE_EXCEPTION_PSERIES(vec, label, \
447 EXC_HV, SOFTEN_TEST_HV) 432 EXC_HV, SOFTEN_TEST_HV)
448 433
449#define MASKABLE_EXCEPTION_HV_OOL(vec, label) \ 434#define MASKABLE_EXCEPTION_HV_OOL(vec, label) \
450 .globl label##_hv; \
451label##_hv: \
452 EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_HV, vec); \ 435 EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_HV, vec); \
453 EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_HV); 436 EXCEPTION_PROLOG_PSERIES_1(label, EXC_HV)
454 437
455#define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \ 438#define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \
456 SET_SCRATCH0(r13); /* save r13 */ \ 439 SET_SCRATCH0(r13); /* save r13 */ \
457 EXCEPTION_PROLOG_0(PACA_EXGEN); \ 440 EXCEPTION_PROLOG_0(PACA_EXGEN); \
458 __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \ 441 __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \
459 EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, h); 442 EXCEPTION_RELON_PROLOG_PSERIES_1(label, h)
460#define _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \ 443
444#define _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \
461 __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) 445 __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra)
462 446
463#define MASKABLE_RELON_EXCEPTION_PSERIES(loc, vec, label) \ 447#define MASKABLE_RELON_EXCEPTION_PSERIES(loc, vec, label) \
464 . = loc; \
465 .globl label##_relon_pSeries; \
466label##_relon_pSeries: \
467 _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \ 448 _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \
468 EXC_STD, SOFTEN_NOTEST_PR) 449 EXC_STD, SOFTEN_NOTEST_PR)
469 450
470#define MASKABLE_RELON_EXCEPTION_HV(loc, vec, label) \ 451#define MASKABLE_RELON_EXCEPTION_HV(loc, vec, label) \
471 . = loc; \
472 .globl label##_relon_hv; \
473label##_relon_hv: \
474 _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \ 452 _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \
475 EXC_HV, SOFTEN_NOTEST_HV) 453 EXC_HV, SOFTEN_NOTEST_HV)
476 454
477#define MASKABLE_RELON_EXCEPTION_HV_OOL(vec, label) \ 455#define MASKABLE_RELON_EXCEPTION_HV_OOL(vec, label) \
478 .globl label##_relon_hv; \
479label##_relon_hv: \
480 EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_NOTEST_HV, vec); \ 456 EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_NOTEST_HV, vec); \
481 EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_HV); 457 EXCEPTION_PROLOG_PSERIES_1(label, EXC_HV)
482 458
483/* 459/*
484 * Our exception common code can be passed various "additions" 460 * Our exception common code can be passed various "additions"
@@ -504,9 +480,6 @@ BEGIN_FTR_SECTION \
504END_FTR_SECTION_IFSET(CPU_FTR_CTRL) 480END_FTR_SECTION_IFSET(CPU_FTR_CTRL)
505 481
506#define EXCEPTION_COMMON(trap, label, hdlr, ret, additions) \ 482#define EXCEPTION_COMMON(trap, label, hdlr, ret, additions) \
507 .align 7; \
508 .globl label##_common; \
509label##_common: \
510 EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \ 483 EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \
511 /* Volatile regs are potentially clobbered here */ \ 484 /* Volatile regs are potentially clobbered here */ \
512 additions; \ 485 additions; \
diff --git a/arch/powerpc/include/asm/head-64.h b/arch/powerpc/include/asm/head-64.h
new file mode 100644
index 000000000000..358c25c80c62
--- /dev/null
+++ b/arch/powerpc/include/asm/head-64.h
@@ -0,0 +1,163 @@
1#ifndef _ASM_POWERPC_HEAD_64_H
2#define _ASM_POWERPC_HEAD_64_H
3
4#include <asm/cache.h>
5
6#define EXC_REAL_BEGIN(name, start, end) \
7 . = start ; \
8 .global exc_real_##start##_##name ; \
9exc_real_##start##_##name:
10
11#define EXC_REAL_END(name, start, end)
12
13#define EXC_VIRT_BEGIN(name, start, end) \
14 . = start ; \
15 .global exc_virt_##start##_##name ; \
16exc_virt_##start##_##name:
17
18#define EXC_VIRT_END(name, start, end)
19
20#define EXC_COMMON_BEGIN(name) \
21 .global name; \
22name:
23
24#define TRAMP_REAL_BEGIN(name) \
25 .global name ; \
26name:
27
28#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
29#define TRAMP_KVM_BEGIN(name) \
30 TRAMP_REAL_BEGIN(name)
31#else
32#define TRAMP_KVM_BEGIN(name)
33#endif
34
35#define EXC_REAL_NONE(start, end)
36
37#define EXC_VIRT_NONE(start, end)
38
39
40#define EXC_REAL(name, start, end) \
41 EXC_REAL_BEGIN(name, start, end); \
42 STD_EXCEPTION_PSERIES(start, name##_common); \
43 EXC_REAL_END(name, start, end);
44
45#define EXC_VIRT(name, start, end, realvec) \
46 EXC_VIRT_BEGIN(name, start, end); \
47 STD_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \
48 EXC_VIRT_END(name, start, end);
49
50#define EXC_REAL_MASKABLE(name, start, end) \
51 EXC_REAL_BEGIN(name, start, end); \
52 MASKABLE_EXCEPTION_PSERIES(start, start, name##_common); \
53 EXC_REAL_END(name, start, end);
54
55#define EXC_VIRT_MASKABLE(name, start, end, realvec) \
56 EXC_VIRT_BEGIN(name, start, end); \
57 MASKABLE_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \
58 EXC_VIRT_END(name, start, end);
59
60#define EXC_REAL_HV(name, start, end) \
61 EXC_REAL_BEGIN(name, start, end); \
62 STD_EXCEPTION_HV(start, start, name##_common); \
63 EXC_REAL_END(name, start, end);
64
65#define EXC_VIRT_HV(name, start, end, realvec) \
66 EXC_VIRT_BEGIN(name, start, end); \
67 STD_RELON_EXCEPTION_HV(start, realvec, name##_common); \
68 EXC_VIRT_END(name, start, end);
69
70#define __EXC_REAL_OOL(name, start, end) \
71 EXC_REAL_BEGIN(name, start, end); \
72 __OOL_EXCEPTION(start, label, tramp_real_##name); \
73 EXC_REAL_END(name, start, end);
74
75#define __TRAMP_REAL_REAL_OOL(name, vec) \
76 TRAMP_REAL_BEGIN(tramp_real_##name); \
77 STD_EXCEPTION_PSERIES_OOL(vec, name##_common); \
78
79#define __EXC_REAL_OOL_MASKABLE(name, start, end) \
80 __EXC_REAL_OOL(name, start, end);
81
82#define __TRAMP_REAL_REAL_OOL_MASKABLE(name, vec) \
83 TRAMP_REAL_BEGIN(tramp_real_##name); \
84 MASKABLE_EXCEPTION_PSERIES_OOL(vec, name##_common); \
85
86#define __EXC_REAL_OOL_HV_DIRECT(name, start, end, handler) \
87 EXC_REAL_BEGIN(name, start, end); \
88 __OOL_EXCEPTION(start, label, handler); \
89 EXC_REAL_END(name, start, end);
90
91#define __EXC_REAL_OOL_HV(name, start, end) \
92 __EXC_REAL_OOL(name, start, end);
93
94#define __TRAMP_REAL_REAL_OOL_HV(name, vec) \
95 TRAMP_REAL_BEGIN(tramp_real_##name); \
96 STD_EXCEPTION_HV_OOL(vec, name##_common); \
97
98#define __EXC_REAL_OOL_MASKABLE_HV(name, start, end) \
99 __EXC_REAL_OOL(name, start, end);
100
101#define __TRAMP_REAL_REAL_OOL_MASKABLE_HV(name, vec) \
102 TRAMP_REAL_BEGIN(tramp_real_##name); \
103 MASKABLE_EXCEPTION_HV_OOL(vec, name##_common); \
104
105#define __EXC_VIRT_OOL(name, start, end) \
106 EXC_VIRT_BEGIN(name, start, end); \
107 __OOL_EXCEPTION(start, label, tramp_virt_##name); \
108 EXC_VIRT_END(name, start, end);
109
110#define __TRAMP_REAL_VIRT_OOL(name, realvec) \
111 TRAMP_REAL_BEGIN(tramp_virt_##name); \
112 STD_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common); \
113
114#define __EXC_VIRT_OOL_MASKABLE(name, start, end) \
115 __EXC_VIRT_OOL(name, start, end);
116
117#define __TRAMP_REAL_VIRT_OOL_MASKABLE(name, realvec) \
118 TRAMP_REAL_BEGIN(tramp_virt_##name); \
119 MASKABLE_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common); \
120
121#define __EXC_VIRT_OOL_HV(name, start, end) \
122 __EXC_VIRT_OOL(name, start, end);
123
124#define __TRAMP_REAL_VIRT_OOL_HV(name, realvec) \
125 TRAMP_REAL_BEGIN(tramp_virt_##name); \
126 STD_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \
127
128#define __EXC_VIRT_OOL_MASKABLE_HV(name, start, end) \
129 __EXC_VIRT_OOL(name, start, end);
130
131#define __TRAMP_REAL_VIRT_OOL_MASKABLE_HV(name, realvec) \
132 TRAMP_REAL_BEGIN(tramp_virt_##name); \
133 MASKABLE_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \
134
135#define TRAMP_KVM(area, n) \
136 TRAMP_KVM_BEGIN(do_kvm_##n); \
137 KVM_HANDLER(area, EXC_STD, n); \
138
139#define TRAMP_KVM_SKIP(area, n) \
140 TRAMP_KVM_BEGIN(do_kvm_##n); \
141 KVM_HANDLER_SKIP(area, EXC_STD, n); \
142
143#define TRAMP_KVM_HV(area, n) \
144 TRAMP_KVM_BEGIN(do_kvm_H##n); \
145 KVM_HANDLER(area, EXC_HV, n + 0x2); \
146
147#define TRAMP_KVM_HV_SKIP(area, n) \
148 TRAMP_KVM_BEGIN(do_kvm_H##n); \
149 KVM_HANDLER_SKIP(area, EXC_HV, n + 0x2); \
150
151#define EXC_COMMON(name, realvec, hdlr) \
152 EXC_COMMON_BEGIN(name); \
153 STD_EXCEPTION_COMMON(realvec, name, hdlr); \
154
155#define EXC_COMMON_ASYNC(name, realvec, hdlr) \
156 EXC_COMMON_BEGIN(name); \
157 STD_EXCEPTION_COMMON_ASYNC(realvec, name, hdlr); \
158
159#define EXC_COMMON_HV(name, realvec, hdlr) \
160 EXC_COMMON_BEGIN(name); \
161 STD_EXCEPTION_COMMON(realvec + 0x2, name, hdlr); \
162
163#endif /* _ASM_POWERPC_HEAD_64_H */