2021-06-18 01:51:05 +10:00
# include < a s m / a s m - o f f s e t s . h >
# include < a s m / b u g . h >
# ifdef C O N F I G _ P P C _ B O O K 3 S
# include < a s m / e x c e p t i o n - 6 4 s . h >
# else
# include < a s m / e x c e p t i o n - 6 4 e . h >
# endif
# include < a s m / f e a t u r e - f i x u p s . h >
# include < a s m / h e a d - 6 4 . h >
# include < a s m / h w _ i r q . h >
# include < a s m / k u p . h >
# include < a s m / m m u . h >
# include < a s m / p p c _ a s m . h >
# include < a s m / p t r a c e . h >
.section " .toc " , " aw"
SYS_CALL_TABLE :
.tc sys_ c a l l _ t a b l e [ T C ] ,s y s _ c a l l _ t a b l e
# ifdef C O N F I G _ C O M P A T
COMPAT_SYS_CALL_TABLE :
.tc compat_ s y s _ c a l l _ t a b l e [ T C ] ,c o m p a t _ s y s _ c a l l _ t a b l e
# endif
.previous
.align 7
.macro DEBUG_SRR_VALID srr
# ifdef C O N F I G _ P P C _ R F I _ S R R _ D E B U G
.ifc \ srr,s r r
mfspr r11 ,S P R N _ S R R 0
ld r12 ,_ N I P ( r1 )
100 : tdne r11 ,r12
EMIT_ B U G _ E N T R Y 1 0 0 b ,_ _ F I L E _ _ ,_ _ L I N E _ _ ,( B U G F L A G _ W A R N I N G | B U G F L A G _ O N C E )
mfspr r11 ,S P R N _ S R R 1
ld r12 ,_ M S R ( r1 )
100 : tdne r11 ,r12
EMIT_ B U G _ E N T R Y 1 0 0 b ,_ _ F I L E _ _ ,_ _ L I N E _ _ ,( B U G F L A G _ W A R N I N G | B U G F L A G _ O N C E )
.else
mfspr r11 ,S P R N _ H S R R 0
ld r12 ,_ N I P ( r1 )
100 : tdne r11 ,r12
EMIT_ B U G _ E N T R Y 1 0 0 b ,_ _ F I L E _ _ ,_ _ L I N E _ _ ,( B U G F L A G _ W A R N I N G | B U G F L A G _ O N C E )
mfspr r11 ,S P R N _ H S R R 1
ld r12 ,_ M S R ( r1 )
100 : tdne r11 ,r12
EMIT_ B U G _ E N T R Y 1 0 0 b ,_ _ F I L E _ _ ,_ _ L I N E _ _ ,( B U G F L A G _ W A R N I N G | B U G F L A G _ O N C E )
.endif
# endif
.endm
# ifdef C O N F I G _ P P C _ B O O K 3 S
.macro system_call_vectored name t r a p n r
.globl system_ c a l l _ v e c t o r e d _ \ n a m e
system_ c a l l _ v e c t o r e d _ \ n a m e :
_ ASM_ N O K P R O B E _ S Y M B O L ( s y s t e m _ c a l l _ v e c t o r e d _ \ n a m e )
SCV_ I N T E R R U P T _ T O _ K E R N E L
mr r10 ,r1
ld r1 ,P A C A K S A V E ( r13 )
std r10 ,0 ( r1 )
std r11 ,_ N I P ( r1 )
std r12 ,_ M S R ( r1 )
std r0 ,G P R 0 ( r1 )
std r10 ,G P R 1 ( r1 )
std r2 ,G P R 2 ( r1 )
ld r2 ,P A C A T O C ( r13 )
mfcr r12
li r11 ,0
/* Can we avoid saving r3-r8 in common case? */
std r3 ,G P R 3 ( r1 )
std r4 ,G P R 4 ( r1 )
std r5 ,G P R 5 ( r1 )
std r6 ,G P R 6 ( r1 )
std r7 ,G P R 7 ( r1 )
std r8 ,G P R 8 ( r1 )
/* Zero r9-r12, this should only be required when restoring all GPRs */
std r11 ,G P R 9 ( r1 )
std r11 ,G P R 1 0 ( r1 )
std r11 ,G P R 1 1 ( r1 )
std r11 ,G P R 1 2 ( r1 )
std r9 ,G P R 1 3 ( r1 )
SAVE_ N V G P R S ( r1 )
std r11 ,_ X E R ( r1 )
std r11 ,_ L I N K ( r1 )
std r11 ,_ C T R ( r1 )
li r11 ,\ t r a p n r
std r11 ,_ T R A P ( r1 )
std r12 ,_ C C R ( r1 )
addi r10 ,r1 ,S T A C K _ F R A M E _ O V E R H E A D
ld r11 ,e x c e p t i o n _ m a r k e r @toc(r2)
std r11 ,- 1 6 ( r10 ) / * " r e g s h e r e " m a r k e r * /
BEGIN_ F T R _ S E C T I O N
HMT_ M E D I U M
END_ F T R _ S E C T I O N _ I F S E T ( C P U _ F T R _ H A S _ P P R )
/ *
* scv e n t e r s w i t h M S R [ E E ] =1 a n d i s i m m e d i a t e l y c o n s i d e r e d s o f t - m a s k e d .
* The e n t r y v e c t o r a l r e a d y s e t s P A C A I R Q S O F T M A S K t o I R Q S _ A L L _ D I S A B L E D ,
* and i n t e r r u p t s m a y b e m a s k e d a n d p e n d i n g a l r e a d y .
* system_ c a l l _ e x c e p t i o n ( ) w i l l c a l l t r a c e _ h a r d i r q s _ o f f ( ) w h i c h m e a n s
* interrupts c o u l d a l r e a d y h a v e b e e n b l o c k e d b e f o r e t r a c e _ h a r d i r q s _ o f f ,
* but t h i s i s t h e b e s t w e c a n d o .
* /
/* Calling convention has r9 = orig r0, r10 = regs */
mr r9 ,r0
bl s y s t e m _ c a l l _ e x c e p t i o n
.Lsyscall_vectored_ \ name\ ( ) _ e x i t :
2021-06-18 01:51:11 +10:00
addi r4 ,r1 ,S T A C K _ F R A M E _ O V E R H E A D
2021-06-18 01:51:05 +10:00
li r5 ,1 / * s c v * /
bl s y s c a l l _ e x i t _ p r e p a r e
2021-06-18 01:51:11 +10:00
std r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 ) / * s a v e r1 f o r r e s t a r t * /
.Lsyscall_vectored_ \ name\ ( ) _ r s t _ s t a r t :
lbz r11 ,P A C A I R Q H A P P E N E D ( r13 )
andi. r11 ,r11 ,( ~ P A C A _ I R Q _ H A R D _ D I S ) @l
bne- s y s c a l l _ v e c t o r e d _ \ n a m e \ ( ) _ r e s t a r t
li r11 ,I R Q S _ E N A B L E D
stb r11 ,P A C A I R Q S O F T M A S K ( r13 )
li r11 ,0
stb r11 ,P A C A I R Q H A P P E N E D ( r13 ) # c l e a r o u t p o s s i b l e H A R D _ D I S
2021-06-18 01:51:05 +10:00
ld r2 ,_ C C R ( r1 )
ld r4 ,_ N I P ( r1 )
ld r5 ,_ M S R ( r1 )
BEGIN_ F T R _ S E C T I O N
stdcx. r0 ,0 ,r1 / * t o c l e a r t h e r e s e r v a t i o n * /
END_ F T R _ S E C T I O N _ I F C L R ( C P U _ F T R _ S T C X _ C H E C K S _ A D D R E S S )
BEGIN_ F T R _ S E C T I O N
HMT_ M E D I U M _ L O W
END_ F T R _ S E C T I O N _ I F S E T ( C P U _ F T R _ H A S _ P P R )
cmpdi r3 ,0
bne . L s y s c a l l _ v e c t o r e d _ \ n a m e \ ( ) _ r e s t o r e _ r e g s
/* rfscv returns with LR->NIA and CTR->MSR */
mtlr r4
mtctr r5
/ * Could z e r o t h e s e a s p e r A B I , b u t w e m a y c o n s i d e r a s t r i c t e r A B I
* which p r e s e r v e s t h e s e i f l i b c i m p l e m e n t a t i o n s c a n b e n e f i t , s o
* restore t h e m f o r n o w u n t i l f u r t h e r m e a s u r e m e n t i s d o n e . * /
ld r0 ,G P R 0 ( r1 )
ld r4 ,G P R 4 ( r1 )
ld r5 ,G P R 5 ( r1 )
ld r6 ,G P R 6 ( r1 )
ld r7 ,G P R 7 ( r1 )
ld r8 ,G P R 8 ( r1 )
/* Zero volatile regs that may contain sensitive kernel data */
li r9 ,0
li r10 ,0
li r11 ,0
li r12 ,0
mtspr S P R N _ X E R ,r0
/ *
* We d o n ' t n e e d t o r e s t o r e A M R o n t h e w a y b a c k t o u s e r s p a c e f o r K U A P .
* The v a l u e o f A M R o n l y m a t t e r s w h i l e w e ' r e i n t h e k e r n e l .
* /
mtcr r2
ld r2 ,G P R 2 ( r1 )
ld r3 ,G P R 3 ( r1 )
ld r13 ,G P R 1 3 ( r1 )
ld r1 ,G P R 1 ( r1 )
RFSCV_ T O _ U S E R
b . / * p r e v e n t s p e c u l a t i v e e x e c u t i o n * /
.Lsyscall_vectored_ \ name\ ( ) _ r e s t o r e _ r e g s :
mtspr S P R N _ S R R 0 ,r4
mtspr S P R N _ S R R 1 ,r5
ld r3 ,_ C T R ( r1 )
ld r4 ,_ L I N K ( r1 )
ld r5 ,_ X E R ( r1 )
REST_ N V G P R S ( r1 )
ld r0 ,G P R 0 ( r1 )
mtcr r2
mtctr r3
mtlr r4
mtspr S P R N _ X E R ,r5
REST_ 1 0 G P R S ( 2 , r1 )
REST_ 2 G P R S ( 1 2 , r1 )
ld r1 ,G P R 1 ( r1 )
RFI_ T O _ U S E R
2021-06-18 01:51:11 +10:00
.Lsyscall_vectored_ \ name\ ( ) _ r s t _ e n d :
syscall_ v e c t o r e d _ \ n a m e \ ( ) _ r e s t a r t :
2021-06-30 17:46:19 +10:00
_ ASM_ N O K P R O B E _ S Y M B O L ( s y s c a l l _ v e c t o r e d _ \ n a m e \ ( ) _ r e s t a r t )
2021-06-18 01:51:11 +10:00
GET_ P A C A ( r13 )
ld r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 )
ld r2 ,P A C A T O C ( r13 )
ld r3 ,R E S U L T ( r1 )
addi r4 ,r1 ,S T A C K _ F R A M E _ O V E R H E A D
li r11 ,I R Q S _ A L L _ D I S A B L E D
stb r11 ,P A C A I R Q S O F T M A S K ( r13 )
bl s y s c a l l _ e x i t _ r e s t a r t
std r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 ) / * s a v e r1 f o r r e s t a r t * /
b . L s y s c a l l _ v e c t o r e d _ \ n a m e \ ( ) _ r s t _ s t a r t
2021-06-30 17:46:16 +10:00
1 :
2021-06-18 01:51:11 +10:00
2021-06-30 17:46:16 +10:00
SOFT_ M A S K _ T A B L E ( . L s y s c a l l _ v e c t o r e d _ \ n a m e \ ( ) _ r s t _ s t a r t , 1 b )
2021-06-18 01:51:11 +10:00
RESTART_ T A B L E ( . L s y s c a l l _ v e c t o r e d _ \ n a m e \ ( ) _ r s t _ s t a r t , . L s y s c a l l _ v e c t o r e d _ \ n a m e \ ( ) _ r s t _ e n d , s y s c a l l _ v e c t o r e d _ \ n a m e \ ( ) _ r e s t a r t )
2021-06-18 01:51:05 +10:00
.endm
system_ c a l l _ v e c t o r e d c o m m o n 0 x30 0 0
2021-06-18 01:51:11 +10:00
2021-06-18 01:51:05 +10:00
/ *
* We i n s t a n t i a t e a n o t h e r e n t r y c o p y f o r t h e S I G I L L v a r i a n t , w i t h T R A P =0x7ff0
* which i s t e s t e d b y s y s t e m _ c a l l _ e x c e p t i o n w h e n r0 i s - 1 ( a s s e t b y v e c t o r
* entry c o d e ) .
* /
system_ c a l l _ v e c t o r e d s i g i l l 0 x7 f f0
/ *
* Entered v i a k e r n e l r e t u r n s e t u p b y k e r n e l / s s t e p . c , m u s t m a t c h e n t r y r e g s
* /
.globl system_call_vectored_emulate
system_call_vectored_emulate :
_ ASM_ N O K P R O B E _ S Y M B O L ( s y s t e m _ c a l l _ v e c t o r e d _ e m u l a t e )
li r10 ,I R Q S _ A L L _ D I S A B L E D
stb r10 ,P A C A I R Q S O F T M A S K ( r13 )
b s y s t e m _ c a l l _ v e c t o r e d _ c o m m o n
2021-06-30 17:46:15 +10:00
# endif / * C O N F I G _ P P C _ B O O K 3 S * /
2021-06-18 01:51:05 +10:00
.balign IFETCH_ALIGN_BYTES
.globl system_call_common_real
system_call_common_real :
2021-06-30 17:46:19 +10:00
_ ASM_ N O K P R O B E _ S Y M B O L ( s y s t e m _ c a l l _ c o m m o n _ r e a l )
2021-06-18 01:51:05 +10:00
ld r10 ,P A C A K M S R ( r13 ) / * g e t M S R v a l u e f o r k e r n e l * /
mtmsrd r10
.balign IFETCH_ALIGN_BYTES
.globl system_call_common
system_call_common :
_ ASM_ N O K P R O B E _ S Y M B O L ( s y s t e m _ c a l l _ c o m m o n )
mr r10 ,r1
ld r1 ,P A C A K S A V E ( r13 )
std r10 ,0 ( r1 )
std r11 ,_ N I P ( r1 )
std r12 ,_ M S R ( r1 )
std r0 ,G P R 0 ( r1 )
std r10 ,G P R 1 ( r1 )
std r2 ,G P R 2 ( r1 )
# ifdef C O N F I G _ P P C _ F S L _ B O O K 3 E
START_ B T B _ F L U S H _ S E C T I O N
BTB_ F L U S H ( r10 )
END_ B T B _ F L U S H _ S E C T I O N
# endif
ld r2 ,P A C A T O C ( r13 )
mfcr r12
li r11 ,0
/* Can we avoid saving r3-r8 in common case? */
std r3 ,G P R 3 ( r1 )
std r4 ,G P R 4 ( r1 )
std r5 ,G P R 5 ( r1 )
std r6 ,G P R 6 ( r1 )
std r7 ,G P R 7 ( r1 )
std r8 ,G P R 8 ( r1 )
/* Zero r9-r12, this should only be required when restoring all GPRs */
std r11 ,G P R 9 ( r1 )
std r11 ,G P R 1 0 ( r1 )
std r11 ,G P R 1 1 ( r1 )
std r11 ,G P R 1 2 ( r1 )
std r9 ,G P R 1 3 ( r1 )
SAVE_ N V G P R S ( r1 )
std r11 ,_ X E R ( r1 )
std r11 ,_ C T R ( r1 )
mflr r10
/ *
* This c l e a r s C R 0 . S O ( b i t 2 8 ) , w h i c h i s t h e e r r o r i n d i c a t i o n o n
* return f r o m t h i s s y s t e m c a l l .
* /
rldimi r12 ,r11 ,2 8 ,( 6 3 - 2 8 )
li r11 ,0 x c00
std r10 ,_ L I N K ( r1 )
std r11 ,_ T R A P ( r1 )
std r12 ,_ C C R ( r1 )
addi r10 ,r1 ,S T A C K _ F R A M E _ O V E R H E A D
ld r11 ,e x c e p t i o n _ m a r k e r @toc(r2)
std r11 ,- 1 6 ( r10 ) / * " r e g s h e r e " m a r k e r * /
# ifdef C O N F I G _ P P C _ B O O K 3 S
li r11 ,1
stb r11 ,P A C A S R R _ V A L I D ( r13 )
# endif
/ *
* We a l w a y s e n t e r k e r n e l f r o m u s e r s p a c e w i t h i r q s o f t - m a s k e n a b l e d a n d
* nothing p e n d i n g . s y s t e m _ c a l l _ e x c e p t i o n ( ) w i l l c a l l
* trace_ h a r d i r q s _ o f f ( ) .
* /
li r11 ,I R Q S _ A L L _ D I S A B L E D
stb r11 ,P A C A I R Q S O F T M A S K ( r13 )
2021-07-06 15:13:10 +10:00
# ifdef C O N F I G _ P P C _ B O O K 3 S
li r12 ,- 1 / * S e t M S R _ E E a n d M S R _ R I * /
2021-06-18 01:51:06 +10:00
mtmsrd r12 ,1
2021-07-06 15:13:10 +10:00
# else
wrteei 1
# endif
2021-06-18 01:51:05 +10:00
/* Calling convention has r9 = orig r0, r10 = regs */
mr r9 ,r0
bl s y s t e m _ c a l l _ e x c e p t i o n
.Lsyscall_exit :
2021-06-18 01:51:11 +10:00
addi r4 ,r1 ,S T A C K _ F R A M E _ O V E R H E A D
2021-06-18 01:51:05 +10:00
li r5 ,0 / * ! s c v * /
bl s y s c a l l _ e x i t _ p r e p a r e
2021-06-18 01:51:11 +10:00
std r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 ) / * s a v e r1 f o r r e s t a r t * /
2021-06-30 17:46:15 +10:00
# ifdef C O N F I G _ P P C _ B O O K 3 S
2021-06-18 01:51:11 +10:00
.Lsyscall_rst_start :
lbz r11 ,P A C A I R Q H A P P E N E D ( r13 )
andi. r11 ,r11 ,( ~ P A C A _ I R Q _ H A R D _ D I S ) @l
bne- s y s c a l l _ r e s t a r t
2021-06-30 17:46:15 +10:00
# endif
2021-06-18 01:51:11 +10:00
li r11 ,I R Q S _ E N A B L E D
stb r11 ,P A C A I R Q S O F T M A S K ( r13 )
li r11 ,0
stb r11 ,P A C A I R Q H A P P E N E D ( r13 ) # c l e a r o u t p o s s i b l e H A R D _ D I S
2021-06-18 01:51:05 +10:00
ld r2 ,_ C C R ( r1 )
ld r6 ,_ L I N K ( r1 )
mtlr r6
# ifdef C O N F I G _ P P C _ B O O K 3 S
lbz r4 ,P A C A S R R _ V A L I D ( r13 )
cmpdi r4 ,0
bne 1 f
li r4 ,0
stb r4 ,P A C A S R R _ V A L I D ( r13 )
# endif
ld r4 ,_ N I P ( r1 )
ld r5 ,_ M S R ( r1 )
mtspr S P R N _ S R R 0 ,r4
mtspr S P R N _ S R R 1 ,r5
1 :
DEBUG_ S R R _ V A L I D s r r
BEGIN_ F T R _ S E C T I O N
stdcx. r0 ,0 ,r1 / * t o c l e a r t h e r e s e r v a t i o n * /
END_ F T R _ S E C T I O N _ I F C L R ( C P U _ F T R _ S T C X _ C H E C K S _ A D D R E S S )
cmpdi r3 ,0
bne . L s y s c a l l _ r e s t o r e _ r e g s
/* Zero volatile regs that may contain sensitive kernel data */
li r0 ,0
li r4 ,0
li r5 ,0
li r6 ,0
li r7 ,0
li r8 ,0
li r9 ,0
li r10 ,0
li r11 ,0
li r12 ,0
mtctr r0
mtspr S P R N _ X E R ,r0
.Lsyscall_restore_regs_cont :
BEGIN_ F T R _ S E C T I O N
HMT_ M E D I U M _ L O W
END_ F T R _ S E C T I O N _ I F S E T ( C P U _ F T R _ H A S _ P P R )
/ *
* We d o n ' t n e e d t o r e s t o r e A M R o n t h e w a y b a c k t o u s e r s p a c e f o r K U A P .
* The v a l u e o f A M R o n l y m a t t e r s w h i l e w e ' r e i n t h e k e r n e l .
* /
mtcr r2
ld r2 ,G P R 2 ( r1 )
ld r3 ,G P R 3 ( r1 )
ld r13 ,G P R 1 3 ( r1 )
ld r1 ,G P R 1 ( r1 )
RFI_ T O _ U S E R
b . / * p r e v e n t s p e c u l a t i v e e x e c u t i o n * /
.Lsyscall_restore_regs :
ld r3 ,_ C T R ( r1 )
ld r4 ,_ X E R ( r1 )
REST_ N V G P R S ( r1 )
mtctr r3
mtspr S P R N _ X E R ,r4
ld r0 ,G P R 0 ( r1 )
REST_ 8 G P R S ( 4 , r1 )
ld r12 ,G P R 1 2 ( r1 )
b . L s y s c a l l _ r e s t o r e _ r e g s _ c o n t
2021-06-18 01:51:11 +10:00
.Lsyscall_rst_end :
2021-06-30 17:46:15 +10:00
# ifdef C O N F I G _ P P C _ B O O K 3 S
2021-06-18 01:51:11 +10:00
syscall_restart :
2021-06-30 17:46:19 +10:00
_ ASM_ N O K P R O B E _ S Y M B O L ( s y s c a l l _ r e s t a r t )
2021-06-18 01:51:11 +10:00
GET_ P A C A ( r13 )
ld r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 )
ld r2 ,P A C A T O C ( r13 )
ld r3 ,R E S U L T ( r1 )
addi r4 ,r1 ,S T A C K _ F R A M E _ O V E R H E A D
li r11 ,I R Q S _ A L L _ D I S A B L E D
stb r11 ,P A C A I R Q S O F T M A S K ( r13 )
bl s y s c a l l _ e x i t _ r e s t a r t
std r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 ) / * s a v e r1 f o r r e s t a r t * /
b . L s y s c a l l _ r s t _ s t a r t
2021-06-30 17:46:16 +10:00
1 :
2021-06-18 01:51:11 +10:00
2021-06-30 17:46:16 +10:00
SOFT_ M A S K _ T A B L E ( . L s y s c a l l _ r s t _ s t a r t , 1 b )
2021-06-18 01:51:11 +10:00
RESTART_ T A B L E ( . L s y s c a l l _ r s t _ s t a r t , . L s y s c a l l _ r s t _ e n d , s y s c a l l _ r e s t a r t )
2021-06-30 17:46:15 +10:00
# endif
2021-06-18 01:51:05 +10:00
/ *
* If M S R E E / R I w a s n e v e r e n a b l e d , I R Q s n o t r e c o n c i l e d , N V G P R s n o t
* touched, n o e x i t w o r k c r e a t e d , t h e n t h i s c a n b e u s e d .
* /
.balign IFETCH_ALIGN_BYTES
.globl fast_interrupt_return_srr
fast_interrupt_return_srr :
_ ASM_ N O K P R O B E _ S Y M B O L ( f a s t _ i n t e r r u p t _ r e t u r n _ s r r )
kuap_ c h e c k _ a m r r3 , r4
ld r5 ,_ M S R ( r1 )
andi. r0 ,r5 ,M S R _ P R
# ifdef C O N F I G _ P P C _ B O O K 3 S
2021-06-18 01:51:11 +10:00
beq 1 f
kuap_ u s e r _ r e s t o r e r3 , r4
b . L f a s t _ u s e r _ i n t e r r u p t _ r e t u r n _ s r r
1 : kuap_ k e r n e l _ r e s t o r e r3 , r4
2021-06-18 01:51:05 +10:00
andi. r0 ,r5 ,M S R _ R I
li r3 ,0 / * 0 r e t u r n v a l u e , n o E M U L A T E _ S T A C K _ S T O R E * /
bne+ . L f a s t _ k e r n e l _ i n t e r r u p t _ r e t u r n _ s r r
addi r3 ,r1 ,S T A C K _ F R A M E _ O V E R H E A D
bl u n r e c o v e r a b l e _ e x c e p t i o n
b . / * s h o u l d n o t g e t h e r e * /
# else
bne . L f a s t _ u s e r _ i n t e r r u p t _ r e t u r n _ s r r
b . L f a s t _ k e r n e l _ i n t e r r u p t _ r e t u r n _ s r r
# endif
.macro interrupt_return_macro srr
.balign IFETCH_ALIGN_BYTES
.globl interrupt_ r e t u r n _ \ s r r
interrupt_ r e t u r n _ \ s r r \ ( ) :
_ ASM_ N O K P R O B E _ S Y M B O L ( i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) )
ld r4 ,_ M S R ( r1 )
andi. r0 ,r4 ,M S R _ P R
2021-06-30 17:46:20 +10:00
beq i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ k e r n e l
interrupt_ r e t u r n _ \ s r r \ ( ) _ u s e r : / * m a k e b a c k t r a c e s m a t c h t h e _ k e r n e l v a r i a n t * /
_ ASM_ N O K P R O B E _ S Y M B O L ( i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ u s e r )
2021-06-18 01:51:05 +10:00
addi r3 ,r1 ,S T A C K _ F R A M E _ O V E R H E A D
bl i n t e r r u p t _ e x i t _ u s e r _ p r e p a r e
cmpdi r3 ,0
bne- . L r e s t o r e _ n v g p r s _ \ s r r
2021-06-18 01:51:11 +10:00
.Lrestore_nvgprs_ \ srr\ ( ) _ c o n t :
std r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 ) / * s a v e r1 f o r r e s t a r t * /
2021-06-30 17:46:15 +10:00
# ifdef C O N F I G _ P P C _ B O O K 3 S
2021-06-18 01:51:11 +10:00
.Linterrupt_return_ \ srr\ ( ) _ u s e r _ r s t _ s t a r t :
lbz r11 ,P A C A I R Q H A P P E N E D ( r13 )
andi. r11 ,r11 ,( ~ P A C A _ I R Q _ H A R D _ D I S ) @l
bne- i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ u s e r _ r e s t a r t
2021-06-30 17:46:15 +10:00
# endif
2021-06-18 01:51:11 +10:00
li r11 ,I R Q S _ E N A B L E D
stb r11 ,P A C A I R Q S O F T M A S K ( r13 )
li r11 ,0
stb r11 ,P A C A I R Q H A P P E N E D ( r13 ) # c l e a r o u t p o s s i b l e H A R D _ D I S
2021-06-18 01:51:05 +10:00
.Lfast_user_interrupt_return_ \ srr\ ( ) :
# ifdef C O N F I G _ P P C _ B O O K 3 S
.ifc \ srr,s r r
lbz r4 ,P A C A S R R _ V A L I D ( r13 )
.else
lbz r4 ,P A C A H S R R _ V A L I D ( r13 )
.endif
cmpdi r4 ,0
li r4 ,0
bne 1 f
# endif
ld r11 ,_ N I P ( r1 )
ld r12 ,_ M S R ( r1 )
.ifc \ srr,s r r
mtspr S P R N _ S R R 0 ,r11
mtspr S P R N _ S R R 1 ,r12
1 :
# ifdef C O N F I G _ P P C _ B O O K 3 S
stb r4 ,P A C A S R R _ V A L I D ( r13 )
# endif
.else
mtspr S P R N _ H S R R 0 ,r11
mtspr S P R N _ H S R R 1 ,r12
1 :
# ifdef C O N F I G _ P P C _ B O O K 3 S
stb r4 ,P A C A H S R R _ V A L I D ( r13 )
# endif
.endif
DEBUG_ S R R _ V A L I D \ s r r
2021-06-18 01:51:11 +10:00
# ifdef C O N F I G _ P P C _ I R Q _ S O F T _ M A S K _ D E B U G
lbz r4 ,P A C A I R Q S O F T M A S K ( r13 )
tdnei r4 ,I R Q S _ E N A B L E D
# endif
BEGIN_ F T R _ S E C T I O N
ld r10 ,_ P P R ( r1 )
mtspr S P R N _ P P R ,r10
END_ F T R _ S E C T I O N _ I F S E T ( C P U _ F T R _ H A S _ P P R )
2021-06-18 01:51:05 +10:00
BEGIN_ F T R _ S E C T I O N
stdcx. r0 ,0 ,r1 / * t o c l e a r t h e r e s e r v a t i o n * /
FTR_ S E C T I O N _ E L S E
ldarx r0 ,0 ,r1
ALT_ F T R _ S E C T I O N _ E N D _ I F C L R ( C P U _ F T R _ S T C X _ C H E C K S _ A D D R E S S )
ld r3 ,_ C C R ( r1 )
ld r4 ,_ L I N K ( r1 )
ld r5 ,_ C T R ( r1 )
ld r6 ,_ X E R ( r1 )
li r0 ,0
REST_ 4 G P R S ( 7 , r1 )
REST_ 2 G P R S ( 1 1 , r1 )
REST_ G P R ( 1 3 , r1 )
mtcr r3
mtlr r4
mtctr r5
mtspr S P R N _ X E R ,r6
REST_ 4 G P R S ( 2 , r1 )
REST_ G P R ( 6 , r1 )
REST_ G P R ( 0 , r1 )
REST_ G P R ( 1 , r1 )
.ifc \ srr,s r r
RFI_ T O _ U S E R
.else
HRFI_ T O _ U S E R
.endif
b . / * p r e v e n t s p e c u l a t i v e e x e c u t i o n * /
2021-06-18 01:51:11 +10:00
.Linterrupt_return_ \ srr\ ( ) _ u s e r _ r s t _ e n d :
2021-06-18 01:51:05 +10:00
.Lrestore_nvgprs_ \ srr\ ( ) :
REST_ N V G P R S ( r1 )
2021-06-18 01:51:11 +10:00
b . L r e s t o r e _ n v g p r s _ \ s r r \ ( ) _ c o n t
2021-06-30 17:46:15 +10:00
# ifdef C O N F I G _ P P C _ B O O K 3 S
2021-06-18 01:51:11 +10:00
interrupt_ r e t u r n _ \ s r r \ ( ) _ u s e r _ r e s t a r t :
2021-06-30 17:46:19 +10:00
_ ASM_ N O K P R O B E _ S Y M B O L ( i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ u s e r _ r e s t a r t )
2021-06-18 01:51:11 +10:00
GET_ P A C A ( r13 )
ld r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 )
ld r2 ,P A C A T O C ( r13 )
addi r3 ,r1 ,S T A C K _ F R A M E _ O V E R H E A D
li r11 ,I R Q S _ A L L _ D I S A B L E D
stb r11 ,P A C A I R Q S O F T M A S K ( r13 )
bl i n t e r r u p t _ e x i t _ u s e r _ r e s t a r t
std r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 ) / * s a v e r1 f o r r e s t a r t * /
b . L i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ u s e r _ r s t _ s t a r t
2021-06-30 17:46:16 +10:00
1 :
2021-06-18 01:51:11 +10:00
2021-06-30 17:46:16 +10:00
SOFT_ M A S K _ T A B L E ( . L i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ u s e r _ r s t _ s t a r t , 1 b )
2021-06-18 01:51:11 +10:00
RESTART_ T A B L E ( . L i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ u s e r _ r s t _ s t a r t , . L i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ u s e r _ r s t _ e n d , i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ u s e r _ r e s t a r t )
2021-06-30 17:46:15 +10:00
# endif
2021-06-18 01:51:05 +10:00
.balign IFETCH_ALIGN_BYTES
2021-06-30 17:46:20 +10:00
interrupt_ r e t u r n _ \ s r r \ ( ) _ k e r n e l :
_ ASM_ N O K P R O B E _ S Y M B O L ( i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ k e r n e l )
2021-06-18 01:51:05 +10:00
addi r3 ,r1 ,S T A C K _ F R A M E _ O V E R H E A D
bl i n t e r r u p t _ e x i t _ k e r n e l _ p r e p a r e
2021-06-18 01:51:11 +10:00
std r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 ) / * s a v e r1 f o r r e s t a r t * /
.Linterrupt_return_ \ srr\ ( ) _ k e r n e l _ r s t _ s t a r t :
ld r11 ,S O F T E ( r1 )
cmpwi r11 ,I R Q S _ E N A B L E D
stb r11 ,P A C A I R Q S O F T M A S K ( r13 )
bne 1 f
2021-06-30 17:46:15 +10:00
# ifdef C O N F I G _ P P C _ B O O K 3 S
2021-06-18 01:51:11 +10:00
lbz r11 ,P A C A I R Q H A P P E N E D ( r13 )
andi. r11 ,r11 ,( ~ P A C A _ I R Q _ H A R D _ D I S ) @l
bne- i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ k e r n e l _ r e s t a r t
2021-06-30 17:46:15 +10:00
# endif
2021-06-18 01:51:11 +10:00
li r11 ,0
stb r11 ,P A C A I R Q H A P P E N E D ( r13 ) # c l e a r o u t p o s s i b l e H A R D _ D I S
1 :
2021-06-18 01:51:05 +10:00
.Lfast_kernel_interrupt_return_ \ srr\ ( ) :
cmpdi c r1 ,r3 ,0
# ifdef C O N F I G _ P P C _ B O O K 3 S
.ifc \ srr,s r r
lbz r4 ,P A C A S R R _ V A L I D ( r13 )
.else
lbz r4 ,P A C A H S R R _ V A L I D ( r13 )
.endif
cmpdi r4 ,0
li r4 ,0
bne 1 f
# endif
ld r11 ,_ N I P ( r1 )
ld r12 ,_ M S R ( r1 )
.ifc \ srr,s r r
mtspr S P R N _ S R R 0 ,r11
mtspr S P R N _ S R R 1 ,r12
1 :
# ifdef C O N F I G _ P P C _ B O O K 3 S
stb r4 ,P A C A S R R _ V A L I D ( r13 )
# endif
.else
mtspr S P R N _ H S R R 0 ,r11
mtspr S P R N _ H S R R 1 ,r12
1 :
# ifdef C O N F I G _ P P C _ B O O K 3 S
stb r4 ,P A C A H S R R _ V A L I D ( r13 )
# endif
.endif
DEBUG_ S R R _ V A L I D \ s r r
BEGIN_ F T R _ S E C T I O N
stdcx. r0 ,0 ,r1 / * t o c l e a r t h e r e s e r v a t i o n * /
FTR_ S E C T I O N _ E L S E
ldarx r0 ,0 ,r1
ALT_ F T R _ S E C T I O N _ E N D _ I F C L R ( C P U _ F T R _ S T C X _ C H E C K S _ A D D R E S S )
ld r3 ,_ L I N K ( r1 )
ld r4 ,_ C T R ( r1 )
ld r5 ,_ X E R ( r1 )
ld r6 ,_ C C R ( r1 )
li r0 ,0
REST_ 4 G P R S ( 7 , r1 )
REST_ 2 G P R S ( 1 1 , r1 )
mtlr r3
mtctr r4
mtspr S P R N _ X E R ,r5
/ *
* Leaving a s t a l e e x c e p t i o n _ m a r k e r o n t h e s t a c k c a n c o n f u s e
* the r e l i a b l e s t a c k u n w i n d e r l a t e r o n . C l e a r i t .
* /
std r0 ,S T A C K _ F R A M E _ O V E R H E A D - 1 6 ( r1 )
REST_ 4 G P R S ( 2 , r1 )
bne- c r1 ,1 f / * e m u l a t e s t a c k s t o r e * /
mtcr r6
REST_ G P R ( 6 , r1 )
REST_ G P R ( 0 , r1 )
REST_ G P R ( 1 , r1 )
.ifc \ srr,s r r
RFI_ T O _ K E R N E L
.else
HRFI_ T O _ K E R N E L
.endif
b . / * p r e v e n t s p e c u l a t i v e e x e c u t i o n * /
1 : / *
* Emulate s t a c k s t o r e w i t h u p d a t e . N e w r1 v a l u e w a s a l r e a d y c a l c u l a t e d
* and u p d a t e d i n o u r i n t e r r u p t r e g s b y e m u l a t e _ l o a d s t o r e , b u t w e c a n ' t
* store t h e p r e v i o u s v a l u e o f r1 t o t h e s t a c k b e f o r e r e - l o a d i n g o u r
* registers f r o m i t , o t h e r w i s e t h e y c o u l d b e c l o b b e r e d . U s e
* PACA_ E X G E N a s t e m p o r a r y s t o r a g e t o h o l d t h e s t o r e d a t a , a s
* interrupts a r e d i s a b l e d h e r e s o i t w o n ' t b e c l o b b e r e d .
* /
mtcr r6
std r9 ,P A C A _ E X G E N + 0 ( r13 )
addi r9 ,r1 ,I N T _ F R A M E _ S I Z E / * g e t o r i g i n a l r1 * /
REST_ G P R ( 6 , r1 )
REST_ G P R ( 0 , r1 )
REST_ G P R ( 1 , r1 )
std r9 ,0 ( r1 ) / * p e r f o r m s t o r e c o m p o n e n t o f s t d u * /
ld r9 ,P A C A _ E X G E N + 0 ( r13 )
.ifc \ srr,s r r
RFI_ T O _ K E R N E L
.else
HRFI_ T O _ K E R N E L
.endif
b . / * p r e v e n t s p e c u l a t i v e e x e c u t i o n * /
2021-06-18 01:51:11 +10:00
.Linterrupt_return_ \ srr\ ( ) _ k e r n e l _ r s t _ e n d :
2021-06-30 17:46:15 +10:00
# ifdef C O N F I G _ P P C _ B O O K 3 S
2021-06-18 01:51:11 +10:00
interrupt_ r e t u r n _ \ s r r \ ( ) _ k e r n e l _ r e s t a r t :
2021-06-30 17:46:19 +10:00
_ ASM_ N O K P R O B E _ S Y M B O L ( i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ k e r n e l _ r e s t a r t )
2021-06-18 01:51:11 +10:00
GET_ P A C A ( r13 )
ld r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 )
ld r2 ,P A C A T O C ( r13 )
addi r3 ,r1 ,S T A C K _ F R A M E _ O V E R H E A D
li r11 ,I R Q S _ A L L _ D I S A B L E D
stb r11 ,P A C A I R Q S O F T M A S K ( r13 )
bl i n t e r r u p t _ e x i t _ k e r n e l _ r e s t a r t
std r1 ,P A C A _ E X I T _ S A V E _ R 1 ( r13 ) / * s a v e r1 f o r r e s t a r t * /
b . L i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ k e r n e l _ r s t _ s t a r t
2021-06-30 17:46:16 +10:00
1 :
2021-06-18 01:51:11 +10:00
2021-06-30 17:46:16 +10:00
SOFT_ M A S K _ T A B L E ( . L i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ k e r n e l _ r s t _ s t a r t , 1 b )
2021-06-18 01:51:11 +10:00
RESTART_ T A B L E ( . L i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ k e r n e l _ r s t _ s t a r t , . L i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ k e r n e l _ r s t _ e n d , i n t e r r u p t _ r e t u r n _ \ s r r \ ( ) _ k e r n e l _ r e s t a r t )
2021-06-30 17:46:15 +10:00
# endif
2021-06-18 01:51:11 +10:00
2021-06-18 01:51:05 +10:00
.endm
interrupt_ r e t u r n _ m a c r o s r r
# ifdef C O N F I G _ P P C _ B O O K 3 S
interrupt_ r e t u r n _ m a c r o h s r r
2021-06-18 01:51:10 +10:00
.globl __end_soft_masked
__end_soft_masked :
DEFINE_ F I X E D _ S Y M B O L ( _ _ e n d _ s o f t _ m a s k e d )
2021-06-30 17:46:15 +10:00
# endif / * C O N F I G _ P P C _ B O O K 3 S * /
2021-06-30 17:46:21 +10:00
# ifdef C O N F I G _ P P C _ B O O K 3 S
_ GLOBAL( r e t _ f r o m _ f o r k _ s c v )
bl s c h e d u l e _ t a i l
REST_ N V G P R S ( r1 )
li r3 ,0 / * f o r k ( ) r e t u r n v a l u e * /
b . L s y s c a l l _ v e c t o r e d _ c o m m o n _ e x i t
# endif
_ GLOBAL( r e t _ f r o m _ f o r k )
bl s c h e d u l e _ t a i l
REST_ N V G P R S ( r1 )
li r3 ,0 / * f o r k ( ) r e t u r n v a l u e * /
b . L s y s c a l l _ e x i t
_ GLOBAL( r e t _ f r o m _ k e r n e l _ t h r e a d )
bl s c h e d u l e _ t a i l
REST_ N V G P R S ( r1 )
mtctr r14
mr r3 ,r15
# ifdef P P C 6 4 _ E L F _ A B I _ v2
mr r12 ,r14
# endif
bctrl
li r3 ,0
b . L s y s c a l l _ e x i t