Mike Frysinger | 1c873be | 2009-06-09 07:25:09 -0400 | [diff] [blame] | 1 | /* |
| 2 | * Blackfin ftrace code |
| 3 | * |
| 4 | * Copyright 2009 Analog Devices Inc. |
| 5 | * Licensed under the GPL-2 or later. |
| 6 | */ |
| 7 | |
| 8 | #ifndef __ASM_BFIN_FTRACE_H__ |
| 9 | #define __ASM_BFIN_FTRACE_H__ |
| 10 | |
Yi Li | 5bf9cbe | 2009-09-15 09:24:31 +0000 | [diff] [blame] | 11 | #define MCOUNT_INSN_SIZE 6 /* sizeof "[++sp] = rets; call __mcount;" */ |
Mike Frysinger | 1c873be | 2009-06-09 07:25:09 -0400 | [diff] [blame] | 12 | |
Yi Li | 7136d9c | 2010-01-26 04:02:44 +0000 | [diff] [blame] | 13 | #ifndef __ASSEMBLY__ |
| 14 | |
| 15 | #ifdef CONFIG_FRAME_POINTER |
| 16 | #include <linux/mm.h> |
| 17 | |
| 18 | extern inline void *return_address(unsigned int level) |
| 19 | { |
| 20 | unsigned long *endstack, *fp, *ret_addr; |
| 21 | unsigned int current_level = 0; |
| 22 | |
| 23 | if (level == 0) |
| 24 | return __builtin_return_address(0); |
| 25 | |
| 26 | fp = (unsigned long *)__builtin_frame_address(0); |
| 27 | endstack = (unsigned long *)PAGE_ALIGN((unsigned long)&level); |
| 28 | |
| 29 | while (((unsigned long)fp & 0x3) == 0 && fp && |
| 30 | (fp + 1) < endstack && current_level < level) { |
| 31 | fp = (unsigned long *)*fp; |
| 32 | current_level++; |
| 33 | } |
| 34 | |
| 35 | if (((unsigned long)fp & 0x3) == 0 && fp && |
| 36 | (fp + 1) < endstack) |
| 37 | ret_addr = (unsigned long *)*(fp + 1); |
| 38 | else |
| 39 | ret_addr = NULL; |
| 40 | |
| 41 | return ret_addr; |
| 42 | } |
| 43 | |
| 44 | #else |
| 45 | |
| 46 | extern inline void *return_address(unsigned int level) |
| 47 | { |
| 48 | return NULL; |
| 49 | } |
| 50 | |
| 51 | #endif /* CONFIG_FRAME_POINTER */ |
| 52 | |
| 53 | #define HAVE_ARCH_CALLER_ADDR |
| 54 | |
| 55 | /* inline function or macro may lead to unexpected result */ |
| 56 | #define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) |
| 57 | #define CALLER_ADDR1 ((unsigned long)return_address(1)) |
| 58 | #define CALLER_ADDR2 ((unsigned long)return_address(2)) |
| 59 | #define CALLER_ADDR3 ((unsigned long)return_address(3)) |
| 60 | #define CALLER_ADDR4 ((unsigned long)return_address(4)) |
| 61 | #define CALLER_ADDR5 ((unsigned long)return_address(5)) |
| 62 | #define CALLER_ADDR6 ((unsigned long)return_address(6)) |
| 63 | |
| 64 | #endif /* __ASSEMBLY__ */ |
| 65 | |
Mike Frysinger | 1c873be | 2009-06-09 07:25:09 -0400 | [diff] [blame] | 66 | #endif |