From 12f03c6a0d4f4716105f93c62680eb84b1427b6a Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Wed, 11 Feb 2009 12:45:49 -0800 Subject: [PATCH] --- yaml --- r: 138465 b: refs/heads/master c: bb7253403f7a4670a128e4c080fd8ea1bd4d5029 h: refs/heads/master i: 138463: a5c8210cc921f06b2fed04db79d694cce9a138a1 v: v3 --- [refs] | 2 +- trunk/arch/powerpc/kernel/entry_64.S | 27 ++++++++++++++++++++++++++- trunk/arch/powerpc/kernel/ftrace.c | 13 +++++++++++-- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 3b8555ca2e15..1ddb9a1d6e84 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 465428884765b43d642a967915e16c6c7cacbe8e +refs/heads/master: bb7253403f7a4670a128e4c080fd8ea1bd4d5029 diff --git a/trunk/arch/powerpc/kernel/entry_64.S b/trunk/arch/powerpc/kernel/entry_64.S index 9f61fd61f277..abfc32330479 100644 --- a/trunk/arch/powerpc/kernel/entry_64.S +++ b/trunk/arch/powerpc/kernel/entry_64.S @@ -970,6 +970,28 @@ _GLOBAL(ftrace_graph_caller) blr _GLOBAL(return_to_handler) + /* need to save return values */ + std r4, -24(r1) + std r3, -16(r1) + std r31, -8(r1) + mr r31, r1 + stdu r1, -112(r1) + + bl .ftrace_return_to_handler + nop + + /* return value has real return address */ + mtlr r3 + + ld r1, 0(r1) + ld r4, -24(r1) + ld r3, -16(r1) + ld r31, -8(r1) + + /* Jump back to real return address */ + blr + +_GLOBAL(mod_return_to_handler) /* need to save return values */ std r4, -32(r1) std r3, -24(r1) @@ -979,7 +1001,10 @@ _GLOBAL(return_to_handler) mr r31, r1 stdu r1, -112(r1) - /* update the TOC */ + /* + * We are in a module using the module's TOC. + * Switch to our TOC to run inside the core kernel. + */ LOAD_REG_IMMEDIATE(r4,ftrace_return_to_handler) ld r2, 8(r4) diff --git a/trunk/arch/powerpc/kernel/ftrace.c b/trunk/arch/powerpc/kernel/ftrace.c index 7538b944fa52..5c6dfa97e838 100644 --- a/trunk/arch/powerpc/kernel/ftrace.c +++ b/trunk/arch/powerpc/kernel/ftrace.c @@ -567,6 +567,10 @@ int ftrace_disable_ftrace_graph_caller(void) } #endif /* CONFIG_DYNAMIC_FTRACE */ +#ifdef CONFIG_PPC64 +extern void mod_return_to_handler(void); +#endif + /* * Hook the return address and push it in the stack of return addrs * in current thread info. @@ -577,12 +581,17 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) unsigned long long calltime; int faulted; struct ftrace_graph_ent trace; - unsigned long return_hooker = (unsigned long) - &return_to_handler; + unsigned long return_hooker = (unsigned long)&return_to_handler; if (unlikely(atomic_read(¤t->tracing_graph_pause))) return; +#if CONFIG_PPC64 + /* non core kernel code needs to save and restore the TOC */ + if (REGION_ID(self_addr) != KERNEL_REGION_ID) + return_hooker = (unsigned long)&mod_return_to_handler; +#endif + return_hooker = GET_ADDR(return_hooker); /*