Changeset 2e549dad in rtems for cpukit/score/cpu/mips/cpu_asm.S
- Timestamp:
- 03/14/01 00:14:18 (22 years ago)
- Branches:
- 4.10, 4.11, 4.8, 4.9, 5, master
- Children:
- 7b79761
- Parents:
- 07fbfced
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cpukit/score/cpu/mips/cpu_asm.S
r07fbfced r2e549dad 20 20 * of this software for any purpose. 21 21 * 2000: Reworked by Alan Cudmore <alanc@linuxstart.com> to become 22 * the more general MIPS port. Joel Sherrill <joel@OARcorp.com> 23 * continued this rework, rewriting as much as possible in 24 * C and testing on the TX39. 22 * the baseline of the more general MIPS port. 23 * 2001: Joel Sherrill <joel@OARcorp.com> continued this rework, 24 * rewriting as much as possible in C and added the JMR3904 BSP 25 * so testing could be performed on a simulator. 25 26 * 26 27 * COPYRIGHT (c) 1989-2000. … … 41 42 #define ISR_VEC_SIZE 4 42 43 43 #if 1 /* 32 bit unsigned32 types */ 44 #define sint sw 45 #define lint lw 46 #define stackadd addiu 47 #define intadd addu 44 /* Ifdefs prevent the duplication of code for MIPS ISA Level 3 ( R4xxx ) 45 * and MIPS ISA Level 1 (R3xxx). 46 */ 47 48 #if __mips == 3 49 /* 64 bit register operations */ 50 #define ADD dadd 51 #define STREG sd 52 #define LDREG ld 53 #define MFCO dmfc0 54 #define MTCO dmtc0 55 #define ADDU addu 56 #define ADDIU addiu 57 #define R_SZ 8 58 #define F_SZ 8 59 #define SZ_INT 8 60 #define SZ_INT_POW2 3 61 62 /* XXX if we don't always want 64 bit register ops, then another ifdef */ 63 64 #elif __mips == 1 65 /* 32 bit register operations*/ 66 #define ADD add 67 #define STREG sw 68 #define LDREG lw 69 #define MFCO mfc0 70 #define MTCO mtc0 71 #define ADDU add 72 #define ADDIU addi 73 #define R_SZ 4 74 #define F_SZ 4 48 75 #define SZ_INT 4 49 76 #define SZ_INT_POW2 2 50 #else /* 64 bit unsigned32 types */ 51 #define sint dw 52 #define lint dw 53 #define stackadd daddiu 54 #define intadd daddu 55 #define SZ_INT 8 56 #define SZ_INT_POW2 3 57 #endif 77 78 #else 79 #error "mips assembly: what size registers do I deal with?" 80 #endif 81 58 82 59 83 #ifdef __GNUC__ … … 113 137 114 138 115 /*PAGE116 *117 * _CPU_ISR_Get_level118 *119 * unsigned32 _CPU_ISR_Get_level( void )120 *121 * This routine returns the current interrupt level.122 */123 124 #if __mips == 3125 /* return the current exception level for the 4650 */126 FRAME(_CPU_ISR_Get_level,sp,0,ra)127 mfc0 v0,C0_SR128 nop129 andi v0,SR_EXL130 srl v0,1131 j ra132 ENDFRAME(_CPU_ISR_Get_level)133 134 FRAME(_CPU_ISR_Set_level,sp,0,ra)135 nop136 mfc0 v0,C0_SR137 nop138 andi v0,SR_EXL139 beqz v0,_CPU_ISR_Set_1 /* normalize v0 */140 nop141 li v0,1142 _CPU_ISR_Set_1:143 beq v0,a0,_CPU_ISR_Set_exit /* if (current_level != new_level ) */144 nop145 bnez a0,_CPU_ISR_Set_2146 nop147 nop148 mfc0 t0, C0_SR149 nop150 li t1,~SR_EXL151 and t0,t1152 nop153 mtc0 t0,C0_SR /* disable exception level */154 nop155 j ra156 nop157 _CPU_ISR_Set_2:158 nop159 mfc0 t0,C0_SR160 nop161 li t1,~SR_IE162 and t0,t1163 nop164 mtc0 t0,C0_SR /* first disable ie bit (recommended) */165 nop166 ori t0, SR_EXL|SR_IE /* enable exception level */167 nop168 mtc0 t0,C0_SR169 nop170 _CPU_ISR_Set_exit:171 j ra172 nop173 ENDFRAME(_CPU_ISR_Set_level)174 175 #elif __mips == 1176 177 /* MIPS ISA 1 ( R3000 ) */178 /* _CPU_ISR_Get/Set_level are called as part of task mode manipulation. */179 /* and are defined in C for the __mips == 1 */180 181 #else182 #error "__mips is set to 1 or 3"183 #endif184 185 139 /* 186 140 * _CPU_Context_save_fp_context … … 201 155 */ 202 156 157 #if ( CPU_HARDWARE_FP == FALSE ) 203 158 FRAME(_CPU_Context_save_fp,sp,0,ra) 204 205 206 swc1 $f0,FP0_OFFSET*4(a1)207 swc1 $f1,FP1_OFFSET*4(a1)208 swc1 $f2,FP2_OFFSET*4(a1)209 swc1 $f3,FP3_OFFSET*4(a1)210 swc1 $f4,FP4_OFFSET*4(a1)211 swc1 $f5,FP5_OFFSET*4(a1)212 swc1 $f6,FP6_OFFSET*4(a1)213 swc1 $f7,FP7_OFFSET*4(a1)214 swc1 $f8,FP8_OFFSET*4(a1)215 swc1 $f9,FP9_OFFSET*4(a1)216 swc1 $f10,FP10_OFFSET*4(a1)217 swc1 $f11,FP11_OFFSET*4(a1)218 swc1 $f12,FP12_OFFSET*4(a1)219 swc1 $f13,FP13_OFFSET*4(a1)220 swc1 $f14,FP14_OFFSET*4(a1)221 swc1 $f15,FP15_OFFSET*4(a1)222 swc1 $f16,FP16_OFFSET*4(a1)223 swc1 $f17,FP17_OFFSET*4(a1)224 swc1 $f18,FP18_OFFSET*4(a1)225 swc1 $f19,FP19_OFFSET*4(a1)226 swc1 $f20,FP20_OFFSET*4(a1)227 swc1 $f21,FP21_OFFSET*4(a1)228 swc1 $f22,FP22_OFFSET*4(a1)229 swc1 $f23,FP23_OFFSET*4(a1)230 swc1 $f24,FP24_OFFSET*4(a1)231 swc1 $f25,FP25_OFFSET*4(a1)232 swc1 $f26,FP26_OFFSET*4(a1)233 swc1 $f27,FP27_OFFSET*4(a1)234 swc1 $f28,FP28_OFFSET*4(a1)235 swc1 $f29,FP29_OFFSET*4(a1)236 swc1 $f30,FP30_OFFSET*4(a1)237 swc1 $f31,FP31_OFFSET*4(a1)238 239 240 159 .set noat 160 ld a1,(a0) 161 swc1 $f0,FP0_OFFSET*F_SZ(a1) 162 swc1 $f1,FP1_OFFSET*F_SZ(a1) 163 swc1 $f2,FP2_OFFSET*F_SZ(a1) 164 swc1 $f3,FP3_OFFSET*F_SZ(a1) 165 swc1 $f4,FP4_OFFSET*F_SZ(a1) 166 swc1 $f5,FP5_OFFSET*F_SZ(a1) 167 swc1 $f6,FP6_OFFSET*F_SZ(a1) 168 swc1 $f7,FP7_OFFSET*F_SZ(a1) 169 swc1 $f8,FP8_OFFSET*F_SZ(a1) 170 swc1 $f9,FP9_OFFSET*F_SZ(a1) 171 swc1 $f10,FP10_OFFSET*F_SZ(a1) 172 swc1 $f11,FP11_OFFSET*F_SZ(a1) 173 swc1 $f12,FP12_OFFSET*F_SZ(a1) 174 swc1 $f13,FP13_OFFSET*F_SZ(a1) 175 swc1 $f14,FP14_OFFSET*F_SZ(a1) 176 swc1 $f15,FP15_OFFSET*F_SZ(a1) 177 swc1 $f16,FP16_OFFSET*F_SZ(a1) 178 swc1 $f17,FP17_OFFSET*F_SZ(a1) 179 swc1 $f18,FP18_OFFSET*F_SZ(a1) 180 swc1 $f19,FP19_OFFSET*F_SZ(a1) 181 swc1 $f20,FP20_OFFSET*F_SZ(a1) 182 swc1 $f21,FP21_OFFSET*F_SZ(a1) 183 swc1 $f22,FP22_OFFSET*F_SZ(a1) 184 swc1 $f23,FP23_OFFSET*F_SZ(a1) 185 swc1 $f24,FP24_OFFSET*F_SZ(a1) 186 swc1 $f25,FP25_OFFSET*F_SZ(a1) 187 swc1 $f26,FP26_OFFSET*F_SZ(a1) 188 swc1 $f27,FP27_OFFSET*F_SZ(a1) 189 swc1 $f28,FP28_OFFSET*F_SZ(a1) 190 swc1 $f29,FP29_OFFSET*F_SZ(a1) 191 swc1 $f30,FP30_OFFSET*F_SZ(a1) 192 swc1 $f31,FP31_OFFSET*F_SZ(a1) 193 j ra 194 nop 195 .set at 241 196 ENDFRAME(_CPU_Context_save_fp) 197 #endif 242 198 243 199 /* … … 259 215 */ 260 216 217 #if ( CPU_HARDWARE_FP == FALSE ) 261 218 FRAME(_CPU_Context_restore_fp,sp,0,ra) 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 219 .set noat 220 ld a1,(a0) 221 lwc1 $f0,FP0_OFFSET*4(a1) 222 lwc1 $f1,FP1_OFFSET*4(a1) 223 lwc1 $f2,FP2_OFFSET*4(a1) 224 lwc1 $f3,FP3_OFFSET*4(a1) 225 lwc1 $f4,FP4_OFFSET*4(a1) 226 lwc1 $f5,FP5_OFFSET*4(a1) 227 lwc1 $f6,FP6_OFFSET*4(a1) 228 lwc1 $f7,FP7_OFFSET*4(a1) 229 lwc1 $f8,FP8_OFFSET*4(a1) 230 lwc1 $f9,FP9_OFFSET*4(a1) 231 lwc1 $f10,FP10_OFFSET*4(a1) 232 lwc1 $f11,FP11_OFFSET*4(a1) 233 lwc1 $f12,FP12_OFFSET*4(a1) 234 lwc1 $f13,FP13_OFFSET*4(a1) 235 lwc1 $f14,FP14_OFFSET*4(a1) 236 lwc1 $f15,FP15_OFFSET*4(a1) 237 lwc1 $f16,FP16_OFFSET*4(a1) 238 lwc1 $f17,FP17_OFFSET*4(a1) 239 lwc1 $f18,FP18_OFFSET*4(a1) 240 lwc1 $f19,FP19_OFFSET*4(a1) 241 lwc1 $f20,FP20_OFFSET*4(a1) 242 lwc1 $f21,FP21_OFFSET*4(a1) 243 lwc1 $f22,FP22_OFFSET*4(a1) 244 lwc1 $f23,FP23_OFFSET*4(a1) 245 lwc1 $f24,FP24_OFFSET*4(a1) 246 lwc1 $f25,FP25_OFFSET*4(a1) 247 lwc1 $f26,FP26_OFFSET*4(a1) 248 lwc1 $f27,FP27_OFFSET*4(a1) 249 lwc1 $f28,FP28_OFFSET*4(a1) 250 lwc1 $f29,FP29_OFFSET*4(a1) 251 lwc1 $f30,FP30_OFFSET*4(a1) 252 lwc1 $f31,FP31_OFFSET*4(a1) 253 j ra 254 nop 255 .set at 299 256 ENDFRAME(_CPU_Context_restore_fp) 257 #endif 300 258 301 259 /* _CPU_Context_switch … … 309 267 * ) 310 268 */ 269 270 FRAME(_CPU_Context_switch,sp,0,ra) 271 272 mfc0 t0,C0_SR 273 li t1,~(SR_INTERRUPT_ENABLE_BITS) 274 STREG t0,C0_SR_OFFSET*4(a0) /* save status register */ 275 and t0,t1 276 mtc0 t0,C0_SR /* first disable ie bit (recommended) */ 311 277 #if __mips == 3 312 /* MIPS ISA Level 3 ( R4xxx ) */ 313 314 FRAME(_CPU_Context_switch,sp,0,ra) 315 316 mfc0 t0,C0_SR 317 li t1,~SR_IE 318 sd t0,C0_SR_OFFSET*8(a0) /* save status register */ 319 and t0,t1 320 mtc0 t0,C0_SR /* first disable ie bit (recommended) */ 321 ori t0,SR_EXL|SR_IE /* enable exception level to disable interrupts */ 322 mtc0 t0,C0_SR 323 324 sd ra,RA_OFFSET*8(a0) /* save current context */ 325 sd sp,SP_OFFSET*8(a0) 326 sd fp,FP_OFFSET*8(a0) 327 sd s1,S1_OFFSET*8(a0) 328 sd s2,S2_OFFSET*8(a0) 329 sd s3,S3_OFFSET*8(a0) 330 sd s4,S4_OFFSET*8(a0) 331 sd s5,S5_OFFSET*8(a0) 332 sd s6,S6_OFFSET*8(a0) 333 sd s7,S7_OFFSET*8(a0) 334 dmfc0 t0,C0_EPC 335 sd t0,C0_EPC_OFFSET*8(a0) 278 ori t0,SR_EXL|SR_IE /* enable exception level to disable interrupts */ 279 mtc0 t0,C0_SR 280 #endif 281 282 STREG ra,RA_OFFSET*R_SZ(a0) /* save current context */ 283 STREG sp,SP_OFFSET*R_SZ(a0) 284 STREG fp,FP_OFFSET*R_SZ(a0) 285 STREG s0,S0_OFFSET*R_SZ(a0) 286 STREG s1,S1_OFFSET*R_SZ(a0) 287 STREG s2,S2_OFFSET*R_SZ(a0) 288 STREG s3,S3_OFFSET*R_SZ(a0) 289 STREG s4,S4_OFFSET*R_SZ(a0) 290 STREG s5,S5_OFFSET*R_SZ(a0) 291 STREG s6,S6_OFFSET*R_SZ(a0) 292 STREG s7,S7_OFFSET*R_SZ(a0) 293 294 MFC0 t0,C0_EPC 295 STREG t0,C0_EPC_OFFSET*R_SZ(a0) 336 296 337 297 _CPU_Context_switch_restore: 338 ld s0,S0_OFFSET*8(a1) /* restore context */ 339 ld s1,S1_OFFSET*8(a1) 340 ld s2,S2_OFFSET*8(a1) 341 ld s3,S3_OFFSET*8(a1) 342 ld s4,S4_OFFSET*8(a1) 343 ld s5,S5_OFFSET*8(a1) 344 ld s6,S6_OFFSET*8(a1) 345 ld s7,S7_OFFSET*8(a1) 346 ld fp,FP_OFFSET*8(a1) 347 ld sp,SP_OFFSET*8(a1) 348 ld ra,RA_OFFSET*8(a1) 349 ld t0,C0_EPC_OFFSET*8(a1) 350 dmtc0 t0,C0_EPC 351 ld t0,C0_SR_OFFSET*8(a1) 352 andi t0,SR_EXL 353 bnez t0,_CPU_Context_1 /* set exception level from restore context */ 354 li t0,~SR_EXL 355 mfc0 t1,C0_SR 356 nop 357 and t1,t0 358 mtc0 t1,C0_SR 359 _CPU_Context_1: 360 j ra 361 nop 362 ENDFRAME(_CPU_Context_switch) 298 LDREG s0,S0_OFFSET*R_SZ(a1) /* restore context */ 299 LDREG s1,S1_OFFSET*R_SZ(a1) 300 LDREG s2,S2_OFFSET*R_SZ(a1) 301 LDREG s3,S3_OFFSET*R_SZ(a1) 302 LDREG s4,S4_OFFSET*R_SZ(a1) 303 LDREG s5,S5_OFFSET*R_SZ(a1) 304 LDREG s6,S6_OFFSET*R_SZ(a1) 305 LDREG s7,S7_OFFSET*R_SZ(a1) 306 LDREG fp,FP_OFFSET*R_SZ(a1) 307 LDREG sp,SP_OFFSET*R_SZ(a1) 308 LDREG ra,RA_OFFSET*R_SZ(a1) 309 LDREG t0,C0_EPC_OFFSET*R_SZ(a1) 310 MTC0 t0,C0_EPC 311 LDREG t0, C0_SR_OFFSET*R_SZ(a1) 312 313 #if __mips == 3 314 andi t0,SR_EXL 315 bnez t0,_CPU_Context_1 /* set exception level from restore context */ 316 li t0,~SR_EXL 317 mfc0 t1,C0_SR 318 nop 319 and t1,t0 320 mtc0 t1,C0_SR 363 321 364 322 #elif __mips == 1 365 /* MIPS ISA Level 1 ( R3000 ) */ 366 367 FRAME(_CPU_Context_switch,sp,0,ra) 368 369 mfc0 t0,C0_SR 370 li t1,~(SR_INTERRUPT_ENABLE_BITS) 371 sw t0,C0_SR_OFFSET*4(a0) /* save status register */ 372 and t0,t1 373 mtc0 t0,C0_SR /* first disable ie bit (recommended) */ 374 375 sw ra,RA_OFFSET*4(a0) /* save current context */ 376 sw sp,SP_OFFSET*4(a0) 377 sw fp,FP_OFFSET*4(a0) 378 sw s0,S0_OFFSET*4(a0) 379 sw s1,S1_OFFSET*4(a0) 380 sw s2,S2_OFFSET*4(a0) 381 sw s3,S3_OFFSET*4(a0) 382 sw s4,S4_OFFSET*4(a0) 383 sw s5,S5_OFFSET*4(a0) 384 sw s6,S6_OFFSET*4(a0) 385 sw s7,S7_OFFSET*4(a0) 386 387 mfc0 t0,C0_EPC 388 sw t0,C0_EPC_OFFSET*4(a0) 389 390 _CPU_Context_switch_restore: 391 lw s0,S0_OFFSET*4(a1) /* restore context */ 392 lw s1,S1_OFFSET*4(a1) 393 lw s2,S2_OFFSET*4(a1) 394 lw s3,S3_OFFSET*4(a1) 395 lw s4,S4_OFFSET*4(a1) 396 lw s5,S5_OFFSET*4(a1) 397 lw s6,S6_OFFSET*4(a1) 398 lw s7,S7_OFFSET*4(a1) 399 lw fp,FP_OFFSET*4(a1) 400 lw sp,SP_OFFSET*4(a1) 401 lw ra,RA_OFFSET*4(a1) 402 lw t0,C0_EPC_OFFSET*4(a1) 403 mtc0 t0,C0_EPC 404 lw t0, C0_SR_OFFSET*4(a1) 405 andi t0,(SR_INTERRUPT_ENABLE_BITS) /* we know 0 disabled */ 406 beq t0,$0,_CPU_Context_1 /* set level from restore context */ 407 mfc0 t0,C0_SR 408 nop 409 or t0,(SR_INTERRUPT_ENABLE_BITS) /* new_sr = old sr with enabled */ 410 mtc0 t0,C0_SR /* set with enabled */ 411 323 andi t0,(SR_INTERRUPT_ENABLE_BITS) /* we know 0 disabled */ 324 beq t0,$0,_CPU_Context_1 /* set level from restore context */ 325 mfc0 t0,C0_SR 326 nop 327 or t0,(SR_INTERRUPT_ENABLE_BITS) /* new_sr = old sr with enabled */ 328 mtc0 t0,C0_SR /* set with enabled */ 329 #endif 412 330 413 331 _CPU_Context_1: … … 415 333 nop 416 334 ENDFRAME(_CPU_Context_switch) 417 418 #else419 420 #error "__mips is not set to 1 or 3"421 422 #endif423 335 424 336 /* … … 435 347 */ 436 348 437 #if __mips == 3438 439 349 FRAME(_CPU_Context_restore,sp,0,ra) 440 dadda1,a0,zero441 j_CPU_Context_switch_restore442 350 ADD a1,a0,zero 351 j _CPU_Context_switch_restore 352 nop 443 353 ENDFRAME(_CPU_Context_restore) 444 445 #elif __mips == 1446 447 FRAME(_CPU_Context_restore,sp,0,ra)448 add a1,a0,zero449 j _CPU_Context_switch_restore450 nop451 ENDFRAME(_CPU_Context_restore)452 453 #else454 455 #error "__mips is not set to 1 or 3"456 457 #endif458 354 459 355 ASM_EXTERN(_ISR_Nest_level, SZ_INT) … … 492 388 */ 493 389 494 #if __mips == 3495 /* ----------------------------------------------------------------------------- */496 390 FRAME(_ISR_Handler,sp,0,ra) 497 .set noreorder 498 #if USE_IDTKIT 499 /* IDT/Kit incorrectly adds 4 to EPC before returning. This compensates */ 500 lreg k0, R_EPC*R_SZ(sp) 501 daddiu k0,k0,-4 502 sreg k0, R_EPC*R_SZ(sp) 503 lreg k0, R_CAUSE*R_SZ(sp) 504 li k1, ~CAUSE_BD 505 and k0, k1 506 sreg k0, R_CAUSE*R_SZ(sp) 507 #endif 508 509 /* save registers not already saved by IDT/sim */ 510 stackadd sp,sp,-EXCP_STACK_SIZE /* store ra on the stack */ 511 512 sreg ra, R_RA*R_SZ(sp) 513 sreg v0, R_V0*R_SZ(sp) 514 sreg v1, R_V1*R_SZ(sp) 515 sreg a0, R_A0*R_SZ(sp) 516 sreg a1, R_A1*R_SZ(sp) 517 sreg a2, R_A2*R_SZ(sp) 518 sreg a3, R_A3*R_SZ(sp) 519 sreg t0, R_T0*R_SZ(sp) 520 sreg t1, R_T1*R_SZ(sp) 521 sreg t2, R_T2*R_SZ(sp) 522 sreg t3, R_T3*R_SZ(sp) 523 sreg t4, R_T4*R_SZ(sp) 524 sreg t5, R_T5*R_SZ(sp) 525 sreg t6, R_T6*R_SZ(sp) 526 sreg t7, R_T7*R_SZ(sp) 527 mflo k0 528 sreg t8, R_T8*R_SZ(sp) 529 sreg k0, R_MDLO*R_SZ(sp) 530 sreg t9, R_T9*R_SZ(sp) 531 mfhi k0 532 sreg gp, R_GP*R_SZ(sp) 533 sreg fp, R_FP*R_SZ(sp) 534 sreg k0, R_MDHI*R_SZ(sp) 535 .set noat 536 sreg AT, R_AT*R_SZ(sp) 537 .set at 538 539 stackadd sp,sp,-40 /* store ra on the stack */ 540 sd ra,32(sp) 391 .set noreorder 392 393 /* Q: _ISR_Handler, not using IDT/SIM ...save extra regs? */ 394 395 /* wastes a lot of stack space for context?? */ 396 ADDIU sp,sp,-EXCP_STACK_SIZE 397 398 STREG ra, R_RA*R_SZ(sp) /* store ra on the stack */ 399 STREG v0, R_V0*R_SZ(sp) 400 STREG v1, R_V1*R_SZ(sp) 401 STREG a0, R_A0*R_SZ(sp) 402 STREG a1, R_A1*R_SZ(sp) 403 STREG a2, R_A2*R_SZ(sp) 404 STREG a3, R_A3*R_SZ(sp) 405 STREG t0, R_T0*R_SZ(sp) 406 STREG t1, R_T1*R_SZ(sp) 407 STREG t2, R_T2*R_SZ(sp) 408 STREG t3, R_T3*R_SZ(sp) 409 STREG t4, R_T4*R_SZ(sp) 410 STREG t5, R_T5*R_SZ(sp) 411 STREG t6, R_T6*R_SZ(sp) 412 STREG t7, R_T7*R_SZ(sp) 413 mflo k0 414 STREG t8, R_T8*R_SZ(sp) 415 STREG k0, R_MDLO*R_SZ(sp) 416 STREG t9, R_T9*R_SZ(sp) 417 mfhi k0 418 STREG gp, R_GP*R_SZ(sp) 419 STREG fp, R_FP*R_SZ(sp) 420 STREG k0, R_MDHI*R_SZ(sp) 421 .set noat 422 STREG AT, R_AT*R_SZ(sp) 423 .set at 424 425 /* Q: Why hardcode -40 for stack add??? */ 426 /* This needs to be figured out.........*/ 427 ADDIU sp,sp,-40 428 STREG ra,32(sp) /* store ra on the stack */ 541 429 542 430 /* determine if an interrupt generated this exception */ 543 mfc0 k0,C0_CAUSE 544 and k1,k0,CAUSE_EXCMASK 545 bnez k1,_ISR_Handler_prom_exit /* not an external interrupt, 546 pass exception to Monitor */ 547 mfc0 k1,C0_SR 548 and k0,k1 549 and k0,CAUSE_IPMASK 550 beq k0,zero,_ISR_Handler_quick_exit /* external interrupt not 551 enabled, ignore */ 552 nop 431 432 mfc0 k0,C0_CAUSE 433 and k1,k0,CAUSE_EXCMASK 434 beq k1, 0, _ISR_Handler_1 435 nop 436 437 _ISR_Handler_Exception: 438 nop 439 b _ISR_Handler_Exception /* Jump to the exception code */ 440 nop 441 442 _ISR_Handler_1: 443 444 mfc0 k1,C0_SR 445 and k0,k1 446 and k0,CAUSE_IPMASK 447 beq k0,zero,_ISR_Handler_exit 448 /* external interrupt not enabled, ignore */ 449 /* but if it's not an exception or an interrupt, */ 450 /* Then where did it come from??? */ 451 nop 553 452 554 453 /* … … 561 460 * #endif 562 461 */ 563 #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE ) 564 lint t0,_ISR_Nest_level 565 beq t0, zero, _ISR_Handler_1 566 nop 567 /* switch stacks */ 568 _ISR_Handler_1: 569 #else 570 lint t0,_ISR_Nest_level 571 #endif 462 572 463 /* 573 464 * _ISR_Nest_level++; 574 465 */ 575 addi t0,t0,1 576 sint t0,_ISR_Nest_level 466 LDREG t0,_ISR_Nest_level 467 ADD t0,t0,1 468 STREG t0,_ISR_Nest_level 577 469 /* 578 470 * _Thread_Dispatch_disable_level++; 579 471 */ 580 lint t1,_Thread_Dispatch_disable_level 581 addi t1,t1,1 582 sint t1,_Thread_Dispatch_disable_level 583 #if 0 584 nop 585 j _ISR_Handler_4 586 nop 587 /* 588 * while ( interrupts_pending(cause_reg) ) { 589 * vector = BITFIELD_TO_INDEX(cause_reg); 590 * (*_ISR_Vector_table[ vector ])( vector ); 591 * } 592 */ 593 _ISR_Handler_2: 594 /* software interrupt priorities can be applied here */ 595 li t1,-1 596 /* convert bit field into interrupt index */ 597 _ISR_Handler_3: 598 andi t2,t0,1 599 addi t1,1 600 beql t2,zero,_ISR_Handler_3 601 dsrl t0,1 602 li t1,7 603 dsll t1,3 /* convert index to byte offset (*8) */ 604 la t3,_ISR_Vector_table 605 intadd t1,t3 606 lint t1,(t1) 607 jalr t1 608 nop 609 j _ISR_Handler_5 610 nop 611 _ISR_Handler_4: 612 mfc0 t0,C0_CAUSE 613 andi t0,CAUSE_IPMASK 614 bne t0,zero,_ISR_Handler_2 615 dsrl t0,t0,8 616 _ISR_Handler_5: 617 #else 618 nop 619 li t1,7 620 dsll t1,t1,SZ_INT_POW2 621 la t3,_ISR_Vector_table 622 intadd t1,t3 623 lint t1,(t1) 624 jalr t1 625 nop 626 #endif 472 LDREG t1,_Thread_Dispatch_disable_level 473 ADD t1,t1,1 474 STREG t1,_Thread_Dispatch_disable_level 475 476 /* 477 * Call the CPU model or BSP specific routine to decode the 478 * interrupt source and actually vector to device ISR handlers. 479 */ 480 481 jal mips_vector_isr_handlers 482 nop 483 627 484 /* 628 485 * --_ISR_Nest_level; 629 486 */ 630 lintt2,_ISR_Nest_level631 addit2,t2,-1632 sintt2,_ISR_Nest_level487 LDREG t2,_ISR_Nest_level 488 ADD t2,t2,-1 489 STREG t2,_ISR_Nest_level 633 490 /* 634 491 * --_Thread_Dispatch_disable_level; 635 492 */ 636 lintt1,_Thread_Dispatch_disable_level637 addit1,t1,-1638 sintt1,_Thread_Dispatch_disable_level493 LDREG t1,_Thread_Dispatch_disable_level 494 ADD t1,t1,-1 495 STREG t1,_Thread_Dispatch_disable_level 639 496 /* 640 497 * if ( _Thread_Dispatch_disable_level || _ISR_Nest_level ) 641 498 * goto the label "exit interrupt (simple case)" 642 499 */ 643 ort0,t2,t1644 645 500 or t0,t2,t1 501 bne t0,zero,_ISR_Handler_exit 502 nop 646 503 /* 647 504 * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE ) … … 652 509 * goto the label "exit interrupt (simple case)" 653 510 */ 654 lint t0,_Context_Switch_necessary 655 lint t1,_ISR_Signals_to_thread_executing 656 or t0,t0,t1 657 beq t0,zero,_ISR_Handler_exit 658 nop 659 511 LDREG t0,_Context_Switch_necessary 512 LDREG t1,_ISR_Signals_to_thread_executing 513 or t0,t0,t1 514 beq t0,zero,_ISR_Handler_exit 515 nop 660 516 /* 661 517 * call _Thread_Dispatch() or prepare to return to _ISR_Dispatch 662 518 */ 663 664 519 jal _Thread_Dispatch 520 nop 665 521 /* 666 522 * prepare to get out of interrupt … … 671 527 * return from interrupt 672 528 */ 529 673 530 _ISR_Handler_exit: 674 ld ra,32(sp) 675 stackadd sp,sp,40 676 677 /* restore interrupt context from stack */ 678 lreg k0, R_MDLO*R_SZ(sp) 679 mtlo k0 680 lreg k0, R_MDHI*R_SZ(sp) 681 lreg a2, R_A2*R_SZ(sp) 682 mthi k0 683 lreg a3, R_A3*R_SZ(sp) 684 lreg t0, R_T0*R_SZ(sp) 685 lreg t1, R_T1*R_SZ(sp) 686 lreg t2, R_T2*R_SZ(sp) 687 lreg t3, R_T3*R_SZ(sp) 688 lreg t4, R_T4*R_SZ(sp) 689 lreg t5, R_T5*R_SZ(sp) 690 lreg t6, R_T6*R_SZ(sp) 691 lreg t7, R_T7*R_SZ(sp) 692 lreg t8, R_T8*R_SZ(sp) 693 lreg t9, R_T9*R_SZ(sp) 694 lreg gp, R_GP*R_SZ(sp) 695 lreg fp, R_FP*R_SZ(sp) 696 lreg ra, R_RA*R_SZ(sp) 697 lreg a0, R_A0*R_SZ(sp) 698 lreg a1, R_A1*R_SZ(sp) 699 lreg v1, R_V1*R_SZ(sp) 700 lreg v0, R_V0*R_SZ(sp) 701 .set noat 702 lreg AT, R_AT*R_SZ(sp) 703 .set at 704 705 stackadd sp,sp,EXCP_STACK_SIZE /* store ra on the stack */ 706 707 #if USE_IDTKIT 708 /* we handled exception, so return non-zero value */ 709 li v0,1 710 #endif 711 712 _ISR_Handler_quick_exit: 713 #ifdef USE_IDTKIT 714 j ra 715 #else 716 eret 717 #endif 718 nop 719 720 _ISR_Handler_prom_exit: 721 #if __mips == 1 722 la k0, (R_VEC+((48)*8)) 723 #endif 724 725 #if __mips == 3 726 la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */ 727 #endif 728 j k0 729 nop 730 731 .set reorder 732 733 ENDFRAME(_ISR_Handler) 734 735 /* ---------------------------------------------------------------------- */ 736 #elif __mips == 1 737 /* MIPS ISA Level 1 */ 738 739 FRAME(_ISR_Handler,sp,0,ra) 740 .set noreorder 741 742 /* Q: _ISR_Handler, not using IDT/SIM ...save extra regs? */ 743 744 addiu sp,sp,-EXCP_STACK_SIZE /* wastes alot of stack space for context?? */ 745 746 sw ra, R_RA*R_SZ(sp) /* store ra on the stack */ 747 sw v0, R_V0*R_SZ(sp) 748 sw v1, R_V1*R_SZ(sp) 749 sw a0, R_A0*R_SZ(sp) 750 sw a1, R_A1*R_SZ(sp) 751 sw a2, R_A2*R_SZ(sp) 752 sw a3, R_A3*R_SZ(sp) 753 sw t0, R_T0*R_SZ(sp) 754 sw t1, R_T1*R_SZ(sp) 755 sw t2, R_T2*R_SZ(sp) 756 sw t3, R_T3*R_SZ(sp) 757 sw t4, R_T4*R_SZ(sp) 758 sw t5, R_T5*R_SZ(sp) 759 sw t6, R_T6*R_SZ(sp) 760 sw t7, R_T7*R_SZ(sp) 761 mflo k0 762 sw t8, R_T8*R_SZ(sp) 763 sw k0, R_MDLO*R_SZ(sp) 764 sw t9, R_T9*R_SZ(sp) 765 mfhi k0 766 sw gp, R_GP*R_SZ(sp) 767 sw fp, R_FP*R_SZ(sp) 768 sw k0, R_MDHI*R_SZ(sp) 769 .set noat 770 sw AT, R_AT*R_SZ(sp) 771 .set at 772 773 /* Q: Why hardcode -40 for stack add??? */ 774 /* This needs to be figured out.........*/ 775 addiu sp,sp,-40 776 sw ra,32(sp) /* store ra on the stack */ 777 778 /* determine if an interrupt generated this exception */ 779 780 mfc0 k0,C0_CAUSE 781 and k1,k0,CAUSE_EXCMASK 782 beq k1, 0, _ISR_Handler_1 783 nop 784 785 _ISR_Handler_Exception: 786 nop 787 b _ISR_Handler_Exception /* Jump to the exception code */ 788 nop 789 790 _ISR_Handler_1: 791 792 mfc0 k1,C0_SR 793 and k0,k1 794 and k0,CAUSE_IPMASK 795 beq k0,zero,_ISR_Handler_exit 796 /* external interrupt not enabled, ignore */ 797 /* but if it's not an exception or an interrupt, */ 798 /* Then where did it come from??? */ 799 nop 800 801 /* 802 * save some or all context on stack 803 * may need to save some special interrupt information for exit 804 * 805 * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE ) 806 * if ( _ISR_Nest_level == 0 ) 807 * switch to software interrupt stack 808 * #endif 809 */ 810 811 /* 812 * _ISR_Nest_level++; 813 */ 814 lw t0,_ISR_Nest_level 815 addi t0,t0,1 816 sw t0,_ISR_Nest_level 817 /* 818 * _Thread_Dispatch_disable_level++; 819 */ 820 lw t1,_Thread_Dispatch_disable_level 821 addi t1,t1,1 822 sw t1,_Thread_Dispatch_disable_level 823 824 /* 825 * Call the CPU model or BSP specific routine to decode the 826 * interrupt source and actually vector to device ISR handlers. 827 */ 828 829 jal mips_vector_isr_handlers 830 nop 831 832 /* 833 * --_ISR_Nest_level; 834 */ 835 lw t2,_ISR_Nest_level 836 addi t2,t2,-1 837 sw t2,_ISR_Nest_level 838 /* 839 * --_Thread_Dispatch_disable_level; 840 */ 841 lw t1,_Thread_Dispatch_disable_level 842 addi t1,t1,-1 843 sw t1,_Thread_Dispatch_disable_level 844 /* 845 * if ( _Thread_Dispatch_disable_level || _ISR_Nest_level ) 846 * goto the label "exit interrupt (simple case)" 847 */ 848 or t0,t2,t1 849 bne t0,zero,_ISR_Handler_exit 850 nop 851 /* 852 * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE ) 853 * restore stack 854 * #endif 855 * 856 * if ( !_Context_Switch_necessary && !_ISR_Signals_to_thread_executing ) 857 * goto the label "exit interrupt (simple case)" 858 */ 859 lw t0,_Context_Switch_necessary 860 lw t1,_ISR_Signals_to_thread_executing 861 or t0,t0,t1 862 beq t0,zero,_ISR_Handler_exit 863 nop 864 /* 865 * call _Thread_Dispatch() or prepare to return to _ISR_Dispatch 866 */ 867 jal _Thread_Dispatch 868 nop 869 /* 870 * prepare to get out of interrupt 871 * return from interrupt (maybe to _ISR_Dispatch) 872 * 873 * LABEL "exit interrupt (simple case): 874 * prepare to get out of interrupt 875 * return from interrupt 876 */ 877 878 _ISR_Handler_exit: 879 ld ra,32(sp) 880 addiu sp,sp,40 /* Q: Again with the 40...Is this needed? */ 531 LDREG ra,32(sp) 532 ADDIU sp,sp,40 /* Q: Again with the 40...Is this needed? */ 881 533 882 534 /* restore interrupt context from stack */ 883 535 884 lwk0, R_MDLO*R_SZ(sp)885 886 lwk0, R_MDHI*R_SZ(sp)887 lwa2, R_A2*R_SZ(sp)888 889 lwa3, R_A3*R_SZ(sp)890 lwt0, R_T0*R_SZ(sp)891 lwt1, R_T1*R_SZ(sp)892 lwt2, R_T2*R_SZ(sp)893 lwt3, R_T3*R_SZ(sp)894 lwt4, R_T4*R_SZ(sp)895 lwt5, R_T5*R_SZ(sp)896 lwt6, R_T6*R_SZ(sp)897 lwt7, R_T7*R_SZ(sp)898 lwt8, R_T8*R_SZ(sp)899 lwt9, R_T9*R_SZ(sp)900 lwgp, R_GP*R_SZ(sp)901 lwfp, R_FP*R_SZ(sp)902 lwra, R_RA*R_SZ(sp)903 lwa0, R_A0*R_SZ(sp)904 lwa1, R_A1*R_SZ(sp)905 lwv1, R_V1*R_SZ(sp)906 lwv0, R_V0*R_SZ(sp)907 908 lwAT, R_AT*R_SZ(sp)909 910 911 addiusp,sp,EXCP_STACK_SIZE912 913 mfc0k0, C0_EPC914 536 LDREG k0, R_MDLO*R_SZ(sp) 537 mtlo k0 538 LDREG k0, R_MDHI*R_SZ(sp) 539 LDREG a2, R_A2*R_SZ(sp) 540 mthi k0 541 LDREG a3, R_A3*R_SZ(sp) 542 LDREG t0, R_T0*R_SZ(sp) 543 LDREG t1, R_T1*R_SZ(sp) 544 LDREG t2, R_T2*R_SZ(sp) 545 LDREG t3, R_T3*R_SZ(sp) 546 LDREG t4, R_T4*R_SZ(sp) 547 LDREG t5, R_T5*R_SZ(sp) 548 LDREG t6, R_T6*R_SZ(sp) 549 LDREG t7, R_T7*R_SZ(sp) 550 LDREG t8, R_T8*R_SZ(sp) 551 LDREG t9, R_T9*R_SZ(sp) 552 LDREG gp, R_GP*R_SZ(sp) 553 LDREG fp, R_FP*R_SZ(sp) 554 LDREG ra, R_RA*R_SZ(sp) 555 LDREG a0, R_A0*R_SZ(sp) 556 LDREG a1, R_A1*R_SZ(sp) 557 LDREG v1, R_V1*R_SZ(sp) 558 LDREG v0, R_V0*R_SZ(sp) 559 .set noat 560 LDREG AT, R_AT*R_SZ(sp) 561 .set at 562 563 ADDIU sp,sp,EXCP_STACK_SIZE 564 565 MFC0 k0, C0_EPC 566 915 567 rfe /* Might not need to do RFE here... */ 916 jk0917 568 j k0 569 nop 918 570 919 571 .set reorder 920 572 ENDFRAME(_ISR_Handler) 921 573 922 #else923 924 #error "__mips is not set to 1 or 3 "925 926 #endif927 928 574 FRAME(mips_break,sp,0,ra) 929 575 #if 1 930 931 576 break 0x0 577 j mips_break 932 578 #else 933 934 #endif 935 579 j ra 580 #endif 581 nop 936 582 ENDFRAME(mips_break) 937 583
Note: See TracChangeset
for help on using the changeset viewer.