]>
Commit | Line | Data |
---|---|---|
8972963c A |
1 | #if __arm__ |
2 | ||
3 | #include <arm/arch.h> | |
7257e56c | 4 | #include <mach/vm_param.h> |
8972963c A |
5 | |
6 | .syntax unified | |
7 | ||
8 | .text | |
9 | ||
8070259c A |
10 | .private_extern __a2a3_tramphead |
11 | .private_extern __a2a3_firsttramp | |
12 | .private_extern __a2a3_trampend | |
cd5f04f5 | 13 | |
8070259c A |
14 | // Trampoline machinery assumes the trampolines are Thumb function pointers |
15 | #if !__thumb2__ | |
16 | # error sorry | |
cd5f04f5 A |
17 | #endif |
18 | ||
8070259c A |
19 | .thumb |
20 | .thumb_func __a2a3_tramphead | |
21 | .thumb_func __a2a3_firsttramp | |
22 | .thumb_func __a2a3_trampend | |
23 | ||
24 | .align PAGE_MAX_SHIFT | |
8972963c A |
25 | __a2a3_tramphead: |
26 | /* | |
8972963c | 27 | r1 == self |
8070259c | 28 | r12 == pc of trampoline's first instruction + PC bias |
8972963c A |
29 | lr == original return address |
30 | */ | |
31 | ||
8972963c | 32 | mov r2, r1 // _cmd = self |
8972963c | 33 | |
8070259c A |
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 r1, [r12, #-4] // self = block object | |
38 | ldr pc, [r1, #12] // tail call block->invoke | |
8972963c A |
39 | // not reached |
40 | ||
8070259c A |
41 | // Align trampolines to 8 bytes |
42 | .align 3 | |
43 | ||
8972963c | 44 | .macro TrampolineEntry |
8070259c | 45 | mov r12, pc |
8972963c | 46 | b __a2a3_tramphead |
8070259c A |
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 | |
8972963c A |
92 | .endmacro |
93 | ||
8972963c A |
94 | .private_extern __a2a3_firsttramp |
95 | __a2a3_firsttramp: | |
8070259c A |
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 | |
8972963c | 139 | |
8070259c A |
140 | TrampolineEntry |
141 | TrampolineEntry | |
142 | // TrampolineEntry | |
143 | // TrampolineEntry | |
8972963c A |
144 | |
145 | .private_extern __a2a3_trampend | |
146 | __a2a3_trampend: | |
147 | ||
148 | #endif |