]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/powerpc/kernel/ftrace.c
powerpc/cell/cpufreq: Add spu aware cpufreq governor
[linux-2.6-omap-h63xx.git] / arch / powerpc / kernel / ftrace.c
index 5a4993fefa45f5001aa3212fb11a04492c24e251..3855ceb937b0d23ae3b5d39bf271aabadea5eb79 100644 (file)
@@ -15,8 +15,8 @@
 #include <linux/list.h>
 
 #include <asm/cacheflush.h>
+#include <asm/ftrace.h>
 
-#define CALL_BACK              4
 
 static unsigned int ftrace_nop = 0x60000000;
 
@@ -27,19 +27,10 @@ static unsigned int ftrace_nop = 0x60000000;
 # define GET_ADDR(addr) *(unsigned long *)addr
 #endif
 
-notrace int ftrace_ip_converted(unsigned long ip)
-{
-       unsigned int save;
-
-       ip -= CALL_BACK;
-       save = *(unsigned int *)ip;
-
-       return save == ftrace_nop;
-}
 
 static unsigned int notrace ftrace_calc_offset(long ip, long addr)
 {
-       return (int)((addr + CALL_BACK) - ip);
+       return (int)(addr - ip);
 }
 
 notrace unsigned char *ftrace_nop_replace(void)
@@ -51,10 +42,16 @@ notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
 {
        static unsigned int op;
 
+       /*
+        * It would be nice to just use create_function_call, but that will
+        * update the code itself. Here we need to just return the
+        * instruction that is going to be modified, without modifying the
+        * code.
+        */
        addr = GET_ADDR(addr);
 
        /* Set to "bl addr" */
-       op = 0x48000001 | (ftrace_calc_offset(ip, addr) & 0x03fffffe);
+       op = 0x48000001 | (ftrace_calc_offset(ip, addr) & 0x03fffffc);
 
        /*
         * No locking needed, this must be called via kstop_machine
@@ -80,9 +77,6 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code,
        unsigned new = *(unsigned *)new_code;
        int faulted = 0;
 
-       /* move the IP back to the start of the call */
-       ip -= CALL_BACK;
-
        /*
         * Note: Due to modules and __init, code can
         *  disappear and change, we need to protect against faulting
@@ -122,12 +116,10 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code,
 notrace int ftrace_update_ftrace_func(ftrace_func_t func)
 {
        unsigned long ip = (unsigned long)(&ftrace_call);
-       unsigned char old[4], *new;
+       unsigned char old[MCOUNT_INSN_SIZE], *new;
        int ret;
 
-       ip += CALL_BACK;
-
-       memcpy(old, &ftrace_call, 4);
+       memcpy(old, &ftrace_call, MCOUNT_INSN_SIZE);
        new = ftrace_call_replace(ip, (unsigned long)func);
        ret = ftrace_modify_code(ip, old, new);
 
@@ -138,16 +130,13 @@ notrace int ftrace_mcount_set(unsigned long *data)
 {
        unsigned long ip = (long)(&mcount_call);
        unsigned long *addr = data;
-       unsigned char old[4], *new;
-
-       /* ip is at the location, but modify code will subtact this */
-       ip += CALL_BACK;
+       unsigned char old[MCOUNT_INSN_SIZE], *new;
 
        /*
         * Replace the mcount stub with a pointer to the
         * ip recorder function.
         */
-       memcpy(old, &mcount_call, 4);
+       memcpy(old, &mcount_call, MCOUNT_INSN_SIZE);
        new = ftrace_call_replace(ip, *addr);
        *addr = ftrace_modify_code(ip, old, new);