1 | #include "sanitizer_common/sanitizer_asm.h" |
2 | |
3 | .section .text |
4 | |
5 | ASM_HIDDEN(__tsan_setjmp) |
6 | .comm _ZN14__interception11real_setjmpE,8,8 |
7 | .globl ASM_SYMBOL_INTERCEPTOR(setjmp) |
8 | ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp)) |
9 | ASM_SYMBOL_INTERCEPTOR(setjmp): |
10 | CFI_STARTPROC |
11 | |
12 | // Save frame pointer and return address register |
13 | addi.d $sp, $sp, -32 |
14 | st.d $ra, $sp, 24 |
15 | st.d $fp, $sp, 16 |
16 | CFI_DEF_CFA_OFFSET (32) |
17 | CFI_OFFSET (1, -8) |
18 | CFI_OFFSET (22, -16) |
19 | |
20 | // Adjust the SP for previous frame |
21 | addi.d $fp, $sp, 32 |
22 | CFI_DEF_CFA_REGISTER (22) |
23 | |
24 | // Save env parameter |
25 | st.d $a0, $sp, 8 |
26 | CFI_OFFSET (4, -24) |
27 | |
28 | // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
29 | addi.d $a0, $fp, 0 |
30 | |
31 | // call tsan interceptor |
32 | bl ASM_SYMBOL(__tsan_setjmp) |
33 | |
34 | // Restore env parameter |
35 | ld.d $a0, $sp, 8 |
36 | CFI_RESTORE (4) |
37 | |
38 | // Restore frame/link register |
39 | ld.d $fp, $sp, 16 |
40 | ld.d $ra, $sp, 24 |
41 | addi.d $sp, $sp, 32 |
42 | CFI_RESTORE (22) |
43 | CFI_RESTORE (1) |
44 | CFI_DEF_CFA (3, 0) |
45 | |
46 | // tail jump to libc setjmp |
47 | la.local $a1, _ZN14__interception11real_setjmpE |
48 | ld.d $a1, $a1, 0 |
49 | jr $a1 |
50 | |
51 | CFI_ENDPROC |
52 | ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp)) |
53 | |
54 | .comm _ZN14__interception12real__setjmpE,8,8 |
55 | .globl ASM_SYMBOL_INTERCEPTOR(_setjmp) |
56 | ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp)) |
57 | ASM_SYMBOL_INTERCEPTOR(_setjmp): |
58 | CFI_STARTPROC |
59 | |
60 | // Save frame pointer and return address register |
61 | addi.d $sp, $sp, -32 |
62 | st.d $ra, $sp, 24 |
63 | st.d $fp, $sp, 16 |
64 | CFI_DEF_CFA_OFFSET (32) |
65 | CFI_OFFSET (1, -8) |
66 | CFI_OFFSET (22, -16) |
67 | |
68 | // Adjust the SP for previous frame |
69 | addi.d $fp, $sp, 32 |
70 | CFI_DEF_CFA_REGISTER (22) |
71 | |
72 | // Save env parameter |
73 | st.d $a0, $sp, 8 |
74 | CFI_OFFSET (4, -24) |
75 | |
76 | // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
77 | addi.d $a0, $fp, 0 |
78 | |
79 | // call tsan interceptor |
80 | bl ASM_SYMBOL(__tsan_setjmp) |
81 | |
82 | // Restore env parameter |
83 | ld.d $a0, $sp, 8 |
84 | CFI_RESTORE (4) |
85 | |
86 | // Restore frame/link register |
87 | ld.d $fp, $sp, 16 |
88 | ld.d $ra, $sp, 24 |
89 | addi.d $sp, $sp, 32 |
90 | CFI_RESTORE (22) |
91 | CFI_RESTORE (1) |
92 | CFI_DEF_CFA (3, 0) |
93 | |
94 | // tail jump to libc setjmp |
95 | la.local $a1, _ZN14__interception12real__setjmpE |
96 | ld.d $a1, $a1, 0 |
97 | jr $a1 |
98 | |
99 | CFI_ENDPROC |
100 | ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp)) |
101 | |
102 | .comm _ZN14__interception14real_sigsetjmpE,8,8 |
103 | .globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp) |
104 | ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) |
105 | ASM_SYMBOL_INTERCEPTOR(sigsetjmp): |
106 | CFI_STARTPROC |
107 | |
108 | // Save frame pointer and return address register |
109 | addi.d $sp, $sp, -32 |
110 | st.d $ra, $sp, 24 |
111 | st.d $fp, $sp, 16 |
112 | CFI_DEF_CFA_OFFSET (32) |
113 | CFI_OFFSET (1, -8) |
114 | CFI_OFFSET (22, -16) |
115 | |
116 | // Adjust the SP for previous frame |
117 | addi.d $fp, $sp, 32 |
118 | CFI_DEF_CFA_REGISTER (22) |
119 | |
120 | // Save env parameter |
121 | st.d $a0, $sp, 8 |
122 | CFI_OFFSET (4, -24) |
123 | |
124 | // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
125 | addi.d $a0, $fp, 0 |
126 | |
127 | // call tsan interceptor |
128 | bl ASM_SYMBOL(__tsan_setjmp) |
129 | |
130 | // Restore env parameter |
131 | ld.d $a0, $sp, 8 |
132 | CFI_RESTORE (4) |
133 | |
134 | // Restore frame/link register |
135 | ld.d $fp, $sp, 16 |
136 | ld.d $ra, $sp, 24 |
137 | addi.d $sp, $sp, 32 |
138 | CFI_RESTORE (22) |
139 | CFI_RESTORE (1) |
140 | CFI_DEF_CFA (3, 0) |
141 | |
142 | // tail jump to libc setjmp |
143 | la.local $a1, _ZN14__interception14real_sigsetjmpE |
144 | ld.d $a1, $a1, 0 |
145 | jr $a1 |
146 | |
147 | CFI_ENDPROC |
148 | ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) |
149 | |
150 | .comm _ZN14__interception16real___sigsetjmpE,8,8 |
151 | .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp) |
152 | ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) |
153 | ASM_SYMBOL_INTERCEPTOR(__sigsetjmp): |
154 | CFI_STARTPROC |
155 | |
156 | // Save frame pointer and return address register |
157 | addi.d $sp, $sp, -32 |
158 | st.d $ra, $sp, 24 |
159 | st.d $fp, $sp, 16 |
160 | CFI_DEF_CFA_OFFSET (32) |
161 | CFI_OFFSET (1, -8) |
162 | CFI_OFFSET (22, -16) |
163 | |
164 | // Adjust the SP for previous frame |
165 | addi.d $fp, $sp, 32 |
166 | CFI_DEF_CFA_REGISTER (22) |
167 | |
168 | // Save env parameter |
169 | st.d $a0, $sp, 8 |
170 | CFI_OFFSET (4, -24) |
171 | |
172 | // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
173 | addi.d $a0, $fp, 0 |
174 | |
175 | // call tsan interceptor |
176 | bl ASM_SYMBOL(__tsan_setjmp) |
177 | |
178 | // Restore env parameter |
179 | ld.d $a0, $sp, 8 |
180 | CFI_RESTORE (4) |
181 | |
182 | // Restore frame/link register |
183 | ld.d $fp, $sp, 16 |
184 | ld.d $ra, $sp, 24 |
185 | addi.d $sp, $sp, 32 |
186 | CFI_RESTORE (22) |
187 | CFI_RESTORE (1) |
188 | CFI_DEF_CFA (3, 0) |
189 | |
190 | // tail jump to libc setjmp |
191 | la.local $a1, _ZN14__interception16real___sigsetjmpE |
192 | ld.d $a1, $a1, 0 |
193 | jr $a1 |
194 | |
195 | CFI_ENDPROC |
196 | ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) |
197 | |