xref: /freebsd/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_rtl_amd64.S (revision 2e3507c25e42292b45a5482e116d278f5515d04d)
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
211