objc-blocktramps-arm64.s 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #if __arm64__
  2. #include <mach/vm_param.h>
  3. #include "arm64-asm.h"
  4. // Offset of block->invoke field.
  5. #if __LP64__
  6. // true arm64
  7. # define BLOCK_INVOKE 16
  8. #else
  9. // arm64_32
  10. # define BLOCK_INVOKE 12
  11. #endif
  12. .text
  13. .globl __objc_blockTrampolineImpl
  14. .globl __objc_blockTrampolineStart
  15. .globl __objc_blockTrampolineLast
  16. .align PAGE_MAX_SHIFT
  17. __objc_blockTrampolineImpl:
  18. L_objc_blockTrampolineImpl:
  19. /*
  20. x0 == self
  21. x17 == address of called trampoline's data (2 pages before its code)
  22. lr == original return address
  23. */
  24. mov x1, x0 // _cmd = self
  25. ldr p0, [x17] // self = block object
  26. add p15, p0, #BLOCK_INVOKE // x15 = &block->invoke
  27. ldr p16, [x15] // x16 = block->invoke
  28. TailCallBlockInvoke x16, x15
  29. // pad up to TrampolineBlockPagePair header size
  30. nop
  31. .macro TrampolineEntry
  32. // load address of trampoline data (two pages before this instruction)
  33. adr x17, -2*PAGE_MAX_SIZE
  34. b L_objc_blockTrampolineImpl
  35. .endmacro
  36. .macro TrampolineEntryX16
  37. TrampolineEntry
  38. TrampolineEntry
  39. TrampolineEntry
  40. TrampolineEntry
  41. TrampolineEntry
  42. TrampolineEntry
  43. TrampolineEntry
  44. TrampolineEntry
  45. TrampolineEntry
  46. TrampolineEntry
  47. TrampolineEntry
  48. TrampolineEntry
  49. TrampolineEntry
  50. TrampolineEntry
  51. TrampolineEntry
  52. TrampolineEntry
  53. .endmacro
  54. .macro TrampolineEntryX256
  55. TrampolineEntryX16
  56. TrampolineEntryX16
  57. TrampolineEntryX16
  58. TrampolineEntryX16
  59. TrampolineEntryX16
  60. TrampolineEntryX16
  61. TrampolineEntryX16
  62. TrampolineEntryX16
  63. TrampolineEntryX16
  64. TrampolineEntryX16
  65. TrampolineEntryX16
  66. TrampolineEntryX16
  67. TrampolineEntryX16
  68. TrampolineEntryX16
  69. TrampolineEntryX16
  70. TrampolineEntryX16
  71. .endmacro
  72. .align 3
  73. __objc_blockTrampolineStart:
  74. // 2048-3 trampolines to fill 16K page
  75. TrampolineEntryX256
  76. TrampolineEntryX256
  77. TrampolineEntryX256
  78. TrampolineEntryX256
  79. TrampolineEntryX256
  80. TrampolineEntryX256
  81. TrampolineEntryX256
  82. TrampolineEntryX16
  83. TrampolineEntryX16
  84. TrampolineEntryX16
  85. TrampolineEntryX16
  86. TrampolineEntryX16
  87. TrampolineEntryX16
  88. TrampolineEntryX16
  89. TrampolineEntryX16
  90. TrampolineEntryX16
  91. TrampolineEntryX16
  92. TrampolineEntryX16
  93. TrampolineEntryX16
  94. TrampolineEntryX16
  95. TrampolineEntryX16
  96. TrampolineEntryX16
  97. TrampolineEntry
  98. TrampolineEntry
  99. TrampolineEntry
  100. TrampolineEntry
  101. TrampolineEntry
  102. TrampolineEntry
  103. TrampolineEntry
  104. TrampolineEntry
  105. TrampolineEntry
  106. TrampolineEntry
  107. TrampolineEntry
  108. TrampolineEntry
  109. __objc_blockTrampolineLast:
  110. TrampolineEntry
  111. // TrampolineEntry
  112. // TrampolineEntry
  113. // TrampolineEntry
  114. #endif