aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/syscalls.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/syscalls.h')
-rw-r--r--include/linux/syscalls.h132
1 files changed, 50 insertions, 82 deletions
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index a990ace1a838..057929b0a651 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -23,16 +23,21 @@ struct kexec_segment;
23struct linux_dirent; 23struct linux_dirent;
24struct linux_dirent64; 24struct linux_dirent64;
25struct list_head; 25struct list_head;
26struct mmap_arg_struct;
26struct msgbuf; 27struct msgbuf;
27struct msghdr; 28struct msghdr;
29struct mmsghdr;
28struct msqid_ds; 30struct msqid_ds;
29struct new_utsname; 31struct new_utsname;
30struct nfsctl_arg; 32struct nfsctl_arg;
31struct __old_kernel_stat; 33struct __old_kernel_stat;
34struct oldold_utsname;
35struct old_utsname;
32struct pollfd; 36struct pollfd;
33struct rlimit; 37struct rlimit;
34struct rusage; 38struct rusage;
35struct sched_param; 39struct sched_param;
40struct sel_arg_struct;
36struct semaphore; 41struct semaphore;
37struct sembuf; 42struct sembuf;
38struct shmid_ds; 43struct shmid_ds;
@@ -98,44 +103,21 @@ struct perf_event_attr;
98#define __SC_TEST5(t5, a5, ...) __SC_TEST(t5); __SC_TEST4(__VA_ARGS__) 103#define __SC_TEST5(t5, a5, ...) __SC_TEST(t5); __SC_TEST4(__VA_ARGS__)
99#define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__) 104#define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__)
100 105
101#ifdef CONFIG_EVENT_PROFILE 106#ifdef CONFIG_PERF_EVENTS
102#define TRACE_SYS_ENTER_PROFILE(sname) \ 107
103static int prof_sysenter_enable_##sname(void) \ 108#define TRACE_SYS_ENTER_PERF_INIT(sname) \
104{ \ 109 .perf_event_enable = perf_sysenter_enable, \
105 return reg_prof_syscall_enter("sys"#sname); \ 110 .perf_event_disable = perf_sysenter_disable,
106} \ 111
107 \ 112#define TRACE_SYS_EXIT_PERF_INIT(sname) \
108static void prof_sysenter_disable_##sname(void) \ 113 .perf_event_enable = perf_sysexit_enable, \
109{ \ 114 .perf_event_disable = perf_sysexit_disable,
110 unreg_prof_syscall_enter("sys"#sname); \
111}
112
113#define TRACE_SYS_EXIT_PROFILE(sname) \
114static int prof_sysexit_enable_##sname(void) \
115{ \
116 return reg_prof_syscall_exit("sys"#sname); \
117} \
118 \
119static 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 115#else
134#define TRACE_SYS_ENTER_PROFILE(sname) 116#define TRACE_SYS_ENTER_PERF(sname)
135#define TRACE_SYS_ENTER_PROFILE_INIT(sname) 117#define TRACE_SYS_ENTER_PERF_INIT(sname)
136#define TRACE_SYS_EXIT_PROFILE(sname) 118#define TRACE_SYS_EXIT_PERF(sname)
137#define TRACE_SYS_EXIT_PROFILE_INIT(sname) 119#define TRACE_SYS_EXIT_PERF_INIT(sname)
138#endif 120#endif /* CONFIG_PERF_EVENTS */
139 121
140#ifdef CONFIG_FTRACE_SYSCALLS 122#ifdef CONFIG_FTRACE_SYSCALLS
141#define __SC_STR_ADECL1(t, a) #a 123#define __SC_STR_ADECL1(t, a) #a
@@ -153,75 +135,47 @@ static void prof_sysexit_disable_##sname(void) \
153#define __SC_STR_TDECL6(t, a, ...) #t, __SC_STR_TDECL5(__VA_ARGS__) 135#define __SC_STR_TDECL6(t, a, ...) #t, __SC_STR_TDECL5(__VA_ARGS__)
154 136
155#define SYSCALL_TRACE_ENTER_EVENT(sname) \ 137#define SYSCALL_TRACE_ENTER_EVENT(sname) \
156 static struct ftrace_event_call event_enter_##sname; \ 138 static const struct syscall_metadata __syscall_meta_##sname; \
157 struct trace_event enter_syscall_print_##sname = { \ 139 static struct ftrace_event_call \
140 __attribute__((__aligned__(4))) event_enter_##sname; \
141 static struct trace_event enter_syscall_print_##sname = { \
158 .trace = print_syscall_enter, \ 142 .trace = print_syscall_enter, \
159 }; \ 143 }; \
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 \ 144 static struct ftrace_event_call __used \
176 __attribute__((__aligned__(4))) \ 145 __attribute__((__aligned__(4))) \
177 __attribute__((section("_ftrace_events"))) \ 146 __attribute__((section("_ftrace_events"))) \
178 event_enter_##sname = { \ 147 event_enter_##sname = { \
179 .name = "sys_enter"#sname, \ 148 .name = "sys_enter"#sname, \
180 .system = "syscalls", \ 149 .system = "syscalls", \
181 .event = &event_syscall_enter, \ 150 .event = &enter_syscall_print_##sname, \
182 .raw_init = init_enter_##sname, \ 151 .raw_init = init_syscall_trace, \
183 .show_format = syscall_enter_format, \
184 .define_fields = syscall_enter_define_fields, \ 152 .define_fields = syscall_enter_define_fields, \
185 .regfunc = reg_event_syscall_enter, \ 153 .regfunc = reg_event_syscall_enter, \
186 .unregfunc = unreg_event_syscall_enter, \ 154 .unregfunc = unreg_event_syscall_enter, \
187 .data = "sys"#sname, \ 155 .data = (void *)&__syscall_meta_##sname,\
188 TRACE_SYS_ENTER_PROFILE_INIT(sname) \ 156 TRACE_SYS_ENTER_PERF_INIT(sname) \
189 } 157 }
190 158
191#define SYSCALL_TRACE_EXIT_EVENT(sname) \ 159#define SYSCALL_TRACE_EXIT_EVENT(sname) \
192 static struct ftrace_event_call event_exit_##sname; \ 160 static const struct syscall_metadata __syscall_meta_##sname; \
193 struct trace_event exit_syscall_print_##sname = { \ 161 static struct ftrace_event_call \
162 __attribute__((__aligned__(4))) event_exit_##sname; \
163 static struct trace_event exit_syscall_print_##sname = { \
194 .trace = print_syscall_exit, \ 164 .trace = print_syscall_exit, \
195 }; \ 165 }; \
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 \ 166 static struct ftrace_event_call __used \
212 __attribute__((__aligned__(4))) \ 167 __attribute__((__aligned__(4))) \
213 __attribute__((section("_ftrace_events"))) \ 168 __attribute__((section("_ftrace_events"))) \
214 event_exit_##sname = { \ 169 event_exit_##sname = { \
215 .name = "sys_exit"#sname, \ 170 .name = "sys_exit"#sname, \
216 .system = "syscalls", \ 171 .system = "syscalls", \
217 .event = &event_syscall_exit, \ 172 .event = &exit_syscall_print_##sname, \
218 .raw_init = init_exit_##sname, \ 173 .raw_init = init_syscall_trace, \
219 .show_format = syscall_exit_format, \
220 .define_fields = syscall_exit_define_fields, \ 174 .define_fields = syscall_exit_define_fields, \
221 .regfunc = reg_event_syscall_exit, \ 175 .regfunc = reg_event_syscall_exit, \
222 .unregfunc = unreg_event_syscall_exit, \ 176 .unregfunc = unreg_event_syscall_exit, \
223 .data = "sys"#sname, \ 177 .data = (void *)&__syscall_meta_##sname,\
224 TRACE_SYS_EXIT_PROFILE_INIT(sname) \ 178 TRACE_SYS_EXIT_PERF_INIT(sname) \
225 } 179 }
226 180
227#define SYSCALL_METADATA(sname, nb) \ 181#define SYSCALL_METADATA(sname, nb) \
@@ -245,7 +199,7 @@ static void prof_sysexit_disable_##sname(void) \
245 static const struct syscall_metadata __used \ 199 static const struct syscall_metadata __used \
246 __attribute__((__aligned__(4))) \ 200 __attribute__((__aligned__(4))) \
247 __attribute__((section("__syscalls_metadata"))) \ 201 __attribute__((section("__syscalls_metadata"))) \
248 __syscall_meta_##sname = { \ 202 __syscall_meta__##sname = { \
249 .name = "sys_"#sname, \ 203 .name = "sys_"#sname, \
250 .nb_args = 0, \ 204 .nb_args = 0, \
251 .enter_event = &event_enter__##sname, \ 205 .enter_event = &event_enter__##sname, \
@@ -677,6 +631,9 @@ asmlinkage long sys_recv(int, void __user *, size_t, unsigned);
677asmlinkage long sys_recvfrom(int, void __user *, size_t, unsigned, 631asmlinkage long sys_recvfrom(int, void __user *, size_t, unsigned,
678 struct sockaddr __user *, int __user *); 632 struct sockaddr __user *, int __user *);
679asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags); 633asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags);
634asmlinkage long sys_recvmmsg(int fd, struct mmsghdr __user *msg,
635 unsigned int vlen, unsigned flags,
636 struct timespec __user *timeout);
680asmlinkage long sys_socket(int, int, int); 637asmlinkage long sys_socket(int, int, int);
681asmlinkage long sys_socketpair(int, int, int, int __user *); 638asmlinkage long sys_socketpair(int, int, int, int __user *);
682asmlinkage long sys_socketcall(int call, unsigned long __user *args); 639asmlinkage long sys_socketcall(int call, unsigned long __user *args);
@@ -685,6 +642,7 @@ asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds,
685 long timeout); 642 long timeout);
686asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp, 643asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp,
687 fd_set __user *exp, struct timeval __user *tvp); 644 fd_set __user *exp, struct timeval __user *tvp);
645asmlinkage long sys_old_select(struct sel_arg_struct __user *arg);
688asmlinkage long sys_epoll_create(int size); 646asmlinkage long sys_epoll_create(int size);
689asmlinkage long sys_epoll_create1(int flags); 647asmlinkage long sys_epoll_create1(int flags);
690asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, 648asmlinkage long sys_epoll_ctl(int epfd, int op, int fd,
@@ -699,6 +657,8 @@ asmlinkage long sys_gethostname(char __user *name, int len);
699asmlinkage long sys_sethostname(char __user *name, int len); 657asmlinkage long sys_sethostname(char __user *name, int len);
700asmlinkage long sys_setdomainname(char __user *name, int len); 658asmlinkage long sys_setdomainname(char __user *name, int len);
701asmlinkage long sys_newuname(struct new_utsname __user *name); 659asmlinkage long sys_newuname(struct new_utsname __user *name);
660asmlinkage long sys_uname(struct old_utsname __user *);
661asmlinkage long sys_olduname(struct oldold_utsname __user *);
702 662
703asmlinkage long sys_getrlimit(unsigned int resource, 663asmlinkage long sys_getrlimit(unsigned int resource,
704 struct rlimit __user *rlim); 664 struct rlimit __user *rlim);
@@ -728,6 +688,8 @@ asmlinkage long sys_shmat(int shmid, char __user *shmaddr, int shmflg);
728asmlinkage long sys_shmget(key_t key, size_t size, int flag); 688asmlinkage long sys_shmget(key_t key, size_t size, int flag);
729asmlinkage long sys_shmdt(char __user *shmaddr); 689asmlinkage long sys_shmdt(char __user *shmaddr);
730asmlinkage long sys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf); 690asmlinkage long sys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
691asmlinkage long sys_ipc(unsigned int call, int first, unsigned long second,
692 unsigned long third, void __user *ptr, long fifth);
731 693
732asmlinkage long sys_mq_open(const char __user *name, int oflag, mode_t mode, struct mq_attr __user *attr); 694asmlinkage long sys_mq_open(const char __user *name, int oflag, mode_t mode, struct mq_attr __user *attr);
733asmlinkage long sys_mq_unlink(const char __user *name); 695asmlinkage long sys_mq_unlink(const char __user *name);
@@ -879,4 +841,10 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[]);
879asmlinkage long sys_perf_event_open( 841asmlinkage long sys_perf_event_open(
880 struct perf_event_attr __user *attr_uptr, 842 struct perf_event_attr __user *attr_uptr,
881 pid_t pid, int cpu, int group_fd, unsigned long flags); 843 pid_t pid, int cpu, int group_fd, unsigned long flags);
844
845asmlinkage long sys_mmap_pgoff(unsigned long addr, unsigned long len,
846 unsigned long prot, unsigned long flags,
847 unsigned long fd, unsigned long pgoff);
848asmlinkage long sys_old_mmap(struct mmap_arg_struct __user *arg);
849
882#endif 850#endif