trapIntrDMA: lui v0,_hi(sectbase(.data)) lw v0,_lo(sectbase(.data))(v0) addiu sp,sp,-48 sw ra,40(sp) sw s5,36(sp) sw s4,32(sp) sw s3,28(sp) sw s2,24(sp) sw s1,20(sp) sw s0,16(sp) lw v0,0(v0) nop srl v0,v0,24 andi s1,v0,$007F beqz s1,text_128 nop li s4,1 lui s3,$00FF ori s3,s3,$FFFF lui s5,_hi(data_4) addiu s5,s5,_lo(data_4) text_A0: beqz s1,text_104 move s0,zero move s2,s5 text_AC: slti v0,s0,7 beqz v0,text_104 andi v0,s1,$0001 beqz v0,text_F4 addiu v0,s0,24 lui a0,_hi(sectbase(.data)) lw a0,_lo(sectbase(.data))(a0) sllv v0,s4,v0 lw v1,0(a0) or v0,v0,s3 and v1,v1,v0 sw v1,0(a0) lw v0,0(s2) nop beqz v0,text_F4 nop jalr ra,v0 nop text_F4: addiu s2,s2,4 srl s1,s1,1 bnez s1,text_AC addiu s0,s0,1 text_104: lui v0,_hi(sectbase(.data)) lw v0,_lo(sectbase(.data))(v0) nop lw v0,0(v0) nop srl v0,v0,24 andi s1,v0,$007F bnez s1,text_A0 nop text_128: lui a1,_hi(sectbase(.data)) lw a1,_lo(sectbase(.data))(a1) nop lw v0,0(a1) lui v1,$FF00 and v0,v0,v1 lui v1,$8000 beq v0,v1,text_160 nop lw v0,0(a1) nop andi v0,v0,$8000 beqz v0,text_1A8 nop text_160: lui a0,_hi(sectbase(.rdata)) addiu a0,a0,_lo(sectbase(.rdata)) lw a1,0(a1) jal printf move s0,zero text_174: lui a0,_hi(rdata_1C) addiu a0,a0,_lo(rdata_1C) move a1,s0 lui v0,_hi(data_24) lw v0,_lo(data_24)(v0) sll v1,s0,4 addu v1,v1,v0 lw a2,0(v1) jal printf addiu s0,s0,1 slti v0,s0,7 bnez v0,text_174 nop text_1A8: lw ra,40(sp) lw s5,36(sp) lw s4,32(sp) lw s3,28(sp) lw s2,24(sp) lw s1,20(sp) lw s0,16(sp) jr ra addiu sp,sp,48 |
static volatile u_long *dicr = (void *)0x1f8010f4; static void (*cbIntrDMA[8])(); typedef struct { u_long madr; u_long bcr; u_long chcr; long pad; } DMA; static DMA *dma = (void *)0x1f801080; static void trapIntrDMA() { int i; u_long mask; while(mask = (*dicr >> 24) & 0x7f) { i = 0; while(mask && i<7) { if(mask & 1) { *dicr &= (1 << (24 + i)) | 0xffffff; if(cbIntrDMA[i]) cbIntrDMA[i](); } i++; mask >>= 1; } } if(((*dicr & 0xff000000) == 0x80000000) || (*dicr & 0x8000)) { printf("DMA bus error: code=%08x\n", *dicr); for(i=0; i<7; i++) printf("MADR[%d]=%08x\n", i, dma[i].madr); } } |
trapIntrDMA: lw $2,dicr subu $sp,$sp,48 sw $31,40($sp) sw $21,36($sp) sw $20,32($sp) sw $19,28($sp) sw $18,24($sp) sw $17,20($sp) sw $16,16($sp) lw $2,0($2) nop srl $2,$2,24 andi $17,$2,0x007f beq $17,$0,$L3 nop li $20,0x00000001 li $19,0x00ff0000 ori $19,$19,0xffff la $21,cbIntrDMA $L4: beq $17,$0,$L2 move $16,$0 move $18,$21 $L11: slt $2,$16,7 beq $2,$0,$L2 andi $2,$17,0x0001 beq $2,$0,$L9 addu $2,$16,24 lw $4,dicr sll $2,$20,$2 lw $3,0($4) or $2,$2,$19 and $3,$3,$2 sw $3,0($4) lw $2,0($18) nop beq $2,$0,$L9 nop jal $31,$2 nop $L9: addu $18,$18,4 srl $17,$17,1 bne $17,$0,$L11 addu $16,$16,1 $L2: lw $2,dicr nop lw $2,0($2) nop srl $2,$2,24 andi $17,$2,0x007f bne $17,$0,$L4 nop $L3: lw $5,dicr nop lw $2,0($5) li $3,0xff000000 and $2,$2,$3 li $3,0x80000000 beq $2,$3,$L14 nop lw $2,0($5) nop andi $2,$2,0x8000 beq $2,$0,$L13 nop $L14: la $4,$LC0 lw $5,0($5) jal printf move $16,$0 $L18: la $4,$LC1 move $5,$16 lw $2,dma sll $3,$16,4 addu $3,$3,$2 lw $6,0($3) jal printf addu $16,$16,1 slt $2,$16,7 bne $2,$0,$L18 nop $L13: lw $31,40($sp) lw $21,36($sp) lw $20,32($sp) lw $19,28($sp) lw $18,24($sp) lw $17,20($sp) lw $16,16($sp) j $31 addu $sp,$sp,48 |