aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64/kernel
diff options
context:
space:
mode:
authorAbhishek Sagar <sagar.abhishek@gmail.com>2008-06-21 14:17:27 -0400
committerIngo Molnar <mingo@elte.hu>2008-06-23 16:10:56 -0400
commit395a59d0f8e86bb39cd700c3d185d30c670bb958 (patch)
tree1558e635efcede901c5dbe9acd625d475db5b369 /arch/sparc64/kernel
parentf34bfb1beef8a17ba3d46b60f8fa19ffedc1ed8d (diff)
ftrace: store mcount address in rec->ip
Record the address of the mcount call-site. Currently all archs except sparc64 record the address of the instruction following the mcount call-site. Some general cleanups are entailed. Storing mcount addresses in rec->ip enables looking them up in the kprobe hash table later on to check if they're kprobe'd. Signed-off-by: Abhishek Sagar <sagar.abhishek@gmail.com> Cc: davem@davemloft.net Cc: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/sparc64/kernel')
-rw-r--r--arch/sparc64/kernel/ftrace.c10
-rw-r--r--arch/sparc64/kernel/sparc64_ksyms.c2
2 files changed, 7 insertions, 5 deletions
diff --git a/arch/sparc64/kernel/ftrace.c b/arch/sparc64/kernel/ftrace.c
index c17373195b1e..4298d0aee713 100644
--- a/arch/sparc64/kernel/ftrace.c
+++ b/arch/sparc64/kernel/ftrace.c
@@ -5,6 +5,8 @@
5#include <linux/init.h> 5#include <linux/init.h>
6#include <linux/list.h> 6#include <linux/list.h>
7 7
8#include <asm/ftrace.h>
9
8static const u32 ftrace_nop = 0x01000000; 10static const u32 ftrace_nop = 0x01000000;
9 11
10notrace unsigned char *ftrace_nop_replace(void) 12notrace unsigned char *ftrace_nop_replace(void)
@@ -60,9 +62,9 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code,
60notrace int ftrace_update_ftrace_func(ftrace_func_t func) 62notrace int ftrace_update_ftrace_func(ftrace_func_t func)
61{ 63{
62 unsigned long ip = (unsigned long)(&ftrace_call); 64 unsigned long ip = (unsigned long)(&ftrace_call);
63 unsigned char old[4], *new; 65 unsigned char old[MCOUNT_INSN_SIZE], *new;
64 66
65 memcpy(old, &ftrace_call, 4); 67 memcpy(old, &ftrace_call, MCOUNT_INSN_SIZE);
66 new = ftrace_call_replace(ip, (unsigned long)func); 68 new = ftrace_call_replace(ip, (unsigned long)func);
67 return ftrace_modify_code(ip, old, new); 69 return ftrace_modify_code(ip, old, new);
68} 70}
@@ -71,13 +73,13 @@ notrace int ftrace_mcount_set(unsigned long *data)
71{ 73{
72 unsigned long ip = (long)(&mcount_call); 74 unsigned long ip = (long)(&mcount_call);
73 unsigned long *addr = data; 75 unsigned long *addr = data;
74 unsigned char old[4], *new; 76 unsigned char old[MCOUNT_INSN_SIZE], *new;
75 77
76 /* 78 /*
77 * Replace the mcount stub with a pointer to the 79 * Replace the mcount stub with a pointer to the
78 * ip recorder function. 80 * ip recorder function.
79 */ 81 */
80 memcpy(old, &mcount_call, 4); 82 memcpy(old, &mcount_call, MCOUNT_INSN_SIZE);
81 new = ftrace_call_replace(ip, *addr); 83 new = ftrace_call_replace(ip, *addr);
82 *addr = ftrace_modify_code(ip, old, new); 84 *addr = ftrace_modify_code(ip, old, new);
83 85
diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c
index 8ac0b99f2c55..b80d982a29c6 100644
--- a/arch/sparc64/kernel/sparc64_ksyms.c
+++ b/arch/sparc64/kernel/sparc64_ksyms.c
@@ -53,6 +53,7 @@
53#include <asm/ns87303.h> 53#include <asm/ns87303.h>
54#include <asm/timer.h> 54#include <asm/timer.h>
55#include <asm/cpudata.h> 55#include <asm/cpudata.h>
56#include <asm/ftrace.h>
56 57
57struct poll { 58struct poll {
58 int fd; 59 int fd;
@@ -112,7 +113,6 @@ EXPORT_SYMBOL(smp_call_function);
112#endif /* CONFIG_SMP */ 113#endif /* CONFIG_SMP */
113 114
114#if defined(CONFIG_MCOUNT) 115#if defined(CONFIG_MCOUNT)
115extern void _mcount(void);
116EXPORT_SYMBOL(_mcount); 116EXPORT_SYMBOL(_mcount);
117#endif 117#endif
118 118