2019-05-27 08:55:01 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2017-04-25 19:25:53 +05:30
/ *
* Split f r o m e n t r y _ 3 2 . S
* /
# include < l i n u x / m a g i c . h >
# include < a s m / r e g . h >
# include < a s m / p p c _ a s m . h >
# include < a s m / a s m - o f f s e t s . h >
# include < a s m / f t r a c e . h >
# include < a s m / e x p o r t . h >
_ GLOBAL( m c o u n t )
_ GLOBAL( _ m c o u n t )
/ *
* It i s r e q u i r e d t h a t _ m c o u n t o n P P C 3 2 m u s t p r e s e r v e t h e
* link r e g i s t e r . B u t w e h a v e r0 t o p l a y w i t h . W e u s e r0
* to p u s h t h e r e t u r n a d d r e s s b a c k t o t h e c a l l e r o f m c o u n t
* into t h e c t r r e g i s t e r , r e s t o r e t h e l i n k r e g i s t e r a n d
* then j u m p b a c k u s i n g t h e c t r r e g i s t e r .
* /
mflr r0
mtctr r0
lwz r0 , 4 ( r1 )
mtlr r0
bctr
_ GLOBAL( f t r a c e _ c a l l e r )
MCOUNT_ S A V E _ F R A M E
/* r3 ends up with link register */
subi r3 , r3 , M C O U N T _ I N S N _ S I Z E
.globl ftrace_call
ftrace_call :
bl f t r a c e _ s t u b
nop
# ifdef C O N F I G _ F U N C T I O N _ G R A P H _ T R A C E R
.globl ftrace_graph_call
ftrace_graph_call :
b f t r a c e _ g r a p h _ s t u b
_ GLOBAL( f t r a c e _ g r a p h _ s t u b )
# endif
MCOUNT_ R E S T O R E _ F R A M E
/* old link register ends up in ctr reg */
bctr
EXPORT_ S Y M B O L ( _ m c o u n t )
_ GLOBAL( f t r a c e _ s t u b )
blr
# ifdef C O N F I G _ F U N C T I O N _ G R A P H _ T R A C E R
_ GLOBAL( f t r a c e _ g r a p h _ c a l l e r )
2019-09-05 23:50:29 +05:30
addi r5 , r1 , 4 8
2017-04-25 19:25:53 +05:30
/* load r4 with local address */
lwz r4 , 4 4 ( r1 )
subi r4 , r4 , M C O U N T _ I N S N _ S I Z E
/* Grab the LR out of the caller stack frame */
lwz r3 ,5 2 ( r1 )
bl p r e p a r e _ f t r a c e _ r e t u r n
nop
/ *
* prepare_ f t r a c e _ r e t u r n g i v e s u s t h e a d d r e s s w e d i v e r t t o .
* Change t h e L R i n t h e c a l l e r s s t a c k f r a m e t o t h i s .
* /
stw r3 ,5 2 ( r1 )
MCOUNT_ R E S T O R E _ F R A M E
/* old link register ends up in ctr reg */
bctr
_ GLOBAL( r e t u r n _ t o _ h a n d l e r )
/* need to save return values */
stwu r1 , - 3 2 ( r1 )
stw r3 , 2 0 ( r1 )
stw r4 , 1 6 ( r1 )
stw r31 , 1 2 ( r1 )
mr r31 , r1
bl f t r a c e _ r e t u r n _ t o _ h a n d l e r
nop
/* return value has real return address */
mtlr r3
lwz r3 , 2 0 ( r1 )
lwz r4 , 1 6 ( r1 )
lwz r31 ,1 2 ( r1 )
lwz r1 , 0 ( r1 )
/* Jump back to real return address */
blr
# endif / * C O N F I G _ F U N C T I O N _ G R A P H _ T R A C E R * /