1 | #include "../builtins/assembly.h" |
2 | #include "../sanitizer_common/sanitizer_asm.h" |
3 | |
4 | .macro SAVE_REGISTERS |
5 | stp x1, x2, [sp, #-16]! |
6 | stp x3, x4, [sp, #-16]! |
7 | stp x5, x6, [sp, #-16]! |
8 | stp x7, x30, [sp, #-16]! |
9 | stp q0, q1, [sp, #-32]! |
10 | stp q2, q3, [sp, #-32]! |
11 | stp q4, q5, [sp, #-32]! |
12 | stp q6, q7, [sp, #-32]! |
13 | // x8 is the indirect result register and needs to be preserved for the body of the function to use. |
14 | stp x8, x0, [sp, #-16]! |
15 | .endm |
16 | |
17 | .macro RESTORE_REGISTERS |
18 | ldp x8, x0, [sp], #16 |
19 | ldp q6, q7, [sp], #32 |
20 | ldp q4, q5, [sp], #32 |
21 | ldp q2, q3, [sp], #32 |
22 | ldp q0, q1, [sp], #32 |
23 | ldp x7, x30, [sp], #16 |
24 | ldp x5, x6, [sp], #16 |
25 | ldp x3, x4, [sp], #16 |
26 | ldp x1, x2, [sp], #16 |
27 | .endm |
28 | |
29 | .text |
30 | .p2align 2 |
31 | .global ASM_SYMBOL(__xray_FunctionEntry) |
32 | ASM_HIDDEN(__xray_FunctionEntry) |
33 | ASM_TYPE_FUNCTION(__xray_FunctionEntry) |
34 | ASM_SYMBOL(__xray_FunctionEntry): |
35 | /* Move the return address beyond the end of sled data. The 12 bytes of |
36 | data are inserted in the code of the runtime patch, between the call |
37 | instruction and the instruction returned into. The data contains 32 |
38 | bits of instrumented function ID and 64 bits of the address of |
39 | the current trampoline. */ |
40 | add x30, x30, #12 |
41 | // Push the registers which may be modified by the handler function. |
42 | SAVE_REGISTERS |
43 | |
44 | // Load the handler function pointer. |
45 | adrp x2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) |
46 | ldr x2, [x2, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)] |
47 | cbz x2, 1f |
48 | // Set w0 to the function ID (w17). Set x1 to XRayEntryType::ENTRY = 0. |
49 | mov w0, w17 |
50 | mov x1, #0 |
51 | // Call the handler with 2 parameters. |
52 | blr x2 |
53 | 1: |
54 | RESTORE_REGISTERS |
55 | ret |
56 | ASM_SIZE(__xray_FunctionEntry) |
57 | |
58 | .p2align 2 |
59 | .global ASM_SYMBOL(__xray_FunctionExit) |
60 | ASM_HIDDEN(__xray_FunctionExit) |
61 | ASM_TYPE_FUNCTION(__xray_FunctionExit) |
62 | ASM_SYMBOL(__xray_FunctionExit): |
63 | /* Move the return address beyond the end of sled data. The 12 bytes of |
64 | data are inserted in the code of the runtime patch, between the call |
65 | instruction and the instruction returned into. The data contains 32 |
66 | bits of instrumented function ID and 64 bits of the address of |
67 | the current trampoline. */ |
68 | add x30, x30, #12 |
69 | SAVE_REGISTERS |
70 | |
71 | // Load the handler function pointer into x2. |
72 | adrp x2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) |
73 | ldr x2, [x2, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)] |
74 | cbz x2, 1f |
75 | // Set w0 to the function ID (w17). Set x1 to XRayEntryType::EXIT = 1. |
76 | mov w0, w17 |
77 | mov x1, #1 |
78 | // Call the handler with 2 parameters. |
79 | blr x2 |
80 | 1: |
81 | RESTORE_REGISTERS |
82 | ret |
83 | ASM_SIZE(__xray_FunctionExit) |
84 | |
85 | .p2align 2 |
86 | .global ASM_SYMBOL(__xray_FunctionTailExit) |
87 | ASM_HIDDEN(__xray_FunctionTailExit) |
88 | ASM_TYPE_FUNCTION(__xray_FunctionTailExit) |
89 | ASM_SYMBOL(__xray_FunctionTailExit): |
90 | /* Move the return address beyond the end of sled data. The 12 bytes of |
91 | data are inserted in the code of the runtime patch, between the call |
92 | instruction and the instruction returned into. The data contains 32 |
93 | bits of instrumented function ID and 64 bits of the address of |
94 | the current trampoline. */ |
95 | add x30, x30, #12 |
96 | // Save the registers which may be modified by the handler function. |
97 | SAVE_REGISTERS |
98 | // Load the handler function pointer into x2. |
99 | adrp x2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) |
100 | ldr x2, [x2, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)] |
101 | cbz x2, 1f |
102 | // Set w0 to the function ID (w17). Set x1 to XRayEntryType::TAIL = 2. |
103 | mov w0, w17 |
104 | mov x1, #2 |
105 | // Call the handler with 2 parameters. |
106 | blr x2 |
107 | 1: |
108 | RESTORE_REGISTERS |
109 | ret |
110 | ASM_SIZE(__xray_FunctionTailExit) |
111 | |
112 | .p2align 2 |
113 | .global ASM_SYMBOL(__xray_ArgLoggerEntry) |
114 | ASM_HIDDEN(__xray_ArgLoggerEntry) |
115 | ASM_TYPE_FUNCTION(__xray_ArgLoggerEntry) |
116 | ASM_SYMBOL(__xray_ArgLoggerEntry): |
117 | add x30, x30, #12 |
118 | // Push the registers which may be modified by the handler function. |
119 | SAVE_REGISTERS |
120 | |
121 | adrp x8, ASM_SYMBOL(_ZN6__xray13XRayArgLoggerE) |
122 | ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray13XRayArgLoggerE)] |
123 | cbnz x8, 2f |
124 | |
125 | // Load the handler function pointer. |
126 | adrp x8, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) |
127 | ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)] |
128 | cbz x8, 1f |
129 | |
130 | 2: |
131 | mov x2, x0 |
132 | mov x1, #3 // XRayEntryType::LOG_ARGS_ENTRY |
133 | mov w0, w17 |
134 | blr x8 |
135 | |
136 | 1: |
137 | RESTORE_REGISTERS |
138 | ret |
139 | ASM_SIZE(__xray_ArgLoggerEntry) |
140 | |
141 | // __xray_*Event have default visibility so that they can be referenced by user |
142 | // DSOs that do not link against the runtime. |
143 | .global ASM_SYMBOL(__xray_CustomEvent) |
144 | ASM_TYPE_FUNCTION(__xray_CustomEvent) |
145 | ASM_SYMBOL(__xray_CustomEvent): |
146 | SAVE_REGISTERS |
147 | adrp x8, ASM_SYMBOL(_ZN6__xray22XRayPatchedCustomEventE) |
148 | ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray22XRayPatchedCustomEventE)] |
149 | cbz x8, 1f |
150 | blr x8 |
151 | 1: |
152 | RESTORE_REGISTERS |
153 | ret |
154 | ASM_SIZE(__xray_CustomEvent) |
155 | |
156 | .global ASM_SYMBOL(__xray_TypedEvent) |
157 | ASM_TYPE_FUNCTION(__xray_TypedEvent) |
158 | ASM_SYMBOL(__xray_TypedEvent): |
159 | SAVE_REGISTERS |
160 | adrp x8, ASM_SYMBOL(_ZN6__xray21XRayPatchedTypedEventE) |
161 | ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray21XRayPatchedTypedEventE)] |
162 | cbz x8, 1f |
163 | blr x8 |
164 | 1: |
165 | RESTORE_REGISTERS |
166 | ret |
167 | ASM_SIZE(__xray_TypedEvent) |
168 | |
169 | NO_EXEC_STACK_DIRECTIVE |
170 | |