1*0b57cec5SDimitry Andric.section .text 2*0b57cec5SDimitry Andric.set noreorder 3*0b57cec5SDimitry Andric 4*0b57cec5SDimitry Andric.hidden __tsan_setjmp 5*0b57cec5SDimitry Andric.comm _ZN14__interception11real_setjmpE,8,8 6*0b57cec5SDimitry Andric.globl setjmp 7*0b57cec5SDimitry Andric.type setjmp, @function 8*0b57cec5SDimitry Andricsetjmp: 9*0b57cec5SDimitry Andric 10*0b57cec5SDimitry Andric // save env parameters 11*0b57cec5SDimitry Andric daddiu $sp,$sp,-40 12*0b57cec5SDimitry Andric sd $s0,32($sp) 13*0b57cec5SDimitry Andric sd $ra,24($sp) 14*0b57cec5SDimitry Andric sd $fp,16($sp) 15*0b57cec5SDimitry Andric sd $gp,8($sp) 16*0b57cec5SDimitry Andric 17*0b57cec5SDimitry Andric // calculate and save pointer to GOT 18*0b57cec5SDimitry Andric lui $gp,%hi(%neg(%gp_rel(setjmp))) 19*0b57cec5SDimitry Andric daddu $gp,$gp,$t9 20*0b57cec5SDimitry Andric daddiu $gp,$gp,%lo(%neg(%gp_rel(setjmp))) 21*0b57cec5SDimitry Andric move $s0,$gp 22*0b57cec5SDimitry Andric 23*0b57cec5SDimitry Andric // save jmp_buf 24*0b57cec5SDimitry Andric sd $a0,0($sp) 25*0b57cec5SDimitry Andric 26*0b57cec5SDimitry Andric // obtain $sp 27*0b57cec5SDimitry Andric dadd $a0,$zero,$sp 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric // call tsan interceptor 30*0b57cec5SDimitry Andric jal __tsan_setjmp 31*0b57cec5SDimitry Andric daddiu $a1,$a0,40 32*0b57cec5SDimitry Andric 33*0b57cec5SDimitry Andric // restore jmp_buf 34*0b57cec5SDimitry Andric ld $a0,0($sp) 35*0b57cec5SDimitry Andric 36*0b57cec5SDimitry Andric // restore gp 37*0b57cec5SDimitry Andric move $gp,$s0 38*0b57cec5SDimitry Andric 39*0b57cec5SDimitry Andric // load pointer of libc setjmp to t9 40*0b57cec5SDimitry Andric dla $t9,(_ZN14__interception11real_setjmpE) 41*0b57cec5SDimitry Andric 42*0b57cec5SDimitry Andric // restore env parameters 43*0b57cec5SDimitry Andric ld $gp,8($sp) 44*0b57cec5SDimitry Andric ld $fp,16($sp) 45*0b57cec5SDimitry Andric ld $ra,24($sp) 46*0b57cec5SDimitry Andric ld $s0,32($sp) 47*0b57cec5SDimitry Andric daddiu $sp,$sp,40 48*0b57cec5SDimitry Andric 49*0b57cec5SDimitry Andric // tail jump to libc setjmp 50*0b57cec5SDimitry Andric ld $t9,0($t9) 51*0b57cec5SDimitry Andric jr $t9 52*0b57cec5SDimitry Andric nop 53*0b57cec5SDimitry Andric 54*0b57cec5SDimitry Andric.size setjmp, .-setjmp 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry Andric.hidden __tsan_setjmp 57*0b57cec5SDimitry Andric.globl _setjmp 58*0b57cec5SDimitry Andric.comm _ZN14__interception12real__setjmpE,8,8 59*0b57cec5SDimitry Andric.type _setjmp, @function 60*0b57cec5SDimitry Andric_setjmp: 61*0b57cec5SDimitry Andric 62*0b57cec5SDimitry Andric // Save env parameters 63*0b57cec5SDimitry Andric daddiu $sp,$sp,-40 64*0b57cec5SDimitry Andric sd $s0,32($sp) 65*0b57cec5SDimitry Andric sd $ra,24($sp) 66*0b57cec5SDimitry Andric sd $fp,16($sp) 67*0b57cec5SDimitry Andric sd $gp,8($sp) 68*0b57cec5SDimitry Andric 69*0b57cec5SDimitry Andric // calculate and save pointer to GOT 70*0b57cec5SDimitry Andric lui $gp,%hi(%neg(%gp_rel(_setjmp))) 71*0b57cec5SDimitry Andric daddu $gp,$gp,$t9 72*0b57cec5SDimitry Andric daddiu $gp,$gp,%lo(%neg(%gp_rel(_setjmp))) 73*0b57cec5SDimitry Andric move $s0,$gp 74*0b57cec5SDimitry Andric 75*0b57cec5SDimitry Andric // save jmp_buf 76*0b57cec5SDimitry Andric sd $a0,0($sp) 77*0b57cec5SDimitry Andric 78*0b57cec5SDimitry Andric // obtain $sp 79*0b57cec5SDimitry Andric dadd $a0,$zero,$sp 80*0b57cec5SDimitry Andric 81*0b57cec5SDimitry Andric // call tsan interceptor 82*0b57cec5SDimitry Andric jal __tsan_setjmp 83*0b57cec5SDimitry Andric daddiu $a1,$a0,40 84*0b57cec5SDimitry Andric 85*0b57cec5SDimitry Andric // restore jmp_buf 86*0b57cec5SDimitry Andric ld $a0,0($sp) 87*0b57cec5SDimitry Andric 88*0b57cec5SDimitry Andric // restore gp 89*0b57cec5SDimitry Andric move $gp,$s0 90*0b57cec5SDimitry Andric 91*0b57cec5SDimitry Andric // load pointer of libc _setjmp to t9 92*0b57cec5SDimitry Andric dla $t9,(_ZN14__interception12real__setjmpE) 93*0b57cec5SDimitry Andric 94*0b57cec5SDimitry Andric // restore env parameters 95*0b57cec5SDimitry Andric ld $gp,8($sp) 96*0b57cec5SDimitry Andric ld $fp,16($sp) 97*0b57cec5SDimitry Andric ld $ra,24($sp) 98*0b57cec5SDimitry Andric ld $s0,32($sp) 99*0b57cec5SDimitry Andric daddiu $sp,$sp,40 100*0b57cec5SDimitry Andric 101*0b57cec5SDimitry Andric // tail jump to libc _setjmp 102*0b57cec5SDimitry Andric ld $t9,0($t9) 103*0b57cec5SDimitry Andric jr $t9 104*0b57cec5SDimitry Andric nop 105*0b57cec5SDimitry Andric 106*0b57cec5SDimitry Andric.size _setjmp, .-_setjmp 107*0b57cec5SDimitry Andric 108*0b57cec5SDimitry Andric.hidden __tsan_setjmp 109*0b57cec5SDimitry Andric.globl sigsetjmp 110*0b57cec5SDimitry Andric.comm _ZN14__interception14real_sigsetjmpE,8,8 111*0b57cec5SDimitry Andric.type sigsetjmp, @function 112*0b57cec5SDimitry Andricsigsetjmp: 113*0b57cec5SDimitry Andric 114*0b57cec5SDimitry Andric // Save env parameters 115*0b57cec5SDimitry Andric daddiu $sp,$sp,-48 116*0b57cec5SDimitry Andric sd $s0,40($sp) 117*0b57cec5SDimitry Andric sd $ra,32($sp) 118*0b57cec5SDimitry Andric sd $fp,24($sp) 119*0b57cec5SDimitry Andric sd $gp,16($sp) 120*0b57cec5SDimitry Andric 121*0b57cec5SDimitry Andric // calculate and save pointer to GOT 122*0b57cec5SDimitry Andric lui $gp,%hi(%neg(%gp_rel(sigsetjmp))) 123*0b57cec5SDimitry Andric daddu $gp,$gp,$t9 124*0b57cec5SDimitry Andric daddiu $gp,$gp,%lo(%neg(%gp_rel(sigsetjmp))) 125*0b57cec5SDimitry Andric move $s0,$gp 126*0b57cec5SDimitry Andric 127*0b57cec5SDimitry Andric // save jmp_buf and savesig 128*0b57cec5SDimitry Andric sd $a0,0($sp) 129*0b57cec5SDimitry Andric sd $a1,8($sp) 130*0b57cec5SDimitry Andric 131*0b57cec5SDimitry Andric // obtain $sp 132*0b57cec5SDimitry Andric dadd $a0,$zero,$sp 133*0b57cec5SDimitry Andric 134*0b57cec5SDimitry Andric // call tsan interceptor 135*0b57cec5SDimitry Andric jal __tsan_setjmp 136*0b57cec5SDimitry Andric daddiu $a1,$a0,48 137*0b57cec5SDimitry Andric 138*0b57cec5SDimitry Andric // restore jmp_buf and savesig 139*0b57cec5SDimitry Andric ld $a0,0($sp) 140*0b57cec5SDimitry Andric ld $a1,8($sp) 141*0b57cec5SDimitry Andric 142*0b57cec5SDimitry Andric // restore gp 143*0b57cec5SDimitry Andric move $gp,$s0 144*0b57cec5SDimitry Andric 145*0b57cec5SDimitry Andric // load pointer of libc sigsetjmp to t9 146*0b57cec5SDimitry Andric dla $t9,(_ZN14__interception14real_sigsetjmpE) 147*0b57cec5SDimitry Andric 148*0b57cec5SDimitry Andric // restore env parameters 149*0b57cec5SDimitry Andric ld $gp,16($sp) 150*0b57cec5SDimitry Andric ld $fp,24($sp) 151*0b57cec5SDimitry Andric ld $ra,32($sp) 152*0b57cec5SDimitry Andric ld $s0,40($sp) 153*0b57cec5SDimitry Andric daddiu $sp,$sp,48 154*0b57cec5SDimitry Andric 155*0b57cec5SDimitry Andric // tail jump to libc sigsetjmp 156*0b57cec5SDimitry Andric ld $t9,0($t9) 157*0b57cec5SDimitry Andric jr $t9 158*0b57cec5SDimitry Andric nop 159*0b57cec5SDimitry Andric 160*0b57cec5SDimitry Andric.size sigsetjmp, .-sigsetjmp 161*0b57cec5SDimitry Andric 162*0b57cec5SDimitry Andric.hidden __tsan_setjmp 163*0b57cec5SDimitry Andric.comm _ZN14__interception16real___sigsetjmpE,8,8 164*0b57cec5SDimitry Andric.globl __sigsetjmp 165*0b57cec5SDimitry Andric.type __sigsetjmp, @function 166*0b57cec5SDimitry Andric__sigsetjmp: 167*0b57cec5SDimitry Andric 168*0b57cec5SDimitry Andric // Save env parameters 169*0b57cec5SDimitry Andric daddiu $sp,$sp,-48 170*0b57cec5SDimitry Andric sd $s0,40($sp) 171*0b57cec5SDimitry Andric sd $ra,32($sp) 172*0b57cec5SDimitry Andric sd $fp,24($sp) 173*0b57cec5SDimitry Andric sd $gp,16($sp) 174*0b57cec5SDimitry Andric 175*0b57cec5SDimitry Andric // calculate and save pointer to GOT 176*0b57cec5SDimitry Andric lui $gp,%hi(%neg(%gp_rel(__sigsetjmp))) 177*0b57cec5SDimitry Andric daddu $gp,$gp,$t9 178*0b57cec5SDimitry Andric daddiu $gp,$gp,%lo(%neg(%gp_rel(__sigsetjmp))) 179*0b57cec5SDimitry Andric move $s0,$gp 180*0b57cec5SDimitry Andric 181*0b57cec5SDimitry Andric // save jmp_buf and savesig 182*0b57cec5SDimitry Andric sd $a0,0($sp) 183*0b57cec5SDimitry Andric sd $a1,8($sp) 184*0b57cec5SDimitry Andric 185*0b57cec5SDimitry Andric // obtain $sp 186*0b57cec5SDimitry Andric dadd $a0,$zero,$sp 187*0b57cec5SDimitry Andric 188*0b57cec5SDimitry Andric // call tsan interceptor 189*0b57cec5SDimitry Andric jal __tsan_setjmp 190*0b57cec5SDimitry Andric daddiu $a1,$a0,48 191*0b57cec5SDimitry Andric 192*0b57cec5SDimitry Andric // restore jmp_buf and savesig 193*0b57cec5SDimitry Andric ld $a0,0($sp) 194*0b57cec5SDimitry Andric ld $a1,8($sp) 195*0b57cec5SDimitry Andric 196*0b57cec5SDimitry Andric // restore gp 197*0b57cec5SDimitry Andric move $gp,$s0 198*0b57cec5SDimitry Andric 199*0b57cec5SDimitry Andric // load pointer to libc __sigsetjmp in t9 200*0b57cec5SDimitry Andric dla $t9,(_ZN14__interception16real___sigsetjmpE) 201*0b57cec5SDimitry Andric 202*0b57cec5SDimitry Andric // restore env parameters 203*0b57cec5SDimitry Andric ld $gp,16($sp) 204*0b57cec5SDimitry Andric ld $fp,24($sp) 205*0b57cec5SDimitry Andric ld $ra,32($sp) 206*0b57cec5SDimitry Andric ld $s0,40($sp) 207*0b57cec5SDimitry Andric daddiu $sp,$sp,48 208*0b57cec5SDimitry Andric 209*0b57cec5SDimitry Andric // tail jump to libc __sigsetjmp 210*0b57cec5SDimitry Andric ld $t9,0($t9) 211*0b57cec5SDimitry Andric jr $t9 212*0b57cec5SDimitry Andric nop 213*0b57cec5SDimitry Andric 214*0b57cec5SDimitry Andric.size __sigsetjmp, .-__sigsetjmp 215