@ -11,6 +11,29 @@
# include < z e p h y r / a r c h / c p u . h >
# include < z e p h y r / a r c h / c p u . h >
# include " i n t c _ c l i c . h "
# include " i n t c _ c l i c . h "
# ifdef C O N F I G _ 6 4 B I T
/* register-wide load/store based on ld/sd (XLEN = 64) */
.macro lr, r d , m e m
ld \ r d , \ m e m
.endm
.macro sr, r s , m e m
sd \ r s , \ m e m
.endm
# else
/* register-wide load/store based on lw/sw (XLEN = 32) */
.macro lr, r d , m e m
lw \ r d , \ m e m
.endm
.macro sr, r s , m e m
sw \ r s , \ m e m
.endm
# endif
GTEXT( _ _ s o c _ h a n d l e _ i r q )
GTEXT( _ _ s o c _ h a n d l e _ i r q )
/ *
/ *
@ -36,7 +59,7 @@ GTEXT(sys_trace_isr_exit)
* /
* /
SECTION_ F U N C ( e x c e p t i o n . o t h e r , _ _ s o c _ h a n d l e _ a l l _ i r q s )
SECTION_ F U N C ( e x c e p t i o n . o t h e r , _ _ s o c _ h a n d l e _ a l l _ i r q s )
addi s p , s p , - 1 6
addi s p , s p , - 1 6
sw r a , 0 ( s p )
sr r a , 0 ( s p )
/ * Read a n d c l e a r m n x t i t o g e t h i g h e s t c u r r e n t i n t e r r u p t a n d e n a b l e i n t e r r u p t s . W i l l r e t u r n
/ * Read a n d c l e a r m n x t i t o g e t h i g h e s t c u r r e n t i n t e r r u p t a n d e n a b l e i n t e r r u p t s . W i l l r e t u r n
* original i n t e r r u p t i f n o o t h e r s a p p e a r . * /
* original i n t e r r u p t i f n o o t h e r s a p p e a r . * /
@ -58,10 +81,10 @@ irq_loop:
add t 0 , t 0 , a0
add t 0 , t 0 , a0
/* Load argument in a0 register */
/* Load argument in a0 register */
lw a0 , 0 ( t 0 )
lr a0 , 0 ( t 0 )
/* Load ISR function address in register t1 */
/* Load ISR function address in register t1 */
lw t 1 , R V _ R E G S I Z E ( t 0 )
lr t 1 , R V _ R E G S I Z E ( t 0 )
/* Call ISR function */
/* Call ISR function */
jalr r a , t 1 , 0
jalr r a , t 1 , 0
@ -75,6 +98,6 @@ irq_loop:
bnez a0 , i r q _ l o o p
bnez a0 , i r q _ l o o p
irq_done :
irq_done :
lw r a , 0 ( s p )
lr r a , 0 ( s p )
addi s p , s p , 1 6
addi s p , s p , 1 6
ret
ret