#include "sanitizer_common/sanitizer_asm.h" .hidden __tsan_trace_switch .globl __tsan_trace_switch_thunk __tsan_trace_switch_thunk: CFI_STARTPROC # Save scratch registers. push %rax CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rax, 0) push %rcx CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rcx, 0) push %rdx CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rdx, 0) push %rsi CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rsi, 0) push %rdi CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rdi, 0) push %r8 CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%r8, 0) push %r9 CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%r9, 0) push %r10 CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%r10, 0) push %r11 CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%r11, 0) # Align stack frame. push %rbx # non-scratch CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rbx, 0) mov %rsp, %rbx # save current rsp CFI_DEF_CFA_REGISTER(%rbx) shr $4, %rsp # clear 4 lsb, align to 16 shl $4, %rsp call __tsan_trace_switch # Unalign stack frame back. mov %rbx, %rsp # restore the original rsp CFI_DEF_CFA_REGISTER(%rsp) pop %rbx CFI_ADJUST_CFA_OFFSET(-8) # Restore scratch registers. pop %r11 CFI_ADJUST_CFA_OFFSET(-8) pop %r10 CFI_ADJUST_CFA_OFFSET(-8) pop %r9 CFI_ADJUST_CFA_OFFSET(-8) pop %r8 CFI_ADJUST_CFA_OFFSET(-8) pop %rdi CFI_ADJUST_CFA_OFFSET(-8) pop %rsi CFI_ADJUST_CFA_OFFSET(-8) pop %rdx CFI_ADJUST_CFA_OFFSET(-8) pop %rcx CFI_ADJUST_CFA_OFFSET(-8) pop %rax CFI_ADJUST_CFA_OFFSET(-8) CFI_RESTORE(%rax) CFI_RESTORE(%rbx) CFI_RESTORE(%rcx) CFI_RESTORE(%rdx) CFI_RESTORE(%rsi) CFI_RESTORE(%rdi) CFI_RESTORE(%r8) CFI_RESTORE(%r9) CFI_RESTORE(%r10) CFI_RESTORE(%r11) ret CFI_ENDPROC .hidden __tsan_report_race .globl __tsan_report_race_thunk __tsan_report_race_thunk: CFI_STARTPROC # Save scratch registers. push %rax CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rax, 0) push %rcx CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rcx, 0) push %rdx CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rdx, 0) push %rsi CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rsi, 0) push %rdi CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rdi, 0) push %r8 CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%r8, 0) push %r9 CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%r9, 0) push %r10 CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%r10, 0) push %r11 CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%r11, 0) # Align stack frame. push %rbx # non-scratch CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rbx, 0) mov %rsp, %rbx # save current rsp CFI_DEF_CFA_REGISTER(%rbx) shr $4, %rsp # clear 4 lsb, align to 16 shl $4, %rsp call __tsan_report_race # Unalign stack frame back. mov %rbx, %rsp # restore the original rsp CFI_DEF_CFA_REGISTER(%rsp) pop %rbx CFI_ADJUST_CFA_OFFSET(-8) # Restore scratch registers. pop %r11 CFI_ADJUST_CFA_OFFSET(-8) pop %r10 CFI_ADJUST_CFA_OFFSET(-8) pop %r9 CFI_ADJUST_CFA_OFFSET(-8) pop %r8 CFI_ADJUST_CFA_OFFSET(-8) pop %rdi CFI_ADJUST_CFA_OFFSET(-8) pop %rsi CFI_ADJUST_CFA_OFFSET(-8) pop %rdx CFI_ADJUST_CFA_OFFSET(-8) pop %rcx CFI_ADJUST_CFA_OFFSET(-8) pop %rax CFI_ADJUST_CFA_OFFSET(-8) CFI_RESTORE(%rax) CFI_RESTORE(%rbx) CFI_RESTORE(%rcx) CFI_RESTORE(%rdx) CFI_RESTORE(%rsi) CFI_RESTORE(%rdi) CFI_RESTORE(%r8) CFI_RESTORE(%r9) CFI_RESTORE(%r10) CFI_RESTORE(%r11) ret CFI_ENDPROC .hidden __tsan_setjmp .comm _ZN14__interception11real_setjmpE,8,8 .globl setjmp .type setjmp, @function setjmp: CFI_STARTPROC // save env parameter push %rdi CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rdi, 0) // obtain %rsp lea 16(%rsp), %rdi mov %rdi, %rsi xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) rol $0x11, %rsi // call tsan interceptor call __tsan_setjmp // restore env parameter pop %rdi CFI_ADJUST_CFA_OFFSET(-8) CFI_RESTORE(%rdi) // tail jump to libc setjmp movl $0, %eax movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx jmp *(%rdx) CFI_ENDPROC .size setjmp, .-setjmp .comm _ZN14__interception12real__setjmpE,8,8 .globl _setjmp .type _setjmp, @function _setjmp: CFI_STARTPROC // save env parameter push %rdi CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rdi, 0) // obtain %rsp lea 16(%rsp), %rdi mov %rdi, %rsi xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) rol $0x11, %rsi // call tsan interceptor call __tsan_setjmp // restore env parameter pop %rdi CFI_ADJUST_CFA_OFFSET(-8) CFI_RESTORE(%rdi) // tail jump to libc setjmp movl $0, %eax movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx jmp *(%rdx) CFI_ENDPROC .size _setjmp, .-_setjmp .comm _ZN14__interception14real_sigsetjmpE,8,8 .globl sigsetjmp .type sigsetjmp, @function sigsetjmp: CFI_STARTPROC // save env parameter push %rdi CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rdi, 0) // save savesigs parameter push %rsi CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rsi, 0) // align stack frame sub $8, %rsp CFI_ADJUST_CFA_OFFSET(8) // obtain %rsp lea 32(%rsp), %rdi mov %rdi, %rsi xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) rol $0x11, %rsi // call tsan interceptor call __tsan_setjmp // unalign stack frame add $8, %rsp CFI_ADJUST_CFA_OFFSET(-8) // restore savesigs parameter pop %rsi CFI_ADJUST_CFA_OFFSET(-8) CFI_RESTORE(%rsi) // restore env parameter pop %rdi CFI_ADJUST_CFA_OFFSET(-8) CFI_RESTORE(%rdi) // tail jump to libc sigsetjmp movl $0, %eax movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx jmp *(%rdx) CFI_ENDPROC .size sigsetjmp, .-sigsetjmp .comm _ZN14__interception16real___sigsetjmpE,8,8 .globl __sigsetjmp .type __sigsetjmp, @function __sigsetjmp: CFI_STARTPROC // save env parameter push %rdi CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rdi, 0) // save savesigs parameter push %rsi CFI_ADJUST_CFA_OFFSET(8) CFI_REL_OFFSET(%rsi, 0) // align stack frame sub $8, %rsp CFI_ADJUST_CFA_OFFSET(8) // obtain %rsp lea 32(%rsp), %rdi mov %rdi, %rsi xor %fs:0x30, %rsi // magic mangling of rsp (see libc setjmp) rol $0x11, %rsi // call tsan interceptor call __tsan_setjmp // unalign stack frame add $8, %rsp CFI_ADJUST_CFA_OFFSET(-8) // restore savesigs parameter pop %rsi CFI_ADJUST_CFA_OFFSET(-8) CFI_RESTORE(%rsi) // restore env parameter pop %rdi CFI_ADJUST_CFA_OFFSET(-8) CFI_RESTORE(%rdi) // tail jump to libc sigsetjmp movl $0, %eax movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx jmp *(%rdx) CFI_ENDPROC .size __sigsetjmp, .-__sigsetjmp #ifdef __linux__ /* We do not need executable stack. */ .section .note.GNU-stack,"",@progbits #endif