]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
395a59d0 AS |
2 | #ifndef _ASM_ARM_FTRACE |
3 | #define _ASM_ARM_FTRACE | |
4 | ||
620176f3 AV |
5 | #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS |
6 | #define ARCH_SUPPORTS_FTRACE_OPS 1 | |
7 | #endif | |
8 | ||
606576ce | 9 | #ifdef CONFIG_FUNCTION_TRACER |
3b6c223b | 10 | #define MCOUNT_ADDR ((unsigned long)(__gnu_mcount_nc)) |
395a59d0 AS |
11 | #define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */ |
12 | ||
13 | #ifndef __ASSEMBLY__ | |
14 | extern void mcount(void); | |
181f817e | 15 | extern void __gnu_mcount_nc(void); |
3b6c223b RV |
16 | |
17 | #ifdef CONFIG_DYNAMIC_FTRACE | |
18 | struct dyn_arch_ftrace { | |
19 | #ifdef CONFIG_OLD_MCOUNT | |
20 | bool old_mcount; | |
21 | #endif | |
22 | }; | |
23 | ||
24 | static inline unsigned long ftrace_call_adjust(unsigned long addr) | |
25 | { | |
72dc43a9 RV |
26 | /* With Thumb-2, the recorded addresses have the lsb set */ |
27 | return addr & ~1; | |
3b6c223b RV |
28 | } |
29 | ||
30 | extern void ftrace_caller_old(void); | |
31 | extern void ftrace_call_old(void); | |
32 | #endif | |
33 | ||
395a59d0 AS |
34 | #endif |
35 | ||
36 | #endif | |
37 | ||
4bf1fa5a UKK |
38 | #ifndef __ASSEMBLY__ |
39 | ||
40 | #if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) | |
41 | /* | |
42 | * return_address uses walk_stackframe to do it's work. If both | |
43 | * CONFIG_FRAME_POINTER=y and CONFIG_ARM_UNWIND=y walk_stackframe uses unwind | |
44 | * information. For this to work in the function tracer many functions would | |
45 | * have to be marked with __notrace. So for now just depend on | |
46 | * !CONFIG_ARM_UNWIND. | |
47 | */ | |
48 | ||
49 | void *return_address(unsigned int); | |
50 | ||
51 | #else | |
52 | ||
aeea3592 | 53 | static inline void *return_address(unsigned int level) |
4bf1fa5a UKK |
54 | { |
55 | return NULL; | |
56 | } | |
57 | ||
58 | #endif | |
59 | ||
1712ef43 | 60 | #define ftrace_return_address(n) return_address(n) |
4bf1fa5a | 61 | |
270c8cf1 RV |
62 | #define ARCH_HAS_SYSCALL_MATCH_SYM_NAME |
63 | ||
64 | static inline bool arch_syscall_match_sym_name(const char *sym, | |
65 | const char *name) | |
66 | { | |
67 | if (!strcmp(sym, "sys_mmap2")) | |
68 | sym = "sys_mmap_pgoff"; | |
69 | else if (!strcmp(sym, "sys_statfs64_wrapper")) | |
70 | sym = "sys_statfs64"; | |
71 | else if (!strcmp(sym, "sys_fstatfs64_wrapper")) | |
72 | sym = "sys_fstatfs64"; | |
73 | else if (!strcmp(sym, "sys_arm_fadvise64_64")) | |
74 | sym = "sys_fadvise64_64"; | |
75 | ||
76 | /* Ignore case since sym may start with "SyS" instead of "sys" */ | |
77 | return !strcasecmp(sym, name); | |
78 | } | |
79 | ||
4bf1fa5a UKK |
80 | #endif /* ifndef __ASSEMBLY__ */ |
81 | ||
395a59d0 | 82 | #endif /* _ASM_ARM_FTRACE */ |