1    /*
2     * This handler performs a register save for selfVerification mode.
3     * On entry:
4     *    Top of stack + 4: a1 value to save
5     *    Top of stack + 0: a0 value to save
6     *    a0 - offset from rSELF to the beginning of the heapArgSpace record
7     *    a1 - the value of regMap
8     *
9     * The handler must save regMap, r0-r31, f0-f31 if FPU, and then return with
10     * r0-r31 with their original values (note that this means a0 and a1 must take
11     * the values on the stack - not the ones in those registers on entry.
12     * Finally, the two registers previously pushed must be popped.
13     * Note: the following registers are not saved
14     *       zero, AT, gp, sp, fp, ra
15     */
16    add     a0, a0, rSELF               # pointer to heapArgSpace
17    sw      a1, 0(a0)                   # save regMap
18    add     a0, a0, 4                   # pointer to coreRegs
19#if 0
20    sw      zero, r_ZERO*4(a0)          # save zero
21#endif
22    .set noat
23    sw      AT, r_AT*4(a0)              # save at
24    .set at
25    sw      v0, r_V0*4(a0)              # save v0
26    sw      v1, r_V1*4(a0)              # save v1
27
28    lw      a1, 0(sp)                   # recover a0 value
29    sw      a1, r_A0*4(a0)              # save a0
30    lw      a1, 4(sp)                   # recover a1 value
31    sw      a1, r_A1*4(a0)              # save a1
32    sw      a2, r_A2*4(a0)              # save a2
33    sw      a3, r_A3*4(a0)              # save a3
34
35    sw      t0, r_T0*4(a0)              # save t0
36    sw      t1, r_T1*4(a0)              # save t1
37    sw      t2, r_T2*4(a0)              # save t2
38    sw      t3, r_T3*4(a0)              # save t3
39    sw      t4, r_T4*4(a0)              # save t4
40    sw      t5, r_T5*4(a0)              # save t5
41    sw      t6, r_T6*4(a0)              # save t6
42    sw      t7, r_T7*4(a0)              # save t7
43
44    sw      s0, r_S0*4(a0)              # save s0
45    sw      s1, r_S1*4(a0)              # save s1
46    sw      s2, r_S2*4(a0)              # save s2
47    sw      s3, r_S3*4(a0)              # save s3
48    sw      s4, r_S4*4(a0)              # save s4
49    sw      s5, r_S5*4(a0)              # save s5
50    sw      s6, r_S6*4(a0)              # save s6
51    sw      s7, r_S7*4(a0)              # save s7
52
53    sw      t8, r_T8*4(a0)              # save t8
54    sw      t9, r_T9*4(a0)              # save t9
55
56    sw      k0, r_K0*4(a0)              # save k0
57    sw      k1, r_K1*4(a0)              # save k1
58
59#if 0
60    sw      gp, r_GP*4(a0)              # save gp
61    sw      sp, r_SP*4(a0)              # save sp (need to adjust??? )
62    sw      fp, r_FP*4(a0)              # save fp
63    sw      ra, r_RA*4(a0)              # save ra
64#endif
65
66/* #ifdef HARD_FLOAT */
67#if 0
68    sw      f0, fr0*4(a0)               # save f0
69    sw      f1, fr1*4(a0)               # save f1
70    sw      f2, fr2*4(a0)               # save f2
71    sw      f3, fr3*4(a0)               # save f3
72    sw      f4, fr4*4(a0)               # save f4
73    sw      f5, fr5*4(a0)               # save f5
74    sw      f6, fr6*4(a0)               # save f6
75    sw      f7, fr7*4(a0)               # save f7
76    sw      f8, fr8*4(a0)               # save f8
77    sw      f9, fr9*4(a0)               # save f9
78    sw      f10, fr10*4(a0)             # save f10
79    sw      f11, fr11*4(a0)             # save f11
80    sw      f12, fr12*4(a0)             # save f12
81    sw      f13, fr13*4(a0)             # save f13
82    sw      f14, fr14*4(a0)             # save f14
83    sw      f15, fr15*4(a0)             # save f15
84    sw      f16, fr16*4(a0)             # save f16
85    sw      f17, fr17*4(a0)             # save f17
86    sw      f18, fr18*4(a0)             # save f18
87    sw      f19, fr19*4(a0)             # save f19
88    sw      f20, fr20*4(a0)             # save f20
89    sw      f21, fr21*4(a0)             # save f21
90    sw      f22, fr22*4(a0)             # save f22
91    sw      f23, fr23*4(a0)             # save f23
92    sw      f24, fr24*4(a0)             # save f24
93    sw      f25, fr25*4(a0)             # save f25
94    sw      f26, fr26*4(a0)             # save f26
95    sw      f27, fr27*4(a0)             # save f27
96    sw      f28, fr28*4(a0)             # save f28
97    sw      f29, fr29*4(a0)             # save f29
98    sw      f30, fr30*4(a0)             # save f30
99    sw      f31, fr31*4(a0)             # save f31
100#endif
101
102    lw      a1, 0(sp)                   # recover a0 value
103    lw      a1, 4(sp)                   # recover a1 value
104    sub     sp, sp, 8                   # adjust stack ptr
105    RETURN
106