objc-blocktramps-arm64.s 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. nop
  32. nop
  33. .macro TrampolineEntry
  34. // load address of trampoline data (two pages before this instruction)
  35. adr x17, -2*PAGE_MAX_SIZE
  36. b L_objc_blockTrampolineImpl
  37. .endmacro
  38. .macro TrampolineEntryX16
  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. TrampolineEntry
  54. TrampolineEntry
  55. .endmacro
  56. .macro TrampolineEntryX256
  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. TrampolineEntryX16
  72. TrampolineEntryX16
  73. .endmacro
  74. .align 3
  75. __objc_blockTrampolineStart:
  76. // 2048-4 trampolines to fill 16K page
  77. TrampolineEntryX256
  78. TrampolineEntryX256
  79. TrampolineEntryX256
  80. TrampolineEntryX256
  81. TrampolineEntryX256
  82. TrampolineEntryX256
  83. TrampolineEntryX256
  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. TrampolineEntryX16
  98. TrampolineEntryX16
  99. TrampolineEntry
  100. TrampolineEntry
  101. TrampolineEntry
  102. TrampolineEntry
  103. TrampolineEntry
  104. TrampolineEntry
  105. TrampolineEntry
  106. TrampolineEntry
  107. TrampolineEntry
  108. TrampolineEntry
  109. TrampolineEntry
  110. __objc_blockTrampolineLast:
  111. TrampolineEntry
  112. // TrampolineEntry
  113. // TrampolineEntry
  114. // TrampolineEntry
  115. // TrampolineEntry
  116. #endif