2013-08-09 13:26:09 -04:00
/ *
* Copyright 2 0 1 2 T i l e r a C o r p o r a t i o n . A l l R i g h t s R e s e r v e d .
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or
* modify i t u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e
* as p u b l i s h e d b y t h e F r e e S o f t w a r e F o u n d a t i o n , v e r s i o n 2 .
*
* This p r o g r a m i s d i s t r i b u t e d i n t h e h o p e t h a t i t w i l l b e u s e f u l , b u t
* WITHOUT A N Y W A R R A N T Y ; without even the implied warranty of
* MERCHANTABILITY O R F I T N E S S F O R A P A R T I C U L A R P U R P O S E , G O O D T I T L E o r
* NON I N F R I N G E M E N T . S e e t h e G N U G e n e r a l P u b l i c L i c e n s e f o r
* more d e t a i l s .
*
* TILE- G x s p e c i f i c _ _ m c o u n t s u p p o r t
* /
# include < l i n u x / l i n k a g e . h >
# include < a s m / f t r a c e . h >
# define R E G S I Z E 8
.text
.global __mcount
.macro MCOUNT_SAVE_REGS
addli s p , s p , - R E G S I Z E
{
st s p , l r
addli r29 , s p , - ( 1 2 * R E G S I Z E )
}
{
addli s p , s p , - ( 1 3 * R E G S I Z E )
st r29 , s p
}
addli r29 , r29 , R E G S I Z E
{ st r29 , r0 ; addli r29, r29, REGSIZE }
{ st r29 , r1 ; addli r29, r29, REGSIZE }
{ st r29 , r2 ; addli r29, r29, REGSIZE }
{ st r29 , r3 ; addli r29, r29, REGSIZE }
{ st r29 , r4 ; addli r29, r29, REGSIZE }
{ st r29 , r5 ; addli r29, r29, REGSIZE }
{ st r29 , r6 ; addli r29, r29, REGSIZE }
{ st r29 , r7 ; addli r29, r29, REGSIZE }
{ st r29 , r8 ; addli r29, r29, REGSIZE }
{ st r29 , r9 ; addli r29, r29, REGSIZE }
{ st r29 , r10 ; addli r29, r29, REGSIZE }
.endm
.macro MCOUNT_RESTORE_REGS
addli r29 , s p , ( 2 * R E G S I Z E )
{ ld r0 , r29 ; addli r29, r29, REGSIZE }
{ ld r1 , r29 ; addli r29, r29, REGSIZE }
{ ld r2 , r29 ; addli r29, r29, REGSIZE }
{ ld r3 , r29 ; addli r29, r29, REGSIZE }
{ ld r4 , r29 ; addli r29, r29, REGSIZE }
{ ld r5 , r29 ; addli r29, r29, REGSIZE }
{ ld r6 , r29 ; addli r29, r29, REGSIZE }
{ ld r7 , r29 ; addli r29, r29, REGSIZE }
{ ld r8 , r29 ; addli r29, r29, REGSIZE }
{ ld r9 , r29 ; addli r29, r29, REGSIZE }
{ ld r10 , r29 ; addli lr, sp, (13 * REGSIZE) }
{ ld l r , l r ; addli sp, sp, (14 * REGSIZE) }
.endm
.macro RETURN_BACK
{ move r12 , l r ; move lr, r10 }
jrp r12
.endm
# ifdef C O N F I G _ D Y N A M I C _ F T R A C E
.align 64
STD_ E N T R Y ( _ _ m c o u n t )
__mcount :
j f t r a c e _ s t u b
STD_ E N D P R O C ( _ _ m c o u n t )
.align 64
STD_ E N T R Y ( f t r a c e _ c a l l e r )
MCOUNT_ S A V E _ R E G S
/* arg1: self return address */
/* arg2: parent's return address */
2015-03-27 14:46:38 -04:00
/* arg3: ftrace_ops */
/* arg4: regs (but make it NULL) */
{ move r0 , l r ; moveli r2, hw2_last(function_trace_op) }
{ move r1 , r10 ; shl16insli r2, r2, hw1(function_trace_op) }
{ movei r3 , 0 ; shl16insli r2, r2, hw0(function_trace_op) }
ld r2 ,r2
2013-08-09 13:26:09 -04:00
.global ftrace_call
ftrace_call :
/ *
* a p l a c e h o l d e r f o r t h e c a l l t o a r e a l t r a c i n g f u n c t i o n , i . e .
* ftrace_ t r a c e _ f u n c t i o n ( )
* /
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
.global ftrace_graph_call
ftrace_graph_call :
/ *
* a p l a c e h o l d e r f o r t h e c a l l t o a r e a l t r a c i n g f u n c t i o n , i . e .
* ftrace_ g r a p h _ c a l l e r ( )
* /
nop
# endif
MCOUNT_ R E S T O R E _ R E G S
.global ftrace_stub
ftrace_stub :
RETURN_ B A C K
STD_ E N D P R O C ( f t r a c e _ c a l l e r )
# else / * ! C O N F I G _ D Y N A M I C _ F T R A C E * /
.align 64
STD_ E N T R Y ( _ _ m c o u n t )
{
moveli r11 , h w2 _ l a s t ( f t r a c e _ t r a c e _ f u n c t i o n )
moveli r13 , h w2 _ l a s t ( f t r a c e _ s t u b )
}
{
shl1 6 i n s l i r11 , r11 , h w1 ( f t r a c e _ t r a c e _ f u n c t i o n )
shl1 6 i n s l i r13 , r13 , h w1 ( f t r a c e _ s t u b )
}
{
shl1 6 i n s l i r11 , r11 , h w0 ( f t r a c e _ t r a c e _ f u n c t i o n )
shl1 6 i n s l i r13 , r13 , h w0 ( f t r a c e _ s t u b )
}
ld r11 , r11
sub r14 , r13 , r11
bnez r14 , s t a t i c _ t r a c e
# 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
moveli r15 , h w2 _ l a s t ( f t r a c e _ g r a p h _ r e t u r n )
shl1 6 i n s l i r15 , r15 , h w1 ( f t r a c e _ g r a p h _ r e t u r n )
shl1 6 i n s l i r15 , r15 , h w0 ( f t r a c e _ g r a p h _ r e t u r n )
ld r15 , r15
sub r15 , r15 , r13
bnez r15 , f t r a c e _ g r a p h _ c a l l e r
{
moveli r16 , h w2 _ l a s t ( f t r a c e _ g r a p h _ e n t r y )
moveli r17 , h w2 _ l a s t ( f t r a c e _ g r a p h _ e n t r y _ s t u b )
}
{
shl1 6 i n s l i r16 , r16 , h w1 ( f t r a c e _ g r a p h _ e n t r y )
shl1 6 i n s l i r17 , r17 , h w1 ( f t r a c e _ g r a p h _ e n t r y _ s t u b )
}
{
shl1 6 i n s l i r16 , r16 , h w0 ( f t r a c e _ g r a p h _ e n t r y )
shl1 6 i n s l i r17 , r17 , h w0 ( f t r a c e _ g r a p h _ e n t r y _ s t u b )
}
ld r16 , r16
sub r17 , r16 , r17
bnez r17 , f t r a c e _ g r a p h _ c a l l e r
# endif
RETURN_ B A C K
static_trace :
MCOUNT_ S A V E _ R E G S
/* arg1: self return address */
/* arg2: parent's return address */
{ move r0 , l r ; move r1, r10 }
/* call ftrace_trace_function() */
jalr r11
MCOUNT_ R E S T O R E _ R E G S
.global ftrace_stub
ftrace_stub :
RETURN_ B A C K
STD_ E N D P R O C ( _ _ m c o u n t )
# endif / * ! C O N F I G _ D Y N A M I C _ F T R A C E * /
# 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
STD_ E N T R Y ( f t r a c e _ g r a p h _ c a l l e r )
ftrace_graph_caller :
# ifndef C O N F I G _ D Y N A M I C _ F T R A C E
MCOUNT_ S A V E _ R E G S
# endif
/* arg1: Get the location of the parent's return address */
addi r0 , s p , 1 2 * R E G S I Z E
/* arg2: Get self return address */
move r1 , l r
jal p r e p a r e _ f t r a c e _ r e t u r n
MCOUNT_ R E S T O R E _ R E G S
RETURN_ B A C K
STD_ E N D P R O C ( f t r a c e _ g r a p h _ c a l l e r )
.global return_to_handler
return_to_handler :
MCOUNT_ S A V E _ R E G S
jal f t r a c e _ r e t u r n _ t o _ h a n d l e r
/* restore the real parent address */
move r11 , r0
MCOUNT_ R E S T O R E _ R E G S
jr r11
# 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 * /