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