powerpc/ftrace: Fix math to calculate offset in TOC
authorSteven Rostedt <rostedt@goodmis.org>
Sat, 7 Feb 2009 20:22:40 +0000 (20:22 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 10 Feb 2009 03:39:08 +0000 (14:39 +1100)
Impact: fix dynamic ftrace with large modules in PPC64

The math to calculate the offset into the TOC that is taken from reading
the trampoline is incorrect. The bottom half of the offset is a signed
extended short. The current code was using an OR to create the offset
when it should have been using an addition.

Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Acked-by: Geoff Levand <geoffrey.levand@am.sony.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/ftrace.c

index 5355244c99ff934abde18ce75336fe9a37689bcb..60c60ccf5e3c83cdd3f9d02fe2b0d48c88edf66b 100644 (file)
@@ -195,8 +195,9 @@ __ftrace_make_nop(struct module *mod,
                return -EINVAL;
        }
 
-       offset = (unsigned)((unsigned short)jmp[0]) << 16 |
-               (unsigned)((unsigned short)jmp[1]);
+       /* The bottom half is signed extended */
+       offset = ((unsigned)((unsigned short)jmp[0]) << 16) +
+               (int)((short)jmp[1]);
 
        DEBUGP(" %x ", offset);