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-2010 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 /* requires #include "priv_types_n_macros.h" */ 35 36 // Clone-related functions 37 extern Word ML_(start_thread_NORETURN) ( void* arg ); 38 extern Addr ML_(allocstack) ( ThreadId tid ); 39 extern void ML_(call_on_new_stack_0_1) ( Addr stack, Addr retaddr, 40 void (*f)(Word), Word arg1 ); 41 extern SysRes ML_(do_fork_clone) ( ThreadId tid, UInt flags, 42 Int* parent_tidptr, Int* child_tidptr ); 43 44 45 // Linux-specific (but non-arch-specific) syscalls 46 47 DECL_TEMPLATE(linux, sys_mount); 48 DECL_TEMPLATE(linux, sys_oldumount); 49 DECL_TEMPLATE(linux, sys_umount); 50 DECL_TEMPLATE(linux, sys_perf_counter_open); 51 DECL_TEMPLATE(linux, sys_preadv); 52 DECL_TEMPLATE(linux, sys_pwritev); 53 DECL_TEMPLATE(linux, sys_dup3); 54 DECL_TEMPLATE(linux, sys_getcpu); 55 DECL_TEMPLATE(linux, sys_splice); 56 DECL_TEMPLATE(linux, sys_readahead); 57 58 // POSIX, but various sub-cases differ between Linux and Darwin. 59 DECL_TEMPLATE(linux, sys_fcntl); 60 DECL_TEMPLATE(linux, sys_fcntl64); 61 DECL_TEMPLATE(linux, sys_ioctl); 62 63 DECL_TEMPLATE(linux, sys_setfsuid16); 64 DECL_TEMPLATE(linux, sys_setfsuid); 65 DECL_TEMPLATE(linux, sys_setfsgid16); 66 DECL_TEMPLATE(linux, sys_setfsgid); 67 DECL_TEMPLATE(linux, sys_setresuid16); // man page says "non-standard"; 68 DECL_TEMPLATE(linux, sys_setresuid); // man page says "non-standard" 69 DECL_TEMPLATE(linux, sys_getresuid16); 70 DECL_TEMPLATE(linux, sys_getresuid); 71 DECL_TEMPLATE(linux, sys_setresgid16); // man page says "non-standard" 72 DECL_TEMPLATE(linux, sys_setresgid); // man page says "non-standard" 73 DECL_TEMPLATE(linux, sys_getresgid16); 74 DECL_TEMPLATE(linux, sys_getresgid); 75 76 DECL_TEMPLATE(linux, sys_exit_group); 77 DECL_TEMPLATE(linux, sys_llseek); 78 DECL_TEMPLATE(linux, sys_adjtimex); 79 DECL_TEMPLATE(linux, sys_ioperm); 80 DECL_TEMPLATE(linux, sys_syslog); 81 DECL_TEMPLATE(linux, sys_vhangup); 82 DECL_TEMPLATE(linux, sys_sysinfo); 83 DECL_TEMPLATE(linux, sys_personality); 84 DECL_TEMPLATE(linux, sys_sysctl); 85 DECL_TEMPLATE(linux, sys_prctl); 86 DECL_TEMPLATE(linux, sys_sendfile); 87 DECL_TEMPLATE(linux, sys_sendfile64); 88 DECL_TEMPLATE(linux, sys_futex); 89 DECL_TEMPLATE(linux, sys_set_robust_list); 90 DECL_TEMPLATE(linux, sys_get_robust_list); 91 DECL_TEMPLATE(linux, sys_pselect6); 92 DECL_TEMPLATE(linux, sys_ppoll); 93 94 DECL_TEMPLATE(linux, sys_epoll_create); 95 DECL_TEMPLATE(linux, sys_epoll_create1); 96 DECL_TEMPLATE(linux, sys_epoll_ctl); 97 DECL_TEMPLATE(linux, sys_epoll_wait); 98 DECL_TEMPLATE(linux, sys_epoll_pwait); 99 DECL_TEMPLATE(linux, sys_eventfd); 100 DECL_TEMPLATE(linux, sys_eventfd2); 101 102 DECL_TEMPLATE(linux, sys_fallocate); 103 104 DECL_TEMPLATE(linux, sys_gettid); 105 DECL_TEMPLATE(linux, sys_set_tid_address); 106 DECL_TEMPLATE(linux, sys_tkill); 107 DECL_TEMPLATE(linux, sys_tgkill); 108 109 DECL_TEMPLATE(linux, sys_fadvise64); 110 DECL_TEMPLATE(linux, sys_fadvise64_64); 111 112 DECL_TEMPLATE(linux, sys_io_setup); 113 DECL_TEMPLATE(linux, sys_io_destroy); 114 DECL_TEMPLATE(linux, sys_io_getevents); 115 DECL_TEMPLATE(linux, sys_io_submit); 116 DECL_TEMPLATE(linux, sys_io_cancel); 117 118 DECL_TEMPLATE(linux, sys_ioprio_set); 119 DECL_TEMPLATE(linux, sys_ioprio_get); 120 121 DECL_TEMPLATE(linux, sys_mbind); 122 DECL_TEMPLATE(linux, sys_set_mempolicy); 123 DECL_TEMPLATE(linux, sys_get_mempolicy); 124 125 DECL_TEMPLATE(linux, sys_inotify_init); 126 DECL_TEMPLATE(linux, sys_inotify_init1); 127 DECL_TEMPLATE(linux, sys_inotify_add_watch); 128 DECL_TEMPLATE(linux, sys_inotify_rm_watch); 129 130 DECL_TEMPLATE(linux, sys_mq_open); 131 DECL_TEMPLATE(linux, sys_mq_unlink); 132 DECL_TEMPLATE(linux, sys_mq_timedsend); 133 DECL_TEMPLATE(linux, sys_mq_timedreceive); 134 DECL_TEMPLATE(linux, sys_mq_notify); 135 DECL_TEMPLATE(linux, sys_mq_getsetattr); 136 137 DECL_TEMPLATE(linux, sys_clock_settime); 138 DECL_TEMPLATE(linux, sys_clock_gettime); 139 DECL_TEMPLATE(linux, sys_clock_getres); 140 DECL_TEMPLATE(linux, sys_clock_nanosleep); 141 142 DECL_TEMPLATE(linux, sys_timer_create); // Linux: varies across archs? 143 DECL_TEMPLATE(linux, sys_timer_settime); 144 DECL_TEMPLATE(linux, sys_timer_gettime); 145 DECL_TEMPLATE(linux, sys_timer_getoverrun); 146 DECL_TEMPLATE(linux, sys_timer_delete); 147 DECL_TEMPLATE(linux, sys_timerfd_create); 148 DECL_TEMPLATE(linux, sys_timerfd_gettime); 149 DECL_TEMPLATE(linux, sys_timerfd_settime); 150 151 DECL_TEMPLATE(linux, sys_signalfd); 152 DECL_TEMPLATE(linux, sys_signalfd4); 153 154 DECL_TEMPLATE(linux, sys_capget); 155 DECL_TEMPLATE(linux, sys_capset); 156 157 DECL_TEMPLATE(linux, sys_openat); 158 DECL_TEMPLATE(linux, sys_mkdirat); 159 DECL_TEMPLATE(linux, sys_mknodat); 160 DECL_TEMPLATE(linux, sys_fchownat); 161 DECL_TEMPLATE(linux, sys_futimesat); 162 DECL_TEMPLATE(linux, sys_newfstatat); 163 DECL_TEMPLATE(linux, sys_unlinkat); 164 DECL_TEMPLATE(linux, sys_renameat); 165 DECL_TEMPLATE(linux, sys_linkat); 166 DECL_TEMPLATE(linux, sys_symlinkat); 167 DECL_TEMPLATE(linux, sys_readlinkat); 168 DECL_TEMPLATE(linux, sys_fchmodat); 169 DECL_TEMPLATE(linux, sys_faccessat); 170 DECL_TEMPLATE(linux, sys_utimensat); 171 172 DECL_TEMPLATE(linux, sys_add_key); 173 DECL_TEMPLATE(linux, sys_request_key); 174 DECL_TEMPLATE(linux, sys_keyctl); 175 176 // These ones have 32-bit generic equivalents, but the 16-bit versions (they 177 // use 16-bit gid_t and uid_t types) seem to be Linux-specific. 178 DECL_TEMPLATE(linux, sys_getuid16); 179 DECL_TEMPLATE(linux, sys_setuid16); 180 DECL_TEMPLATE(linux, sys_getgid16); 181 DECL_TEMPLATE(linux, sys_setgid16); 182 DECL_TEMPLATE(linux, sys_geteuid16); 183 DECL_TEMPLATE(linux, sys_getegid16); 184 DECL_TEMPLATE(linux, sys_setreuid16); 185 DECL_TEMPLATE(linux, sys_setregid16); 186 DECL_TEMPLATE(linux, sys_getgroups16); 187 DECL_TEMPLATE(linux, sys_setgroups16); 188 189 // Again, these 16-bit versions are Linux-specific, the 32-bit versions are 190 // generic. 191 DECL_TEMPLATE(linux, sys_chown16); 192 DECL_TEMPLATE(linux, sys_fchown16); 193 //DECL_TEMPLATE(linux, sys_lchown16); // not yet encountered 194 195 // Are these POSIX? In Darwin they have an extra parameter 'position', 196 // so put them here. 197 DECL_TEMPLATE(linux, sys_setxattr); 198 DECL_TEMPLATE(linux, sys_lsetxattr); 199 DECL_TEMPLATE(linux, sys_fsetxattr); 200 DECL_TEMPLATE(linux, sys_getxattr); 201 DECL_TEMPLATE(linux, sys_lgetxattr); 202 DECL_TEMPLATE(linux, sys_fgetxattr); 203 DECL_TEMPLATE(linux, sys_listxattr); 204 DECL_TEMPLATE(linux, sys_llistxattr); 205 DECL_TEMPLATE(linux, sys_flistxattr); 206 DECL_TEMPLATE(linux, sys_removexattr); 207 DECL_TEMPLATE(linux, sys_lremovexattr); 208 DECL_TEMPLATE(linux, sys_fremovexattr); 209 210 // These are Posix, but not necessarily syscalls. Darwin only supports 211 // sched_get_priority_{min,max} and sched_yield, but as libc functions, not 212 // syscalls. 213 DECL_TEMPLATE(linux, sys_sched_setparam); 214 DECL_TEMPLATE(linux, sys_sched_getparam); 215 DECL_TEMPLATE(linux, sys_sched_setscheduler); 216 DECL_TEMPLATE(linux, sys_sched_getscheduler); 217 DECL_TEMPLATE(linux, sys_sched_yield); 218 DECL_TEMPLATE(linux, sys_sched_get_priority_max); 219 DECL_TEMPLATE(linux, sys_sched_get_priority_min); 220 DECL_TEMPLATE(linux, sys_sched_rr_get_interval); 221 DECL_TEMPLATE(linux, sys_sched_setaffinity); 222 DECL_TEMPLATE(linux, sys_sched_getaffinity); 223 224 // These ones have different parameters and/or return values on Darwin. 225 // Also, some archs on Linux do not match the generic wrapper for sys_pipe. 226 DECL_TEMPLATE(linux, sys_munlockall); 227 DECL_TEMPLATE(linux, sys_pipe); 228 DECL_TEMPLATE(linux, sys_pipe2); 229 DECL_TEMPLATE(linux, sys_quotactl); 230 DECL_TEMPLATE(linux, sys_waitid); 231 232 // Posix, but in Darwin utime is a libc function that calls syscall utimes. 233 DECL_TEMPLATE(linux, sys_utime); 234 235 // On Darwin, off_t is 64-bits even on 32-bit platforms. 236 DECL_TEMPLATE(linux, sys_lseek); 237 238 // Darwin (and probably other OSes) don't have the old_sigset_t type. 239 DECL_TEMPLATE(linux, sys_sigpending); 240 DECL_TEMPLATE(linux, sys_sigprocmask); 241 DECL_TEMPLATE(linux, sys_sigaction); 242 DECL_TEMPLATE(linux, sys_sigsuspend); 243 244 // I think these are Linux-specific? 245 DECL_TEMPLATE(linux, sys_rt_sigaction); 246 DECL_TEMPLATE(linux, sys_rt_sigprocmask); 247 DECL_TEMPLATE(linux, sys_rt_sigpending); 248 DECL_TEMPLATE(linux, sys_rt_sigtimedwait); 249 DECL_TEMPLATE(linux, sys_rt_sigqueueinfo); 250 DECL_TEMPLATE(linux, sys_rt_tgsigqueueinfo); 251 DECL_TEMPLATE(linux, sys_rt_sigsuspend); 252 253 // Linux-specific? 254 DECL_TEMPLATE(linux, sys_sync_file_range); 255 DECL_TEMPLATE(linux, sys_sync_file_range2); 256 DECL_TEMPLATE(linux, sys_stime); /* maybe generic? I'm not sure */ 257 258 // Linux specific (kernel modules) 259 DECL_TEMPLATE(linux, sys_init_module); 260 DECL_TEMPLATE(linux, sys_delete_module); 261 262 // Linux-specific (oprofile-related) 263 DECL_TEMPLATE(linux, sys_lookup_dcookie); // (*/32/64) L 264 265 /* --------------------------------------------------------------------- 266 Wrappers for sockets and ipc-ery. These are split into standalone 267 procedures because x86-linux hides them inside multiplexors 268 (sys_socketcall and sys_ipc). 269 ------------------------------------------------------------------ */ 270 271 #define TId ThreadId 272 #define UW UWord 273 #define SR SysRes 274 275 extern void ML_(linux_PRE_sys_msgsnd) ( TId, UW, UW, UW, UW ); 276 extern void ML_(linux_PRE_sys_msgrcv) ( TId, UW, UW, UW, UW, UW ); 277 extern void ML_(linux_POST_sys_msgrcv) ( TId, UW, UW, UW, UW, UW, UW ); 278 extern void ML_(linux_PRE_sys_msgctl) ( TId, UW, UW, UW ); 279 extern void ML_(linux_POST_sys_msgctl) ( TId, UW, UW, UW, UW ); 280 extern void ML_(linux_PRE_sys_getsockopt) ( TId, UW, UW, UW, UW, UW ); 281 extern void ML_(linux_POST_sys_getsockopt) ( TId, SR, UW, UW, UW, UW, UW ); 282 283 #undef TId 284 #undef UW 285 #undef SR 286 287 #endif // __PRIV_SYSWRAP_LINUX_H 288 289 /*--------------------------------------------------------------------*/ 290 /*--- end ---*/ 291 /*--------------------------------------------------------------------*/ 292