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