1*10465441SEvalZero#include "macdefs.inc" 2*10465441SEvalZero 3*10465441SEvalZero name OS_Core 4*10465441SEvalZero 5*10465441SEvalZero COMMON INTVEC:CODE 6*10465441SEvalZero 7*10465441SEvalZero;******************************************************************** 8*10465441SEvalZero; 9*10465441SEvalZero; function: 10*10465441SEvalZero; description: Trap 0x10 vector used for context switch 11*10465441SEvalZero; Right now, all TRAPs to $1x are trated the same way 12*10465441SEvalZero; 13*10465441SEvalZero org 50h 14*10465441SEvalZero jr OSCtxSW 15*10465441SEvalZero 16*10465441SEvalZero 17*10465441SEvalZero;******************************************************************** 18*10465441SEvalZero; 19*10465441SEvalZero; function: 20*10465441SEvalZero; description: Timer 40 compare match interrupt used for system 21*10465441SEvalZero; tick interrupt 22*10465441SEvalZero; 23*10465441SEvalZero org 0x220 24*10465441SEvalZero jr OSTickIntr 25*10465441SEvalZero 26*10465441SEvalZero org 0x0520 27*10465441SEvalZero jr uarta1_int_r 28*10465441SEvalZero 29*10465441SEvalZero RSEG CODE(1) 30*10465441SEvalZero 31*10465441SEvalZero EXTERN rt_thread_switch_interrupt_flag 32*10465441SEvalZero EXTERN rt_interrupt_from_thread 33*10465441SEvalZero EXTERN rt_interrupt_to_thread 34*10465441SEvalZero 35*10465441SEvalZero EXTERN rt_interrupt_enter 36*10465441SEvalZero EXTERN rt_interrupt_leave 37*10465441SEvalZero EXTERN rt_tick_increase 38*10465441SEvalZero EXTERN uarta1_receive_handler 39*10465441SEvalZero 40*10465441SEvalZero PUBLIC rt_hw_interrupt_disable 41*10465441SEvalZero PUBLIC rt_hw_interrupt_enable 42*10465441SEvalZero PUBLIC rt_hw_context_switch_to 43*10465441SEvalZero PUBLIC OSCtxSW 44*10465441SEvalZero PUBLIC OS_Restore_CPU_Context 45*10465441SEvalZero 46*10465441SEvalZerort_hw_interrupt_disable: 47*10465441SEvalZero stsr psw, r1 48*10465441SEvalZero di 49*10465441SEvalZero jmp [lp] 50*10465441SEvalZero 51*10465441SEvalZerort_hw_interrupt_enable: 52*10465441SEvalZero ldsr r1, psw 53*10465441SEvalZero jmp [lp] 54*10465441SEvalZero 55*10465441SEvalZeroOS_Restore_CPU_Context: 56*10465441SEvalZero mov sp, ep 57*10465441SEvalZero sld.w 4[ep], r2 58*10465441SEvalZero sld.w 8[ep], r5 59*10465441SEvalZero sld.w 12[ep],r6 60*10465441SEvalZero sld.w 16[ep],r7 61*10465441SEvalZero sld.w 20[ep],r8 62*10465441SEvalZero sld.w 24[ep],r9 63*10465441SEvalZero sld.w 28[ep],r10 64*10465441SEvalZero sld.w 32[ep],r11 65*10465441SEvalZero sld.w 36[ep],r12 66*10465441SEvalZero sld.w 40[ep],r13 67*10465441SEvalZero sld.w 44[ep],r14 68*10465441SEvalZero sld.w 48[ep],r15 69*10465441SEvalZero sld.w 52[ep],r16 70*10465441SEvalZero 71*10465441SEvalZero ;See what was the latest interruption (trap or interrupt) 72*10465441SEvalZero stsr ecr, r17 ;Move ecr to r17 73*10465441SEvalZero mov 0x050,r1 74*10465441SEvalZero cmp r1, r17 ;If latest break was due to TRAP, set EP 75*10465441SEvalZero be _SetEP 76*10465441SEvalZero 77*10465441SEvalZero_ClrEP: 78*10465441SEvalZero mov 0x20, r17 ;Set only ID 79*10465441SEvalZero ldsr r17, psw 80*10465441SEvalZero 81*10465441SEvalZero ;Restore caller address 82*10465441SEvalZero sld.w 56[ep], r1 83*10465441SEvalZero ldsr r1, EIPC 84*10465441SEvalZero ;Restore PSW 85*10465441SEvalZero sld.w 60[ep], r1 86*10465441SEvalZero andi 0xffdf,r1,r1 87*10465441SEvalZero ldsr r1, EIPSW 88*10465441SEvalZero sld.w 0[ep], r1 89*10465441SEvalZero dispose (8+(4*14)),{r23,r24,r25,r26,r27,r28,r29,r30,r31} 90*10465441SEvalZero 91*10465441SEvalZero ;Return from interrupt starts new task! 92*10465441SEvalZero reti 93*10465441SEvalZero 94*10465441SEvalZero_SetEP: 95*10465441SEvalZero mov 0x60, r17 ;Set both EIPC and ID bits 96*10465441SEvalZero ldsr r17, psw 97*10465441SEvalZero 98*10465441SEvalZero ;Restore caller address 99*10465441SEvalZero sld.w 56[ep], r1 100*10465441SEvalZero ldsr r1, EIPC 101*10465441SEvalZero ;Restore PSW 102*10465441SEvalZero sld.w 60[ep], r1 103*10465441SEvalZero andi 0xffdf,r1,r1 104*10465441SEvalZero ldsr r1, EIPSW 105*10465441SEvalZero sld.w 0[ep], r1 106*10465441SEvalZero dispose (8+(4*14)),{r23,r24,r25,r26,r27,r28,r29,r30,r31} 107*10465441SEvalZero 108*10465441SEvalZero ;Return from interrupt starts new task! 109*10465441SEvalZero reti 110*10465441SEvalZero 111*10465441SEvalZero//rseg CODE:CODE 112*10465441SEvalZero//public rt_hw_context_switch_to 113*10465441SEvalZerort_hw_context_switch_to: 114*10465441SEvalZero ;Load stack pointer of the task to run 115*10465441SEvalZero ld.w 0[r1], sp ;load sp from struct 116*10465441SEvalZero 117*10465441SEvalZero ;Restore all Processor registers from stack and return from interrupt 118*10465441SEvalZero jr OS_Restore_CPU_Context 119*10465441SEvalZero 120*10465441SEvalZeroOSCtxSW: 121*10465441SEvalZero SAVE_CPU_CTX ;Save all CPU registers 122*10465441SEvalZero 123*10465441SEvalZero mov rt_interrupt_from_thread, r21 124*10465441SEvalZero ld.w 0[r21], r21 125*10465441SEvalZero st.w sp, 0[r21] 126*10465441SEvalZero 127*10465441SEvalZero mov rt_interrupt_to_thread, r1 128*10465441SEvalZero ld.w 0[r1], r1 129*10465441SEvalZero ld.w 0[r1], sp 130*10465441SEvalZero 131*10465441SEvalZero ;Restore all Processor registers from stack and return from interrupt 132*10465441SEvalZero jr OS_Restore_CPU_Context 133*10465441SEvalZero 134*10465441SEvalZerort_hw_context_switch_interrupt_do: 135*10465441SEvalZero mov rt_thread_switch_interrupt_flag, r8 136*10465441SEvalZero mov 0, r9 137*10465441SEvalZero st.b r9, 0[r8] 138*10465441SEvalZero 139*10465441SEvalZero mov rt_interrupt_from_thread, r21 140*10465441SEvalZero ld.w 0[r21], r21 141*10465441SEvalZero st.w sp, 0[r21] 142*10465441SEvalZero 143*10465441SEvalZero mov rt_interrupt_to_thread, r1 144*10465441SEvalZero ld.w 0[r1], r1 145*10465441SEvalZero ld.w 0[r1], sp 146*10465441SEvalZero jr OS_Restore_CPU_Context 147*10465441SEvalZero 148*10465441SEvalZeroOSTickIntr: 149*10465441SEvalZero SAVE_CPU_CTX ;Save current task's registers 150*10465441SEvalZero jarl rt_interrupt_enter,lp 151*10465441SEvalZero jarl rt_tick_increase,lp 152*10465441SEvalZero jarl rt_interrupt_leave,lp 153*10465441SEvalZero 154*10465441SEvalZero mov rt_thread_switch_interrupt_flag, r8 155*10465441SEvalZero ld.w 0[r8],r9 156*10465441SEvalZero cmp 1, r9 157*10465441SEvalZero be rt_hw_context_switch_interrupt_do 158*10465441SEvalZero 159*10465441SEvalZero jr OS_Restore_CPU_Context 160*10465441SEvalZero 161*10465441SEvalZerouarta1_int_r: 162*10465441SEvalZero SAVE_CPU_CTX ;Save current task's registers 163*10465441SEvalZero jarl rt_interrupt_enter,lp 164*10465441SEvalZero jarl uarta1_receive_handler,lp 165*10465441SEvalZero jarl rt_interrupt_leave,lp 166*10465441SEvalZero 167*10465441SEvalZero mov rt_thread_switch_interrupt_flag, r8 168*10465441SEvalZero ld.w 0[r8],r9 169*10465441SEvalZero cmp 1, r9 170*10465441SEvalZero be rt_hw_context_switch_interrupt_do 171*10465441SEvalZero 172*10465441SEvalZero jr OS_Restore_CPU_Context 173*10465441SEvalZero 174*10465441SEvalZero END 175