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