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