1#if __arm__ 2 3#include <arm/arch.h> 4#include <mach/vm_param.h> 5 6.syntax unified 7 8.text 9 10 .private_extern __a1a2_tramphead 11 .private_extern __a1a2_firsttramp 12 .private_extern __a1a2_trampend 13 14// Trampoline machinery assumes the trampolines are Thumb function pointers 15#if !__thumb2__ 16# error sorry 17#endif 18 19.thumb 20.thumb_func __a1a2_tramphead 21.thumb_func __a1a2_firsttramp 22.thumb_func __a1a2_trampend 23 24.align PAGE_MAX_SHIFT 25__a1a2_tramphead: 26 /* 27 r0 == self 28 r12 == pc of trampoline's first instruction + PC bias 29 lr == original return address 30 */ 31 32 mov r1, r0 // _cmd = self 33 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 39 // not reached 40 41 // Align trampolines to 8 bytes 42.align 3 43 44.macro TrampolineEntry 45 mov r12, pc 46 b __a1a2_tramphead 47.align 3 48.endmacro 49 50.macro TrampolineEntryX16 51 TrampolineEntry 52 TrampolineEntry 53 TrampolineEntry 54 TrampolineEntry 55 56 TrampolineEntry 57 TrampolineEntry 58 TrampolineEntry 59 TrampolineEntry 60 61 TrampolineEntry 62 TrampolineEntry 63 TrampolineEntry 64 TrampolineEntry 65 66 TrampolineEntry 67 TrampolineEntry 68 TrampolineEntry 69 TrampolineEntry 70.endmacro 71 72.macro TrampolineEntryX256 73 TrampolineEntryX16 74 TrampolineEntryX16 75 TrampolineEntryX16 76 TrampolineEntryX16 77 78 TrampolineEntryX16 79 TrampolineEntryX16 80 TrampolineEntryX16 81 TrampolineEntryX16 82 83 TrampolineEntryX16 84 TrampolineEntryX16 85 TrampolineEntryX16 86 TrampolineEntryX16 87 88 TrampolineEntryX16 89 TrampolineEntryX16 90 TrampolineEntryX16 91 TrampolineEntryX16 92.endmacro 93 94.private_extern __a1a2_firsttramp 95__a1a2_firsttramp: 96 // 2048-2 trampolines to fill 16K page 97 TrampolineEntryX256 98 TrampolineEntryX256 99 TrampolineEntryX256 100 TrampolineEntryX256 101 102 TrampolineEntryX256 103 TrampolineEntryX256 104 TrampolineEntryX256 105 106 TrampolineEntryX16 107 TrampolineEntryX16 108 TrampolineEntryX16 109 TrampolineEntryX16 110 111 TrampolineEntryX16 112 TrampolineEntryX16 113 TrampolineEntryX16 114 TrampolineEntryX16 115 116 TrampolineEntryX16 117 TrampolineEntryX16 118 TrampolineEntryX16 119 TrampolineEntryX16 120 121 TrampolineEntryX16 122 TrampolineEntryX16 123 TrampolineEntryX16 124 125 TrampolineEntry 126 TrampolineEntry 127 TrampolineEntry 128 TrampolineEntry 129 130 TrampolineEntry 131 TrampolineEntry 132 TrampolineEntry 133 TrampolineEntry 134 135 TrampolineEntry 136 TrampolineEntry 137 TrampolineEntry 138 TrampolineEntry 139 140 TrampolineEntry 141 TrampolineEntry 142 // TrampolineEntry 143 // TrampolineEntry 144 145.private_extern __a1a2_trampend 146__a1a2_trampend: 147 148#endif 149