diff options
Diffstat (limited to 'arch/x86/kernel/entry_64.S')
-rw-r--r-- | arch/x86/kernel/entry_64.S | 98 |
1 files changed, 69 insertions, 29 deletions
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 3194636a4293..e28c7a987793 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -67,16 +67,10 @@ ENTRY(mcount) | |||
67 | END(mcount) | 67 | END(mcount) |
68 | 68 | ||
69 | ENTRY(ftrace_caller) | 69 | ENTRY(ftrace_caller) |
70 | cmpl $0, function_trace_stop | ||
71 | jne ftrace_stub | ||
70 | 72 | ||
71 | /* taken from glibc */ | 73 | MCOUNT_SAVE_FRAME |
72 | subq $0x38, %rsp | ||
73 | movq %rax, (%rsp) | ||
74 | movq %rcx, 8(%rsp) | ||
75 | movq %rdx, 16(%rsp) | ||
76 | movq %rsi, 24(%rsp) | ||
77 | movq %rdi, 32(%rsp) | ||
78 | movq %r8, 40(%rsp) | ||
79 | movq %r9, 48(%rsp) | ||
80 | 74 | ||
81 | movq 0x38(%rsp), %rdi | 75 | movq 0x38(%rsp), %rdi |
82 | movq 8(%rbp), %rsi | 76 | movq 8(%rbp), %rsi |
@@ -86,14 +80,13 @@ ENTRY(ftrace_caller) | |||
86 | ftrace_call: | 80 | ftrace_call: |
87 | call ftrace_stub | 81 | call ftrace_stub |
88 | 82 | ||
89 | movq 48(%rsp), %r9 | 83 | MCOUNT_RESTORE_FRAME |
90 | movq 40(%rsp), %r8 | 84 | |
91 | movq 32(%rsp), %rdi | 85 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
92 | movq 24(%rsp), %rsi | 86 | .globl ftrace_graph_call |
93 | movq 16(%rsp), %rdx | 87 | ftrace_graph_call: |
94 | movq 8(%rsp), %rcx | 88 | jmp ftrace_stub |
95 | movq (%rsp), %rax | 89 | #endif |
96 | addq $0x38, %rsp | ||
97 | 90 | ||
98 | .globl ftrace_stub | 91 | .globl ftrace_stub |
99 | ftrace_stub: | 92 | ftrace_stub: |
@@ -102,15 +95,63 @@ END(ftrace_caller) | |||
102 | 95 | ||
103 | #else /* ! CONFIG_DYNAMIC_FTRACE */ | 96 | #else /* ! CONFIG_DYNAMIC_FTRACE */ |
104 | ENTRY(mcount) | 97 | ENTRY(mcount) |
98 | cmpl $0, function_trace_stop | ||
99 | jne ftrace_stub | ||
100 | |||
105 | cmpq $ftrace_stub, ftrace_trace_function | 101 | cmpq $ftrace_stub, ftrace_trace_function |
106 | jnz trace | 102 | jnz trace |
103 | |||
104 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
105 | cmpq $ftrace_stub, ftrace_graph_return | ||
106 | jnz ftrace_graph_caller | ||
107 | |||
108 | cmpq $ftrace_graph_entry_stub, ftrace_graph_entry | ||
109 | jnz ftrace_graph_caller | ||
110 | #endif | ||
111 | |||
107 | .globl ftrace_stub | 112 | .globl ftrace_stub |
108 | ftrace_stub: | 113 | ftrace_stub: |
109 | retq | 114 | retq |
110 | 115 | ||
111 | trace: | 116 | trace: |
112 | /* taken from glibc */ | 117 | MCOUNT_SAVE_FRAME |
113 | subq $0x38, %rsp | 118 | |
119 | movq 0x38(%rsp), %rdi | ||
120 | movq 8(%rbp), %rsi | ||
121 | subq $MCOUNT_INSN_SIZE, %rdi | ||
122 | |||
123 | call *ftrace_trace_function | ||
124 | |||
125 | MCOUNT_RESTORE_FRAME | ||
126 | |||
127 | jmp ftrace_stub | ||
128 | END(mcount) | ||
129 | #endif /* CONFIG_DYNAMIC_FTRACE */ | ||
130 | #endif /* CONFIG_FUNCTION_TRACER */ | ||
131 | |||
132 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
133 | ENTRY(ftrace_graph_caller) | ||
134 | cmpl $0, function_trace_stop | ||
135 | jne ftrace_stub | ||
136 | |||
137 | MCOUNT_SAVE_FRAME | ||
138 | |||
139 | leaq 8(%rbp), %rdi | ||
140 | movq 0x38(%rsp), %rsi | ||
141 | subq $MCOUNT_INSN_SIZE, %rsi | ||
142 | |||
143 | call prepare_ftrace_return | ||
144 | |||
145 | MCOUNT_RESTORE_FRAME | ||
146 | |||
147 | retq | ||
148 | END(ftrace_graph_caller) | ||
149 | |||
150 | |||
151 | .globl return_to_handler | ||
152 | return_to_handler: | ||
153 | subq $80, %rsp | ||
154 | |||
114 | movq %rax, (%rsp) | 155 | movq %rax, (%rsp) |
115 | movq %rcx, 8(%rsp) | 156 | movq %rcx, 8(%rsp) |
116 | movq %rdx, 16(%rsp) | 157 | movq %rdx, 16(%rsp) |
@@ -118,13 +159,14 @@ trace: | |||
118 | movq %rdi, 32(%rsp) | 159 | movq %rdi, 32(%rsp) |
119 | movq %r8, 40(%rsp) | 160 | movq %r8, 40(%rsp) |
120 | movq %r9, 48(%rsp) | 161 | movq %r9, 48(%rsp) |
162 | movq %r10, 56(%rsp) | ||
163 | movq %r11, 64(%rsp) | ||
121 | 164 | ||
122 | movq 0x38(%rsp), %rdi | 165 | call ftrace_return_to_handler |
123 | movq 8(%rbp), %rsi | ||
124 | subq $MCOUNT_INSN_SIZE, %rdi | ||
125 | |||
126 | call *ftrace_trace_function | ||
127 | 166 | ||
167 | movq %rax, 72(%rsp) | ||
168 | movq 64(%rsp), %r11 | ||
169 | movq 56(%rsp), %r10 | ||
128 | movq 48(%rsp), %r9 | 170 | movq 48(%rsp), %r9 |
129 | movq 40(%rsp), %r8 | 171 | movq 40(%rsp), %r8 |
130 | movq 32(%rsp), %rdi | 172 | movq 32(%rsp), %rdi |
@@ -132,12 +174,10 @@ trace: | |||
132 | movq 16(%rsp), %rdx | 174 | movq 16(%rsp), %rdx |
133 | movq 8(%rsp), %rcx | 175 | movq 8(%rsp), %rcx |
134 | movq (%rsp), %rax | 176 | movq (%rsp), %rax |
135 | addq $0x38, %rsp | 177 | addq $72, %rsp |
178 | retq | ||
179 | #endif | ||
136 | 180 | ||
137 | jmp ftrace_stub | ||
138 | END(mcount) | ||
139 | #endif /* CONFIG_DYNAMIC_FTRACE */ | ||
140 | #endif /* CONFIG_FUNCTION_TRACER */ | ||
141 | 181 | ||
142 | #ifndef CONFIG_PREEMPT | 182 | #ifndef CONFIG_PREEMPT |
143 | #define retint_kernel retint_restore_args | 183 | #define retint_kernel retint_restore_args |