1// The content of this file is AArch64-only: 2#if defined(__aarch64__) 3 4#include "sanitizer_common/sanitizer_asm.h" 5#include "builtins/assembly.h" 6 7#if !defined(__APPLE__) 8.section .text 9#else 10.section __TEXT,__text 11.align 3 12#endif 13 14ASM_HIDDEN(__tsan_setjmp) 15.comm _ZN14__interception11real_setjmpE,8,8 16.globl ASM_SYMBOL_INTERCEPTOR(setjmp) 17ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp)) 18ASM_SYMBOL_INTERCEPTOR(setjmp): 19 CFI_STARTPROC 20 BTI_C 21 22 // Save frame/link register 23 stp x29, x30, [sp, -32]! 24 CFI_DEF_CFA_OFFSET (32) 25 CFI_OFFSET (29, -32) 26 CFI_OFFSET (30, -24) 27 28 // Adjust the SP for previous frame 29 add x29, sp, 0 30 CFI_DEF_CFA_REGISTER (29) 31 32 // Save env parameter 33 str x0, [sp, 16] 34 CFI_OFFSET (0, -16) 35 36 // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` 37 add x0, x29, 32 38 39 // call tsan interceptor 40 bl ASM_SYMBOL(__tsan_setjmp) 41 42 // Restore env parameter 43 ldr x0, [sp, 16] 44 CFI_RESTORE (0) 45 46 // Restore frame/link register 47 ldp x29, x30, [sp], 32 48 CFI_RESTORE (29) 49 CFI_RESTORE (30) 50 CFI_DEF_CFA (31, 0) 51 52 // tail jump to libc setjmp 53#if !defined(__APPLE__) 54 adrp x1, :got:_ZN14__interception11real_setjmpE 55 ldr x1, [x1, #:got_lo12:_ZN14__interception11real_setjmpE] 56 ldr x1, [x1] 57#else 58 adrp x1, _setjmp@GOTPAGE 59 ldr x1, [x1, _setjmp@GOTPAGEOFF] 60#endif 61 br x1 62 63 CFI_ENDPROC 64ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp)) 65 66.comm _ZN14__interception12real__setjmpE,8,8 67.globl ASM_SYMBOL_INTERCEPTOR(_setjmp) 68ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp)) 69ASM_SYMBOL_INTERCEPTOR(_setjmp): 70 CFI_STARTPROC 71 BTI_C 72 73 // Save frame/link register 74 stp x29, x30, [sp, -32]! 75 CFI_DEF_CFA_OFFSET (32) 76 CFI_OFFSET (29, -32) 77 CFI_OFFSET (30, -24) 78 79 // Adjust the SP for previous frame 80 add x29, sp, 0 81 CFI_DEF_CFA_REGISTER (29) 82 83 // Save env parameter 84 str x0, [sp, 16] 85 CFI_OFFSET (0, -16) 86 87 // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` 88 add x0, x29, 32 89 90 // call tsan interceptor 91 bl ASM_SYMBOL(__tsan_setjmp) 92 93 // Restore env parameter 94 ldr x0, [sp, 16] 95 CFI_RESTORE (0) 96 97 // Restore frame/link register 98 ldp x29, x30, [sp], 32 99 CFI_RESTORE (29) 100 CFI_RESTORE (30) 101 CFI_DEF_CFA (31, 0) 102 103 // tail jump to libc setjmp 104#if !defined(__APPLE__) 105 adrp x1, :got:_ZN14__interception12real__setjmpE 106 ldr x1, [x1, #:got_lo12:_ZN14__interception12real__setjmpE] 107 ldr x1, [x1] 108#else 109 adrp x1, __setjmp@GOTPAGE 110 ldr x1, [x1, __setjmp@GOTPAGEOFF] 111#endif 112 br x1 113 114 CFI_ENDPROC 115ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp)) 116 117.comm _ZN14__interception14real_sigsetjmpE,8,8 118.globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp) 119ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) 120ASM_SYMBOL_INTERCEPTOR(sigsetjmp): 121 CFI_STARTPROC 122 BTI_C 123 124 // Save frame/link register 125 stp x29, x30, [sp, -32]! 126 CFI_DEF_CFA_OFFSET (32) 127 CFI_OFFSET (29, -32) 128 CFI_OFFSET (30, -24) 129 130 // Adjust the SP for previous frame 131 add x29, sp, 0 132 CFI_DEF_CFA_REGISTER (29) 133 134 // Save env and savesigs parameter 135 stp x0, x1, [sp, 16] 136 CFI_OFFSET (0, -16) 137 CFI_OFFSET (1, -8) 138 139 // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` 140 add x0, x29, 32 141 142 // call tsan interceptor 143 bl ASM_SYMBOL(__tsan_setjmp) 144 145 // Restore env and savesigs parameter 146 ldp x0, x1, [sp, 16] 147 CFI_RESTORE (0) 148 CFI_RESTORE (1) 149 150 // Restore frame/link register 151 ldp x29, x30, [sp], 32 152 CFI_RESTORE (29) 153 CFI_RESTORE (30) 154 CFI_DEF_CFA (31, 0) 155 156 // tail jump to libc sigsetjmp 157#if !defined(__APPLE__) 158 adrp x2, :got:_ZN14__interception14real_sigsetjmpE 159 ldr x2, [x2, #:got_lo12:_ZN14__interception14real_sigsetjmpE] 160 ldr x2, [x2] 161#else 162 adrp x2, _sigsetjmp@GOTPAGE 163 ldr x2, [x2, _sigsetjmp@GOTPAGEOFF] 164#endif 165 br x2 166 CFI_ENDPROC 167ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) 168 169#if !defined(__APPLE__) 170.comm _ZN14__interception16real___sigsetjmpE,8,8 171.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp) 172ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) 173ASM_SYMBOL_INTERCEPTOR(__sigsetjmp): 174 CFI_STARTPROC 175 BTI_C 176 177 // Save frame/link register 178 stp x29, x30, [sp, -32]! 179 CFI_DEF_CFA_OFFSET (32) 180 CFI_OFFSET (29, -32) 181 CFI_OFFSET (30, -24) 182 183 // Adjust the SP for previous frame 184 add x29, sp, 0 185 CFI_DEF_CFA_REGISTER (29) 186 187 // Save env and savesigs parameter 188 stp x0, x1, [sp, 16] 189 CFI_OFFSET (0, -16) 190 CFI_OFFSET (1, -8) 191 192 // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` 193 add x0, x29, 32 194 195 // call tsan interceptor 196 bl ASM_SYMBOL(__tsan_setjmp) 197 198 // Restore env and savesigs parameter 199 ldp x0, x1, [sp, 16] 200 CFI_RESTORE (0) 201 CFI_RESTORE (1) 202 203 // Restore frame/link register 204 ldp x29, x30, [sp], 32 205 CFI_RESTORE (29) 206 CFI_RESTORE (30) 207 CFI_DEF_CFA (31, 0) 208 209 // tail jump to libc __sigsetjmp 210#if !defined(__APPLE__) 211 adrp x2, :got:_ZN14__interception16real___sigsetjmpE 212 ldr x2, [x2, #:got_lo12:_ZN14__interception16real___sigsetjmpE] 213 ldr x2, [x2] 214#else 215 adrp x2, ASM_SYMBOL(__sigsetjmp)@page 216 add x2, x2, ASM_SYMBOL(__sigsetjmp)@pageoff 217#endif 218 br x2 219 CFI_ENDPROC 220ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) 221#endif 222 223NO_EXEC_STACK_DIRECTIVE 224 225GNU_PROPERTY_BTI_PAC 226 227#endif 228