]>
Commit | Line | Data |
---|---|---|
395a59d0 AS |
1 | #ifndef _ASM_ARM_FTRACE |
2 | #define _ASM_ARM_FTRACE | |
3 | ||
606576ce | 4 | #ifdef CONFIG_FUNCTION_TRACER |
3b6c223b | 5 | #define MCOUNT_ADDR ((unsigned long)(__gnu_mcount_nc)) |
395a59d0 AS |
6 | #define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */ |
7 | ||
8 | #ifndef __ASSEMBLY__ | |
9 | extern void mcount(void); | |
181f817e | 10 | extern void __gnu_mcount_nc(void); |
3b6c223b RV |
11 | |
12 | #ifdef CONFIG_DYNAMIC_FTRACE | |
13 | struct dyn_arch_ftrace { | |
14 | #ifdef CONFIG_OLD_MCOUNT | |
15 | bool old_mcount; | |
16 | #endif | |
17 | }; | |
18 | ||
19 | static inline unsigned long ftrace_call_adjust(unsigned long addr) | |
20 | { | |
72dc43a9 RV |
21 | /* With Thumb-2, the recorded addresses have the lsb set */ |
22 | return addr & ~1; | |
3b6c223b RV |
23 | } |
24 | ||
25 | extern void ftrace_caller_old(void); | |
26 | extern void ftrace_call_old(void); | |
27 | #endif | |
28 | ||
395a59d0 AS |
29 | #endif |
30 | ||
31 | #endif | |
32 | ||
4bf1fa5a UKK |
33 | #ifndef __ASSEMBLY__ |
34 | ||
35 | #if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) | |
36 | /* | |
37 | * return_address uses walk_stackframe to do it's work. If both | |
38 | * CONFIG_FRAME_POINTER=y and CONFIG_ARM_UNWIND=y walk_stackframe uses unwind | |
39 | * information. For this to work in the function tracer many functions would | |
40 | * have to be marked with __notrace. So for now just depend on | |
41 | * !CONFIG_ARM_UNWIND. | |
42 | */ | |
43 | ||
44 | void *return_address(unsigned int); | |
45 | ||
46 | #else | |
47 | ||
aeea3592 | 48 | static inline void *return_address(unsigned int level) |
4bf1fa5a UKK |
49 | { |
50 | return NULL; | |
51 | } | |
52 | ||
53 | #endif | |
54 | ||
1712ef43 | 55 | #define ftrace_return_address(n) return_address(n) |
4bf1fa5a UKK |
56 | |
57 | #endif /* ifndef __ASSEMBLY__ */ | |
58 | ||
395a59d0 | 59 | #endif /* _ASM_ARM_FTRACE */ |