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