Mercurial > nand-ecoscentric
comparison packages/hal/mips/arch/current/src/context.S @ 6:d376b777e2ce ecos-sw-1999-05-14
Merge from eCos master repository on 1999-05-14-19:27:43-BST
| author | jlarmour |
|---|---|
| date | Fri, 14 May 1999 12:20:00 +0000 |
| parents | 443894e2e912 |
| children | ece80412419a |
comparison
equal
deleted
inserted
replaced
| 5:4e8259f41183 | 6:d376b777e2ce |
|---|---|
| 40 ## | 40 ## |
| 41 ##============================================================================= | 41 ##============================================================================= |
| 42 | 42 |
| 43 #include <pkgconf/hal.h> | 43 #include <pkgconf/hal.h> |
| 44 | 44 |
| 45 #include <cyg/hal/mips.inc> | 45 #include <cyg/hal/arch.inc> |
| 46 | 46 |
| 47 .set noat | 47 .set noat |
| 48 | 48 |
| 49 #------------------------------------------------------------------------------ | 49 #------------------------------------------------------------------------------ |
| 50 # hal_thread_switch_context | 50 # hal_thread_switch_context |
| 57 | 57 |
| 58 addi sp,sp,-mipsreg_size # space for registers | 58 addi sp,sp,-mipsreg_size # space for registers |
| 59 | 59 |
| 60 # store GPRs | 60 # store GPRs |
| 61 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM | 61 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM |
| 62 sw $0,(mipsreg_regs+0*4)(sp) | 62 sw $0,(mipsreg_regs+0*mips_regsize)(sp) |
| 63 sw $1,(mipsreg_regs+1*4)(sp) | 63 sw $1,(mipsreg_regs+1*mips_regsize)(sp) |
| 64 sw $2,(mipsreg_regs+2*4)(sp) | 64 sw $2,(mipsreg_regs+2*mips_regsize)(sp) |
| 65 sw $3,(mipsreg_regs+3*4)(sp) | 65 sw $3,(mipsreg_regs+3*mips_regsize)(sp) |
| 66 sw $4,(mipsreg_regs+4*4)(sp) | 66 sw $4,(mipsreg_regs+4*mips_regsize)(sp) |
| 67 sw $5,(mipsreg_regs+5*4)(sp) | 67 sw $5,(mipsreg_regs+5*mips_regsize)(sp) |
| 68 sw $6,(mipsreg_regs+6*4)(sp) | 68 sw $6,(mipsreg_regs+6*mips_regsize)(sp) |
| 69 sw $7,(mipsreg_regs+7*4)(sp) | 69 sw $7,(mipsreg_regs+7*mips_regsize)(sp) |
| 70 sw $8,(mipsreg_regs+8*4)(sp) | 70 sw $8,(mipsreg_regs+8*mips_regsize)(sp) |
| 71 sw $9,(mipsreg_regs+9*4)(sp) | 71 sw $9,(mipsreg_regs+9*mips_regsize)(sp) |
| 72 sw $10,(mipsreg_regs+10*4)(sp) | 72 sw $10,(mipsreg_regs+10*mips_regsize)(sp) |
| 73 sw $11,(mipsreg_regs+11*4)(sp) | 73 sw $11,(mipsreg_regs+11*mips_regsize)(sp) |
| 74 sw $12,(mipsreg_regs+12*4)(sp) | 74 sw $12,(mipsreg_regs+12*mips_regsize)(sp) |
| 75 sw $13,(mipsreg_regs+13*4)(sp) | 75 sw $13,(mipsreg_regs+13*mips_regsize)(sp) |
| 76 sw $14,(mipsreg_regs+14*4)(sp) | 76 sw $14,(mipsreg_regs+14*mips_regsize)(sp) |
| 77 sw $15,(mipsreg_regs+15*4)(sp) | 77 sw $15,(mipsreg_regs+15*mips_regsize)(sp) |
| 78 sw $24,(mipsreg_regs+24*4)(sp) | 78 sw $24,(mipsreg_regs+24*mips_regsize)(sp) |
| 79 sw $25,(mipsreg_regs+25*4)(sp) | 79 sw $25,(mipsreg_regs+25*mips_regsize)(sp) |
| 80 sw $28,(mipsreg_regs+28*4)(sp) # == GP | 80 sw $28,(mipsreg_regs+28*mips_regsize)(sp) # == GP |
| 81 #endif | 81 #endif |
| 82 sw $16,(mipsreg_regs+16*4)(sp) | 82 sw $16,(mipsreg_regs+16*mips_regsize)(sp) |
| 83 sw $17,(mipsreg_regs+17*4)(sp) | 83 sw $17,(mipsreg_regs+17*mips_regsize)(sp) |
| 84 sw $18,(mipsreg_regs+18*4)(sp) | 84 sw $18,(mipsreg_regs+18*mips_regsize)(sp) |
| 85 sw $19,(mipsreg_regs+19*4)(sp) | 85 sw $19,(mipsreg_regs+19*mips_regsize)(sp) |
| 86 sw $20,(mipsreg_regs+20*4)(sp) | 86 sw $20,(mipsreg_regs+20*mips_regsize)(sp) |
| 87 sw $21,(mipsreg_regs+21*4)(sp) | 87 sw $21,(mipsreg_regs+21*mips_regsize)(sp) |
| 88 sw $22,(mipsreg_regs+22*4)(sp) | 88 sw $22,(mipsreg_regs+22*mips_regsize)(sp) |
| 89 sw $23,(mipsreg_regs+23*4)(sp) | 89 sw $23,(mipsreg_regs+23*mips_regsize)(sp) |
| 90 # sw $26,(mipsreg_regs+26*4)(sp) # == K0 | 90 # sw $26,(mipsreg_regs+26*mips_regsize)(sp) # == K0 |
| 91 # sw $27,(mipsreg_regs+27*4)(sp) # == K1 | 91 # sw $27,(mipsreg_regs+27*mips_regsize)(sp) # == K1 |
| 92 # sw $29,(mipsreg_regs+29*4)(sp) # == SP | 92 # sw $29,(mipsreg_regs+29*mips_regsize)(sp) # == SP |
| 93 sw $30,(mipsreg_regs+30*4)(sp) # == FP | 93 sw $30,(mipsreg_regs+30*mips_regsize)(sp) # == FP |
| 94 sw $31,(mipsreg_regs+31*4)(sp) # == RA | 94 sw $31,(mipsreg_regs+31*mips_regsize)(sp) # == RA |
| 95 sw $31,(mipsreg_pc)(sp) # == PC (to help with debugging) | 95 sw $31,(mipsreg_pc)(sp) # == PC (to help with debugging) |
| 96 | 96 |
| 97 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM | 97 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM |
| 98 | 98 |
| 99 mflo t0 # save LO and HI regs | 99 mflo t0 # save LO and HI regs |
| 101 sw t0,mipsreg_lo(sp) | 101 sw t0,mipsreg_lo(sp) |
| 102 sw t1,mipsreg_hi(sp) | 102 sw t1,mipsreg_hi(sp) |
| 103 | 103 |
| 104 #endif | 104 #endif |
| 105 | 105 |
| 106 hal_fpu_save_callee sp | |
| 107 | |
| 108 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM | |
| 109 | |
| 110 hal_fpu_save_caller sp | |
| 111 | |
| 112 #endif | |
| 113 | |
| 106 addi t0,sp,mipsreg_size # save SP in reg dump | 114 addi t0,sp,mipsreg_size # save SP in reg dump |
| 107 sw t0,(mipsreg_regs+29*4)(sp) | 115 sw t0,(mipsreg_regs+29*mips_regsize)(sp) |
| 108 | 116 |
| 117 mfc0 t1,status # Save status register | |
| 118 sw t1,mipsreg_sr(sp) | |
| 119 | |
| 109 sw sp,0(a1) # save sp in save loc | 120 sw sp,0(a1) # save sp in save loc |
| 110 | 121 |
| 111 # Now load the destination thread by dropping through | 122 # Now load the destination thread by dropping through |
| 112 # to hal_thread_load_context | 123 # to hal_thread_load_context |
| 113 | 124 |
| 122 hal_thread_load_context: | 133 hal_thread_load_context: |
| 123 | 134 |
| 124 lw sp,0(a0) # load new SP directly | 135 lw sp,0(a0) # load new SP directly |
| 125 | 136 |
| 126 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM | 137 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM |
| 138 | |
| 139 hal_fpu_load_caller sp | |
| 140 | |
| 141 #endif | |
| 142 | |
| 143 hal_fpu_load_callee sp | |
| 144 | |
| 145 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM | |
| 127 | 146 |
| 128 lw t0,mipsreg_hi(sp) # load HI and LO regs | 147 lw t0,mipsreg_hi(sp) # load HI and LO regs |
| 129 lw t1,mipsreg_lo(sp) | 148 lw t1,mipsreg_lo(sp) |
| 130 mthi t0 | 149 mthi t0 |
| 131 mtlo t1 | 150 mtlo t1 |
| 132 | 151 |
| 133 #endif | 152 #endif |
| 134 | 153 |
| 135 # load GPRs | 154 # load GPRs |
| 136 # lw $0,(mipsreg_regs+0*4)(sp) | 155 # lw $0,(mipsreg_regs+0*mips_regsize)(sp) |
| 137 lw $4,(mipsreg_regs+4*4)(sp) # A0, must load for thread startup | 156 lw $4,(mipsreg_regs+4*mips_regsize)(sp) # A0, must load for thread startup |
| 138 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM | 157 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM |
| 139 lw $1,(mipsreg_regs+1*4)(sp) | 158 lw $1,(mipsreg_regs+1*mips_regsize)(sp) |
| 140 lw $2,(mipsreg_regs+2*4)(sp) | 159 lw $2,(mipsreg_regs+2*mips_regsize)(sp) |
| 141 lw $3,(mipsreg_regs+3*4)(sp) | 160 lw $3,(mipsreg_regs+3*mips_regsize)(sp) |
| 142 lw $5,(mipsreg_regs+5*4)(sp) | 161 lw $5,(mipsreg_regs+5*mips_regsize)(sp) |
| 143 lw $6,(mipsreg_regs+6*4)(sp) | 162 lw $6,(mipsreg_regs+6*mips_regsize)(sp) |
| 144 lw $7,(mipsreg_regs+7*4)(sp) | 163 lw $7,(mipsreg_regs+7*mips_regsize)(sp) |
| 145 lw $8,(mipsreg_regs+8*4)(sp) | 164 lw $8,(mipsreg_regs+8*mips_regsize)(sp) |
| 146 lw $9,(mipsreg_regs+9*4)(sp) | 165 lw $9,(mipsreg_regs+9*mips_regsize)(sp) |
| 147 lw $10,(mipsreg_regs+10*4)(sp) | 166 lw $10,(mipsreg_regs+10*mips_regsize)(sp) |
| 148 lw $11,(mipsreg_regs+11*4)(sp) | 167 lw $11,(mipsreg_regs+11*mips_regsize)(sp) |
| 149 lw $12,(mipsreg_regs+12*4)(sp) | 168 lw $12,(mipsreg_regs+12*mips_regsize)(sp) |
| 150 lw $13,(mipsreg_regs+13*4)(sp) | 169 lw $13,(mipsreg_regs+13*mips_regsize)(sp) |
| 151 lw $14,(mipsreg_regs+14*4)(sp) | 170 lw $14,(mipsreg_regs+14*mips_regsize)(sp) |
| 152 lw $15,(mipsreg_regs+15*4)(sp) | 171 lw $15,(mipsreg_regs+15*mips_regsize)(sp) |
| 153 lw $24,(mipsreg_regs+24*4)(sp) | 172 lw $24,(mipsreg_regs+24*mips_regsize)(sp) |
| 154 lw $25,(mipsreg_regs+25*4)(sp) | 173 lw $25,(mipsreg_regs+25*mips_regsize)(sp) |
| 155 #endif | 174 #endif |
| 156 lw $16,(mipsreg_regs+16*4)(sp) | 175 lw $16,(mipsreg_regs+16*mips_regsize)(sp) |
| 157 lw $17,(mipsreg_regs+17*4)(sp) | 176 lw $17,(mipsreg_regs+17*mips_regsize)(sp) |
| 158 lw $18,(mipsreg_regs+18*4)(sp) | 177 lw $18,(mipsreg_regs+18*mips_regsize)(sp) |
| 159 lw $19,(mipsreg_regs+19*4)(sp) | 178 lw $19,(mipsreg_regs+19*mips_regsize)(sp) |
| 160 lw $20,(mipsreg_regs+20*4)(sp) | 179 lw $20,(mipsreg_regs+20*mips_regsize)(sp) |
| 161 lw $21,(mipsreg_regs+21*4)(sp) | 180 lw $21,(mipsreg_regs+21*mips_regsize)(sp) |
| 162 lw $22,(mipsreg_regs+22*4)(sp) | 181 lw $22,(mipsreg_regs+22*mips_regsize)(sp) |
| 163 lw $23,(mipsreg_regs+23*4)(sp) | 182 lw $23,(mipsreg_regs+23*mips_regsize)(sp) |
| 164 # lw $26,(mipsreg_regs+26*4)(sp) # == K0 | 183 # lw $26,(mipsreg_regs+26*mips_regsize)(sp) # == K0 |
| 165 # lw $27,(mipsreg_regs+27*4)(sp) # == K1 | 184 # lw $27,(mipsreg_regs+27*mips_regsize)(sp) # == K1 |
| 166 # lw $28,(mipsreg_regs+28*4)(sp) # == GP | 185 # lw $28,(mipsreg_regs+28*mips_regsize)(sp) # == GP |
| 167 # lw $29,(mipsreg_regs+29*4)(sp) # == SP | 186 # lw $29,(mipsreg_regs+29*mips_regsize)(sp) # == SP |
| 168 lw $30,(mipsreg_regs+30*4)(sp) # == FP | 187 lw $30,(mipsreg_regs+30*mips_regsize)(sp) # == FP |
| 169 lw $31,(mipsreg_regs+31*4)(sp) # == RA | 188 lw $31,(mipsreg_regs+31*mips_regsize)(sp) # == RA |
| 170 | 189 |
| 171 # Note that the following lw must go here and not | 190 lw a2,mipsreg_sr(sp) # A2 = saved SR |
| 172 # in the jr delay slot, since it has a delay slot | 191 lw sp,(mipsreg_regs+29*mips_regsize)(sp) # SP = saved SP |
| 173 # of its own. | 192 |
| 174 lw sp,(mipsreg_regs+29*4)(sp) # load SP | 193 hal_cpu_int_merge a2 # Merge with current SR |
| 194 | |
| 175 jr ra # return via ra | 195 jr ra # return via ra |
| 176 nop # delay slot - must be nop | 196 nop # delay slot - must be nop |
| 177 | 197 |
| 178 #------------------------------------------------------------------------------ | 198 #------------------------------------------------------------------------------ |
| 179 # HAL longjmp, setjmp implementations | 199 # HAL longjmp, setjmp implementations |
| 198 #define CYGARC_JMP_BUF_SIZE 12 | 218 #define CYGARC_JMP_BUF_SIZE 12 |
| 199 | 219 |
| 200 .globl hal_setjmp | 220 .globl hal_setjmp |
| 201 .ent hal_setjmp | 221 .ent hal_setjmp |
| 202 hal_setjmp: | 222 hal_setjmp: |
| 203 sw $31,CYGARC_JMP_BUF_R31*4(a0) # ra (link) | 223 sw $31,CYGARC_JMP_BUF_R31*mips_regsize(a0) # ra (link) |
| 204 sw $30,CYGARC_JMP_BUF_R30*4(a0) | 224 sw $30,CYGARC_JMP_BUF_R30*mips_regsize(a0) |
| 205 sw $28,CYGARC_JMP_BUF_R28*4(a0) # gp, optimize out? | 225 sw $28,CYGARC_JMP_BUF_R28*mips_regsize(a0) # gp, optimize out? |
| 206 sw $23,CYGARC_JMP_BUF_R23*4(a0) | 226 sw $23,CYGARC_JMP_BUF_R23*mips_regsize(a0) |
| 207 sw $22,CYGARC_JMP_BUF_R22*4(a0) | 227 sw $22,CYGARC_JMP_BUF_R22*mips_regsize(a0) |
| 208 sw $21,CYGARC_JMP_BUF_R21*4(a0) | 228 sw $21,CYGARC_JMP_BUF_R21*mips_regsize(a0) |
| 209 sw $20,CYGARC_JMP_BUF_R20*4(a0) | 229 sw $20,CYGARC_JMP_BUF_R20*mips_regsize(a0) |
| 210 sw $19,CYGARC_JMP_BUF_R19*4(a0) | 230 sw $19,CYGARC_JMP_BUF_R19*mips_regsize(a0) |
| 211 sw $18,CYGARC_JMP_BUF_R18*4(a0) | 231 sw $18,CYGARC_JMP_BUF_R18*mips_regsize(a0) |
| 212 sw $17,CYGARC_JMP_BUF_R17*4(a0) | 232 sw $17,CYGARC_JMP_BUF_R17*mips_regsize(a0) |
| 213 sw $16,CYGARC_JMP_BUF_R16*4(a0) | 233 sw $16,CYGARC_JMP_BUF_R16*mips_regsize(a0) |
| 214 sw sp,CYGARC_JMP_BUF_SP*4(a0) # $29 | 234 sw sp,CYGARC_JMP_BUF_SP*mips_regsize(a0) # $29 |
| 215 li v0,0 | 235 li v0,0 |
| 216 jr ra | 236 jr ra |
| 217 nop # delay slot | 237 nop # delay slot |
| 218 .end hal_setjmp | 238 .end hal_setjmp |
| 219 | 239 |
| 220 .globl hal_longjmp | 240 .globl hal_longjmp |
| 221 .ent hal_longjmp | 241 .ent hal_longjmp |
| 222 hal_longjmp: | 242 hal_longjmp: |
| 223 lw $31,CYGARC_JMP_BUF_R31*4(a0) # ra (link) | 243 lw $31,CYGARC_JMP_BUF_R31*mips_regsize(a0) # ra (link) |
| 224 lw $30,CYGARC_JMP_BUF_R30*4(a0) | 244 lw $30,CYGARC_JMP_BUF_R30*mips_regsize(a0) |
| 225 lw $28,CYGARC_JMP_BUF_R28*4(a0) # gp, optimize out? | 245 lw $28,CYGARC_JMP_BUF_R28*mips_regsize(a0) # gp, optimize out? |
| 226 lw $23,CYGARC_JMP_BUF_R23*4(a0) | 246 lw $23,CYGARC_JMP_BUF_R23*mips_regsize(a0) |
| 227 lw $22,CYGARC_JMP_BUF_R22*4(a0) | 247 lw $22,CYGARC_JMP_BUF_R22*mips_regsize(a0) |
| 228 lw $21,CYGARC_JMP_BUF_R21*4(a0) | 248 lw $21,CYGARC_JMP_BUF_R21*mips_regsize(a0) |
| 229 lw $20,CYGARC_JMP_BUF_R20*4(a0) | 249 lw $20,CYGARC_JMP_BUF_R20*mips_regsize(a0) |
| 230 lw $19,CYGARC_JMP_BUF_R19*4(a0) | 250 lw $19,CYGARC_JMP_BUF_R19*mips_regsize(a0) |
| 231 lw $18,CYGARC_JMP_BUF_R18*4(a0) | 251 lw $18,CYGARC_JMP_BUF_R18*mips_regsize(a0) |
| 232 lw $17,CYGARC_JMP_BUF_R17*4(a0) | 252 lw $17,CYGARC_JMP_BUF_R17*mips_regsize(a0) |
| 233 lw $16,CYGARC_JMP_BUF_R16*4(a0) | 253 lw $16,CYGARC_JMP_BUF_R16*mips_regsize(a0) |
| 234 lw sp,CYGARC_JMP_BUF_SP*4(a0) # $29 | 254 lw sp,CYGARC_JMP_BUF_SP*mips_regsize(a0) # $29 |
| 235 move v0,a1 | 255 move v0,a1 |
| 236 jr ra | 256 jr ra |
| 237 nop # delay slot | 257 nop # delay slot |
| 238 .end hal_longjmp | 258 .end hal_longjmp |
| 239 | 259 |
