feature-fixups.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #ifndef __ASM_POWERPC_FEATURE_FIXUPS_H
  2. #define __ASM_POWERPC_FEATURE_FIXUPS_H
  3. /*
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * as published by the Free Software Foundation; either version
  7. * 2 of the License, or (at your option) any later version.
  8. */
  9. #ifdef __ASSEMBLY__
  10. /*
  11. * Feature section common macros
  12. *
  13. * Note that the entries now contain offsets between the table entry
  14. * and the code rather than absolute code pointers in order to be
  15. * useable with the vdso shared library. There is also an assumption
  16. * that values will be negative, that is, the fixup table has to be
  17. * located after the code it fixes up.
  18. */
  19. #if defined(CONFIG_PPC64) && !defined(__powerpc64__)
  20. /* 64 bits kernel, 32 bits code (ie. vdso32) */
  21. #define FTR_ENTRY_LONG .llong
  22. #define FTR_ENTRY_OFFSET .long 0xffffffff; .long
  23. #else
  24. /* 64 bit kernel 64 bit code, or 32 bit kernel 32 bit code */
  25. #define FTR_ENTRY_LONG PPC_LONG
  26. #define FTR_ENTRY_OFFSET PPC_LONG
  27. #endif
  28. #define START_FTR_SECTION(label) label##1:
  29. #define FTR_SECTION_ELSE_NESTED(label) \
  30. label##2: \
  31. .pushsection __ftr_alt_##label,"a"; \
  32. .align 2; \
  33. label##3:
  34. #define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \
  35. label##4: \
  36. .popsection; \
  37. .pushsection sect,"a"; \
  38. .align 3; \
  39. label##5: \
  40. FTR_ENTRY_LONG msk; \
  41. FTR_ENTRY_LONG val; \
  42. FTR_ENTRY_OFFSET label##1b-label##5b; \
  43. FTR_ENTRY_OFFSET label##2b-label##5b; \
  44. FTR_ENTRY_OFFSET label##3b-label##5b; \
  45. FTR_ENTRY_OFFSET label##4b-label##5b; \
  46. .popsection;
  47. /* CPU feature dependent sections */
  48. #define BEGIN_FTR_SECTION_NESTED(label) START_FTR_SECTION(label)
  49. #define BEGIN_FTR_SECTION START_FTR_SECTION(97)
  50. #define END_FTR_SECTION_NESTED(msk, val, label) \
  51. FTR_SECTION_ELSE_NESTED(label) \
  52. MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup)
  53. #define END_FTR_SECTION(msk, val) \
  54. END_FTR_SECTION_NESTED(msk, val, 97)
  55. #define END_FTR_SECTION_IFSET(msk) END_FTR_SECTION((msk), (msk))
  56. #define END_FTR_SECTION_IFCLR(msk) END_FTR_SECTION((msk), 0)
  57. /* CPU feature sections with alternatives, use BEGIN_FTR_SECTION to start */
  58. #define FTR_SECTION_ELSE FTR_SECTION_ELSE_NESTED(97)
  59. #define ALT_FTR_SECTION_END_NESTED(msk, val, label) \
  60. MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup)
  61. #define ALT_FTR_SECTION_END_NESTED_IFSET(msk, label) \
  62. ALT_FTR_SECTION_END_NESTED(msk, msk, label)
  63. #define ALT_FTR_SECTION_END_NESTED_IFCLR(msk, label) \
  64. ALT_FTR_SECTION_END_NESTED(msk, 0, label)
  65. #define ALT_FTR_SECTION_END(msk, val) \
  66. ALT_FTR_SECTION_END_NESTED(msk, val, 97)
  67. #define ALT_FTR_SECTION_END_IFSET(msk) \
  68. ALT_FTR_SECTION_END_NESTED_IFSET(msk, 97)
  69. #define ALT_FTR_SECTION_END_IFCLR(msk) \
  70. ALT_FTR_SECTION_END_NESTED_IFCLR(msk, 97)
  71. /* MMU feature dependent sections */
  72. #define BEGIN_MMU_FTR_SECTION_NESTED(label) START_FTR_SECTION(label)
  73. #define BEGIN_MMU_FTR_SECTION START_FTR_SECTION(97)
  74. #define END_MMU_FTR_SECTION_NESTED(msk, val, label) \
  75. FTR_SECTION_ELSE_NESTED(label) \
  76. MAKE_FTR_SECTION_ENTRY(msk, val, label, __mmu_ftr_fixup)
  77. #define END_MMU_FTR_SECTION(msk, val) \
  78. END_MMU_FTR_SECTION_NESTED(msk, val, 97)
  79. #define END_MMU_FTR_SECTION_IFSET(msk) END_MMU_FTR_SECTION((msk), (msk))
  80. #define END_MMU_FTR_SECTION_IFCLR(msk) END_MMU_FTR_SECTION((msk), 0)
  81. /* MMU feature sections with alternatives, use BEGIN_FTR_SECTION to start */
  82. #define MMU_FTR_SECTION_ELSE_NESTED(label) FTR_SECTION_ELSE_NESTED(label)
  83. #define MMU_FTR_SECTION_ELSE MMU_FTR_SECTION_ELSE_NESTED(97)
  84. #define ALT_MMU_FTR_SECTION_END_NESTED(msk, val, label) \
  85. MAKE_FTR_SECTION_ENTRY(msk, val, label, __mmu_ftr_fixup)
  86. #define ALT_MMU_FTR_SECTION_END_NESTED_IFSET(msk, label) \
  87. ALT_MMU_FTR_SECTION_END_NESTED(msk, msk, label)
  88. #define ALT_MMU_FTR_SECTION_END_NESTED_IFCLR(msk, label) \
  89. ALT_MMU_FTR_SECTION_END_NESTED(msk, 0, label)
  90. #define ALT_MMU_FTR_SECTION_END(msk, val) \
  91. ALT_MMU_FTR_SECTION_END_NESTED(msk, val, 97)
  92. #define ALT_MMU_FTR_SECTION_END_IFSET(msk) \
  93. ALT_MMU_FTR_SECTION_END_NESTED_IFSET(msk, 97)
  94. #define ALT_MMU_FTR_SECTION_END_IFCLR(msk) \
  95. ALT_MMU_FTR_SECTION_END_NESTED_IFCLR(msk, 97)
  96. /* Firmware feature dependent sections */
  97. #define BEGIN_FW_FTR_SECTION_NESTED(label) START_FTR_SECTION(label)
  98. #define BEGIN_FW_FTR_SECTION START_FTR_SECTION(97)
  99. #define END_FW_FTR_SECTION_NESTED(msk, val, label) \
  100. FTR_SECTION_ELSE_NESTED(label) \
  101. MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup)
  102. #define END_FW_FTR_SECTION(msk, val) \
  103. END_FW_FTR_SECTION_NESTED(msk, val, 97)
  104. #define END_FW_FTR_SECTION_IFSET(msk) END_FW_FTR_SECTION((msk), (msk))
  105. #define END_FW_FTR_SECTION_IFCLR(msk) END_FW_FTR_SECTION((msk), 0)
  106. /* Firmware feature sections with alternatives */
  107. #define FW_FTR_SECTION_ELSE_NESTED(label) FTR_SECTION_ELSE_NESTED(label)
  108. #define FW_FTR_SECTION_ELSE FTR_SECTION_ELSE_NESTED(97)
  109. #define ALT_FW_FTR_SECTION_END_NESTED(msk, val, label) \
  110. MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup)
  111. #define ALT_FW_FTR_SECTION_END_NESTED_IFSET(msk, label) \
  112. ALT_FW_FTR_SECTION_END_NESTED(msk, msk, label)
  113. #define ALT_FW_FTR_SECTION_END_NESTED_IFCLR(msk, label) \
  114. ALT_FW_FTR_SECTION_END_NESTED(msk, 0, label)
  115. #define ALT_FW_FTR_SECTION_END(msk, val) \
  116. ALT_FW_FTR_SECTION_END_NESTED(msk, val, 97)
  117. #define ALT_FW_FTR_SECTION_END_IFSET(msk) \
  118. ALT_FW_FTR_SECTION_END_NESTED_IFSET(msk, 97)
  119. #define ALT_FW_FTR_SECTION_END_IFCLR(msk) \
  120. ALT_FW_FTR_SECTION_END_NESTED_IFCLR(msk, 97)
  121. #endif /* __ASSEMBLY__ */
  122. /* LWSYNC feature sections */
  123. #define START_LWSYNC_SECTION(label) label##1:
  124. #define MAKE_LWSYNC_SECTION_ENTRY(label, sect) \
  125. label##2: \
  126. .pushsection sect,"a"; \
  127. .align 2; \
  128. label##3: \
  129. .long label##1b-label##3b; \
  130. .popsection;
  131. #endif /* __ASM_POWERPC_FEATURE_FIXUPS_H */