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