4 #include <mach/vm_param.h>
10 .private_extern __a1a2_tramphead
11 .private_extern __a1a2_firsttramp
12 .private_extern __a1a2_trampend
14 // Trampoline machinery assumes the trampolines are Thumb function pointers
20 .thumb_func __a1a2_tramphead
21 .thumb_func __a1a2_firsttramp
22 .thumb_func __a1a2_trampend
28 r12 == pc of trampoline's first instruction + PC bias
29 lr == original return address
32 mov r1, r0 // _cmd = self
34 // Trampoline's data is one page before the trampoline text.
35 // Also correct PC bias of 4 bytes.
36 sub r12, #PAGE_MAX_SIZE
37 ldr r0, [r12, #-4] // self = block object
38 ldr pc, [r0, #12] // tail call block->invoke
41 // Align trampolines to 8 bytes
44 .macro TrampolineEntry
50 .macro TrampolineEntryX16
72 .macro TrampolineEntryX256
94 .private_extern __a1a2_firsttramp
96 // 2048-2 trampolines to fill 16K page
145 .private_extern __a1a2_trampend