1
2/*--------------------------------------------------------------------*/
3/*--- Linux-specific syscalls stuff.          priv_syswrap-linux.h ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7   This file is part of Valgrind, a dynamic binary instrumentation
8   framework.
9
10   Copyright (C) 2000-2015 Nicholas Nethercote
11      njn@valgrind.org
12
13   This program is free software; you can redistribute it and/or
14   modify it under the terms of the GNU General Public License as
15   published by the Free Software Foundation; either version 2 of the
16   License, or (at your option) any later version.
17
18   This program is distributed in the hope that it will be useful, but
19   WITHOUT ANY WARRANTY; without even the implied warranty of
20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21   General Public License for more details.
22
23   You should have received a copy of the GNU General Public License
24   along with this program; if not, write to the Free Software
25   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26   02111-1307, USA.
27
28   The GNU General Public License is contained in the file COPYING.
29*/
30
31#ifndef __PRIV_SYSWRAP_LINUX_H
32#define __PRIV_SYSWRAP_LINUX_H
33
34#include "pub_core_basics.h"     // ThreadId
35#include "priv_types_n_macros.h" // DECL_TEMPLATE
36
37// Clone-related functions
38extern Word ML_(start_thread_NORETURN) ( void* arg );
39extern Addr ML_(allocstack)            ( ThreadId tid );
40extern void ML_(call_on_new_stack_0_1) ( Addr stack, Addr retaddr,
41			                 void (*f)(Word), Word arg1 );
42extern SysRes ML_(do_fork_clone) ( ThreadId tid, UInt flags,
43                                   Int* parent_tidptr, Int* child_tidptr );
44
45
46// Linux-specific (but non-arch-specific) syscalls
47
48DECL_TEMPLATE(linux, sys_mount);
49DECL_TEMPLATE(linux, sys_oldumount);
50DECL_TEMPLATE(linux, sys_umount);
51DECL_TEMPLATE(linux, sys_perf_event_open);
52DECL_TEMPLATE(linux, sys_preadv);
53DECL_TEMPLATE(linux, sys_pwritev);
54DECL_TEMPLATE(linux, sys_sendmmsg);
55DECL_TEMPLATE(linux, sys_recvmmsg);
56DECL_TEMPLATE(linux, sys_dup3);
57DECL_TEMPLATE(linux, sys_getcpu);
58DECL_TEMPLATE(linux, sys_splice);
59DECL_TEMPLATE(linux, sys_tee);
60DECL_TEMPLATE(linux, sys_vmsplice);
61DECL_TEMPLATE(linux, sys_readahead);
62DECL_TEMPLATE(linux, sys_move_pages);
63
64// POSIX, but various sub-cases differ between Linux and Darwin.
65DECL_TEMPLATE(linux, sys_fcntl);
66DECL_TEMPLATE(linux, sys_fcntl64);
67DECL_TEMPLATE(linux, sys_ioctl);
68
69DECL_TEMPLATE(linux, sys_setfsuid16);
70DECL_TEMPLATE(linux, sys_setfsuid);
71DECL_TEMPLATE(linux, sys_setfsgid16);
72DECL_TEMPLATE(linux, sys_setfsgid);
73DECL_TEMPLATE(linux, sys_setresuid16);  // man page says "non-standard";
74DECL_TEMPLATE(linux, sys_setresuid);    // man page says "non-standard"
75DECL_TEMPLATE(linux, sys_getresuid16);
76DECL_TEMPLATE(linux, sys_getresuid);
77DECL_TEMPLATE(linux, sys_setresgid16);  // man page says "non-standard"
78DECL_TEMPLATE(linux, sys_setresgid);    // man page says "non-standard"
79DECL_TEMPLATE(linux, sys_getresgid16);
80DECL_TEMPLATE(linux, sys_getresgid);
81
82DECL_TEMPLATE(linux, sys_exit_group);
83DECL_TEMPLATE(linux, sys_llseek);
84DECL_TEMPLATE(linux, sys_adjtimex);
85DECL_TEMPLATE(linux, sys_ioperm);
86DECL_TEMPLATE(linux, sys_syslog);
87DECL_TEMPLATE(linux, sys_vhangup);
88DECL_TEMPLATE(linux, sys_sysinfo);
89DECL_TEMPLATE(linux, sys_personality);
90DECL_TEMPLATE(linux, sys_pivot_root);
91DECL_TEMPLATE(linux, sys_sysctl);
92DECL_TEMPLATE(linux, sys_prctl);
93DECL_TEMPLATE(linux, sys_sendfile);
94DECL_TEMPLATE(linux, sys_sendfile64);
95DECL_TEMPLATE(linux, sys_futex);
96DECL_TEMPLATE(linux, sys_set_robust_list);
97DECL_TEMPLATE(linux, sys_get_robust_list);
98DECL_TEMPLATE(linux, sys_pselect6);
99DECL_TEMPLATE(linux, sys_ppoll);
100
101DECL_TEMPLATE(linux, sys_epoll_create);
102DECL_TEMPLATE(linux, sys_epoll_create1);
103DECL_TEMPLATE(linux, sys_epoll_ctl);
104DECL_TEMPLATE(linux, sys_epoll_wait);
105DECL_TEMPLATE(linux, sys_epoll_pwait);
106DECL_TEMPLATE(linux, sys_eventfd);
107DECL_TEMPLATE(linux, sys_eventfd2);
108
109DECL_TEMPLATE(linux, sys_fallocate);
110
111DECL_TEMPLATE(linux, sys_prlimit64);
112
113DECL_TEMPLATE(linux, sys_gettid);
114DECL_TEMPLATE(linux, sys_set_tid_address);
115DECL_TEMPLATE(linux, sys_tkill);
116DECL_TEMPLATE(linux, sys_tgkill);
117
118DECL_TEMPLATE(linux, sys_fadvise64);
119DECL_TEMPLATE(linux, sys_fadvise64_64);
120
121DECL_TEMPLATE(linux, sys_io_setup);
122DECL_TEMPLATE(linux, sys_io_destroy);
123DECL_TEMPLATE(linux, sys_io_getevents);
124DECL_TEMPLATE(linux, sys_io_submit);
125DECL_TEMPLATE(linux, sys_io_cancel);
126
127DECL_TEMPLATE(linux, sys_ioprio_set);
128DECL_TEMPLATE(linux, sys_ioprio_get);
129
130DECL_TEMPLATE(linux, sys_mbind);
131DECL_TEMPLATE(linux, sys_set_mempolicy);
132DECL_TEMPLATE(linux, sys_get_mempolicy);
133
134DECL_TEMPLATE(linux, sys_inotify_init);
135DECL_TEMPLATE(linux, sys_inotify_init1);
136DECL_TEMPLATE(linux, sys_inotify_add_watch);
137DECL_TEMPLATE(linux, sys_inotify_rm_watch);
138
139DECL_TEMPLATE(linux, sys_mq_open);
140DECL_TEMPLATE(linux, sys_mq_unlink);
141DECL_TEMPLATE(linux, sys_mq_timedsend);
142DECL_TEMPLATE(linux, sys_mq_timedreceive);
143DECL_TEMPLATE(linux, sys_mq_notify);
144DECL_TEMPLATE(linux, sys_mq_getsetattr);
145
146DECL_TEMPLATE(linux, sys_clock_settime);
147DECL_TEMPLATE(linux, sys_clock_gettime);
148DECL_TEMPLATE(linux, sys_clock_getres);
149DECL_TEMPLATE(linux, sys_clock_nanosleep);
150DECL_TEMPLATE(linux, sys_clock_adjtime);
151
152DECL_TEMPLATE(linux, sys_timer_create);      // Linux: varies across archs?
153DECL_TEMPLATE(linux, sys_timer_settime);
154DECL_TEMPLATE(linux, sys_timer_gettime);
155DECL_TEMPLATE(linux, sys_timer_getoverrun);
156DECL_TEMPLATE(linux, sys_timer_delete);
157DECL_TEMPLATE(linux, sys_timerfd_create);
158DECL_TEMPLATE(linux, sys_timerfd_gettime);
159DECL_TEMPLATE(linux, sys_timerfd_settime);
160
161DECL_TEMPLATE(linux, sys_signalfd);
162DECL_TEMPLATE(linux, sys_signalfd4);
163
164DECL_TEMPLATE(linux, sys_capget);
165DECL_TEMPLATE(linux, sys_capset);
166
167DECL_TEMPLATE(linux, sys_openat);
168DECL_TEMPLATE(linux, sys_mkdirat);
169DECL_TEMPLATE(linux, sys_mknodat);
170DECL_TEMPLATE(linux, sys_fchownat);
171DECL_TEMPLATE(linux, sys_futimesat);
172DECL_TEMPLATE(linux, sys_newfstatat);
173DECL_TEMPLATE(linux, sys_unlinkat);
174DECL_TEMPLATE(linux, sys_renameat);
175DECL_TEMPLATE(linux, sys_linkat);
176DECL_TEMPLATE(linux, sys_symlinkat);
177DECL_TEMPLATE(linux, sys_readlinkat);
178DECL_TEMPLATE(linux, sys_fchmodat);
179DECL_TEMPLATE(linux, sys_faccessat);
180DECL_TEMPLATE(linux, sys_utimensat);
181DECL_TEMPLATE(linux, sys_name_to_handle_at);
182DECL_TEMPLATE(linux, sys_open_by_handle_at);
183
184DECL_TEMPLATE(linux, sys_add_key);
185DECL_TEMPLATE(linux, sys_request_key);
186DECL_TEMPLATE(linux, sys_keyctl);
187
188// These ones have 32-bit generic equivalents, but the 16-bit versions (they
189// use 16-bit gid_t and uid_t types) seem to be Linux-specific.
190DECL_TEMPLATE(linux, sys_getuid16);
191DECL_TEMPLATE(linux, sys_setuid16);
192DECL_TEMPLATE(linux, sys_getgid16);
193DECL_TEMPLATE(linux, sys_setgid16);
194DECL_TEMPLATE(linux, sys_geteuid16);
195DECL_TEMPLATE(linux, sys_getegid16);
196DECL_TEMPLATE(linux, sys_setreuid16);
197DECL_TEMPLATE(linux, sys_setregid16);
198DECL_TEMPLATE(linux, sys_getgroups16);
199DECL_TEMPLATE(linux, sys_setgroups16);
200
201// Again, these 16-bit versions are Linux-specific, the 32-bit versions are
202// generic.
203DECL_TEMPLATE(linux, sys_chown16);
204DECL_TEMPLATE(linux, sys_fchown16);
205//DECL_TEMPLATE(linux, sys_lchown16);      // not yet encountered
206
207// Are these POSIX?  In Darwin they have an extra parameter 'position',
208// so put them here.
209DECL_TEMPLATE(linux, sys_setxattr);
210DECL_TEMPLATE(linux, sys_lsetxattr);
211DECL_TEMPLATE(linux, sys_fsetxattr);
212DECL_TEMPLATE(linux, sys_getxattr);
213DECL_TEMPLATE(linux, sys_lgetxattr);
214DECL_TEMPLATE(linux, sys_fgetxattr);
215DECL_TEMPLATE(linux, sys_listxattr);
216DECL_TEMPLATE(linux, sys_llistxattr);
217DECL_TEMPLATE(linux, sys_flistxattr);
218DECL_TEMPLATE(linux, sys_removexattr);
219DECL_TEMPLATE(linux, sys_lremovexattr);
220DECL_TEMPLATE(linux, sys_fremovexattr);
221
222// These are Posix, but not necessarily syscalls.  Darwin only supports
223// sched_get_priority_{min,max} and sched_yield, but as libc functions, not
224// syscalls.
225DECL_TEMPLATE(linux, sys_sched_setparam);
226DECL_TEMPLATE(linux, sys_sched_getparam);
227DECL_TEMPLATE(linux, sys_sched_setscheduler);
228DECL_TEMPLATE(linux, sys_sched_getscheduler);
229DECL_TEMPLATE(linux, sys_sched_yield);
230DECL_TEMPLATE(linux, sys_sched_get_priority_max);
231DECL_TEMPLATE(linux, sys_sched_get_priority_min);
232DECL_TEMPLATE(linux, sys_sched_rr_get_interval);
233DECL_TEMPLATE(linux, sys_sched_setaffinity);
234DECL_TEMPLATE(linux, sys_sched_getaffinity);
235
236DECL_TEMPLATE(linux, sys_unshare);
237
238// These ones have different parameters and/or return values on Darwin.
239// Also, some archs on Linux do not match the generic wrapper for sys_pipe.
240DECL_TEMPLATE(linux, sys_munlockall);
241DECL_TEMPLATE(linux, sys_pipe);
242DECL_TEMPLATE(linux, sys_pipe2);
243DECL_TEMPLATE(linux, sys_quotactl);
244DECL_TEMPLATE(linux, sys_waitid);
245
246// Posix, but in Darwin utime is a libc function that calls syscall utimes.
247DECL_TEMPLATE(linux, sys_utime);
248
249// On Darwin, off_t is 64-bits even on 32-bit platforms.
250DECL_TEMPLATE(linux, sys_lseek);
251
252// Darwin (and probably other OSes) don't have the old_sigset_t type.
253DECL_TEMPLATE(linux, sys_sigpending);
254DECL_TEMPLATE(linux, sys_sigprocmask);
255DECL_TEMPLATE(linux, sys_sigaction);
256
257// I think these are Linux-specific?
258DECL_TEMPLATE(linux, sys_rt_sigaction);
259DECL_TEMPLATE(linux, sys_rt_sigprocmask);
260DECL_TEMPLATE(linux, sys_rt_sigpending);
261DECL_TEMPLATE(linux, sys_rt_sigtimedwait);
262DECL_TEMPLATE(linux, sys_rt_sigqueueinfo);
263DECL_TEMPLATE(linux, sys_rt_tgsigqueueinfo);
264DECL_TEMPLATE(linux, sys_rt_sigsuspend);
265
266// Linux-specific?
267DECL_TEMPLATE(linux, sys_sync_file_range);
268DECL_TEMPLATE(linux, sys_sync_file_range2);
269DECL_TEMPLATE(linux, sys_stime);  /* maybe generic?  I'm not sure */
270
271// Linux specific (kernel modules)
272DECL_TEMPLATE(linux, sys_init_module);
273DECL_TEMPLATE(linux, sys_delete_module);
274
275// Linux-specific (oprofile-related)
276DECL_TEMPLATE(linux, sys_lookup_dcookie);        // (*/32/64) L
277
278// Linux-specific (new in Linux 3.2)
279DECL_TEMPLATE(linux, sys_process_vm_readv);
280DECL_TEMPLATE(linux, sys_process_vm_writev);
281
282// Linux-specific (new in Linux 2.6.36)
283DECL_TEMPLATE(linux, sys_fanotify_init);
284DECL_TEMPLATE(linux, sys_fanotify_mark);
285
286// Linux-specific (new in Linux 3.17)
287DECL_TEMPLATE(linux, sys_getrandom);
288DECL_TEMPLATE(linux, sys_memfd_create);
289
290DECL_TEMPLATE(linux, sys_syncfs);
291
292/* ---------------------------------------------------------------------
293   Wrappers for sockets and ipc-ery.  These are split into standalone
294   procedures because x86-linux hides them inside multiplexors
295   (sys_socketcall and sys_ipc).
296   ------------------------------------------------------------------ */
297
298#define TId ThreadId
299#define UW  UWord
300#define SR  SysRes
301
302extern void ML_(linux_PRE_sys_msgsnd)      ( TId, UW, UW, UW, UW );
303extern void ML_(linux_PRE_sys_msgrcv)      ( TId, UW, UW, UW, UW, UW );
304extern void ML_(linux_POST_sys_msgrcv)     ( TId, UW, UW, UW, UW, UW, UW );
305extern void ML_(linux_PRE_sys_msgctl)      ( TId, UW, UW, UW );
306extern void ML_(linux_POST_sys_msgctl)     ( TId, UW, UW, UW, UW );
307extern void ML_(linux_PRE_sys_getsockopt)  ( TId, UW, UW, UW, UW, UW );
308extern void ML_(linux_POST_sys_getsockopt) ( TId, SR, UW, UW, UW, UW, UW );
309extern void ML_(linux_PRE_sys_setsockopt)  ( TId, UW, UW, UW, UW, UW );
310extern void ML_(linux_PRE_sys_recvmmsg)    ( TId, UW, UW, UW, UW, UW );
311extern void ML_(linux_POST_sys_recvmmsg)   ( TId, UW, UW, UW, UW, UW, UW );
312extern void ML_(linux_PRE_sys_sendmmsg)    ( TId, UW, UW, UW, UW );
313extern void ML_(linux_POST_sys_sendmmsg)   ( TId, UW, UW, UW, UW, UW );
314
315// Linux-specific (but non-arch-specific) ptrace wrapper helpers
316extern void ML_(linux_PRE_getregset) ( ThreadId, long, long );
317extern void ML_(linux_PRE_setregset) ( ThreadId, long, long );
318extern void ML_(linux_POST_getregset)( ThreadId, long, long );
319
320#undef TId
321#undef UW
322#undef SR
323
324/* sys_ipc and sys_socketcall are multiplexors which implements several syscalls.
325   Used e.g. by x86, ppc32, ppc64, ... */
326DECL_TEMPLATE(linux, sys_ipc);
327DECL_TEMPLATE(linux, sys_socketcall);
328
329/* Depending on the platform, the below are implemented as
330   direct syscalls or via the above sys_socketcall multiplexor. */
331
332/* Direct ipc related syscalls. */
333/* Semaphore */
334DECL_TEMPLATE(linux, sys_semget);
335DECL_TEMPLATE(linux, sys_semop);
336DECL_TEMPLATE(linux, sys_semctl);
337DECL_TEMPLATE(linux, sys_semtimedop);
338/* Shared memory */
339DECL_TEMPLATE(linux, wrap_sys_shmat);
340DECL_TEMPLATE(linux, sys_shmget);
341DECL_TEMPLATE(linux, sys_shmdt);
342DECL_TEMPLATE(linux, sys_shmctl);
343/* Message queue */
344DECL_TEMPLATE(linux, sys_msgget);
345DECL_TEMPLATE(linux, sys_msgrcv);
346DECL_TEMPLATE(linux, sys_msgsnd);
347DECL_TEMPLATE(linux, sys_msgctl);
348
349/* Direct socket related syscalls. */
350DECL_TEMPLATE(linux, sys_socket);
351DECL_TEMPLATE(linux, sys_setsockopt);
352DECL_TEMPLATE(linux, sys_getsockopt);
353DECL_TEMPLATE(linux, sys_connect);
354DECL_TEMPLATE(linux, sys_accept);
355DECL_TEMPLATE(linux, sys_accept4);
356DECL_TEMPLATE(linux, sys_send);
357DECL_TEMPLATE(linux, sys_sendto);
358DECL_TEMPLATE(linux, sys_recv);
359DECL_TEMPLATE(linux, sys_recvfrom);
360DECL_TEMPLATE(linux, sys_sendmsg);
361DECL_TEMPLATE(linux, sys_recvmsg);
362DECL_TEMPLATE(linux, sys_shutdown);
363DECL_TEMPLATE(linux, sys_bind);
364DECL_TEMPLATE(linux, sys_listen);
365DECL_TEMPLATE(linux, sys_getsockname);
366DECL_TEMPLATE(linux, sys_getpeername);
367DECL_TEMPLATE(linux, sys_socketpair);
368DECL_TEMPLATE(linux, sys_kcmp);
369
370#endif   // __PRIV_SYSWRAP_LINUX_H
371
372/*--------------------------------------------------------------------*/
373/*--- end                                                          ---*/
374/*--------------------------------------------------------------------*/
375