diff options
author | Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 2008-05-12 15:20:42 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2008-05-23 14:31:58 -0400 |
commit | 16444a8a40d4c7b4f6de34af0cae1f76a4f6c901 (patch) | |
tree | 9c290bcdbdc1ecf8f578c30b3b36914e14fdaacc /arch/x86/kernel/entry_32.S | |
parent | 6e766410c4babd37bc7cd5e25009c179781742c8 (diff) |
ftrace: add basic support for gcc profiler instrumentation
If CONFIG_FTRACE is selected and /proc/sys/kernel/ftrace_enabled is
set to a non-zero value the ftrace routine will be called everytime
we enter a kernel function that is not marked with the "notrace"
attribute.
The ftrace routine will then call a registered function if a function
happens to be registered.
[ This code has been highly hacked by Steven Rostedt and Ingo Molnar,
so don't blame Arnaldo for all of this ;-) ]
Update:
It is now possible to register more than one ftrace function.
If only one ftrace function is registered, that will be the
function that ftrace calls directly. If more than one function
is registered, then ftrace will call a function that will loop
through the functions to call.
Signed-off-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/entry_32.S')
-rw-r--r-- | arch/x86/kernel/entry_32.S | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 2a609dc3271..f47b9b5440d 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
@@ -1109,6 +1109,33 @@ ENDPROC(xen_failsafe_callback) | |||
1109 | 1109 | ||
1110 | #endif /* CONFIG_XEN */ | 1110 | #endif /* CONFIG_XEN */ |
1111 | 1111 | ||
1112 | #ifdef CONFIG_FTRACE | ||
1113 | ENTRY(mcount) | ||
1114 | cmpl $ftrace_stub, ftrace_trace_function | ||
1115 | jnz trace | ||
1116 | |||
1117 | .globl ftrace_stub | ||
1118 | ftrace_stub: | ||
1119 | ret | ||
1120 | |||
1121 | /* taken from glibc */ | ||
1122 | trace: | ||
1123 | pushl %eax | ||
1124 | pushl %ecx | ||
1125 | pushl %edx | ||
1126 | movl 0xc(%esp), %eax | ||
1127 | movl 0x4(%ebp), %edx | ||
1128 | |||
1129 | call *ftrace_trace_function | ||
1130 | |||
1131 | popl %edx | ||
1132 | popl %ecx | ||
1133 | popl %eax | ||
1134 | |||
1135 | jmp ftrace_stub | ||
1136 | END(mcount) | ||
1137 | #endif | ||
1138 | |||
1112 | .section .rodata,"a" | 1139 | .section .rodata,"a" |
1113 | #include "syscall_table_32.S" | 1140 | #include "syscall_table_32.S" |
1114 | 1141 | ||