-
Notifications
You must be signed in to change notification settings - Fork 517
/
Copy pathobjc-blocktramps-arm64.s
146 lines (119 loc) · 2.56 KB
/
objc-blocktramps-arm64.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <TargetConditionals.h>
#if !TARGET_OS_EXCLAVEKIT
#if __arm64__
#include "objc-vm.h"
#include "arm64-asm.h"
// Offset of block->invoke field.
#if __LP64__
// true arm64
# define BLOCK_INVOKE 16
#else
// arm64_32
# define BLOCK_INVOKE 12
#endif
.text
.globl __objc_blockTrampolineImpl
.globl __objc_blockTrampolineStart
.globl __objc_blockTrampolineLast
.align PAGE_MAX_SHIFT
__objc_blockTrampolineImpl:
L_objc_blockTrampolineImpl:
/*
x0 == self
x17 == address of called trampoline's data (2 pages before its code)
lr == original return address
*/
mov x1, x0 // _cmd = self
ldr p0, [x17] // self = block object
add p15, p0, #BLOCK_INVOKE // x15 = &block->invoke
ldr p16, [x15] // x16 = block->invoke
TailCallBlockInvoke x16, x15
// pad up to TrampolineBlockPagePair header size
nop
nop
nop
.macro TrampolineEntry
// load address of trampoline data (two pages before this instruction)
adr x17, -2*PAGE_MAX_SIZE
b L_objc_blockTrampolineImpl
.endmacro
.macro TrampolineEntryX16
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
.endmacro
.macro TrampolineEntryX256
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
.endmacro
.align 3
__objc_blockTrampolineStart:
// 2048-4 trampolines to fill 16K page
TrampolineEntryX256
TrampolineEntryX256
TrampolineEntryX256
TrampolineEntryX256
TrampolineEntryX256
TrampolineEntryX256
TrampolineEntryX256
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntryX16
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
TrampolineEntry
__objc_blockTrampolineLast:
TrampolineEntry
// TrampolineEntry
// TrampolineEntry
// TrampolineEntry
// TrampolineEntry
#endif
#endif // !TARGET_OS_EXCLAVEKIT