diff options
Diffstat (limited to 'include/linux/syscalls.h')
-rw-r--r-- | include/linux/syscalls.h | 132 |
1 files changed, 125 insertions, 7 deletions
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 80de7003d8c2..a990ace1a838 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -55,7 +55,7 @@ struct compat_timeval; | |||
55 | struct robust_list_head; | 55 | struct robust_list_head; |
56 | struct getcpu_cache; | 56 | struct getcpu_cache; |
57 | struct old_linux_dirent; | 57 | struct old_linux_dirent; |
58 | struct perf_counter_attr; | 58 | struct perf_event_attr; |
59 | 59 | ||
60 | #include <linux/types.h> | 60 | #include <linux/types.h> |
61 | #include <linux/aio_abi.h> | 61 | #include <linux/aio_abi.h> |
@@ -64,6 +64,7 @@ struct perf_counter_attr; | |||
64 | #include <linux/sem.h> | 64 | #include <linux/sem.h> |
65 | #include <asm/siginfo.h> | 65 | #include <asm/siginfo.h> |
66 | #include <asm/signal.h> | 66 | #include <asm/signal.h> |
67 | #include <linux/unistd.h> | ||
67 | #include <linux/quota.h> | 68 | #include <linux/quota.h> |
68 | #include <linux/key.h> | 69 | #include <linux/key.h> |
69 | #include <trace/syscall.h> | 70 | #include <trace/syscall.h> |
@@ -97,6 +98,45 @@ struct perf_counter_attr; | |||
97 | #define __SC_TEST5(t5, a5, ...) __SC_TEST(t5); __SC_TEST4(__VA_ARGS__) | 98 | #define __SC_TEST5(t5, a5, ...) __SC_TEST(t5); __SC_TEST4(__VA_ARGS__) |
98 | #define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__) | 99 | #define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__) |
99 | 100 | ||
101 | #ifdef CONFIG_EVENT_PROFILE | ||
102 | #define TRACE_SYS_ENTER_PROFILE(sname) \ | ||
103 | static int prof_sysenter_enable_##sname(void) \ | ||
104 | { \ | ||
105 | return reg_prof_syscall_enter("sys"#sname); \ | ||
106 | } \ | ||
107 | \ | ||
108 | static void prof_sysenter_disable_##sname(void) \ | ||
109 | { \ | ||
110 | unreg_prof_syscall_enter("sys"#sname); \ | ||
111 | } | ||
112 | |||
113 | #define TRACE_SYS_EXIT_PROFILE(sname) \ | ||
114 | static int prof_sysexit_enable_##sname(void) \ | ||
115 | { \ | ||
116 | return reg_prof_syscall_exit("sys"#sname); \ | ||
117 | } \ | ||
118 | \ | ||
119 | static void prof_sysexit_disable_##sname(void) \ | ||
120 | { \ | ||
121 | unreg_prof_syscall_exit("sys"#sname); \ | ||
122 | } | ||
123 | |||
124 | #define TRACE_SYS_ENTER_PROFILE_INIT(sname) \ | ||
125 | .profile_count = ATOMIC_INIT(-1), \ | ||
126 | .profile_enable = prof_sysenter_enable_##sname, \ | ||
127 | .profile_disable = prof_sysenter_disable_##sname, | ||
128 | |||
129 | #define TRACE_SYS_EXIT_PROFILE_INIT(sname) \ | ||
130 | .profile_count = ATOMIC_INIT(-1), \ | ||
131 | .profile_enable = prof_sysexit_enable_##sname, \ | ||
132 | .profile_disable = prof_sysexit_disable_##sname, | ||
133 | #else | ||
134 | #define TRACE_SYS_ENTER_PROFILE(sname) | ||
135 | #define TRACE_SYS_ENTER_PROFILE_INIT(sname) | ||
136 | #define TRACE_SYS_EXIT_PROFILE(sname) | ||
137 | #define TRACE_SYS_EXIT_PROFILE_INIT(sname) | ||
138 | #endif | ||
139 | |||
100 | #ifdef CONFIG_FTRACE_SYSCALLS | 140 | #ifdef CONFIG_FTRACE_SYSCALLS |
101 | #define __SC_STR_ADECL1(t, a) #a | 141 | #define __SC_STR_ADECL1(t, a) #a |
102 | #define __SC_STR_ADECL2(t, a, ...) #a, __SC_STR_ADECL1(__VA_ARGS__) | 142 | #define __SC_STR_ADECL2(t, a, ...) #a, __SC_STR_ADECL1(__VA_ARGS__) |
@@ -112,7 +152,81 @@ struct perf_counter_attr; | |||
112 | #define __SC_STR_TDECL5(t, a, ...) #t, __SC_STR_TDECL4(__VA_ARGS__) | 152 | #define __SC_STR_TDECL5(t, a, ...) #t, __SC_STR_TDECL4(__VA_ARGS__) |
113 | #define __SC_STR_TDECL6(t, a, ...) #t, __SC_STR_TDECL5(__VA_ARGS__) | 153 | #define __SC_STR_TDECL6(t, a, ...) #t, __SC_STR_TDECL5(__VA_ARGS__) |
114 | 154 | ||
155 | #define SYSCALL_TRACE_ENTER_EVENT(sname) \ | ||
156 | static struct ftrace_event_call event_enter_##sname; \ | ||
157 | struct trace_event enter_syscall_print_##sname = { \ | ||
158 | .trace = print_syscall_enter, \ | ||
159 | }; \ | ||
160 | static int init_enter_##sname(void) \ | ||
161 | { \ | ||
162 | int num, id; \ | ||
163 | num = syscall_name_to_nr("sys"#sname); \ | ||
164 | if (num < 0) \ | ||
165 | return -ENOSYS; \ | ||
166 | id = register_ftrace_event(&enter_syscall_print_##sname);\ | ||
167 | if (!id) \ | ||
168 | return -ENODEV; \ | ||
169 | event_enter_##sname.id = id; \ | ||
170 | set_syscall_enter_id(num, id); \ | ||
171 | INIT_LIST_HEAD(&event_enter_##sname.fields); \ | ||
172 | return 0; \ | ||
173 | } \ | ||
174 | TRACE_SYS_ENTER_PROFILE(sname); \ | ||
175 | static struct ftrace_event_call __used \ | ||
176 | __attribute__((__aligned__(4))) \ | ||
177 | __attribute__((section("_ftrace_events"))) \ | ||
178 | event_enter_##sname = { \ | ||
179 | .name = "sys_enter"#sname, \ | ||
180 | .system = "syscalls", \ | ||
181 | .event = &event_syscall_enter, \ | ||
182 | .raw_init = init_enter_##sname, \ | ||
183 | .show_format = syscall_enter_format, \ | ||
184 | .define_fields = syscall_enter_define_fields, \ | ||
185 | .regfunc = reg_event_syscall_enter, \ | ||
186 | .unregfunc = unreg_event_syscall_enter, \ | ||
187 | .data = "sys"#sname, \ | ||
188 | TRACE_SYS_ENTER_PROFILE_INIT(sname) \ | ||
189 | } | ||
190 | |||
191 | #define SYSCALL_TRACE_EXIT_EVENT(sname) \ | ||
192 | static struct ftrace_event_call event_exit_##sname; \ | ||
193 | struct trace_event exit_syscall_print_##sname = { \ | ||
194 | .trace = print_syscall_exit, \ | ||
195 | }; \ | ||
196 | static int init_exit_##sname(void) \ | ||
197 | { \ | ||
198 | int num, id; \ | ||
199 | num = syscall_name_to_nr("sys"#sname); \ | ||
200 | if (num < 0) \ | ||
201 | return -ENOSYS; \ | ||
202 | id = register_ftrace_event(&exit_syscall_print_##sname);\ | ||
203 | if (!id) \ | ||
204 | return -ENODEV; \ | ||
205 | event_exit_##sname.id = id; \ | ||
206 | set_syscall_exit_id(num, id); \ | ||
207 | INIT_LIST_HEAD(&event_exit_##sname.fields); \ | ||
208 | return 0; \ | ||
209 | } \ | ||
210 | TRACE_SYS_EXIT_PROFILE(sname); \ | ||
211 | static struct ftrace_event_call __used \ | ||
212 | __attribute__((__aligned__(4))) \ | ||
213 | __attribute__((section("_ftrace_events"))) \ | ||
214 | event_exit_##sname = { \ | ||
215 | .name = "sys_exit"#sname, \ | ||
216 | .system = "syscalls", \ | ||
217 | .event = &event_syscall_exit, \ | ||
218 | .raw_init = init_exit_##sname, \ | ||
219 | .show_format = syscall_exit_format, \ | ||
220 | .define_fields = syscall_exit_define_fields, \ | ||
221 | .regfunc = reg_event_syscall_exit, \ | ||
222 | .unregfunc = unreg_event_syscall_exit, \ | ||
223 | .data = "sys"#sname, \ | ||
224 | TRACE_SYS_EXIT_PROFILE_INIT(sname) \ | ||
225 | } | ||
226 | |||
115 | #define SYSCALL_METADATA(sname, nb) \ | 227 | #define SYSCALL_METADATA(sname, nb) \ |
228 | SYSCALL_TRACE_ENTER_EVENT(sname); \ | ||
229 | SYSCALL_TRACE_EXIT_EVENT(sname); \ | ||
116 | static const struct syscall_metadata __used \ | 230 | static const struct syscall_metadata __used \ |
117 | __attribute__((__aligned__(4))) \ | 231 | __attribute__((__aligned__(4))) \ |
118 | __attribute__((section("__syscalls_metadata"))) \ | 232 | __attribute__((section("__syscalls_metadata"))) \ |
@@ -121,18 +235,23 @@ struct perf_counter_attr; | |||
121 | .nb_args = nb, \ | 235 | .nb_args = nb, \ |
122 | .types = types_##sname, \ | 236 | .types = types_##sname, \ |
123 | .args = args_##sname, \ | 237 | .args = args_##sname, \ |
124 | } | 238 | .enter_event = &event_enter_##sname, \ |
239 | .exit_event = &event_exit_##sname, \ | ||
240 | }; | ||
125 | 241 | ||
126 | #define SYSCALL_DEFINE0(sname) \ | 242 | #define SYSCALL_DEFINE0(sname) \ |
243 | SYSCALL_TRACE_ENTER_EVENT(_##sname); \ | ||
244 | SYSCALL_TRACE_EXIT_EVENT(_##sname); \ | ||
127 | static const struct syscall_metadata __used \ | 245 | static const struct syscall_metadata __used \ |
128 | __attribute__((__aligned__(4))) \ | 246 | __attribute__((__aligned__(4))) \ |
129 | __attribute__((section("__syscalls_metadata"))) \ | 247 | __attribute__((section("__syscalls_metadata"))) \ |
130 | __syscall_meta_##sname = { \ | 248 | __syscall_meta_##sname = { \ |
131 | .name = "sys_"#sname, \ | 249 | .name = "sys_"#sname, \ |
132 | .nb_args = 0, \ | 250 | .nb_args = 0, \ |
251 | .enter_event = &event_enter__##sname, \ | ||
252 | .exit_event = &event_exit__##sname, \ | ||
133 | }; \ | 253 | }; \ |
134 | asmlinkage long sys_##sname(void) | 254 | asmlinkage long sys_##sname(void) |
135 | |||
136 | #else | 255 | #else |
137 | #define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void) | 256 | #define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void) |
138 | #endif | 257 | #endif |
@@ -341,8 +460,7 @@ asmlinkage long sys_mount(char __user *dev_name, char __user *dir_name, | |||
341 | void __user *data); | 460 | void __user *data); |
342 | asmlinkage long sys_umount(char __user *name, int flags); | 461 | asmlinkage long sys_umount(char __user *name, int flags); |
343 | asmlinkage long sys_oldumount(char __user *name); | 462 | asmlinkage long sys_oldumount(char __user *name); |
344 | asmlinkage long sys_truncate(const char __user *path, | 463 | asmlinkage long sys_truncate(const char __user *path, long length); |
345 | unsigned long length); | ||
346 | asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length); | 464 | asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length); |
347 | asmlinkage long sys_stat(char __user *filename, | 465 | asmlinkage long sys_stat(char __user *filename, |
348 | struct __old_kernel_stat __user *statbuf); | 466 | struct __old_kernel_stat __user *statbuf); |
@@ -758,7 +876,7 @@ asmlinkage long sys_ppoll(struct pollfd __user *, unsigned int, | |||
758 | int kernel_execve(const char *filename, char *const argv[], char *const envp[]); | 876 | int kernel_execve(const char *filename, char *const argv[], char *const envp[]); |
759 | 877 | ||
760 | 878 | ||
761 | asmlinkage long sys_perf_counter_open( | 879 | asmlinkage long sys_perf_event_open( |
762 | struct perf_counter_attr __user *attr_uptr, | 880 | struct perf_event_attr __user *attr_uptr, |
763 | pid_t pid, int cpu, int group_fd, unsigned long flags); | 881 | pid_t pid, int cpu, int group_fd, unsigned long flags); |
764 | #endif | 882 | #endif |