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