aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/ftrace.c
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2009-09-19 00:50:42 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2009-10-14 03:53:56 -0400
commitc44fc770845163f8d9e573f37f92a7b7a7ade14e (patch)
treedac4327b1454b73cefe7ffb2ef28cc67ea878f2b /arch/s390/kernel/ftrace.c
parent4d8289494a37e19cd7f3beacea9c957ad3debad6 (diff)
tracing: Move syscalls metadata handling from arch to core
Most of the syscalls metadata processing is done from arch. But these operations are mostly generic accross archs. Especially now that we have a common variable name that expresses the number of syscalls supported by an arch: NR_syscalls, the only remaining bits that need to reside in arch is the syscall nr to addr translation. v2: Compare syscalls symbols only after the "sys" prefix so that we avoid spurious mismatches with archs that have syscalls wrappers, in which case syscalls symbols have "SyS" prefixed aliases. (Reported by: Heiko Carstens) Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Li Zefan <lizf@cn.fujitsu.com> Cc: Masami Hiramatsu <mhiramat@redhat.com> Cc: Jason Baron <jbaron@redhat.com> Cc: Lai Jiangshan <laijs@cn.fujitsu.com> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/s390/kernel/ftrace.c')
-rw-r--r--arch/s390/kernel/ftrace.c67
1 files changed, 2 insertions, 65 deletions
diff --git a/arch/s390/kernel/ftrace.c b/arch/s390/kernel/ftrace.c
index 57bdcb1e3cdf..7c5752c3423d 100644
--- a/arch/s390/kernel/ftrace.c
+++ b/arch/s390/kernel/ftrace.c
@@ -206,73 +206,10 @@ out:
206 206
207#ifdef CONFIG_FTRACE_SYSCALLS 207#ifdef CONFIG_FTRACE_SYSCALLS
208 208
209extern unsigned long __start_syscalls_metadata[];
210extern unsigned long __stop_syscalls_metadata[];
211extern unsigned int sys_call_table[]; 209extern unsigned int sys_call_table[];
212 210
213static struct syscall_metadata **syscalls_metadata; 211unsigned long __init arch_syscall_addr(int nr)
214
215struct syscall_metadata *syscall_nr_to_meta(int nr)
216{
217 if (!syscalls_metadata || nr >= NR_syscalls || nr < 0)
218 return NULL;
219
220 return syscalls_metadata[nr];
221}
222
223int syscall_name_to_nr(char *name)
224{
225 int i;
226
227 if (!syscalls_metadata)
228 return -1;
229 for (i = 0; i < NR_syscalls; i++)
230 if (syscalls_metadata[i])
231 if (!strcmp(syscalls_metadata[i]->name, name))
232 return i;
233 return -1;
234}
235
236void set_syscall_enter_id(int num, int id)
237{
238 syscalls_metadata[num]->enter_id = id;
239}
240
241void set_syscall_exit_id(int num, int id)
242{ 212{
243 syscalls_metadata[num]->exit_id = id; 213 return (unsigned long)sys_call_table[nr];
244}
245
246static struct syscall_metadata *find_syscall_meta(unsigned long syscall)
247{
248 struct syscall_metadata *start;
249 struct syscall_metadata *stop;
250 char str[KSYM_SYMBOL_LEN];
251
252 start = (struct syscall_metadata *)__start_syscalls_metadata;
253 stop = (struct syscall_metadata *)__stop_syscalls_metadata;
254 kallsyms_lookup(syscall, NULL, NULL, NULL, str);
255
256 for ( ; start < stop; start++) {
257 if (start->name && !strcmp(start->name + 3, str + 3))
258 return start;
259 }
260 return NULL;
261}
262
263static int __init arch_init_ftrace_syscalls(void)
264{
265 struct syscall_metadata *meta;
266 int i;
267 syscalls_metadata = kzalloc(sizeof(*syscalls_metadata) * NR_syscalls,
268 GFP_KERNEL);
269 if (!syscalls_metadata)
270 return -ENOMEM;
271 for (i = 0; i < NR_syscalls; i++) {
272 meta = find_syscall_meta((unsigned long)sys_call_table[i]);
273 syscalls_metadata[i] = meta;
274 }
275 return 0;
276} 214}
277arch_initcall(arch_init_ftrace_syscalls);
278#endif 215#endif