diff options
Diffstat (limited to 'arch/x86/kernel/entry_32.S')
-rw-r--r-- | arch/x86/kernel/entry_32.S | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index fe7014176eb0..d6f0490a7391 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
@@ -954,6 +954,9 @@ ENTRY(mcount) | |||
954 | END(mcount) | 954 | END(mcount) |
955 | 955 | ||
956 | ENTRY(ftrace_caller) | 956 | ENTRY(ftrace_caller) |
957 | cmpl $0, function_trace_stop | ||
958 | jne ftrace_stub | ||
959 | |||
957 | pushl %eax | 960 | pushl %eax |
958 | pushl %ecx | 961 | pushl %ecx |
959 | pushl %edx | 962 | pushl %edx |
@@ -968,6 +971,11 @@ ftrace_call: | |||
968 | popl %edx | 971 | popl %edx |
969 | popl %ecx | 972 | popl %ecx |
970 | popl %eax | 973 | popl %eax |
974 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
975 | .globl ftrace_graph_call | ||
976 | ftrace_graph_call: | ||
977 | jmp ftrace_stub | ||
978 | #endif | ||
971 | 979 | ||
972 | .globl ftrace_stub | 980 | .globl ftrace_stub |
973 | ftrace_stub: | 981 | ftrace_stub: |
@@ -977,8 +985,18 @@ END(ftrace_caller) | |||
977 | #else /* ! CONFIG_DYNAMIC_FTRACE */ | 985 | #else /* ! CONFIG_DYNAMIC_FTRACE */ |
978 | 986 | ||
979 | ENTRY(mcount) | 987 | ENTRY(mcount) |
988 | cmpl $0, function_trace_stop | ||
989 | jne ftrace_stub | ||
990 | |||
980 | cmpl $ftrace_stub, ftrace_trace_function | 991 | cmpl $ftrace_stub, ftrace_trace_function |
981 | jnz trace | 992 | jnz trace |
993 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
994 | cmpl $ftrace_stub, ftrace_graph_return | ||
995 | jnz ftrace_graph_caller | ||
996 | |||
997 | cmpl $ftrace_graph_entry_stub, ftrace_graph_entry | ||
998 | jnz ftrace_graph_caller | ||
999 | #endif | ||
982 | .globl ftrace_stub | 1000 | .globl ftrace_stub |
983 | ftrace_stub: | 1001 | ftrace_stub: |
984 | ret | 1002 | ret |
@@ -997,12 +1015,43 @@ trace: | |||
997 | popl %edx | 1015 | popl %edx |
998 | popl %ecx | 1016 | popl %ecx |
999 | popl %eax | 1017 | popl %eax |
1000 | |||
1001 | jmp ftrace_stub | 1018 | jmp ftrace_stub |
1002 | END(mcount) | 1019 | END(mcount) |
1003 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 1020 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
1004 | #endif /* CONFIG_FUNCTION_TRACER */ | 1021 | #endif /* CONFIG_FUNCTION_TRACER */ |
1005 | 1022 | ||
1023 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
1024 | ENTRY(ftrace_graph_caller) | ||
1025 | cmpl $0, function_trace_stop | ||
1026 | jne ftrace_stub | ||
1027 | |||
1028 | pushl %eax | ||
1029 | pushl %ecx | ||
1030 | pushl %edx | ||
1031 | movl 0xc(%esp), %edx | ||
1032 | lea 0x4(%ebp), %eax | ||
1033 | subl $MCOUNT_INSN_SIZE, %edx | ||
1034 | call prepare_ftrace_return | ||
1035 | popl %edx | ||
1036 | popl %ecx | ||
1037 | popl %eax | ||
1038 | ret | ||
1039 | END(ftrace_graph_caller) | ||
1040 | |||
1041 | .globl return_to_handler | ||
1042 | return_to_handler: | ||
1043 | pushl $0 | ||
1044 | pushl %eax | ||
1045 | pushl %ecx | ||
1046 | pushl %edx | ||
1047 | call ftrace_return_to_handler | ||
1048 | movl %eax, 0xc(%esp) | ||
1049 | popl %edx | ||
1050 | popl %ecx | ||
1051 | popl %eax | ||
1052 | ret | ||
1053 | #endif | ||
1054 | |||
1006 | .section .rodata,"a" | 1055 | .section .rodata,"a" |
1007 | #include "syscall_table_32.S" | 1056 | #include "syscall_table_32.S" |
1008 | 1057 | ||