12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_common/sanitizer_asm.h" 27ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany.section .text 37ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 4f5d526fc35524db0479828188e47c130ac09a038Dmitry Vyukov.hidden __tsan_trace_switch 57ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany.globl __tsan_trace_switch_thunk 67ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_trace_switch_thunk: 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_STARTPROC 87ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany # Save scratch registers. 97ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rax 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rax, 0) 127ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rcx 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rcx, 0) 157ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rdx 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rdx, 0) 187ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rsi 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rsi, 0) 217ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rdi 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rdi, 0) 247ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %r8 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%r8, 0) 277ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %r9 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%r9, 0) 307ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %r10 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%r10, 0) 337ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %r11 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%r11, 0) 367ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany # Align stack frame. 377ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rbx # non-scratch 382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rbx, 0) 407ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany mov %rsp, %rbx # save current rsp 412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_DEF_CFA_REGISTER(%rbx) 427ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany shr $4, %rsp # clear 4 lsb, align to 16 437ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany shl $4, %rsp 447ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 457ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany call __tsan_trace_switch 467ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 477ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany # Unalign stack frame back. 487ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany mov %rbx, %rsp # restore the original rsp 492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_DEF_CFA_REGISTER(%rsp) 507ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rbx 512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 527ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany # Restore scratch registers. 537ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %r11 542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 557ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %r10 562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 577ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %r9 582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 597ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %r8 602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 617ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rdi 622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 637ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rsi 642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 657ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rdx 662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 677ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rcx 682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 697ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rax 702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rax) 722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rbx) 732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rcx) 742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rdx) 752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rsi) 762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rdi) 772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%r8) 782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%r9) 792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%r10) 802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%r11) 817ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany ret 822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ENDPROC 837ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 84f5d526fc35524db0479828188e47c130ac09a038Dmitry Vyukov.hidden __tsan_report_race 857ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany.globl __tsan_report_race_thunk 867ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_report_race_thunk: 872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_STARTPROC 887ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany # Save scratch registers. 897ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rax 902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rax, 0) 927ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rcx 932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rcx, 0) 957ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rdx 962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rdx, 0) 987ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rsi 992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 1002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rsi, 0) 1017ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rdi 1022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 1032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rdi, 0) 1047ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %r8 1052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 1062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%r8, 0) 1077ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %r9 1082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 1092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%r9, 0) 1107ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %r10 1112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 1122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%r10, 0) 1137ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %r11 1142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 1152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%r11, 0) 1167ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany # Align stack frame. 1177ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany push %rbx # non-scratch 1182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 1192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rbx, 0) 1207ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany mov %rsp, %rbx # save current rsp 1212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_DEF_CFA_REGISTER(%rbx) 1227ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany shr $4, %rsp # clear 4 lsb, align to 16 1237ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany shl $4, %rsp 1247ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 1257ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany call __tsan_report_race 1267ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 1277ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany # Unalign stack frame back. 1287ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany mov %rbx, %rsp # restore the original rsp 1292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_DEF_CFA_REGISTER(%rsp) 1307ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rbx 1312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 1327ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany # Restore scratch registers. 1337ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %r11 1342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 1357ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %r10 1362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 1377ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %r9 1382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 1397ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %r8 1402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 1417ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rdi 1422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 1437ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rsi 1442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 1457ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rdx 1462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 1477ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rcx 1482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 1497ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany pop %rax 1502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 1512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rax) 1522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rbx) 1532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rcx) 1542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rdx) 1552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rsi) 1562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rdi) 1572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%r8) 1582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%r9) 1592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%r10) 1602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%r11) 1617ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany ret 1622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ENDPROC 163a911c6f1d0c6f8b7e175bd36e7044d79cdcf5153Dmitry Vyukov 1648b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.hidden __tsan_setjmp 1658b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.comm _ZN14__interception11real_setjmpE,8,8 1668b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.globl setjmp 1678b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.type setjmp, @function 1688b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukovsetjmp: 1692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_STARTPROC 1708b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // save env parameter 1718b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov push %rdi 1722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 1732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rdi, 0) 1748b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // obtain %rsp 1758b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov lea 16(%rsp), %rdi 1768b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov mov %rdi, %rsi 1778b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) 1788b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov rol $0x11, %rsi 1798b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // call tsan interceptor 1808b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov call __tsan_setjmp 1818b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // restore env parameter 1828b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov pop %rdi 1832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 1842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rdi) 1858b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // tail jump to libc setjmp 1868b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov movl $0, %eax 1878b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx 1888b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov jmp *(%rdx) 1892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ENDPROC 1908b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.size setjmp, .-setjmp 1918b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov 1928b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.comm _ZN14__interception12real__setjmpE,8,8 1938b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.globl _setjmp 1948b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.type _setjmp, @function 1958b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov_setjmp: 1962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_STARTPROC 1978b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // save env parameter 1988b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov push %rdi 1992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 2002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rdi, 0) 2018b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // obtain %rsp 2028b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov lea 16(%rsp), %rdi 2038b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov mov %rdi, %rsi 2048b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) 2058b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov rol $0x11, %rsi 2068b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // call tsan interceptor 2078b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov call __tsan_setjmp 2088b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // restore env parameter 2098b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov pop %rdi 2102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 2112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rdi) 2128b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // tail jump to libc setjmp 2138b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov movl $0, %eax 2148b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx 2158b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov jmp *(%rdx) 2162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ENDPROC 2178b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.size _setjmp, .-_setjmp 2188b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov 2198b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.comm _ZN14__interception14real_sigsetjmpE,8,8 2208b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.globl sigsetjmp 2218b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.type sigsetjmp, @function 2228b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukovsigsetjmp: 2232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_STARTPROC 2248b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // save env parameter 2258b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov push %rdi 2262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 2272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rdi, 0) 2288b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // save savesigs parameter 2298b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov push %rsi 2302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 2312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rsi, 0) 2328b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // align stack frame 2338b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov sub $8, %rsp 2342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 2358b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // obtain %rsp 2368b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov lea 32(%rsp), %rdi 2378b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov mov %rdi, %rsi 2388b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) 2398b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov rol $0x11, %rsi 2408b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // call tsan interceptor 2418b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov call __tsan_setjmp 2428b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // unalign stack frame 2438b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov add $8, %rsp 2442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 2458b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // restore savesigs parameter 2468b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov pop %rsi 2472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 2482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rsi) 2498b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // restore env parameter 2508b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov pop %rdi 2512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 2522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rdi) 2538b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // tail jump to libc sigsetjmp 2548b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov movl $0, %eax 2558b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx 2568b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov jmp *(%rdx) 2572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ENDPROC 2588b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.size sigsetjmp, .-sigsetjmp 2598b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov 2608b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.comm _ZN14__interception16real___sigsetjmpE,8,8 2618b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.globl __sigsetjmp 2628b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.type __sigsetjmp, @function 2638b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov__sigsetjmp: 2642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_STARTPROC 2658b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // save env parameter 2668b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov push %rdi 2672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 2682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rdi, 0) 2698b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // save savesigs parameter 2708b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov push %rsi 2712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 2722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_REL_OFFSET(%rsi, 0) 2738b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // align stack frame 2748b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov sub $8, %rsp 2752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(8) 2768b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // obtain %rsp 2778b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov lea 32(%rsp), %rdi 2788b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov mov %rdi, %rsi 2798b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) 2808b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov rol $0x11, %rsi 2818b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // call tsan interceptor 2828b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov call __tsan_setjmp 2838b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // unalign stack frame 2848b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov add $8, %rsp 2852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 2868b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // restore savesigs parameter 2878b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov pop %rsi 2882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 2892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rsi) 2908b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // restore env parameter 2918b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov pop %rdi 2922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ADJUST_CFA_OFFSET(-8) 2932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_RESTORE(%rdi) 2948b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov // tail jump to libc sigsetjmp 2958b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov movl $0, %eax 2968b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx 2978b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov jmp *(%rdx) 2982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CFI_ENDPROC 2998b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov.size __sigsetjmp, .-__sigsetjmp 3008b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov 301a911c6f1d0c6f8b7e175bd36e7044d79cdcf5153Dmitry Vyukov#ifdef __linux__ 302a911c6f1d0c6f8b7e175bd36e7044d79cdcf5153Dmitry Vyukov/* We do not need executable stack. */ 303a911c6f1d0c6f8b7e175bd36e7044d79cdcf5153Dmitry Vyukov.section .note.GNU-stack,"",@progbits 304a911c6f1d0c6f8b7e175bd36e7044d79cdcf5153Dmitry Vyukov#endif 305