| #if defined(WITH_SELF_VERIFICATION) |
| /* |
| * This handler encapsulates heap memory ops for selfVerification mode. |
| * |
| * The call to the handler is inserted prior to a heap memory operation. |
| * This handler then calls a function to decode the memory op, and process |
| * it accordingly. Afterwards, the handler changes the return address to |
| * skip the memory op so it never gets executed. |
| */ |
| #ifdef HARD_FLOAT |
| /* push f0-f31 onto stack */ |
| sw f0, fr0*-4(sp) # push f0 |
| sw f1, fr1*-4(sp) # push f1 |
| sw f2, fr2*-4(sp) # push f2 |
| sw f3, fr3*-4(sp) # push f3 |
| sw f4, fr4*-4(sp) # push f4 |
| sw f5, fr5*-4(sp) # push f5 |
| sw f6, fr6*-4(sp) # push f6 |
| sw f7, fr7*-4(sp) # push f7 |
| sw f8, fr8*-4(sp) # push f8 |
| sw f9, fr9*-4(sp) # push f9 |
| sw f10, fr10*-4(sp) # push f10 |
| sw f11, fr11*-4(sp) # push f11 |
| sw f12, fr12*-4(sp) # push f12 |
| sw f13, fr13*-4(sp) # push f13 |
| sw f14, fr14*-4(sp) # push f14 |
| sw f15, fr15*-4(sp) # push f15 |
| sw f16, fr16*-4(sp) # push f16 |
| sw f17, fr17*-4(sp) # push f17 |
| sw f18, fr18*-4(sp) # push f18 |
| sw f19, fr19*-4(sp) # push f19 |
| sw f20, fr20*-4(sp) # push f20 |
| sw f21, fr21*-4(sp) # push f21 |
| sw f22, fr22*-4(sp) # push f22 |
| sw f23, fr23*-4(sp) # push f23 |
| sw f24, fr24*-4(sp) # push f24 |
| sw f25, fr25*-4(sp) # push f25 |
| sw f26, fr26*-4(sp) # push f26 |
| sw f27, fr27*-4(sp) # push f27 |
| sw f28, fr28*-4(sp) # push f28 |
| sw f29, fr29*-4(sp) # push f29 |
| sw f30, fr30*-4(sp) # push f30 |
| sw f31, fr31*-4(sp) # push f31 |
| |
| sub sp, (32-0)*4 # adjust stack pointer |
| #endif |
| |
| /* push gp registers (except zero, gp, sp, and fp) */ |
| .set noat |
| sw AT, r_AT*-4(sp) # push at |
| .set at |
| sw v0, r_V0*-4(sp) # push v0 |
| sw v1, r_V1*-4(sp) # push v1 |
| sw a0, r_A0*-4(sp) # push a0 |
| sw a1, r_A1*-4(sp) # push a1 |
| sw a2, r_A2*-4(sp) # push a2 |
| sw a3, r_A3*-4(sp) # push a3 |
| sw t0, r_T0*-4(sp) # push t0 |
| sw t1, r_T1*-4(sp) # push t1 |
| sw t2, r_T2*-4(sp) # push t2 |
| sw t3, r_T3*-4(sp) # push t3 |
| sw t4, r_T4*-4(sp) # push t4 |
| sw t5, r_T5*-4(sp) # push t5 |
| sw t6, r_T6*-4(sp) # push t6 |
| sw t7, r_T7*-4(sp) # push t7 |
| sw s0, r_S0*-4(sp) # push s0 |
| sw s1, r_S1*-4(sp) # push s1 |
| sw s2, r_S2*-4(sp) # push s2 |
| sw s3, r_S3*-4(sp) # push s3 |
| sw s4, r_S4*-4(sp) # push s4 |
| sw s5, r_S5*-4(sp) # push s5 |
| sw s6, r_S6*-4(sp) # push s6 |
| sw s7, r_S7*-4(sp) # push s7 |
| sw t8, r_T8*-4(sp) # push t8 |
| sw t9, r_T9*-4(sp) # push t9 |
| sw k0, r_K0*-4(sp) # push k0 |
| sw k1, r_K1*-4(sp) # push k1 |
| sw ra, r_RA*-4(sp) # push RA |
| |
| # Note: even if we don't save all 32 registers, we still need to |
| # adjust SP by 32 registers due to the way we are storing |
| # the registers on the stack. |
| sub sp, (32-0)*4 # adjust stack pointer |
| |
| la a2, .LdvmSelfVerificationMemOpDecode # defined in footer.S |
| lw a2, (a2) |
| move a0, ra # a0<- link register |
| move a1, sp # a1<- stack pointer |
| JALR(a2) |
| |
| /* pop gp registers (except zero, gp, sp, and fp) */ |
| # Note: even if we don't save all 32 registers, we still need to |
| # adjust SP by 32 registers due to the way we are storing |
| # the registers on the stack. |
| add sp, (32-0)*4 # adjust stack pointer |
| .set noat |
| lw AT, r_AT*-4(sp) # pop at |
| .set at |
| lw v0, r_V0*-4(sp) # pop v0 |
| lw v1, r_V1*-4(sp) # pop v1 |
| lw a0, r_A0*-4(sp) # pop a0 |
| lw a1, r_A1*-4(sp) # pop a1 |
| lw a2, r_A2*-4(sp) # pop a2 |
| lw a3, r_A3*-4(sp) # pop a3 |
| lw t0, r_T0*-4(sp) # pop t0 |
| lw t1, r_T1*-4(sp) # pop t1 |
| lw t2, r_T2*-4(sp) # pop t2 |
| lw t3, r_T3*-4(sp) # pop t3 |
| lw t4, r_T4*-4(sp) # pop t4 |
| lw t5, r_T5*-4(sp) # pop t5 |
| lw t6, r_T6*-4(sp) # pop t6 |
| lw t7, r_T7*-4(sp) # pop t7 |
| lw s0, r_S0*-4(sp) # pop s0 |
| lw s1, r_S1*-4(sp) # pop s1 |
| lw s2, r_S2*-4(sp) # pop s2 |
| lw s3, r_S3*-4(sp) # pop s3 |
| lw s4, r_S4*-4(sp) # pop s4 |
| lw s5, r_S5*-4(sp) # pop s5 |
| lw s6, r_S6*-4(sp) # pop s6 |
| lw s7, r_S7*-4(sp) # pop s7 |
| lw t8, r_T8*-4(sp) # pop t8 |
| lw t9, r_T9*-4(sp) # pop t9 |
| lw k0, r_K0*-4(sp) # pop k0 |
| lw k1, r_K1*-4(sp) # pop k1 |
| lw ra, r_RA*-4(sp) # pop RA |
| |
| #ifdef HARD_FLOAT |
| /* pop f0-f31 from stack */ |
| add sp, (32-0)*4 # adjust stack pointer |
| lw f0, fr0*-4(sp) # pop f0 |
| lw f1, fr1*-4(sp) # pop f1 |
| lw f2, fr2*-4(sp) # pop f2 |
| lw f3, fr3*-4(sp) # pop f3 |
| lw f4, fr4*-4(sp) # pop f4 |
| lw f5, fr5*-4(sp) # pop f5 |
| lw f6, fr6*-4(sp) # pop f6 |
| lw f7, fr7*-4(sp) # pop f7 |
| lw f8, fr8*-4(sp) # pop f8 |
| lw f9, fr9*-4(sp) # pop f9 |
| lw f10, fr10*-4(sp) # pop f10 |
| lw f11, fr11*-4(sp) # pop f11 |
| lw f12, fr12*-4(sp) # pop f12 |
| lw f13, fr13*-4(sp) # pop f13 |
| lw f14, fr14*-4(sp) # pop f14 |
| lw f15, fr15*-4(sp) # pop f15 |
| lw f16, fr16*-4(sp) # pop f16 |
| lw f17, fr17*-4(sp) # pop f17 |
| lw f18, fr18*-4(sp) # pop f18 |
| lw f19, fr19*-4(sp) # pop f19 |
| lw f20, fr20*-4(sp) # pop f20 |
| lw f21, fr21*-4(sp) # pop f21 |
| lw f22, fr22*-4(sp) # pop f22 |
| lw f23, fr23*-4(sp) # pop f23 |
| lw f24, fr24*-4(sp) # pop f24 |
| lw f25, fr25*-4(sp) # pop f25 |
| lw f26, fr26*-4(sp) # pop f26 |
| lw f27, fr27*-4(sp) # pop f27 |
| lw f28, fr28*-4(sp) # pop f28 |
| lw f29, fr29*-4(sp) # pop f29 |
| lw f30, fr30*-4(sp) # pop f30 |
| lw f31, fr31*-4(sp) # pop f31 |
| #endif |
| |
| RETURN |
| #endif |