2008-05-22 14:31:07 -04:00
# ifndef _ASM_POWERPC_FTRACE
# define _ASM_POWERPC_FTRACE
2016-06-06 22:26:10 +05:30
# include <asm/types.h>
2008-10-06 19:06:12 -04:00
# ifdef CONFIG_FUNCTION_TRACER
2015-07-12 17:52:24 +08:00
# define MCOUNT_ADDR ((unsigned long)(_mcount))
2008-06-21 23:47:27 +05:30
# define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
2009-02-11 15:01:18 -05:00
# ifdef __ASSEMBLY__
/* Based off of objdump optput from glibc */
# define MCOUNT_SAVE_FRAME \
stwu r1 , - 48 ( r1 ) ; \
stw r3 , 12 ( r1 ) ; \
stw r4 , 16 ( r1 ) ; \
stw r5 , 20 ( r1 ) ; \
stw r6 , 24 ( r1 ) ; \
mflr r3 ; \
lwz r4 , 52 ( r1 ) ; \
mfcr r5 ; \
stw r7 , 28 ( r1 ) ; \
stw r8 , 32 ( r1 ) ; \
stw r9 , 36 ( r1 ) ; \
stw r10 , 40 ( r1 ) ; \
stw r3 , 44 ( r1 ) ; \
stw r5 , 8 ( r1 )
# define MCOUNT_RESTORE_FRAME \
lwz r6 , 8 ( r1 ) ; \
lwz r0 , 44 ( r1 ) ; \
lwz r3 , 12 ( r1 ) ; \
mtctr r0 ; \
lwz r4 , 16 ( r1 ) ; \
mtcr r6 ; \
lwz r5 , 20 ( r1 ) ; \
lwz r6 , 24 ( r1 ) ; \
lwz r0 , 52 ( r1 ) ; \
lwz r7 , 28 ( r1 ) ; \
lwz r8 , 32 ( r1 ) ; \
mtlr r0 ; \
lwz r9 , 36 ( r1 ) ; \
lwz r10 , 40 ( r1 ) ; \
addi r1 , r1 , 48
# else /* !__ASSEMBLY__ */
2008-05-22 14:31:07 -04:00
extern void _mcount ( void ) ;
2008-11-14 16:21:19 -08:00
# ifdef CONFIG_DYNAMIC_FTRACE
2016-03-03 15:26:59 +11:00
# define FTRACE_ADDR ((unsigned long)ftrace_caller)
# define FTRACE_REGS_ADDR FTRACE_ADDR
2008-11-14 16:21:19 -08:00
static inline unsigned long ftrace_call_adjust ( unsigned long addr )
{
/* reloction of mcount call site is the same as the address */
return addr ;
}
struct dyn_arch_ftrace {
2008-11-14 20:47:03 -08:00
struct module * mod ;
2008-11-14 16:21:19 -08:00
} ;
# endif /* CONFIG_DYNAMIC_FTRACE */
# endif /* __ASSEMBLY__ */
2008-05-22 14:31:07 -04:00
2016-03-03 15:26:59 +11:00
# ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
# define ARCH_SUPPORTS_FTRACE_OPS 1
# endif
2008-05-22 14:31:07 -04:00
# endif
2008-06-21 23:47:27 +05:30
2016-06-06 22:26:10 +05:30
# if defined(CONFIG_FTRACE_SYSCALLS) && !defined(__ASSEMBLY__)
# ifdef PPC64_ELF_ABI_v1
2011-02-02 17:27:24 +00:00
# define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
static inline bool arch_syscall_match_sym_name ( const char * sym , const char * name )
{
/*
* Compare the symbol name with the system call name . Skip the . sys or . SyS
* prefix from the symbol name and the sys prefix from the system call name and
* just match the rest . This is only needed on ppc64 since symbol names on
* 32 bit do not start with a period so the generic function will work .
*/
return ! strcmp ( sym + 4 , name + 3 ) ;
}
2014-02-04 16:07:20 +11:00
# endif
2016-06-06 22:26:10 +05:30
# endif /* CONFIG_FTRACE_SYSCALLS && !__ASSEMBLY__ */
2011-02-02 17:27:24 +00:00
2008-06-21 23:47:27 +05:30
# endif /* _ASM_POWERPC_FTRACE */