@ -58,6 +58,50 @@
* /
# include " F r e e R T O S C o n f i g . h "
# include " x p a r a m e t e r s . h "
/ * The c o n t e x t i s o v e r s i z e d t o a l l o w f u n c t i o n s c a l l e d f r o m t h e I S R t o w r i t e
back i n t o t h e c a l l e r s t a c k . * /
# if X P A R _ M I C R O B L A Z E _ 0 _ U S E _ F P U = = 1
# define p o r t C O N T E X T _ S I Z E 1 3 6
# else
# define p o r t C O N T E X T _ S I Z E 1 3 2
# endif
/* Offsets from the stack pointer at which saved registers are placed. */
# define p o r t R 3 1 _ O F F S E T 4
# define p o r t R 3 0 _ O F F S E T 8
# define p o r t R 2 9 _ O F F S E T 1 2
# define p o r t R 2 8 _ O F F S E T 1 6
# define p o r t R 2 7 _ O F F S E T 2 0
# define p o r t R 2 6 _ O F F S E T 2 4
# define p o r t R 2 5 _ O F F S E T 2 8
# define p o r t R 2 4 _ O F F S E T 3 2
# define p o r t R 2 3 _ O F F S E T 3 6
# define p o r t R 2 2 _ O F F S E T 4 0
# define p o r t R 2 1 _ O F F S E T 4 4
# define p o r t R 2 0 _ O F F S E T 4 8
# define p o r t R 1 9 _ O F F S E T 5 2
# define p o r t R 1 8 _ O F F S E T 5 6
# define p o r t R 1 7 _ O F F S E T 6 0
# define p o r t R 1 6 _ O F F S E T 6 4
# define p o r t R 1 5 _ O F F S E T 6 8
# define p o r t R 1 4 _ O F F S E T 7 2
# define p o r t R 1 3 _ O F F S E T 7 6
# define p o r t R 1 2 _ O F F S E T 8 0
# define p o r t R 1 1 _ O F F S E T 8 4
# define p o r t R 1 0 _ O F F S E T 8 8
# define p o r t R 9 _ O F F S E T 9 2
# define p o r t R 8 _ O F F S E T 9 6
# define p o r t R 7 _ O F F S E T 1 0 0
# define p o r t R 6 _ O F F S E T 1 0 4
# define p o r t R 5 _ O F F S E T 1 0 8
# define p o r t R 4 _ O F F S E T 1 1 2
# define p o r t R 3 _ O F F S E T 1 1 6
# define p o r t R 2 _ O F F S E T 1 2 0
# define p o r t C R I T I C A L _ N E S T I N G _ O F F S E T 1 2 4
# define p o r t M S R _ O F F S E T 1 2 8
# define p o r t F S R _ O F F S E T 1 3 2
.extern pxCurrentTCB
.extern XIntc_DeviceInterruptHandler
@ -73,47 +117,53 @@
.macro portSAVE_CONTEXT
/* Make room for the context on the stack. */
addik r1 , r1 , - 1 3 2
/* Save r31 so it can then be used as a temporary. */
swi r31 , r1 , 4
/* Copy the msr into r31 - this is stacked later. */
mfs r31 , r m s r
addik r1 , r1 , - p o r t C O N T E X T _ S I Z E
/* Stack general registers. */
swi r30 , r1 , 1 2
swi r29 , r1 , 1 6
swi r28 , r1 , 2 0
swi r27 , r1 , 2 4
swi r26 , r1 , 2 8
swi r25 , r1 , 3 2
swi r24 , r1 , 3 6
swi r23 , r1 , 4 0
swi r22 , r1 , 4 4
swi r21 , r1 , 4 8
swi r20 , r1 , 5 2
swi r19 , r1 , 5 6
swi r18 , r1 , 6 0
swi r17 , r1 , 6 4
swi r16 , r1 , 6 8
swi r15 , r1 , 7 2
swi r13 , r1 , 8 0
swi r12 , r1 , 8 4
swi r11 , r1 , 8 8
swi r10 , r1 , 9 2
swi r9 , r1 , 9 6
swi r8 , r1 , 1 0 0
swi r7 , r1 , 1 0 4
swi r6 , r1 , 1 0 8
swi r5 , r1 , 1 1 2
swi r4 , r1 , 1 1 6
swi r3 , r1 , 1 2 0
swi r2 , r1 , 1 2 4
swi r31 , r1 , p o r t R 3 1 _ O F F S E T
swi r30 , r1 , p o r t R 3 0 _ O F F S E T
swi r29 , r1 , p o r t R 2 9 _ O F F S E T
swi r28 , r1 , p o r t R 2 8 _ O F F S E T
swi r27 , r1 , p o r t R 2 7 _ O F F S E T
swi r26 , r1 , p o r t R 2 6 _ O F F S E T
swi r25 , r1 , p o r t R 2 5 _ O F F S E T
swi r24 , r1 , p o r t R 2 4 _ O F F S E T
swi r23 , r1 , p o r t R 2 3 _ O F F S E T
swi r22 , r1 , p o r t R 2 2 _ O F F S E T
swi r21 , r1 , p o r t R 2 1 _ O F F S E T
swi r20 , r1 , p o r t R 2 0 _ O F F S E T
swi r19 , r1 , p o r t R 1 9 _ O F F S E T
swi r18 , r1 , p o r t R 1 8 _ O F F S E T
swi r17 , r1 , p o r t R 1 7 _ O F F S E T
swi r16 , r1 , p o r t R 1 6 _ O F F S E T
swi r15 , r1 , p o r t R 1 5 _ O F F S E T
/* R14 is saved later as it needs adjustment if a yield is performed. */
swi r13 , r1 , p o r t R 1 3 _ O F F S E T
swi r12 , r1 , p o r t R 1 2 _ O F F S E T
swi r11 , r1 , p o r t R 1 1 _ O F F S E T
swi r10 , r1 , p o r t R 1 0 _ O F F S E T
swi r9 , r1 , p o r t R 9 _ O F F S E T
swi r8 , r1 , p o r t R 8 _ O F F S E T
swi r7 , r1 , p o r t R 7 _ O F F S E T
swi r6 , r1 , p o r t R 6 _ O F F S E T
swi r5 , r1 , p o r t R 5 _ O F F S E T
swi r4 , r1 , p o r t R 4 _ O F F S E T
swi r3 , r1 , p o r t R 3 _ O F F S E T
swi r2 , r1 , p o r t R 2 _ O F F S E T
/* 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
swi r3 , r1 , 1 2 8
lwi r18 , r0 , u x C r i t i c a l N e s t i n g
swi r18 , r1 , p o r t C R I T I C A L _ N E S T I N G _ O F F S E T
/* Stack MSR. */
mfs r18 , r m s r
swi r18 , r1 , p o r t M S R _ O F F S E T
# if X P A R _ M I C R O B L A Z E _ 0 _ U S E _ F P U = = 1
/* Stack FSR. */
mfs r18 , r f s r
swi r18 , r1 , p o r t F S R _ O F F S E T
# endif
/* Save the top of stack value to the TCB. */
lwi r3 , r0 , p x C u r r e n t T C B
@ -124,60 +174,66 @@
.macro portRESTORE_CONTEXT
/* Load the top of stack value from the TCB. */
lwi r 3 , r0 , p x C u r r e n t T C B
lw r1 , r0 , r 3
lwi r 18 , r0 , p x C u r r e n t T C B
lw r1 , r0 , r 18
/* Restore the general registers. */
lwi r31 , r1 , 4
lwi r30 , r1 , 12
lwi r29 , r1 , 16
lwi r28 , r1 , 20
lwi r27 , r1 , 24
lwi r26 , r1 , 28
lwi r25 , r1 , 32
lwi r24 , r1 , 36
lwi r23 , r1 , 40
lwi r22 , r1 , 44
lwi r21 , r1 , 48
lwi r20 , r1 , 52
lwi r19 , r1 , 56
lwi r1 8, r1 , 6 0
lwi r1 7, r1 , 6 4
lwi r1 6, r1 , 6 8
lwi r1 5, r1 , 7 2
lwi r1 4, r1 , 7 6
lwi r1 3, r1 , 8 0
lwi r1 2, r1 , 8 4
lwi r1 1, r1 , 8 8
lwi r 10, r1 , 9 2
lwi r 9, r1 , 9 6
lwi r 8, r1 , 1 0 0
lwi r 7, r1 , 1 0 4
lwi r 6, r1 , 1 0 8
lwi r 5, r1 , 1 1 2
lwi r 4, r1 , 1 1 6
lwi r2 , r1 , 12 4
lwi r31 , r1 , po r t R 3 1 _ O F F S E T
lwi r30 , r1 , po r t R 3 0 _ O F F S E T
lwi r29 , r1 , po r t R 2 9 _ O F F S E T
lwi r28 , r1 , po r t R 2 8 _ O F F S E T
lwi r27 , r1 , po r t R 2 7 _ O F F S E T
lwi r26 , r1 , po r t R 2 6 _ O F F S E T
lwi r25 , r1 , po r t R 2 5 _ O F F S E T
lwi r24 , r1 , po r t R 2 4 _ O F F S E T
lwi r23 , r1 , po r t R 2 3 _ O F F S E T
lwi r22 , r1 , po r t R 2 2 _ O F F S E T
lwi r21 , r1 , po r t R 2 1 _ O F F S E T
lwi r20 , r1 , po r t R 2 0 _ O F F S E T
lwi r19 , r1 , po r t R 1 9 _ O F F S E T
lwi r1 7, r1 , p o r t R 1 7 _ O F F S E T
lwi r1 6, r1 , p o r t R 1 6 _ O F F S E T
lwi r1 5, r1 , p o r t R 1 5 _ O F F S E T
lwi r1 4, r1 , p o r t R 1 4 _ O F F S E T
lwi r1 3, r1 , p o r t R 1 3 _ O F F S E T
lwi r1 2, r1 , p o r t R 1 2 _ O F F S E T
lwi r1 1, r1 , p o r t R 1 1 _ O F F S E T
lwi r1 0, r1 , p o r t R 1 0 _ O F F S E T
lwi r 9, r1 , p o r t R 9 _ O F F S E T
lwi r 8, r1 , p o r t R 8 _ O F F S E T
lwi r 7, r1 , p o r t R 7 _ O F F S E T
lwi r 6, r1 , p o r t R 6 _ O F F S E T
lwi r 5, r1 , p o r t R 5 _ O F F S E T
lwi r 4, r1 , p o r t R 4 _ O F F S E T
lwi r 3, r1 , p o r t R 3 _ O F F S E T
lwi r2 , r1 , po r t R 2 _ O F F S E T
/* Reload the rmsr from the stack. */
lwi r3 , r1 , 8
mts r m s r , r3
lwi r18 , r1 , p o r t M S R _ O F F S E T
mts r m s r , r18
# if X P A R _ M I C R O B L A Z E _ 0 _ U S E _ F P U = = 1
/* Reload the FSR from the stack. */
lwi r18 , r1 , p o r t F S R _ O F F S E T
mts r f s r , r18
# endif
/* Load the critical nesting value. */
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
lwi r 18, r1 , p o r t C R I T I C A L _ N E S T I N G _ O F F S E T
swi r 18 , r0 , u x C r i t i c a l N e s t i n g
/ * 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
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 r 3, r3 , 0
bnei r 3 , e x i t _ f r o m _ y i e l d
xori r 18, r18 , 0
bnei r 18 , e x i t _ f r o m _ y i e l d
/ * 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
/ * r18 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 r 3, r1 , 1 2 0
lwi r 18, r1 , p o r t R 1 8 _ O F F S E T
/* Remove the stack frame. */
addik r1 , r1 , 13 2
addik r1 , r1 , po r t C O N T E X T _ S I Z E
/ * 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. * /
@ -186,35 +242,33 @@
.endm
.text
.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 . * /
.text
.align 2
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
/ * r18 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 r 3, r1 , 1 2 0
lwi r 18, r1 , p o r t R 1 8 _ O F F S E T
/* Remove the stack frame. */
addik r1 , r1 , 13 2
addik r1 , r1 , po r t C O N T E X T _ S I Z E
/* Return to the task. */
rtsd r14 , 0
or r0 , r0 , r0
.text
.align 2
_interrupt_handler :
portSAVE_ C O N T E X T
/* Stack msr. */
swi r31 , r1 , 8
/* Stack the return address. */
swi r14 , r1 , 76
swi r14 , r1 , p o r t R 1 4 _ O F F S E T
/ * Switch t o t h e I S R s t a c k . T h e p u l I S R S t a c k v a l u e h a s a l r e a d y b e e n s e t t o
leave s p a c e f o r t h e c a l l e r f u n c t i o n t o w r i t e b a c k i n t o t h e s t a c k o f t h i s
@ -232,17 +286,16 @@ _interrupt_handler:
portRESTORE_ C O N T E X T
.text
.align 2
VPortYieldASM :
portSAVE_ C O N T E X T
/* Stack msr. */
swi r31 , r1 , 8
/ * 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
swi r14 , r1 , 76
swi r14 , r1 , po r t R 1 4 _ O F F S E T
/* Switch to use the ISR stack. */
lwi r1 , r0 , p u l I S R S t a c k
@ -254,6 +307,8 @@ VPortYieldASM:
/* Restore the context of the next task scheduled to execute. */
portRESTORE_ C O N T E X T
.text
.align 2
vPortStartFirstTask :
portRESTORE_ C O N T E X T