#ifndef _ASM_POWERPC_FTRACE #define _ASM_POWERPC_FTRACE #ifdef CONFIG_FUNCTION_TRACER #define MCOUNT_ADDR ((long)(_mcount)) #define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */ #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__ */ extern void _mcount(void); #ifdef CONFIG_DYNAMIC_FTRACE 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 { struct module *mod; }; #endif /* CONFIG_DYNAMIC_FTRACE */ #endif /* __ASSEMBLY__ */ #endif #if defined(CONFIG_FTRACE_SYSCALLS) && defined(CONFIG_PPC64) && !defined(__ASSEMBLY__) #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 * 32bit do not start with a period so the generic function will work. */ return !strcmp(sym + 4, name + 3); } #endif /* CONFIG_FTRACE_SYSCALLS && CONFIG_PPC64 && !__ASSEMBLY__ */ #endif /* _ASM_POWERPC_FTRACE */