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