master
  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#if !defined(__APPLE__)
  7.section .text
  8#else
  9.section __TEXT,__text
 10#endif
 11
 12ASM_HIDDEN(__tsan_setjmp)
 13#if defined(__NetBSD__)
 14.comm _ZN14__interception15real___setjmp14E,8,8
 15#elif !defined(__APPLE__)
 16.comm _ZN14__interception11real_setjmpE,8,8
 17#endif
 18#if defined(__NetBSD__)
 19.globl ASM_SYMBOL_INTERCEPTOR(__setjmp14)
 20ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__setjmp14))
 21ASM_SYMBOL_INTERCEPTOR(__setjmp14):
 22#else
 23.globl ASM_SYMBOL_INTERCEPTOR(setjmp)
 24ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
 25ASM_SYMBOL_INTERCEPTOR(setjmp):
 26#endif
 27  CFI_STARTPROC
 28  _CET_ENDBR
 29  // save env parameter
 30  push %rdi
 31  CFI_ADJUST_CFA_OFFSET(8)
 32  CFI_REL_OFFSET(%rdi, 0)
 33  // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
 34#if defined(__FreeBSD__) || defined(__NetBSD__)
 35  lea 8(%rsp), %rdi
 36#elif defined(__linux__) || defined(__APPLE__)
 37  lea 16(%rsp), %rdi
 38#else
 39# error "Unknown platform"
 40#endif
 41  // call tsan interceptor
 42  call ASM_SYMBOL(__tsan_setjmp)
 43  // restore env parameter
 44  pop %rdi
 45  CFI_ADJUST_CFA_OFFSET(-8)
 46  CFI_RESTORE(%rdi)
 47  // tail jump to libc setjmp
 48  movl $0, %eax
 49#if defined(__NetBSD__)
 50  movq _ZN14__interception15real___setjmp14E@GOTPCREL(%rip), %rdx
 51  jmp *(%rdx)
 52#elif !defined(__APPLE__)
 53  movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
 54  jmp *(%rdx)
 55#else
 56  jmp ASM_SYMBOL(setjmp)
 57#endif
 58  CFI_ENDPROC
 59#if defined(__NetBSD__)
 60ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__setjmp14))
 61#else
 62ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))
 63#endif
 64
 65.comm _ZN14__interception12real__setjmpE,8,8
 66.globl ASM_SYMBOL_INTERCEPTOR(_setjmp)
 67ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))
 68ASM_SYMBOL_INTERCEPTOR(_setjmp):
 69  CFI_STARTPROC
 70  _CET_ENDBR
 71  // save env parameter
 72  push %rdi
 73  CFI_ADJUST_CFA_OFFSET(8)
 74  CFI_REL_OFFSET(%rdi, 0)
 75  // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
 76#if defined(__FreeBSD__) || defined(__NetBSD__)
 77  lea 8(%rsp), %rdi
 78#elif defined(__linux__) || defined(__APPLE__)
 79  lea 16(%rsp), %rdi
 80#else
 81# error "Unknown platform"
 82#endif
 83  // call tsan interceptor
 84  call ASM_SYMBOL(__tsan_setjmp)
 85  // restore env parameter
 86  pop %rdi
 87  CFI_ADJUST_CFA_OFFSET(-8)
 88  CFI_RESTORE(%rdi)
 89  // tail jump to libc setjmp
 90  movl $0, %eax
 91#if !defined(__APPLE__)
 92  movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
 93  jmp *(%rdx)
 94#else
 95  jmp ASM_SYMBOL(_setjmp)
 96#endif
 97  CFI_ENDPROC
 98ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
 99
100#if defined(__NetBSD__)
101.comm _ZN14__interception18real___sigsetjmp14E,8,8
102.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14)
103ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))
104ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14):
105#else
106.comm _ZN14__interception14real_sigsetjmpE,8,8
107.globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)
108ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
109ASM_SYMBOL_INTERCEPTOR(sigsetjmp):
110#endif
111  CFI_STARTPROC
112  _CET_ENDBR
113  // save env parameter
114  push %rdi
115  CFI_ADJUST_CFA_OFFSET(8)
116  CFI_REL_OFFSET(%rdi, 0)
117  // save savesigs parameter
118  push %rsi
119  CFI_ADJUST_CFA_OFFSET(8)
120  CFI_REL_OFFSET(%rsi, 0)
121  // align stack frame
122  sub $8, %rsp
123  CFI_ADJUST_CFA_OFFSET(8)
124  // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
125#if defined(__FreeBSD__) || defined(__NetBSD__)
126  lea 24(%rsp), %rdi
127#elif defined(__linux__) || defined(__APPLE__)
128  lea 32(%rsp), %rdi
129#else
130# error "Unknown platform"
131#endif
132  // call tsan interceptor
133  call ASM_SYMBOL(__tsan_setjmp)
134  // unalign stack frame
135  add $8, %rsp
136  CFI_ADJUST_CFA_OFFSET(-8)
137  // restore savesigs parameter
138  pop %rsi
139  CFI_ADJUST_CFA_OFFSET(-8)
140  CFI_RESTORE(%rsi)
141  // restore env parameter
142  pop %rdi
143  CFI_ADJUST_CFA_OFFSET(-8)
144  CFI_RESTORE(%rdi)
145  // tail jump to libc sigsetjmp
146  movl $0, %eax
147#if defined(__NetBSD__)
148  movq _ZN14__interception18real___sigsetjmp14E@GOTPCREL(%rip), %rdx
149  jmp *(%rdx)
150#elif !defined(__APPLE__)
151  movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
152  jmp *(%rdx)
153#else
154  jmp ASM_SYMBOL(sigsetjmp)
155#endif
156  CFI_ENDPROC
157#if defined(__NetBSD__)
158ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))
159#else
160ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
161#endif
162
163#if !defined(__APPLE__) && !defined(__NetBSD__)
164.comm _ZN14__interception16real___sigsetjmpE,8,8
165.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)
166ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
167ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
168  CFI_STARTPROC
169  _CET_ENDBR
170  // save env parameter
171  push %rdi
172  CFI_ADJUST_CFA_OFFSET(8)
173  CFI_REL_OFFSET(%rdi, 0)
174  // save savesigs parameter
175  push %rsi
176  CFI_ADJUST_CFA_OFFSET(8)
177  CFI_REL_OFFSET(%rsi, 0)
178  // align stack frame
179  sub $8, %rsp
180  CFI_ADJUST_CFA_OFFSET(8)
181  // obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`
182#if defined(__FreeBSD__)
183  lea 24(%rsp), %rdi
184#else
185  lea 32(%rsp), %rdi
186#endif
187  // call tsan interceptor
188  call ASM_SYMBOL(__tsan_setjmp)
189  // unalign stack frame
190  add $8, %rsp
191  CFI_ADJUST_CFA_OFFSET(-8)
192  // restore savesigs parameter
193  pop %rsi
194  CFI_ADJUST_CFA_OFFSET(-8)
195  CFI_RESTORE(%rsi)
196  // restore env parameter
197  pop %rdi
198  CFI_ADJUST_CFA_OFFSET(-8)
199  CFI_RESTORE(%rdi)
200  // tail jump to libc sigsetjmp
201  movl $0, %eax
202  movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
203  jmp *(%rdx)
204  CFI_ENDPROC
205ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
206#endif  // !defined(__APPLE__) && !defined(__NetBSD__)
207
208NO_EXEC_STACK_DIRECTIVE
209
210#endif