x86, perf_counter, bts: Fail if BTS is not available
[safe/jmp/linux-2.6] / arch / x86 / kernel / ftrace.c
index 61df775..d94e1ea 100644 (file)
 #include <linux/init.h>
 #include <linux/list.h>
 
+#include <trace/syscall.h>
+
 #include <asm/cacheflush.h>
 #include <asm/ftrace.h>
-#include <linux/ftrace.h>
 #include <asm/nops.h>
 #include <asm/nmi.h>
 
@@ -407,7 +408,8 @@ int ftrace_disable_ftrace_graph_caller(void)
  * Hook the return address and push it in the stack of return addrs
  * in current thread info.
  */
-void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
+void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
+                          unsigned long frame_pointer)
 {
        unsigned long old;
        int faulted;
@@ -441,7 +443,7 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
                _ASM_EXTABLE(1b, 4b)
                _ASM_EXTABLE(2b, 4b)
 
-               : [old] "=r" (old), [faulted] "=r" (faulted)
+               : [old] "=&r" (old), [faulted] "=r" (faulted)
                : [parent] "r" (parent), [return_hooker] "r" (return_hooker)
                : "memory"
        );
@@ -452,7 +454,8 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
                return;
        }
 
-       if (ftrace_push_return_trace(old, self_addr, &trace.depth) == -EBUSY) {
+       if (ftrace_push_return_trace(old, self_addr, &trace.depth,
+                   frame_pointer) == -EBUSY) {
                *parent = old;
                return;
        }