1#include "sanitizer_common/sanitizer_asm.h" 2#if !defined(__APPLE__) 3.section .text 4#else 5.section __TEXT,__text 6#endif 7 8ASM_HIDDEN(__tsan_trace_switch) 9.globl ASM_TSAN_SYMBOL(__tsan_trace_switch_thunk) 10ASM_TSAN_SYMBOL(__tsan_trace_switch_thunk): 11 CFI_STARTPROC 12 # Save scratch registers. 13 push %rax 14 CFI_ADJUST_CFA_OFFSET(8) 15 CFI_REL_OFFSET(%rax, 0) 16 push %rcx 17 CFI_ADJUST_CFA_OFFSET(8) 18 CFI_REL_OFFSET(%rcx, 0) 19 push %rdx 20 CFI_ADJUST_CFA_OFFSET(8) 21 CFI_REL_OFFSET(%rdx, 0) 22 push %rsi 23 CFI_ADJUST_CFA_OFFSET(8) 24 CFI_REL_OFFSET(%rsi, 0) 25 push %rdi 26 CFI_ADJUST_CFA_OFFSET(8) 27 CFI_REL_OFFSET(%rdi, 0) 28 push %r8 29 CFI_ADJUST_CFA_OFFSET(8) 30 CFI_REL_OFFSET(%r8, 0) 31 push %r9 32 CFI_ADJUST_CFA_OFFSET(8) 33 CFI_REL_OFFSET(%r9, 0) 34 push %r10 35 CFI_ADJUST_CFA_OFFSET(8) 36 CFI_REL_OFFSET(%r10, 0) 37 push %r11 38 CFI_ADJUST_CFA_OFFSET(8) 39 CFI_REL_OFFSET(%r11, 0) 40 # Align stack frame. 41 push %rbx # non-scratch 42 CFI_ADJUST_CFA_OFFSET(8) 43 CFI_REL_OFFSET(%rbx, 0) 44 mov %rsp, %rbx # save current rsp 45 CFI_DEF_CFA_REGISTER(%rbx) 46 shr $4, %rsp # clear 4 lsb, align to 16 47 shl $4, %rsp 48 49#ifdef __PIC__ 50 call ASM_TSAN_SYMBOL(__tsan_trace_switch@PLT) 51#else 52 call ASM_TSAN_SYMBOL(__tsan_trace_switch) 53#endif 54 55 # Unalign stack frame back. 56 mov %rbx, %rsp # restore the original rsp 57 CFI_DEF_CFA_REGISTER(%rsp) 58 pop %rbx 59 CFI_ADJUST_CFA_OFFSET(-8) 60 # Restore scratch registers. 61 pop %r11 62 CFI_ADJUST_CFA_OFFSET(-8) 63 pop %r10 64 CFI_ADJUST_CFA_OFFSET(-8) 65 pop %r9 66 CFI_ADJUST_CFA_OFFSET(-8) 67 pop %r8 68 CFI_ADJUST_CFA_OFFSET(-8) 69 pop %rdi 70 CFI_ADJUST_CFA_OFFSET(-8) 71 pop %rsi 72 CFI_ADJUST_CFA_OFFSET(-8) 73 pop %rdx 74 CFI_ADJUST_CFA_OFFSET(-8) 75 pop %rcx 76 CFI_ADJUST_CFA_OFFSET(-8) 77 pop %rax 78 CFI_ADJUST_CFA_OFFSET(-8) 79 CFI_RESTORE(%rax) 80 CFI_RESTORE(%rbx) 81 CFI_RESTORE(%rcx) 82 CFI_RESTORE(%rdx) 83 CFI_RESTORE(%rsi) 84 CFI_RESTORE(%rdi) 85 CFI_RESTORE(%r8) 86 CFI_RESTORE(%r9) 87 CFI_RESTORE(%r10) 88 CFI_RESTORE(%r11) 89 ret 90 CFI_ENDPROC 91 92ASM_HIDDEN(__tsan_report_race) 93.globl ASM_TSAN_SYMBOL(__tsan_report_race_thunk) 94ASM_TSAN_SYMBOL(__tsan_report_race_thunk): 95 CFI_STARTPROC 96 # Save scratch registers. 97 push %rax 98 CFI_ADJUST_CFA_OFFSET(8) 99 CFI_REL_OFFSET(%rax, 0) 100 push %rcx 101 CFI_ADJUST_CFA_OFFSET(8) 102 CFI_REL_OFFSET(%rcx, 0) 103 push %rdx 104 CFI_ADJUST_CFA_OFFSET(8) 105 CFI_REL_OFFSET(%rdx, 0) 106 push %rsi 107 CFI_ADJUST_CFA_OFFSET(8) 108 CFI_REL_OFFSET(%rsi, 0) 109 push %rdi 110 CFI_ADJUST_CFA_OFFSET(8) 111 CFI_REL_OFFSET(%rdi, 0) 112 push %r8 113 CFI_ADJUST_CFA_OFFSET(8) 114 CFI_REL_OFFSET(%r8, 0) 115 push %r9 116 CFI_ADJUST_CFA_OFFSET(8) 117 CFI_REL_OFFSET(%r9, 0) 118 push %r10 119 CFI_ADJUST_CFA_OFFSET(8) 120 CFI_REL_OFFSET(%r10, 0) 121 push %r11 122 CFI_ADJUST_CFA_OFFSET(8) 123 CFI_REL_OFFSET(%r11, 0) 124 # Align stack frame. 125 push %rbx # non-scratch 126 CFI_ADJUST_CFA_OFFSET(8) 127 CFI_REL_OFFSET(%rbx, 0) 128 mov %rsp, %rbx # save current rsp 129 CFI_DEF_CFA_REGISTER(%rbx) 130 shr $4, %rsp # clear 4 lsb, align to 16 131 shl $4, %rsp 132 133#ifdef __PIC__ 134 call ASM_TSAN_SYMBOL(__tsan_report_race@PLT) 135#else 136 call ASM_TSAN_SYMBOL(__tsan_report_race) 137#endif 138 139 # Unalign stack frame back. 140 mov %rbx, %rsp # restore the original rsp 141 CFI_DEF_CFA_REGISTER(%rsp) 142 pop %rbx 143 CFI_ADJUST_CFA_OFFSET(-8) 144 # Restore scratch registers. 145 pop %r11 146 CFI_ADJUST_CFA_OFFSET(-8) 147 pop %r10 148 CFI_ADJUST_CFA_OFFSET(-8) 149 pop %r9 150 CFI_ADJUST_CFA_OFFSET(-8) 151 pop %r8 152 CFI_ADJUST_CFA_OFFSET(-8) 153 pop %rdi 154 CFI_ADJUST_CFA_OFFSET(-8) 155 pop %rsi 156 CFI_ADJUST_CFA_OFFSET(-8) 157 pop %rdx 158 CFI_ADJUST_CFA_OFFSET(-8) 159 pop %rcx 160 CFI_ADJUST_CFA_OFFSET(-8) 161 pop %rax 162 CFI_ADJUST_CFA_OFFSET(-8) 163 CFI_RESTORE(%rax) 164 CFI_RESTORE(%rbx) 165 CFI_RESTORE(%rcx) 166 CFI_RESTORE(%rdx) 167 CFI_RESTORE(%rsi) 168 CFI_RESTORE(%rdi) 169 CFI_RESTORE(%r8) 170 CFI_RESTORE(%r9) 171 CFI_RESTORE(%r10) 172 CFI_RESTORE(%r11) 173 ret 174 CFI_ENDPROC 175 176ASM_HIDDEN(__tsan_setjmp) 177#if !defined(__APPLE__) 178.comm _ZN14__interception11real_setjmpE,8,8 179#endif 180.globl ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp) 181ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp)) 182ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp): 183 CFI_STARTPROC 184 // save env parameter 185 push %rdi 186 CFI_ADJUST_CFA_OFFSET(8) 187 CFI_REL_OFFSET(%rdi, 0) 188 // obtain %rsp 189#if defined(__FreeBSD__) || defined(__NetBSD__) 190 lea 8(%rsp), %rdi 191 mov %rdi, %rsi 192#elif defined(__APPLE__) 193 lea 16(%rsp), %rdi 194 mov %rdi, %rsi 195#elif defined(__linux__) 196 lea 16(%rsp), %rdi 197 mov %rdi, %rsi 198 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) 199 rol $0x11, %rsi 200#else 201# error "Unknown platform" 202#endif 203 // call tsan interceptor 204 call ASM_TSAN_SYMBOL(__tsan_setjmp) 205 // restore env parameter 206 pop %rdi 207 CFI_ADJUST_CFA_OFFSET(-8) 208 CFI_RESTORE(%rdi) 209 // tail jump to libc setjmp 210 movl $0, %eax 211#if !defined(__APPLE__) 212 movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx 213 jmp *(%rdx) 214#else 215 jmp ASM_TSAN_SYMBOL(setjmp) 216#endif 217 CFI_ENDPROC 218ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp)) 219 220.comm _ZN14__interception12real__setjmpE,8,8 221.globl ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp) 222ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp)) 223ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp): 224 CFI_STARTPROC 225 // save env parameter 226 push %rdi 227 CFI_ADJUST_CFA_OFFSET(8) 228 CFI_REL_OFFSET(%rdi, 0) 229 // obtain %rsp 230#if defined(__FreeBSD__) || defined(__NetBSD__) 231 lea 8(%rsp), %rdi 232 mov %rdi, %rsi 233#elif defined(__APPLE__) 234 lea 16(%rsp), %rdi 235 mov %rdi, %rsi 236#elif defined(__linux__) 237 lea 16(%rsp), %rdi 238 mov %rdi, %rsi 239 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) 240 rol $0x11, %rsi 241#else 242# error "Unknown platform" 243#endif 244 // call tsan interceptor 245 call ASM_TSAN_SYMBOL(__tsan_setjmp) 246 // restore env parameter 247 pop %rdi 248 CFI_ADJUST_CFA_OFFSET(-8) 249 CFI_RESTORE(%rdi) 250 // tail jump to libc setjmp 251 movl $0, %eax 252#if !defined(__APPLE__) 253 movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx 254 jmp *(%rdx) 255#else 256 jmp ASM_TSAN_SYMBOL(_setjmp) 257#endif 258 CFI_ENDPROC 259ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp)) 260 261.comm _ZN14__interception14real_sigsetjmpE,8,8 262.globl ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp) 263ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp)) 264ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp): 265 CFI_STARTPROC 266 // save env parameter 267 push %rdi 268 CFI_ADJUST_CFA_OFFSET(8) 269 CFI_REL_OFFSET(%rdi, 0) 270 // save savesigs parameter 271 push %rsi 272 CFI_ADJUST_CFA_OFFSET(8) 273 CFI_REL_OFFSET(%rsi, 0) 274 // align stack frame 275 sub $8, %rsp 276 CFI_ADJUST_CFA_OFFSET(8) 277 // obtain %rsp 278#if defined(__FreeBSD__) || defined(__NetBSD__) 279 lea 24(%rsp), %rdi 280 mov %rdi, %rsi 281#elif defined(__APPLE__) 282 lea 32(%rsp), %rdi 283 mov %rdi, %rsi 284#elif defined(__linux__) 285 lea 32(%rsp), %rdi 286 mov %rdi, %rsi 287 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) 288 rol $0x11, %rsi 289#else 290# error "Unknown platform" 291#endif 292 // call tsan interceptor 293 call ASM_TSAN_SYMBOL(__tsan_setjmp) 294 // unalign stack frame 295 add $8, %rsp 296 CFI_ADJUST_CFA_OFFSET(-8) 297 // restore savesigs parameter 298 pop %rsi 299 CFI_ADJUST_CFA_OFFSET(-8) 300 CFI_RESTORE(%rsi) 301 // restore env parameter 302 pop %rdi 303 CFI_ADJUST_CFA_OFFSET(-8) 304 CFI_RESTORE(%rdi) 305 // tail jump to libc sigsetjmp 306 movl $0, %eax 307#if !defined(__APPLE__) 308 movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx 309 jmp *(%rdx) 310#else 311 jmp ASM_TSAN_SYMBOL(sigsetjmp) 312#endif 313 CFI_ENDPROC 314ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp)) 315 316#if !defined(__APPLE__) 317.comm _ZN14__interception16real___sigsetjmpE,8,8 318.globl ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp) 319ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp)) 320ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp): 321 CFI_STARTPROC 322 // save env parameter 323 push %rdi 324 CFI_ADJUST_CFA_OFFSET(8) 325 CFI_REL_OFFSET(%rdi, 0) 326 // save savesigs parameter 327 push %rsi 328 CFI_ADJUST_CFA_OFFSET(8) 329 CFI_REL_OFFSET(%rsi, 0) 330 // align stack frame 331 sub $8, %rsp 332 CFI_ADJUST_CFA_OFFSET(8) 333 // obtain %rsp 334#if defined(__FreeBSD__) || defined(__NetBSD__) 335 lea 24(%rsp), %rdi 336 mov %rdi, %rsi 337#else 338 lea 32(%rsp), %rdi 339 mov %rdi, %rsi 340 xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) 341 rol $0x11, %rsi 342#endif 343 // call tsan interceptor 344 call ASM_TSAN_SYMBOL(__tsan_setjmp) 345 // unalign stack frame 346 add $8, %rsp 347 CFI_ADJUST_CFA_OFFSET(-8) 348 // restore savesigs parameter 349 pop %rsi 350 CFI_ADJUST_CFA_OFFSET(-8) 351 CFI_RESTORE(%rsi) 352 // restore env parameter 353 pop %rdi 354 CFI_ADJUST_CFA_OFFSET(-8) 355 CFI_RESTORE(%rdi) 356 // tail jump to libc sigsetjmp 357 movl $0, %eax 358 movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx 359 jmp *(%rdx) 360 CFI_ENDPROC 361ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp)) 362#endif // !defined(__APPLE__) 363 364#if defined(__FreeBSD__) || defined(__linux__) || defined(__NetBSD__) 365/* We do not need executable stack. */ 366.section .note.GNU-stack,"",@progbits 367#endif 368