xref: /nrf52832-nimble/rt-thread/libcpu/v850/70f34/context_iar.asm (revision 104654410c56c573564690304ae786df310c91fc)
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