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-2017 Nicholas Nethercote 11 njn (at) 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 38 extern Word ML_(start_thread_NORETURN) ( void* arg ); 39 extern Addr ML_(allocstack) ( ThreadId tid ); 40 extern void ML_(call_on_new_stack_0_1) ( Addr stack, Addr retaddr, 41 void (*f)(Word), Word arg1 ); 42 43 // Linux-specific (but non-arch-specific) syscalls 44 45 DECL_TEMPLATE(linux, sys_clone) 46 DECL_TEMPLATE(linux, sys_mount); 47 DECL_TEMPLATE(linux, sys_oldumount); 48 DECL_TEMPLATE(linux, sys_umount); 49 DECL_TEMPLATE(linux, sys_perf_event_open); 50 DECL_TEMPLATE(linux, sys_preadv); 51 DECL_TEMPLATE(linux, sys_pwritev); 52 DECL_TEMPLATE(linux, sys_sendmmsg); 53 DECL_TEMPLATE(linux, sys_recvmmsg); 54 DECL_TEMPLATE(linux, sys_dup3); 55 DECL_TEMPLATE(linux, sys_getcpu); 56 DECL_TEMPLATE(linux, sys_splice); 57 DECL_TEMPLATE(linux, sys_tee); 58 DECL_TEMPLATE(linux, sys_vmsplice); 59 DECL_TEMPLATE(linux, sys_readahead); 60 DECL_TEMPLATE(linux, sys_move_pages); 61 62 // clone is similar enough between linux variants to have a generic 63 // version, but which will call an extern defined in syswrap-<platform>-linux.c 64 DECL_TEMPLATE(linux, sys_clone); 65 66 // POSIX, but various sub-cases differ between Linux and Darwin. 67 DECL_TEMPLATE(linux, sys_fcntl); 68 DECL_TEMPLATE(linux, sys_fcntl64); 69 DECL_TEMPLATE(linux, sys_ioctl); 70 71 DECL_TEMPLATE(linux, sys_setfsuid16); 72 DECL_TEMPLATE(linux, sys_setfsuid); 73 DECL_TEMPLATE(linux, sys_setfsgid16); 74 DECL_TEMPLATE(linux, sys_setfsgid); 75 DECL_TEMPLATE(linux, sys_setresuid16); // man page says "non-standard"; 76 DECL_TEMPLATE(linux, sys_setresuid); // man page says "non-standard" 77 DECL_TEMPLATE(linux, sys_getresuid16); 78 DECL_TEMPLATE(linux, sys_getresuid); 79 DECL_TEMPLATE(linux, sys_setresgid16); // man page says "non-standard" 80 DECL_TEMPLATE(linux, sys_setresgid); // man page says "non-standard" 81 DECL_TEMPLATE(linux, sys_getresgid16); 82 DECL_TEMPLATE(linux, sys_getresgid); 83 84 DECL_TEMPLATE(linux, sys_exit_group); 85 DECL_TEMPLATE(linux, sys_llseek); 86 DECL_TEMPLATE(linux, sys_adjtimex); 87 DECL_TEMPLATE(linux, sys_ioperm); 88 DECL_TEMPLATE(linux, sys_syslog); 89 DECL_TEMPLATE(linux, sys_vhangup); 90 DECL_TEMPLATE(linux, sys_sysinfo); 91 DECL_TEMPLATE(linux, sys_personality); 92 DECL_TEMPLATE(linux, sys_pivot_root); 93 DECL_TEMPLATE(linux, sys_sysctl); 94 DECL_TEMPLATE(linux, sys_prctl); 95 DECL_TEMPLATE(linux, sys_sendfile); 96 DECL_TEMPLATE(linux, sys_sendfile64); 97 DECL_TEMPLATE(linux, sys_futex); 98 DECL_TEMPLATE(linux, sys_set_robust_list); 99 DECL_TEMPLATE(linux, sys_get_robust_list); 100 DECL_TEMPLATE(linux, sys_pselect6); 101 DECL_TEMPLATE(linux, sys_ppoll); 102 103 DECL_TEMPLATE(linux, sys_epoll_create); 104 DECL_TEMPLATE(linux, sys_epoll_create1); 105 DECL_TEMPLATE(linux, sys_epoll_ctl); 106 DECL_TEMPLATE(linux, sys_epoll_wait); 107 DECL_TEMPLATE(linux, sys_epoll_pwait); 108 DECL_TEMPLATE(linux, sys_eventfd); 109 DECL_TEMPLATE(linux, sys_eventfd2); 110 111 DECL_TEMPLATE(linux, sys_fallocate); 112 113 DECL_TEMPLATE(linux, sys_prlimit64); 114 115 DECL_TEMPLATE(linux, sys_gettid); 116 DECL_TEMPLATE(linux, sys_set_tid_address); 117 DECL_TEMPLATE(linux, sys_tkill); 118 DECL_TEMPLATE(linux, sys_tgkill); 119 120 DECL_TEMPLATE(linux, sys_fadvise64); 121 DECL_TEMPLATE(linux, sys_fadvise64_64); 122 123 DECL_TEMPLATE(linux, sys_io_setup); 124 DECL_TEMPLATE(linux, sys_io_destroy); 125 DECL_TEMPLATE(linux, sys_io_getevents); 126 DECL_TEMPLATE(linux, sys_io_submit); 127 DECL_TEMPLATE(linux, sys_io_cancel); 128 129 DECL_TEMPLATE(linux, sys_ioprio_set); 130 DECL_TEMPLATE(linux, sys_ioprio_get); 131 132 DECL_TEMPLATE(linux, sys_mbind); 133 DECL_TEMPLATE(linux, sys_set_mempolicy); 134 DECL_TEMPLATE(linux, sys_get_mempolicy); 135 136 DECL_TEMPLATE(linux, sys_inotify_init); 137 DECL_TEMPLATE(linux, sys_inotify_init1); 138 DECL_TEMPLATE(linux, sys_inotify_add_watch); 139 DECL_TEMPLATE(linux, sys_inotify_rm_watch); 140 141 DECL_TEMPLATE(linux, sys_mq_open); 142 DECL_TEMPLATE(linux, sys_mq_unlink); 143 DECL_TEMPLATE(linux, sys_mq_timedsend); 144 DECL_TEMPLATE(linux, sys_mq_timedreceive); 145 DECL_TEMPLATE(linux, sys_mq_notify); 146 DECL_TEMPLATE(linux, sys_mq_getsetattr); 147 148 DECL_TEMPLATE(linux, sys_clock_settime); 149 DECL_TEMPLATE(linux, sys_clock_gettime); 150 DECL_TEMPLATE(linux, sys_clock_getres); 151 DECL_TEMPLATE(linux, sys_clock_nanosleep); 152 DECL_TEMPLATE(linux, sys_clock_adjtime); 153 154 DECL_TEMPLATE(linux, sys_timer_create); // Linux: varies across archs? 155 DECL_TEMPLATE(linux, sys_timer_settime); 156 DECL_TEMPLATE(linux, sys_timer_gettime); 157 DECL_TEMPLATE(linux, sys_timer_getoverrun); 158 DECL_TEMPLATE(linux, sys_timer_delete); 159 DECL_TEMPLATE(linux, sys_timerfd_create); 160 DECL_TEMPLATE(linux, sys_timerfd_gettime); 161 DECL_TEMPLATE(linux, sys_timerfd_settime); 162 163 DECL_TEMPLATE(linux, sys_signalfd); 164 DECL_TEMPLATE(linux, sys_signalfd4); 165 166 DECL_TEMPLATE(linux, sys_capget); 167 DECL_TEMPLATE(linux, sys_capset); 168 169 DECL_TEMPLATE(linux, sys_openat); 170 DECL_TEMPLATE(linux, sys_mkdirat); 171 DECL_TEMPLATE(linux, sys_mknodat); 172 DECL_TEMPLATE(linux, sys_fchownat); 173 DECL_TEMPLATE(linux, sys_futimesat); 174 DECL_TEMPLATE(linux, sys_newfstatat); 175 DECL_TEMPLATE(linux, sys_unlinkat); 176 DECL_TEMPLATE(linux, sys_renameat); 177 DECL_TEMPLATE(linux, sys_renameat2); 178 DECL_TEMPLATE(linux, sys_linkat); 179 DECL_TEMPLATE(linux, sys_symlinkat); 180 DECL_TEMPLATE(linux, sys_readlinkat); 181 DECL_TEMPLATE(linux, sys_fchmodat); 182 DECL_TEMPLATE(linux, sys_faccessat); 183 DECL_TEMPLATE(linux, sys_utimensat); 184 DECL_TEMPLATE(linux, sys_name_to_handle_at); 185 DECL_TEMPLATE(linux, sys_open_by_handle_at); 186 187 DECL_TEMPLATE(linux, sys_add_key); 188 DECL_TEMPLATE(linux, sys_request_key); 189 DECL_TEMPLATE(linux, sys_keyctl); 190 191 // These ones have 32-bit generic equivalents, but the 16-bit versions (they 192 // use 16-bit gid_t and uid_t types) seem to be Linux-specific. 193 DECL_TEMPLATE(linux, sys_getuid16); 194 DECL_TEMPLATE(linux, sys_setuid16); 195 DECL_TEMPLATE(linux, sys_getgid16); 196 DECL_TEMPLATE(linux, sys_setgid16); 197 DECL_TEMPLATE(linux, sys_geteuid16); 198 DECL_TEMPLATE(linux, sys_getegid16); 199 DECL_TEMPLATE(linux, sys_setreuid16); 200 DECL_TEMPLATE(linux, sys_setregid16); 201 DECL_TEMPLATE(linux, sys_getgroups16); 202 DECL_TEMPLATE(linux, sys_setgroups16); 203 204 // Again, these 16-bit versions are Linux-specific, the 32-bit versions are 205 // generic. 206 DECL_TEMPLATE(linux, sys_chown16); 207 DECL_TEMPLATE(linux, sys_fchown16); 208 //DECL_TEMPLATE(linux, sys_lchown16); // not yet encountered 209 210 // Are these POSIX? In Darwin they have an extra parameter 'position', 211 // so put them here. 212 DECL_TEMPLATE(linux, sys_setxattr); 213 DECL_TEMPLATE(linux, sys_lsetxattr); 214 DECL_TEMPLATE(linux, sys_fsetxattr); 215 DECL_TEMPLATE(linux, sys_getxattr); 216 DECL_TEMPLATE(linux, sys_lgetxattr); 217 DECL_TEMPLATE(linux, sys_fgetxattr); 218 DECL_TEMPLATE(linux, sys_listxattr); 219 DECL_TEMPLATE(linux, sys_llistxattr); 220 DECL_TEMPLATE(linux, sys_flistxattr); 221 DECL_TEMPLATE(linux, sys_removexattr); 222 DECL_TEMPLATE(linux, sys_lremovexattr); 223 DECL_TEMPLATE(linux, sys_fremovexattr); 224 225 // These are Posix, but not necessarily syscalls. Darwin only supports 226 // sched_get_priority_{min,max} and sched_yield, but as libc functions, not 227 // syscalls. 228 DECL_TEMPLATE(linux, sys_sched_setparam); 229 DECL_TEMPLATE(linux, sys_sched_getparam); 230 DECL_TEMPLATE(linux, sys_sched_setscheduler); 231 DECL_TEMPLATE(linux, sys_sched_getscheduler); 232 DECL_TEMPLATE(linux, sys_sched_yield); 233 DECL_TEMPLATE(linux, sys_sched_get_priority_max); 234 DECL_TEMPLATE(linux, sys_sched_get_priority_min); 235 DECL_TEMPLATE(linux, sys_sched_rr_get_interval); 236 DECL_TEMPLATE(linux, sys_sched_setaffinity); 237 DECL_TEMPLATE(linux, sys_sched_getaffinity); 238 239 DECL_TEMPLATE(linux, sys_unshare); 240 241 // These ones have different parameters and/or return values on Darwin. 242 // Also, some archs on Linux do not match the generic wrapper for sys_pipe. 243 DECL_TEMPLATE(linux, sys_munlockall); 244 DECL_TEMPLATE(linux, sys_pipe); 245 DECL_TEMPLATE(linux, sys_pipe2); 246 DECL_TEMPLATE(linux, sys_quotactl); 247 DECL_TEMPLATE(linux, sys_waitid); 248 249 // Posix, but in Darwin utime is a libc function that calls syscall utimes. 250 DECL_TEMPLATE(linux, sys_utime); 251 252 // On Darwin, off_t is 64-bits even on 32-bit platforms. 253 DECL_TEMPLATE(linux, sys_lseek); 254 255 // Darwin (and probably other OSes) don't have the old_sigset_t type. 256 DECL_TEMPLATE(linux, sys_sigpending); 257 DECL_TEMPLATE(linux, sys_sigprocmask); 258 DECL_TEMPLATE(linux, sys_sigaction); 259 260 // I think these are Linux-specific? 261 DECL_TEMPLATE(linux, sys_rt_sigaction); 262 DECL_TEMPLATE(linux, sys_rt_sigprocmask); 263 DECL_TEMPLATE(linux, sys_rt_sigpending); 264 DECL_TEMPLATE(linux, sys_rt_sigtimedwait); 265 DECL_TEMPLATE(linux, sys_rt_sigqueueinfo); 266 DECL_TEMPLATE(linux, sys_rt_tgsigqueueinfo); 267 DECL_TEMPLATE(linux, sys_rt_sigsuspend); 268 269 // Linux-specific? 270 DECL_TEMPLATE(linux, sys_sync_file_range); 271 DECL_TEMPLATE(linux, sys_sync_file_range2); 272 DECL_TEMPLATE(linux, sys_stime); /* maybe generic? I'm not sure */ 273 274 // Linux specific (kernel modules) 275 DECL_TEMPLATE(linux, sys_init_module); 276 DECL_TEMPLATE(linux, sys_finit_module); 277 DECL_TEMPLATE(linux, sys_delete_module); 278 279 // Linux-specific (oprofile-related) 280 DECL_TEMPLATE(linux, sys_lookup_dcookie); // (*/32/64) L 281 282 // Linux-specific (new in Linux 3.2) 283 DECL_TEMPLATE(linux, sys_process_vm_readv); 284 DECL_TEMPLATE(linux, sys_process_vm_writev); 285 286 // Linux-specific (new in Linux 2.6.36) 287 DECL_TEMPLATE(linux, sys_fanotify_init); 288 DECL_TEMPLATE(linux, sys_fanotify_mark); 289 290 // Linux-specific (new in Linux 3.17) 291 DECL_TEMPLATE(linux, sys_getrandom); 292 DECL_TEMPLATE(linux, sys_memfd_create); 293 294 DECL_TEMPLATE(linux, sys_syncfs); 295 296 /* --------------------------------------------------------------------- 297 Wrappers for sockets and ipc-ery. These are split into standalone 298 procedures because x86-linux hides them inside multiplexors 299 (sys_socketcall and sys_ipc). 300 ------------------------------------------------------------------ */ 301 302 #define TId ThreadId 303 #define UW UWord 304 #define SR SysRes 305 306 extern void ML_(linux_PRE_sys_msgsnd) ( TId, UW, UW, UW, UW ); 307 extern void ML_(linux_PRE_sys_msgrcv) ( TId, UW, UW, UW, UW, UW ); 308 extern void ML_(linux_POST_sys_msgrcv) ( TId, UW, UW, UW, UW, UW, UW ); 309 extern void ML_(linux_PRE_sys_msgctl) ( TId, UW, UW, UW ); 310 extern void ML_(linux_POST_sys_msgctl) ( TId, UW, UW, UW, UW ); 311 extern void ML_(linux_PRE_sys_getsockopt) ( TId, UW, UW, UW, UW, UW ); 312 extern void ML_(linux_POST_sys_getsockopt) ( TId, SR, UW, UW, UW, UW, UW ); 313 extern void ML_(linux_PRE_sys_setsockopt) ( TId, UW, UW, UW, UW, UW ); 314 extern void ML_(linux_PRE_sys_recvmmsg) ( TId, UW, UW, UW, UW, UW ); 315 extern void ML_(linux_POST_sys_recvmmsg) ( TId, UW, UW, UW, UW, UW, UW ); 316 extern void ML_(linux_PRE_sys_sendmmsg) ( TId, UW, UW, UW, UW ); 317 extern void ML_(linux_POST_sys_sendmmsg) ( TId, UW, UW, UW, UW, UW ); 318 319 // Linux-specific (but non-arch-specific) ptrace wrapper helpers 320 extern void ML_(linux_PRE_getregset) ( ThreadId, long, long ); 321 extern void ML_(linux_PRE_setregset) ( ThreadId, long, long ); 322 extern void ML_(linux_POST_traceme) ( ThreadId ); 323 extern void ML_(linux_POST_getregset)( ThreadId, long, long ); 324 325 #undef TId 326 #undef UW 327 #undef SR 328 329 /* sys_ipc and sys_socketcall are multiplexors which implements several syscalls. 330 Used e.g. by x86, ppc32, ppc64, ... */ 331 DECL_TEMPLATE(linux, sys_ipc); 332 DECL_TEMPLATE(linux, sys_socketcall); 333 334 /* Depending on the platform, the below are implemented as 335 direct syscalls or via the above sys_socketcall multiplexor. */ 336 337 /* Direct ipc related syscalls. */ 338 /* Semaphore */ 339 DECL_TEMPLATE(linux, sys_semget); 340 DECL_TEMPLATE(linux, sys_semop); 341 DECL_TEMPLATE(linux, sys_semctl); 342 DECL_TEMPLATE(linux, sys_semtimedop); 343 /* Shared memory */ 344 DECL_TEMPLATE(linux, sys_shmat); 345 DECL_TEMPLATE(linux, sys_shmget); 346 DECL_TEMPLATE(linux, sys_shmdt); 347 DECL_TEMPLATE(linux, sys_shmctl); 348 /* Message queue */ 349 DECL_TEMPLATE(linux, sys_msgget); 350 DECL_TEMPLATE(linux, sys_msgrcv); 351 DECL_TEMPLATE(linux, sys_msgsnd); 352 DECL_TEMPLATE(linux, sys_msgctl); 353 354 /* Direct socket related syscalls. */ 355 DECL_TEMPLATE(linux, sys_socket); 356 DECL_TEMPLATE(linux, sys_setsockopt); 357 DECL_TEMPLATE(linux, sys_getsockopt); 358 DECL_TEMPLATE(linux, sys_connect); 359 DECL_TEMPLATE(linux, sys_accept); 360 DECL_TEMPLATE(linux, sys_accept4); 361 DECL_TEMPLATE(linux, sys_send); 362 DECL_TEMPLATE(linux, sys_sendto); 363 DECL_TEMPLATE(linux, sys_recv); 364 DECL_TEMPLATE(linux, sys_recvfrom); 365 DECL_TEMPLATE(linux, sys_sendmsg); 366 DECL_TEMPLATE(linux, sys_recvmsg); 367 DECL_TEMPLATE(linux, sys_shutdown); 368 DECL_TEMPLATE(linux, sys_bind); 369 DECL_TEMPLATE(linux, sys_listen); 370 DECL_TEMPLATE(linux, sys_getsockname); 371 DECL_TEMPLATE(linux, sys_getpeername); 372 DECL_TEMPLATE(linux, sys_socketpair); 373 DECL_TEMPLATE(linux, sys_kcmp); 374 375 // Some arch specific functions called from syswrap-linux.c 376 extern Int do_syscall_clone_x86_linux ( Word (*fn)(void *), 377 void* stack, 378 Int flags, 379 void* arg, 380 Int* child_tid, 381 Int* parent_tid, 382 void* tls_ptr); 383 extern SysRes ML_(x86_sys_set_thread_area) ( ThreadId tid, 384 vki_modify_ldt_t* info ); 385 extern void ML_(x86_setup_LDT_GDT) ( /*OUT*/ ThreadArchState *child, 386 /*IN*/ ThreadArchState *parent ); 387 388 extern Long do_syscall_clone_amd64_linux ( Word (*fn)(void *), 389 void* stack, 390 Long flags, 391 void* arg, 392 Int* child_tid, 393 Int* parent_tid, 394 void* tls_ptr); 395 extern ULong do_syscall_clone_ppc32_linux ( Word (*fn)(void *), 396 void* stack, 397 Int flags, 398 void* arg, 399 Int* child_tid, 400 Int* parent_tid, 401 void* tls_ptr); 402 extern ULong do_syscall_clone_ppc64_linux ( Word (*fn)(void *), 403 void* stack, 404 Int flags, 405 void* arg, 406 Int* child_tid, 407 Int* parent_tid, 408 void* tls_ptr ); 409 extern ULong do_syscall_clone_s390x_linux ( void *stack, 410 ULong flags, 411 Int *parent_tid, 412 Int *child_tid, 413 void* tls_ptr, 414 Word (*fn)(void *), 415 void *arg); 416 extern Long do_syscall_clone_arm64_linux ( Word (*fn)(void *), 417 void* stack, 418 Long flags, 419 void* arg, 420 Int* child_tid, 421 Int* parent_tid, 422 void* tls_ptr ); 423 extern ULong do_syscall_clone_arm_linux ( Word (*fn)(void *), 424 void* stack, 425 Int flags, 426 void* arg, 427 Int* child_tid, 428 Int* parent_tid, 429 void* tls_ptr ); 430 extern ULong do_syscall_clone_mips64_linux ( Word (*fn) (void *), /* a0 - 4 */ 431 void* stack, /* a1 - 5 */ 432 Int flags, /* a2 - 6 */ 433 void* arg, /* a3 - 7 */ 434 Int* parent_tid, /* a4 - 8 */ 435 void* tls_ptr, /* a5 - 9 */ 436 Int* child_tid ); /* a6 - 10 */ 437 extern UInt do_syscall_clone_mips_linux ( Word (*fn) (void *), //a0 0 32 438 void* stack, //a1 4 36 439 Int flags, //a2 8 40 440 void* arg, //a3 12 44 441 Int* child_tid, //stack 16 48 442 Int* parent_tid, //stack 20 52 443 void* tls_ptr); //stack 24 56 444 #endif // __PRIV_SYSWRAP_LINUX_H 445 446 /*--------------------------------------------------------------------*/ 447 /*--- end ---*/ 448 /*--------------------------------------------------------------------*/ 449