@ -63,19 +63,22 @@
.extern uxCriticalNesting
.extern uxCriticalNesting
.extern pulISRStack
.extern pulISRStack
/* .global vPortFreeRTOSInterruptHandler */
.global _interrupt_handler
.global _interrupt_handler
.global VPortYieldASM
.global VPortYieldASM
.global v StartFirstTask
.global v Port StartFirstTask
.macro portSAVE_CONTEXT
.macro portSAVE_CONTEXT
/* Make room for the context on the stack. */
/* Make room for the context on the stack. */
addik r1 , r1 , - 1 3 2
addik r1 , r1 , - 1 3 2
/* Save r31 so it can then be used. */
/* Save r31 so it can then be used as a temporary. */
swi r31 , r1 , 4
swi r31 , r1 , 4
/* Copy the msr into r31 - this is stacked later. */
/* Copy the msr into r31 - this is stacked later. */
mfs r31 , r m s r
mfs r31 , r m s r
/* Stack general registers. */
/* Stack general registers. */
swi r30 , r1 , 1 2
swi r30 , r1 , 1 2
swi r29 , r1 , 1 6
swi r29 , r1 , 1 6
@ -105,9 +108,11 @@
swi r4 , r1 , 1 1 6
swi r4 , r1 , 1 1 6
swi r3 , r1 , 1 2 0
swi r3 , r1 , 1 2 0
swi r2 , r1 , 1 2 4
swi r2 , r1 , 1 2 4
/* Stack the critical section nesting value. */
/* Stack the critical section nesting value. */
lwi r3 , r0 , u x C r i t i c a l N e s t i n g
lwi r3 , r0 , u x C r i t i c a l N e s t i n g
swi r3 , r1 , 1 2 8
swi r3 , r1 , 1 2 8
/* Save the top of stack value to the TCB. */
/* Save the top of stack value to the TCB. */
lwi r3 , r0 , p x C u r r e n t T C B
lwi r3 , r0 , p x C u r r e n t T C B
sw r1 , r0 , r3
sw r1 , r0 , r3
@ -115,9 +120,11 @@
.endm
.endm
.macro portRESTORE_CONTEXT
.macro portRESTORE_CONTEXT
/* Load the top of stack value from the TCB. */
/* Load the top of stack value from the TCB. */
lwi r3 , r0 , p x C u r r e n t T C B
lwi r3 , r0 , p x C u r r e n t T C B
lw r1 , r0 , r3
lw r1 , r0 , r3
/* Restore the general registers. */
/* Restore the general registers. */
lwi r31 , r1 , 4
lwi r31 , r1 , 4
lwi r30 , r1 , 1 2
lwi r30 , r1 , 1 2
@ -149,38 +156,30 @@
lwi r4 , r1 , 1 1 6
lwi r4 , r1 , 1 1 6
lwi r2 , r1 , 1 2 4
lwi r2 , r1 , 1 2 4
/* Reload the rmsr from the stack. */
lwi r3 , r1 , 8
mts r m s r , r3
/* Load the critical nesting value. */
/* Load the critical nesting value. */
lwi r3 , r1 , 1 2 8
lwi r3 , r1 , 1 2 8
swi r3 , r0 , u x C r i t i c a l N e s t i n g
swi r3 , r0 , u x C r i t i c a l N e s t i n g
/* Obtain the MSR value from the stack. */
/ * Test t h e c r i t i c a l n e s t i n g v a l u e . I f i t i s n o n z e r o t h e n t h e t a s k l a s t
lwi r3 , r1 , 8
exited t h e r u n n i n g s t a t e u s i n g a y i e l d . I f i t i s z e r o , t h e n t h e t a s k
last e x i t e d t h e r u n n i n g s t a t e t h r o u g h a n i n t e r r u p t . * /
xori r3 , r3 , 0
bnei r3 , e x i t _ f r o m _ y i e l d
/ * Are i n t e r r u p t s e n a b l e d i n t h e M S R ? I f s o r e t u r n u s i n g a n r e t u r n f r o m
/ * r3 w a s b e i n g u s e d a s a t e m p o r a r y . N o w r e s t o r e i t s t r u e v a l u e f r o m t h e
interrupt i n s t r u c t i o n t o e n s u r e i n t e r r u p t s a r e e n a b l e d o n l y o n c e t h e t a s k
stack. * /
is r u n n i n g a g a i n . * /
andi r3 , r3 , 2
beqid r3 , 3 6
or r0 , r0 , r0
/ * Reload t h e r m s r f r o m t h e s t a c k , c l e a r t h e e n a b l e i n t e r r u p t b i t i n t h e
value b e f o r e s a v i n g b a c k t o r m s r r e g i s t e r , t h e n r e t u r n e n a b l i n g i n t e r r u p t s
as w e r e t u r n . * /
lwi r3 , r1 , 8
andi r3 , r3 , ~ 2
mts r m s r , r3
lwi r3 , r1 , 1 2 0
lwi r3 , r1 , 1 2 0
addik r1 , r1 , 1 3 2
rtid r14 , 0
or r0 , r0 , r0
/ * Reload t h e r m s r f r o m t h e s t a c k , p l a c e i t i n t h e r m s r r e g i s t e r , a n d
/* Remove the stack frame. */
return w i t h o u t e n a b l i n g i n t e r r u p t s . * /
lwi r3 , r1 , 8
mts r m s r , r3
lwi r3 , r1 , 1 2 0
addik r1 , r1 , 1 3 2
addik r1 , r1 , 1 3 2
rtsd r14 , 0
/ * Return u s i n g r t i d s o i n t e r r u p t s a r e r e - e n a b l e d a s t h i s f u n c t i o n i s
exited. * /
rtid r14 , 0
or r0 , r0 , r0
or r0 , r0 , r0
.endm
.endm
@ -188,41 +187,68 @@
.text
.text
.align 2
.align 2
/ * This f u n c t i o n i s u s e d t o e x i t p o r t R E S T O R E _ C O N T E X T ( ) i f t h e t a s k b e i n g
returned t o l a s t l e f t t h e R u n n i n g s t a t e b y c a l l i n g t a s k Y I E L D ( ) ( r a t h e r t h a n
being p r e e m p t e d b y a n i n t e r r u p t . * /
exit_from_yield :
/ * r3 w a s b e i n g u s e d a s a t e m p o r a r y . N o w r e s t o r e i t s t r u e v a l u e f r o m t h e
stack. * /
lwi r3 , r1 , 1 2 0
/* Remove the stack frame. */
addik r1 , r1 , 1 3 2
/* Return to the task. */
rtsd r14 , 0
or r0 , r0 , r0
/*vPortFreeRTOSInterruptHandler:*/
_interrupt_handler :
_interrupt_handler :
portSAVE_ C O N T E X T
portSAVE_ C O N T E X T
/* Entered via an interrupt so interrupts must be enabled in msr. */
ori r31 , r31 , 2
/* Stack msr. */
/* Stack msr. */
swi r31 , r1 , 8
swi r31 , r1 , 8
/ * Stack t h e r e t u r n a d d r e s s . A s w e e n t e r e d v i a a n i n t e r r u p t w e d o
not n e e d t o m o d i f y t h e r e t u r n a d d r e s s p r i o r t o s t a c k i n g . * /
/* Stack the return address. * /
swi r14 , r1 , 7 6
swi r14 , r1 , 7 6
/* Now switch to use the ISR stack. */
lwi r3 , r0 , p u l I S R S t a c k
/* Switch to the ISR stack. */
add r1 , r3 , r0
lwi r1 , r0 , p u l I S R S t a c k
/* Execute any pending interrupts. */
bralid r15 , X I n t c _ D e v i c e I n t e r r u p t H a n d l e r
bralid r15 , X I n t c _ D e v i c e I n t e r r u p t H a n d l e r
or r0 , r0 , r0
or r0 , r0 , r0
/* Restore the context of the next task scheduled to execute. */
portRESTORE_ C O N T E X T
portRESTORE_ C O N T E X T
VPortYieldASM :
VPortYieldASM :
portSAVE_ C O N T E X T
portSAVE_ C O N T E X T
/* Stack msr. */
/* Stack msr. */
swi r31 , r1 , 8
swi r31 , r1 , 8
/ * Modify t h e r e t u r n a d d r e s s s o w e r e t u r n t o t h e i n s t r u c t i o n a f t e r t h e
exception. * /
/ * Modify t h e r e t u r n a d d r e s s s o a r e t u r n i s d o n e t o t h e i n s t r u c t i o n a f t e r
the c a l l t o V P o r t Y i e l d A S M . * /
addi r14 , r14 , 8
addi r14 , r14 , 8
swi r14 , r1 , 7 6
swi r14 , r1 , 7 6
/* Now switch to use the ISR stack. */
lwi r3 , r0 , p u l I S R S t a c k
/* Switch to use the ISR stack. */
add r1 , r3 , r0
lwi r1 , r0 , p u l I S R S t a c k
/* Select the next task to execute. */
bralid r15 , v T a s k S w i t c h C o n t e x t
bralid r15 , v T a s k S w i t c h C o n t e x t
or r0 , r0 , r0
or r0 , r0 , r0
/* Restore the context of the next task scheduled to execute. */
portRESTORE_ C O N T E X T
portRESTORE_ C O N T E X T
vStartFirstTask :
vPortStartFirstTask :
portRESTORE_ C O N T E X T
portRESTORE_ C O N T E X T