diff options
Diffstat (limited to 'arch/s390/kernel/ftrace.c')
| -rw-r--r-- | arch/s390/kernel/ftrace.c | 67 |
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 | ||
| 209 | extern unsigned long __start_syscalls_metadata[]; | ||
| 210 | extern unsigned long __stop_syscalls_metadata[]; | ||
| 211 | extern unsigned int sys_call_table[]; | 209 | extern unsigned int sys_call_table[]; |
| 212 | 210 | ||
| 213 | static struct syscall_metadata **syscalls_metadata; | 211 | unsigned long __init arch_syscall_addr(int nr) |
| 214 | |||
| 215 | struct 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 | |||
| 223 | int 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 | |||
| 236 | void set_syscall_enter_id(int num, int id) | ||
| 237 | { | ||
| 238 | syscalls_metadata[num]->enter_id = id; | ||
| 239 | } | ||
| 240 | |||
| 241 | void 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 | |||
| 246 | static 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 | |||
| 263 | static 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 | } |
| 277 | arch_initcall(arch_init_ftrace_syscalls); | ||
| 278 | #endif | 215 | #endif |
