blob: 2e7448108c627491a91b598cbeec891257eac45a [file] [log] [blame]
/*
* This handler performs a register save for selfVerification mode.
* On entry:
* Top of stack + 4: a1 value to save
* Top of stack + 0: a0 value to save
* a0 - offset from rSELF to the beginning of the heapArgSpace record
* a1 - the value of regMap
*
* The handler must save regMap, r0-r31, f0-f31 if FPU, and then return with
* r0-r31 with their original values (note that this means a0 and a1 must take
* the values on the stack - not the ones in those registers on entry.
* Finally, the two registers previously pushed must be popped.
* Note: the following registers are not saved
* zero, AT, gp, sp, fp, ra
*/
add a0, a0, rSELF # pointer to heapArgSpace
sw a1, 0(a0) # save regMap
add a0, a0, 4 # pointer to coreRegs
#if 0
sw zero, r_ZERO*4(a0) # save zero
#endif
.set noat
sw AT, r_AT*4(a0) # save at
.set at
sw v0, r_V0*4(a0) # save v0
sw v1, r_V1*4(a0) # save v1
lw a1, 0(sp) # recover a0 value
sw a1, r_A0*4(a0) # save a0
lw a1, 4(sp) # recover a1 value
sw a1, r_A1*4(a0) # save a1
sw a2, r_A2*4(a0) # save a2
sw a3, r_A3*4(a0) # save a3
sw t0, r_T0*4(a0) # save t0
sw t1, r_T1*4(a0) # save t1
sw t2, r_T2*4(a0) # save t2
sw t3, r_T3*4(a0) # save t3
sw t4, r_T4*4(a0) # save t4
sw t5, r_T5*4(a0) # save t5
sw t6, r_T6*4(a0) # save t6
sw t7, r_T7*4(a0) # save t7
sw s0, r_S0*4(a0) # save s0
sw s1, r_S1*4(a0) # save s1
sw s2, r_S2*4(a0) # save s2
sw s3, r_S3*4(a0) # save s3
sw s4, r_S4*4(a0) # save s4
sw s5, r_S5*4(a0) # save s5
sw s6, r_S6*4(a0) # save s6
sw s7, r_S7*4(a0) # save s7
sw t8, r_T8*4(a0) # save t8
sw t9, r_T9*4(a0) # save t9
sw k0, r_K0*4(a0) # save k0
sw k1, r_K1*4(a0) # save k1
#if 0
sw gp, r_GP*4(a0) # save gp
sw sp, r_SP*4(a0) # save sp (need to adjust??? )
sw fp, r_FP*4(a0) # save fp
sw ra, r_RA*4(a0) # save ra
#endif
/* #ifdef HARD_FLOAT */
#if 0
sw f0, fr0*4(a0) # save f0
sw f1, fr1*4(a0) # save f1
sw f2, fr2*4(a0) # save f2
sw f3, fr3*4(a0) # save f3
sw f4, fr4*4(a0) # save f4
sw f5, fr5*4(a0) # save f5
sw f6, fr6*4(a0) # save f6
sw f7, fr7*4(a0) # save f7
sw f8, fr8*4(a0) # save f8
sw f9, fr9*4(a0) # save f9
sw f10, fr10*4(a0) # save f10
sw f11, fr11*4(a0) # save f11
sw f12, fr12*4(a0) # save f12
sw f13, fr13*4(a0) # save f13
sw f14, fr14*4(a0) # save f14
sw f15, fr15*4(a0) # save f15
sw f16, fr16*4(a0) # save f16
sw f17, fr17*4(a0) # save f17
sw f18, fr18*4(a0) # save f18
sw f19, fr19*4(a0) # save f19
sw f20, fr20*4(a0) # save f20
sw f21, fr21*4(a0) # save f21
sw f22, fr22*4(a0) # save f22
sw f23, fr23*4(a0) # save f23
sw f24, fr24*4(a0) # save f24
sw f25, fr25*4(a0) # save f25
sw f26, fr26*4(a0) # save f26
sw f27, fr27*4(a0) # save f27
sw f28, fr28*4(a0) # save f28
sw f29, fr29*4(a0) # save f29
sw f30, fr30*4(a0) # save f30
sw f31, fr31*4(a0) # save f31
#endif
lw a1, 0(sp) # recover a0 value
lw a1, 4(sp) # recover a1 value
sub sp, sp, 8 # adjust stack ptr
RETURN