17ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany.section .text
27ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
3f5d526fc35524db0479828188e47c130ac09a038Dmitry Vyukov.hidden __tsan_trace_switch
47ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany.globl __tsan_trace_switch_thunk
57ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_trace_switch_thunk:
641e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_startproc
77ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  # Save scratch registers.
87ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rax
941e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
1041e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rax, 0
117ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rcx
1241e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
1341e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rcx, 0
147ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rdx
1541e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
1641e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rdx, 0
177ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rsi
1841e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
1941e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rsi, 0
207ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rdi
2141e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
2241e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rdi, 0
237ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %r8
2441e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
2541e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %r8, 0
267ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %r9
2741e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
2841e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %r9, 0
297ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %r10
3041e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
3141e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %r10, 0
327ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %r11
3341e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
3441e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %r11, 0
357ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  # Align stack frame.
367ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rbx  # non-scratch
3741e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
3841e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rbx, 0
397ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  mov %rsp, %rbx  # save current rsp
4041e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_def_cfa_register %rbx
417ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  shr $4, %rsp  # clear 4 lsb, align to 16
427ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  shl $4, %rsp
437ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
447ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  call __tsan_trace_switch
457ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
467ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  # Unalign stack frame back.
477ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  mov %rbx, %rsp  # restore the original rsp
4841e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_def_cfa_register %rsp
497ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rbx
5041e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
517ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  # Restore scratch registers.
527ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %r11
5341e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
547ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %r10
5541e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
567ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %r9
5741e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
587ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %r8
5941e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
607ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rdi
6141e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
627ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rsi
6341e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
647ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rdx
6541e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
667ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rcx
6741e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
687ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rax
6941e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
7041e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rax
7141e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rbx
7241e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rcx
7341e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rdx
7441e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rsi
7541e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rdi
7641e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %r8
7741e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %r9
7841e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %r10
7941e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %r11
807ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  ret
8141e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_endproc
827ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
83f5d526fc35524db0479828188e47c130ac09a038Dmitry Vyukov.hidden __tsan_report_race
847ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany.globl __tsan_report_race_thunk
857ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_report_race_thunk:
8641e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_startproc
877ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  # Save scratch registers.
887ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rax
8941e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
9041e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rax, 0
917ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rcx
9241e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
9341e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rcx, 0
947ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rdx
9541e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
9641e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rdx, 0
977ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rsi
9841e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
9941e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rsi, 0
1007ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rdi
10141e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
10241e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rdi, 0
1037ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %r8
10441e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
10541e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %r8, 0
1067ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %r9
10741e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
10841e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %r9, 0
1097ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %r10
11041e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
11141e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %r10, 0
1127ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %r11
11341e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
11441e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %r11, 0
1157ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  # Align stack frame.
1167ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  push %rbx  # non-scratch
11741e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset 8
11841e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_rel_offset %rbx, 0
1197ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  mov %rsp, %rbx  # save current rsp
12041e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_def_cfa_register %rbx
1217ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  shr $4, %rsp  # clear 4 lsb, align to 16
1227ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  shl $4, %rsp
1237ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
1247ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  call __tsan_report_race
1257ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
1267ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  # Unalign stack frame back.
1277ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  mov %rbx, %rsp  # restore the original rsp
12841e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_def_cfa_register %rsp
1297ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rbx
13041e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
1317ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  # Restore scratch registers.
1327ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %r11
13341e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
1347ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %r10
13541e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
1367ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %r9
13741e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
1387ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %r8
13941e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
1407ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rdi
14141e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
1427ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rsi
14341e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
1447ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rdx
14541e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
1467ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rcx
14741e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
1487ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  pop %rax
14941e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_adjust_cfa_offset -8
15041e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rax
15141e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rbx
15241e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rcx
15341e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rdx
15441e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rsi
15541e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %rdi
15641e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %r8
15741e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %r9
15841e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %r10
15941e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_restore %r11
1607ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  ret
16141e8153c4a29b28bc7c80d35bc1d43438acdd4e7Dmitry Vyukov  .cfi_endproc
162a911c6f1d0c6f8b7e175bd36e7044d79cdcf5153Dmitry Vyukov
1638b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.hidden __tsan_setjmp
1648b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.comm _ZN14__interception11real_setjmpE,8,8
1658b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.globl setjmp
1668b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.type setjmp, @function
1678b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukovsetjmp:
1688b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_startproc
1698b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // save env parameter
1708b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  push %rdi
1718b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset 8
1728b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_rel_offset %rdi, 0
1738b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // obtain %rsp
1748b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  lea 16(%rsp), %rdi
1758b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  mov %rdi, %rsi
1768b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
1778b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  rol $0x11, %rsi
1788b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // call tsan interceptor
1798b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  call __tsan_setjmp
1808b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // restore env parameter
1818b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  pop %rdi
1828b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset -8
1838b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_restore %rdi
1848b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // tail jump to libc setjmp
1858b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  movl $0, %eax
1868b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
1878b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  jmp *(%rdx)
1888b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_endproc
1898b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.size setjmp, .-setjmp
1908b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov
1918b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.comm _ZN14__interception12real__setjmpE,8,8
1928b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.globl _setjmp
1938b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.type _setjmp, @function
1948b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov_setjmp:
1958b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_startproc
1968b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // save env parameter
1978b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  push %rdi
1988b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset 8
1998b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_rel_offset %rdi, 0
2008b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // obtain %rsp
2018b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  lea 16(%rsp), %rdi
2028b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  mov %rdi, %rsi
2038b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
2048b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  rol $0x11, %rsi
2058b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // call tsan interceptor
2068b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  call __tsan_setjmp
2078b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // restore env parameter
2088b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  pop %rdi
2098b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset -8
2108b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_restore %rdi
2118b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // tail jump to libc setjmp
2128b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  movl $0, %eax
2138b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
2148b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  jmp *(%rdx)
2158b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_endproc
2168b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.size _setjmp, .-_setjmp
2178b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov
2188b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.comm _ZN14__interception14real_sigsetjmpE,8,8
2198b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.globl sigsetjmp
2208b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.type sigsetjmp, @function
2218b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukovsigsetjmp:
2228b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_startproc
2238b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // save env parameter
2248b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  push %rdi
2258b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset 8
2268b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_rel_offset %rdi, 0
2278b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // save savesigs parameter
2288b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  push %rsi
2298b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset 8
2308b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_rel_offset %rsi, 0
2318b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // align stack frame
2328b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  sub $8, %rsp
2338b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset 8
2348b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // obtain %rsp
2358b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  lea 32(%rsp), %rdi
2368b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  mov %rdi, %rsi
2378b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
2388b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  rol $0x11, %rsi
2398b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // call tsan interceptor
2408b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  call __tsan_setjmp
2418b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // unalign stack frame
2428b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  add $8, %rsp
2438b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset -8
2448b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // restore savesigs parameter
2458b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  pop %rsi
2468b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset -8
2478b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_restore %rsi
2488b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // restore env parameter
2498b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  pop %rdi
2508b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset -8
2518b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_restore %rdi
2528b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // tail jump to libc sigsetjmp
2538b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  movl $0, %eax
2548b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
2558b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  jmp *(%rdx)
2568b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_endproc
2578b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.size sigsetjmp, .-sigsetjmp
2588b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov
2598b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.comm _ZN14__interception16real___sigsetjmpE,8,8
2608b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.globl __sigsetjmp
2618b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.type __sigsetjmp, @function
2628b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov__sigsetjmp:
2638b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_startproc
2648b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // save env parameter
2658b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  push %rdi
2668b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset 8
2678b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_rel_offset %rdi, 0
2688b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // save savesigs parameter
2698b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  push %rsi
2708b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset 8
2718b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_rel_offset %rsi, 0
2728b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // align stack frame
2738b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  sub $8, %rsp
2748b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset 8
2758b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // obtain %rsp
2768b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  lea 32(%rsp), %rdi
2778b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  mov %rdi, %rsi
2788b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
2798b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  rol $0x11, %rsi
2808b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // call tsan interceptor
2818b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  call __tsan_setjmp
2828b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // unalign stack frame
2838b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  add $8, %rsp
2848b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset -8
2858b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // restore savesigs parameter
2868b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  pop %rsi
2878b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset -8
2888b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_restore %rsi
2898b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // restore env parameter
2908b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  pop %rdi
2918b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_adjust_cfa_offset -8
2928b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_restore %rdi
2938b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  // tail jump to libc sigsetjmp
2948b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  movl $0, %eax
2958b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
2968b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  jmp *(%rdx)
2978b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  .cfi_endproc
2988b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.size __sigsetjmp, .-__sigsetjmp
2998b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov
300a911c6f1d0c6f8b7e175bd36e7044d79cdcf5153Dmitry Vyukov#ifdef __linux__
301a911c6f1d0c6f8b7e175bd36e7044d79cdcf5153Dmitry Vyukov/* We do not need executable stack.  */
302a911c6f1d0c6f8b7e175bd36e7044d79cdcf5153Dmitry Vyukov.section        .note.GNU-stack,"",@progbits
303a911c6f1d0c6f8b7e175bd36e7044d79cdcf5153Dmitry Vyukov#endif
304