head-64.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #ifndef _ASM_POWERPC_HEAD_64_H
  2. #define _ASM_POWERPC_HEAD_64_H
  3. #include <asm/cache.h>
  4. #define EXC_REAL_BEGIN(name, start, end) \
  5. . = start ; \
  6. .global exc_real_##start##_##name ; \
  7. exc_real_##start##_##name:
  8. #define EXC_REAL_END(name, start, end)
  9. #define EXC_VIRT_BEGIN(name, start, end) \
  10. . = start ; \
  11. .global exc_virt_##start##_##name ; \
  12. exc_virt_##start##_##name:
  13. #define EXC_VIRT_END(name, start, end)
  14. #define EXC_COMMON_BEGIN(name) \
  15. .global name; \
  16. name:
  17. #define TRAMP_REAL_BEGIN(name) \
  18. .global name ; \
  19. name:
  20. #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
  21. #define TRAMP_KVM_BEGIN(name) \
  22. TRAMP_REAL_BEGIN(name)
  23. #else
  24. #define TRAMP_KVM_BEGIN(name)
  25. #endif
  26. #define EXC_REAL_NONE(start, end)
  27. #define EXC_VIRT_NONE(start, end)
  28. #define EXC_REAL(name, start, end) \
  29. EXC_REAL_BEGIN(name, start, end); \
  30. STD_EXCEPTION_PSERIES(start, name##_common); \
  31. EXC_REAL_END(name, start, end);
  32. #define EXC_VIRT(name, start, end, realvec) \
  33. EXC_VIRT_BEGIN(name, start, end); \
  34. STD_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \
  35. EXC_VIRT_END(name, start, end);
  36. #define EXC_REAL_MASKABLE(name, start, end) \
  37. EXC_REAL_BEGIN(name, start, end); \
  38. MASKABLE_EXCEPTION_PSERIES(start, start, name##_common); \
  39. EXC_REAL_END(name, start, end);
  40. #define EXC_VIRT_MASKABLE(name, start, end, realvec) \
  41. EXC_VIRT_BEGIN(name, start, end); \
  42. MASKABLE_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \
  43. EXC_VIRT_END(name, start, end);
  44. #define EXC_REAL_HV(name, start, end) \
  45. EXC_REAL_BEGIN(name, start, end); \
  46. STD_EXCEPTION_HV(start, start, name##_common); \
  47. EXC_REAL_END(name, start, end);
  48. #define EXC_VIRT_HV(name, start, end, realvec) \
  49. EXC_VIRT_BEGIN(name, start, end); \
  50. STD_RELON_EXCEPTION_HV(start, realvec, name##_common); \
  51. EXC_VIRT_END(name, start, end);
  52. #define __EXC_REAL_OOL(name, start, end) \
  53. EXC_REAL_BEGIN(name, start, end); \
  54. __OOL_EXCEPTION(start, label, tramp_real_##name); \
  55. EXC_REAL_END(name, start, end);
  56. #define __TRAMP_REAL_REAL_OOL(name, vec) \
  57. TRAMP_REAL_BEGIN(tramp_real_##name); \
  58. STD_EXCEPTION_PSERIES_OOL(vec, name##_common); \
  59. #define __EXC_REAL_OOL_MASKABLE(name, start, end) \
  60. __EXC_REAL_OOL(name, start, end);
  61. #define __TRAMP_REAL_REAL_OOL_MASKABLE(name, vec) \
  62. TRAMP_REAL_BEGIN(tramp_real_##name); \
  63. MASKABLE_EXCEPTION_PSERIES_OOL(vec, name##_common); \
  64. #define __EXC_REAL_OOL_HV_DIRECT(name, start, end, handler) \
  65. EXC_REAL_BEGIN(name, start, end); \
  66. __OOL_EXCEPTION(start, label, handler); \
  67. EXC_REAL_END(name, start, end);
  68. #define __EXC_REAL_OOL_HV(name, start, end) \
  69. __EXC_REAL_OOL(name, start, end);
  70. #define __TRAMP_REAL_REAL_OOL_HV(name, vec) \
  71. TRAMP_REAL_BEGIN(tramp_real_##name); \
  72. STD_EXCEPTION_HV_OOL(vec, name##_common); \
  73. #define __EXC_REAL_OOL_MASKABLE_HV(name, start, end) \
  74. __EXC_REAL_OOL(name, start, end);
  75. #define __TRAMP_REAL_REAL_OOL_MASKABLE_HV(name, vec) \
  76. TRAMP_REAL_BEGIN(tramp_real_##name); \
  77. MASKABLE_EXCEPTION_HV_OOL(vec, name##_common); \
  78. #define __EXC_VIRT_OOL(name, start, end) \
  79. EXC_VIRT_BEGIN(name, start, end); \
  80. __OOL_EXCEPTION(start, label, tramp_virt_##name); \
  81. EXC_VIRT_END(name, start, end);
  82. #define __TRAMP_REAL_VIRT_OOL(name, realvec) \
  83. TRAMP_REAL_BEGIN(tramp_virt_##name); \
  84. STD_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common); \
  85. #define __EXC_VIRT_OOL_MASKABLE(name, start, end) \
  86. __EXC_VIRT_OOL(name, start, end);
  87. #define __TRAMP_REAL_VIRT_OOL_MASKABLE(name, realvec) \
  88. TRAMP_REAL_BEGIN(tramp_virt_##name); \
  89. MASKABLE_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common); \
  90. #define __EXC_VIRT_OOL_HV(name, start, end) \
  91. __EXC_VIRT_OOL(name, start, end);
  92. #define __TRAMP_REAL_VIRT_OOL_HV(name, realvec) \
  93. TRAMP_REAL_BEGIN(tramp_virt_##name); \
  94. STD_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \
  95. #define __EXC_VIRT_OOL_MASKABLE_HV(name, start, end) \
  96. __EXC_VIRT_OOL(name, start, end);
  97. #define __TRAMP_REAL_VIRT_OOL_MASKABLE_HV(name, realvec) \
  98. TRAMP_REAL_BEGIN(tramp_virt_##name); \
  99. MASKABLE_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \
  100. #define TRAMP_KVM(area, n) \
  101. TRAMP_KVM_BEGIN(do_kvm_##n); \
  102. KVM_HANDLER(area, EXC_STD, n); \
  103. #define TRAMP_KVM_SKIP(area, n) \
  104. TRAMP_KVM_BEGIN(do_kvm_##n); \
  105. KVM_HANDLER_SKIP(area, EXC_STD, n); \
  106. #define TRAMP_KVM_HV(area, n) \
  107. TRAMP_KVM_BEGIN(do_kvm_H##n); \
  108. KVM_HANDLER(area, EXC_HV, n + 0x2); \
  109. #define TRAMP_KVM_HV_SKIP(area, n) \
  110. TRAMP_KVM_BEGIN(do_kvm_H##n); \
  111. KVM_HANDLER_SKIP(area, EXC_HV, n + 0x2); \
  112. #define EXC_COMMON(name, realvec, hdlr) \
  113. EXC_COMMON_BEGIN(name); \
  114. STD_EXCEPTION_COMMON(realvec, name, hdlr); \
  115. #define EXC_COMMON_ASYNC(name, realvec, hdlr) \
  116. EXC_COMMON_BEGIN(name); \
  117. STD_EXCEPTION_COMMON_ASYNC(realvec, name, hdlr); \
  118. #define EXC_COMMON_HV(name, realvec, hdlr) \
  119. EXC_COMMON_BEGIN(name); \
  120. STD_EXCEPTION_COMMON(realvec + 0x2, name, hdlr); \
  121. #endif /* _ASM_POWERPC_HEAD_64_H */