1*10465441SEvalZero.set noat 2*10465441SEvalZero 3*10465441SEvalZero.globl .Lexception_exit 4*10465441SEvalZero 5*10465441SEvalZero.section .exceptions.exit.label 6*10465441SEvalZero.Lexception_exit: 7*10465441SEvalZero.section .exceptions.exit, "xa" 8*10465441SEvalZero ldw r5, 68(sp) 9*10465441SEvalZero 10*10465441SEvalZero /* get exception back */ 11*10465441SEvalZero ldw ea, 72(sp) 12*10465441SEvalZero 13*10465441SEvalZero /* if(rt_thread_switch_interrupt_flag == 0) goto no_need_context */ 14*10465441SEvalZero ldw r4,%gprel(rt_thread_switch_interrupt_flag)(gp) 15*10465441SEvalZero beq r4,zero,no_need_context 16*10465441SEvalZero 17*10465441SEvalZeroneed_context: 18*10465441SEvalZero movia ea, rt_hw_context_switch_interrupt_do 19*10465441SEvalZero /* disable interrupt */ 20*10465441SEvalZero mov r5, zero 21*10465441SEvalZero 22*10465441SEvalZerono_need_context: 23*10465441SEvalZero ldw ra, 0(sp) 24*10465441SEvalZero 25*10465441SEvalZero wrctl estatus, r5 26*10465441SEvalZero 27*10465441SEvalZero /* 28*10465441SEvalZero * Leave a gap in the stack frame at 4(sp) for the muldiv handler to 29*10465441SEvalZero * store zero into. 30*10465441SEvalZero */ 31*10465441SEvalZero 32*10465441SEvalZero ldw r1, 8(sp) 33*10465441SEvalZero ldw r2, 12(sp) 34*10465441SEvalZero ldw r3, 16(sp) 35*10465441SEvalZero ldw r4, 20(sp) 36*10465441SEvalZero ldw r5, 24(sp) 37*10465441SEvalZero ldw r6, 28(sp) 38*10465441SEvalZero ldw r7, 32(sp) 39*10465441SEvalZero ldw r8, 36(sp) 40*10465441SEvalZero ldw r9, 40(sp) 41*10465441SEvalZero ldw r10, 44(sp) 42*10465441SEvalZero ldw r11, 48(sp) 43*10465441SEvalZero ldw r12, 52(sp) 44*10465441SEvalZero ldw r13, 56(sp) 45*10465441SEvalZero ldw r14, 60(sp) 46*10465441SEvalZero ldw r15, 64(sp) 47*10465441SEvalZero 48*10465441SEvalZero addi sp, sp, 76 49*10465441SEvalZero 50*10465441SEvalZero eret 51*10465441SEvalZero 52