aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-02-13 09:45:27 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2009-02-22 18:48:56 -0500
commitbb9b903527eb16c8fdad59a562c29e89f5dcf233 (patch)
tree3a6cbb3a2999f2175762ba0a09f78f52933ff296 /arch
parentb54dcfe108b1b72c9d891dce1034aa5679c0d7db (diff)
powerpc, ftrace: use create_branch lib function
Impact: clean up, remove duplicate code When ftrace was first ported to PowerPC, there existed a create_function_call that would create the instruction to make a call to a given address. Unfortunately, this call expected to write to the address it was given, and since it used the address to calculate the offset, it could not be faked. ftrace needed a way to create the instruction without actually writing that instruction to the text section. So ftrace had to implement its own code. Now we have create_branch in the code patching library, which does exactly what ftrace needs. This patch replaces ftrace's implementation with the library function. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/kernel/ftrace.c14
1 files changed, 1 insertions, 13 deletions
diff --git a/arch/powerpc/kernel/ftrace.c b/arch/powerpc/kernel/ftrace.c
index 610c852b92ed..4c75a1c0a5b4 100644
--- a/arch/powerpc/kernel/ftrace.c
+++ b/arch/powerpc/kernel/ftrace.c
@@ -31,11 +31,6 @@
31#endif 31#endif
32 32
33#ifdef CONFIG_DYNAMIC_FTRACE 33#ifdef CONFIG_DYNAMIC_FTRACE
34static unsigned int ftrace_calc_offset(long ip, long addr)
35{
36 return (int)(addr - ip);
37}
38
39static unsigned int ftrace_nop_replace(void) 34static unsigned int ftrace_nop_replace(void)
40{ 35{
41 return PPC_NOP_INSTR; 36 return PPC_NOP_INSTR;
@@ -46,17 +41,10 @@ ftrace_call_replace(unsigned long ip, unsigned long addr, int link)
46{ 41{
47 unsigned int op; 42 unsigned int op;
48 43
49 /*
50 * It would be nice to just use create_function_call, but that will
51 * update the code itself. Here we need to just return the
52 * instruction that is going to be modified, without modifying the
53 * code.
54 */
55 addr = GET_ADDR(addr); 44 addr = GET_ADDR(addr);
56 45
57 /* if (link) set op to 'bl' else 'b' */ 46 /* if (link) set op to 'bl' else 'b' */
58 op = 0x48000000 | (link ? 1 : 0); 47 op = create_branch((unsigned int *)ip, addr, link ? 1 : 0);
59 op |= (ftrace_calc_offset(ip, addr) & 0x03fffffc);
60 48
61 return op; 49 return op;
62} 50}