1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ASM_POWERPC_FTRACE
3 #define _ASM_POWERPC_FTRACE
7 #ifdef CONFIG_FUNCTION_TRACER
8 #define MCOUNT_ADDR ((unsigned long)(_mcount))
9 #define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
13 /* Based off of objdump optput from glibc */
15 #define MCOUNT_SAVE_FRAME \
31 #define MCOUNT_RESTORE_FRAME \
48 #else /* !__ASSEMBLY__ */
49 extern void _mcount(void);
51 #ifdef CONFIG_DYNAMIC_FTRACE
52 # define FTRACE_ADDR ((unsigned long)ftrace_caller)
53 # define FTRACE_REGS_ADDR FTRACE_ADDR
54 static inline unsigned long ftrace_call_adjust(unsigned long addr)
56 /* reloction of mcount call site is the same as the address */
60 struct dyn_arch_ftrace {
63 #endif /* CONFIG_DYNAMIC_FTRACE */
64 #endif /* __ASSEMBLY__ */
66 #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
67 #define ARCH_SUPPORTS_FTRACE_OPS 1
71 #if defined(CONFIG_FTRACE_SYSCALLS) && !defined(__ASSEMBLY__)
73 * Some syscall entry functions on powerpc start with "ppc_" (fork and clone,
74 * for instance) or ppc32_/ppc64_. We should also match the sys_ variant with
77 #define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
78 #ifdef PPC64_ELF_ABI_v1
79 static inline bool arch_syscall_match_sym_name(const char *sym, const char *name)
81 /* We need to skip past the initial dot, and the __se_sys alias */
82 return !strcmp(sym + 1, name) ||
83 (!strncmp(sym, ".__se_sys", 9) && !strcmp(sym + 6, name)) ||
84 (!strncmp(sym, ".ppc_", 5) && !strcmp(sym + 5, name + 4)) ||
85 (!strncmp(sym, ".ppc32_", 7) && !strcmp(sym + 7, name + 4)) ||
86 (!strncmp(sym, ".ppc64_", 7) && !strcmp(sym + 7, name + 4));
89 static inline bool arch_syscall_match_sym_name(const char *sym, const char *name)
91 return !strcmp(sym, name) ||
92 (!strncmp(sym, "__se_sys", 8) && !strcmp(sym + 5, name)) ||
93 (!strncmp(sym, "ppc_", 4) && !strcmp(sym + 4, name + 4)) ||
94 (!strncmp(sym, "ppc32_", 6) && !strcmp(sym + 6, name + 4)) ||
95 (!strncmp(sym, "ppc64_", 6) && !strcmp(sym + 6, name + 4));
98 #endif /* CONFIG_FTRACE_SYSCALLS && !__ASSEMBLY__ */
100 #endif /* _ASM_POWERPC_FTRACE */