213 lines · plain
1// The content of this file is x86_64-only:2#if defined(__x86_64__)3 4#include "sanitizer_common/sanitizer_asm.h"5 6.att_syntax7 8#if !defined(__APPLE__)9.section .text10#else11.section __TEXT,__text12#endif13 14ASM_HIDDEN(__tsan_setjmp)15#if defined(__NetBSD__)16.comm _ZN14__interception15real___setjmp14E,8,817#elif !defined(__APPLE__)18.comm _ZN14__interception11real_setjmpE,8,819#endif20#if defined(__NetBSD__)21.globl ASM_SYMBOL_INTERCEPTOR(__setjmp14)22ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__setjmp14))23ASM_SYMBOL_INTERCEPTOR(__setjmp14):24#else25.globl ASM_SYMBOL_INTERCEPTOR(setjmp)26ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))27ASM_SYMBOL_INTERCEPTOR(setjmp):28#endif29 CFI_STARTPROC30 _CET_ENDBR31 // save env parameter32 push %rdi33 CFI_ADJUST_CFA_OFFSET(8)34 CFI_REL_OFFSET(%rdi, 0)35 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`36#if defined(__FreeBSD__) || defined(__NetBSD__)37 lea 8(%rsp), %rdi38#elif defined(__linux__) || defined(__APPLE__)39 lea 16(%rsp), %rdi40#else41# error "Unknown platform"42#endif43 // call tsan interceptor44 call ASM_SYMBOL(__tsan_setjmp)45 // restore env parameter46 pop %rdi47 CFI_ADJUST_CFA_OFFSET(-8)48 CFI_RESTORE(%rdi)49 // tail jump to libc setjmp50 movl $0, %eax51#if defined(__NetBSD__)52 movq _ZN14__interception15real___setjmp14E@GOTPCREL(%rip), %rdx53 jmp *(%rdx)54#elif !defined(__APPLE__)55 movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx56 jmp *(%rdx)57#else58 jmp ASM_SYMBOL(setjmp)59#endif60 CFI_ENDPROC61#if defined(__NetBSD__)62ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__setjmp14))63#else64ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))65#endif66 67.comm _ZN14__interception12real__setjmpE,8,868.globl ASM_SYMBOL_INTERCEPTOR(_setjmp)69ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))70ASM_SYMBOL_INTERCEPTOR(_setjmp):71 CFI_STARTPROC72 _CET_ENDBR73 // save env parameter74 push %rdi75 CFI_ADJUST_CFA_OFFSET(8)76 CFI_REL_OFFSET(%rdi, 0)77 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`78#if defined(__FreeBSD__) || defined(__NetBSD__)79 lea 8(%rsp), %rdi80#elif defined(__linux__) || defined(__APPLE__)81 lea 16(%rsp), %rdi82#else83# error "Unknown platform"84#endif85 // call tsan interceptor86 call ASM_SYMBOL(__tsan_setjmp)87 // restore env parameter88 pop %rdi89 CFI_ADJUST_CFA_OFFSET(-8)90 CFI_RESTORE(%rdi)91 // tail jump to libc setjmp92 movl $0, %eax93#if !defined(__APPLE__)94 movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx95 jmp *(%rdx)96#else97 jmp ASM_SYMBOL(_setjmp)98#endif99 CFI_ENDPROC100ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))101 102#if defined(__NetBSD__)103.comm _ZN14__interception18real___sigsetjmp14E,8,8104.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14)105ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))106ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14):107#else108.comm _ZN14__interception14real_sigsetjmpE,8,8109.globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)110ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))111ASM_SYMBOL_INTERCEPTOR(sigsetjmp):112#endif113 CFI_STARTPROC114 _CET_ENDBR115 // save env parameter116 push %rdi117 CFI_ADJUST_CFA_OFFSET(8)118 CFI_REL_OFFSET(%rdi, 0)119 // save savesigs parameter120 push %rsi121 CFI_ADJUST_CFA_OFFSET(8)122 CFI_REL_OFFSET(%rsi, 0)123 // align stack frame124 sub $8, %rsp125 CFI_ADJUST_CFA_OFFSET(8)126 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`127#if defined(__FreeBSD__) || defined(__NetBSD__)128 lea 24(%rsp), %rdi129#elif defined(__linux__) || defined(__APPLE__)130 lea 32(%rsp), %rdi131#else132# error "Unknown platform"133#endif134 // call tsan interceptor135 call ASM_SYMBOL(__tsan_setjmp)136 // unalign stack frame137 add $8, %rsp138 CFI_ADJUST_CFA_OFFSET(-8)139 // restore savesigs parameter140 pop %rsi141 CFI_ADJUST_CFA_OFFSET(-8)142 CFI_RESTORE(%rsi)143 // restore env parameter144 pop %rdi145 CFI_ADJUST_CFA_OFFSET(-8)146 CFI_RESTORE(%rdi)147 // tail jump to libc sigsetjmp148 movl $0, %eax149#if defined(__NetBSD__)150 movq _ZN14__interception18real___sigsetjmp14E@GOTPCREL(%rip), %rdx151 jmp *(%rdx)152#elif !defined(__APPLE__)153 movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx154 jmp *(%rdx)155#else156 jmp ASM_SYMBOL(sigsetjmp)157#endif158 CFI_ENDPROC159#if defined(__NetBSD__)160ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))161#else162ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))163#endif164 165#if !defined(__APPLE__) && !defined(__NetBSD__)166.comm _ZN14__interception16real___sigsetjmpE,8,8167.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)168ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))169ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):170 CFI_STARTPROC171 _CET_ENDBR172 // save env parameter173 push %rdi174 CFI_ADJUST_CFA_OFFSET(8)175 CFI_REL_OFFSET(%rdi, 0)176 // save savesigs parameter177 push %rsi178 CFI_ADJUST_CFA_OFFSET(8)179 CFI_REL_OFFSET(%rsi, 0)180 // align stack frame181 sub $8, %rsp182 CFI_ADJUST_CFA_OFFSET(8)183 // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`184#if defined(__FreeBSD__)185 lea 24(%rsp), %rdi186#else187 lea 32(%rsp), %rdi188#endif189 // call tsan interceptor190 call ASM_SYMBOL(__tsan_setjmp)191 // unalign stack frame192 add $8, %rsp193 CFI_ADJUST_CFA_OFFSET(-8)194 // restore savesigs parameter195 pop %rsi196 CFI_ADJUST_CFA_OFFSET(-8)197 CFI_RESTORE(%rsi)198 // restore env parameter199 pop %rdi200 CFI_ADJUST_CFA_OFFSET(-8)201 CFI_RESTORE(%rdi)202 // tail jump to libc sigsetjmp203 movl $0, %eax204 movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx205 jmp *(%rdx)206 CFI_ENDPROC207ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))208#endif // !defined(__APPLE__) && !defined(__NetBSD__)209 210NO_EXEC_STACK_DIRECTIVE211 212#endif213