1 2 /*--------------------------------------------------------------------*/ 3 /*--- Private syscalls header. priv_syswrap-generic.h ---*/ 4 /*--------------------------------------------------------------------*/ 5 6 /* 7 This file is part of Valgrind, a dynamic binary instrumentation 8 framework. 9 10 Copyright (C) 2000-2013 Julian Seward 11 jseward@acm.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_GENERIC_H 32 #define __PRIV_SYSWRAP_GENERIC_H 33 34 #include "pub_core_basics.h" // ThreadId 35 #include "pub_core_vki.h" // vki_msghdr 36 #include "priv_types_n_macros.h" // DECL_TEMPLATE 37 38 39 /* Guess the client stack from the segment in which sp is mapped. 40 Register the guessed stack using VG_(register_stack). 41 Setup tst client_stack_highest_byte and client_stack_szB. 42 If sp is not in a mapped segment, does nothing. */ 43 extern void ML_(guess_and_register_stack) (Addr sp, ThreadState* tst); 44 45 // Return true if address range entirely contained within client 46 // address space. 47 extern 48 Bool ML_(valid_client_addr)(Addr start, SizeT size, ThreadId tid, 49 const HChar *syscallname); 50 51 /* Handy small function to help stop wrappers from segfaulting when 52 presented with bogus client addresses. Is not used for generating 53 user-visible errors. */ 54 extern Bool ML_(safe_to_deref) ( void* start, SizeT size ); 55 56 // Returns True if the signal is OK for the client to use. 57 extern Bool ML_(client_signal_OK)(Int sigNo); 58 59 // Return true if we're allowed to use or create this fd. 60 extern 61 Bool ML_(fd_allowed)(Int fd, const HChar *syscallname, ThreadId tid, 62 Bool isNewFD); 63 64 extern void ML_(record_fd_open_named) (ThreadId tid, Int fd); 65 extern void ML_(record_fd_open_nameless) (ThreadId tid, Int fd); 66 extern void ML_(record_fd_open_with_given_name)(ThreadId tid, Int fd, 67 const HChar *pathname); 68 69 // Used when killing threads -- we must not kill a thread if it's the thread 70 // that would do Valgrind's final cleanup and output. 71 extern 72 Bool ML_(do_sigkill)(Int pid, Int tgid); 73 74 /* When a client mmap or munmap has been successfully done, both the core 75 and the tool need to be notified of the new mapping. Hence this fn. */ 76 extern void 77 ML_(notify_core_and_tool_of_mmap) ( Addr a, SizeT len, UInt prot, 78 UInt mm_flags, Int fd, Off64T offset ); 79 extern void 80 ML_(notify_core_and_tool_of_munmap) ( Addr a, SizeT len ); 81 extern void 82 ML_(notify_core_and_tool_of_mprotect) ( Addr a, SizeT len, Int prot ); 83 84 extern void 85 ML_(buf_and_len_pre_check) ( ThreadId tid, Addr buf_p, Addr buflen_p, 86 const HChar* buf_s, const HChar* buflen_s ); 87 extern void 88 ML_(buf_and_len_post_check) ( ThreadId tid, SysRes res, 89 Addr buf_p, Addr buflen_p, const HChar* s ); 90 91 /* PRE and POST for unknown ioctls based on ioctl request encoding */ 92 extern 93 void ML_(PRE_unknown_ioctl)(ThreadId tid, UWord request, UWord arg); 94 extern 95 void ML_(POST_unknown_ioctl)(ThreadId tid, UInt res, UWord request, UWord arg); 96 97 98 DECL_TEMPLATE(generic, sys_ni_syscall); // * P -- unimplemented 99 DECL_TEMPLATE(generic, sys_exit); 100 DECL_TEMPLATE(generic, sys_fork); 101 DECL_TEMPLATE(generic, sys_read); 102 DECL_TEMPLATE(generic, sys_write); 103 DECL_TEMPLATE(generic, sys_open); 104 DECL_TEMPLATE(generic, sys_close); 105 DECL_TEMPLATE(generic, sys_waitpid); 106 DECL_TEMPLATE(generic, sys_creat); 107 DECL_TEMPLATE(generic, sys_link); 108 DECL_TEMPLATE(generic, sys_unlink); 109 DECL_TEMPLATE(generic, sys_execve); // (*??) P 110 DECL_TEMPLATE(generic, sys_chdir); 111 DECL_TEMPLATE(generic, sys_time); 112 DECL_TEMPLATE(generic, sys_mknod); 113 DECL_TEMPLATE(generic, sys_chmod); 114 DECL_TEMPLATE(generic, sys_getpid); 115 DECL_TEMPLATE(generic, sys_alarm); 116 DECL_TEMPLATE(generic, sys_pause); 117 DECL_TEMPLATE(generic, sys_access); 118 DECL_TEMPLATE(generic, sys_kill); 119 DECL_TEMPLATE(generic, sys_rename); 120 DECL_TEMPLATE(generic, sys_mkdir); 121 DECL_TEMPLATE(generic, sys_rmdir); 122 DECL_TEMPLATE(generic, sys_dup); 123 DECL_TEMPLATE(generic, sys_times); 124 DECL_TEMPLATE(generic, sys_setpgid); 125 DECL_TEMPLATE(generic, sys_umask); 126 DECL_TEMPLATE(generic, sys_dup2); 127 DECL_TEMPLATE(generic, sys_getppid); 128 DECL_TEMPLATE(generic, sys_getpgrp); 129 DECL_TEMPLATE(generic, sys_setsid); 130 DECL_TEMPLATE(generic, sys_munmap); 131 DECL_TEMPLATE(generic, sys_truncate); 132 DECL_TEMPLATE(generic, sys_ftruncate); 133 DECL_TEMPLATE(generic, sys_fchmod); 134 DECL_TEMPLATE(generic, sys_msync); 135 DECL_TEMPLATE(generic, sys_readv); 136 DECL_TEMPLATE(generic, sys_writev); 137 DECL_TEMPLATE(generic, sys_getsid); 138 DECL_TEMPLATE(generic, sys_fdatasync); 139 DECL_TEMPLATE(generic, sys_mlock); 140 DECL_TEMPLATE(generic, sys_munlock); 141 DECL_TEMPLATE(generic, sys_mlockall); 142 DECL_TEMPLATE(generic, sys_nanosleep); 143 DECL_TEMPLATE(generic, sys_mremap); // POSIX, but Linux arg order may be odd 144 DECL_TEMPLATE(generic, sys_getuid); 145 DECL_TEMPLATE(generic, sys_getgid); 146 DECL_TEMPLATE(generic, sys_geteuid); 147 DECL_TEMPLATE(generic, sys_getegid); 148 DECL_TEMPLATE(generic, sys_getpgid); 149 DECL_TEMPLATE(generic, sys_fsync); 150 DECL_TEMPLATE(generic, sys_wait4); 151 DECL_TEMPLATE(generic, sys_mprotect); 152 DECL_TEMPLATE(generic, sys_getcwd); 153 DECL_TEMPLATE(generic, sys_symlink); 154 DECL_TEMPLATE(generic, sys_getgroups); 155 DECL_TEMPLATE(generic, sys_setgroups); // SVr4, SVID, X/OPEN, 4.3BSD 156 DECL_TEMPLATE(generic, sys_chown); 157 DECL_TEMPLATE(generic, sys_setuid); 158 DECL_TEMPLATE(generic, sys_gettimeofday); 159 DECL_TEMPLATE(generic, sys_madvise); 160 DECL_TEMPLATE(generic, sys_sethostname); 161 162 // These ones aren't POSIX, but are in some standard and look reasonably 163 // generic, and are the same for all architectures under Linux. 164 DECL_TEMPLATE(generic, sys_nice); // SVr4, SVID EXT, AT&T, X/OPEN, BSD 4.3 165 DECL_TEMPLATE(generic, sys_sync); // SVr4, SVID, X/OPEN, BSD 4.3 166 DECL_TEMPLATE(generic, sys_brk); // 4.3BSD 167 DECL_TEMPLATE(generic, sys_acct); // SVR4, non-POSIX 168 DECL_TEMPLATE(generic, sys_chroot); // SVr4, SVID, 4.4BSD, X/OPEN 169 DECL_TEMPLATE(generic, sys_readlink); // X/OPEN, 4.4BSD 170 DECL_TEMPLATE(generic, sys_fchdir); // SVr4, SVID, POSIX, X/OPEN, 4.4BSD 171 DECL_TEMPLATE(generic, sys_getdents); // SVr4,SVID 172 DECL_TEMPLATE(generic, sys_select); // 4.4BSD 173 DECL_TEMPLATE(generic, sys_flock); // 4.4BSD 174 DECL_TEMPLATE(generic, sys_poll); // XPG4-UNIX 175 DECL_TEMPLATE(generic, sys_getrusage); // SVr4, 4.3BSD 176 DECL_TEMPLATE(generic, sys_stime); // SVr4, SVID, X/OPEN 177 DECL_TEMPLATE(generic, sys_settimeofday); // SVr4, 4.3BSD (non-POSIX) 178 DECL_TEMPLATE(generic, sys_getpriority); // SVr4, 4.4BSD 179 DECL_TEMPLATE(generic, sys_setpriority); // SVr4, 4.4BSD 180 DECL_TEMPLATE(generic, sys_setitimer); // SVr4, 4.4BSD 181 DECL_TEMPLATE(generic, sys_getitimer); // SVr4, 4.4BSD 182 DECL_TEMPLATE(generic, sys_setreuid); // 4.3BSD 183 DECL_TEMPLATE(generic, sys_setregid); // 4.3BSD 184 DECL_TEMPLATE(generic, sys_fchown); // SVr4,4.3BSD 185 DECL_TEMPLATE(generic, sys_setgid); // SVr4,SVID 186 DECL_TEMPLATE(generic, sys_utimes); // 4.3BSD 187 188 // May not be generic for every architecture under Linux. 189 DECL_TEMPLATE(generic, sys_sigaction); // (x86) P 190 191 // Funny names, not sure... 192 DECL_TEMPLATE(generic, sys_newstat); // * P 193 DECL_TEMPLATE(generic, sys_newlstat); // * 194 DECL_TEMPLATE(generic, sys_newfstat); // * P (SVr4,BSD4.3) 195 196 // For the remainder, not really sure yet 197 DECL_TEMPLATE(generic, sys_ptrace); // (x86?) (almost-P) 198 DECL_TEMPLATE(generic, sys_setrlimit); // SVr4, 4.3BSD 199 DECL_TEMPLATE(generic, sys_old_getrlimit); // SVr4, 4.3BSD L? 200 DECL_TEMPLATE(generic, sys_statfs); // * L? 201 DECL_TEMPLATE(generic, sys_fstatfs); // * L? 202 DECL_TEMPLATE(generic, sys_iopl); // (x86/amd64) L 203 DECL_TEMPLATE(generic, sys_newuname); // * P 204 DECL_TEMPLATE(generic, sys_pread64); // * (Unix98?) 205 DECL_TEMPLATE(generic, sys_pwrite64); // * (Unix98?) 206 DECL_TEMPLATE(generic, sys_sigaltstack); // (x86) (XPG4-UNIX) 207 DECL_TEMPLATE(generic, sys_getpmsg); // (?) (?) 208 DECL_TEMPLATE(generic, sys_putpmsg); // (?) (?) 209 DECL_TEMPLATE(generic, sys_getrlimit); // * (?) 210 DECL_TEMPLATE(generic, sys_truncate64); // %% (P?) 211 DECL_TEMPLATE(generic, sys_ftruncate64); // %% (P?) 212 DECL_TEMPLATE(generic, sys_lchown); // * (L?) 213 DECL_TEMPLATE(generic, sys_mincore); // * L? 214 DECL_TEMPLATE(generic, sys_getdents64); // * (SVr4,SVID?) 215 DECL_TEMPLATE(generic, sys_statfs64); // * (?) 216 DECL_TEMPLATE(generic, sys_fstatfs64); // * (?) 217 218 219 /* --------------------------------------------------------------------- 220 Wrappers for sockets and ipc-ery. These are split into standalone 221 procedures because some platforms hides them inside multiplexors 222 (sys_socketcall and sys_ipc). 223 ------------------------------------------------------------------ */ 224 225 #define TId ThreadId 226 #define UW UWord 227 #define SR SysRes 228 229 extern void ML_(generic_PRE_sys_socketpair) ( TId, UW, UW, UW, UW ); 230 extern SysRes ML_(generic_POST_sys_socketpair) ( TId, SR, UW, UW, UW, UW ); 231 extern SysRes ML_(generic_POST_sys_socket) ( TId, SR ); 232 extern void ML_(generic_PRE_sys_bind) ( TId, UW, UW, UW ); 233 extern void ML_(generic_PRE_sys_accept) ( TId, UW, UW, UW ); 234 extern SysRes ML_(generic_POST_sys_accept) ( TId, SR, UW, UW, UW ); 235 extern void ML_(generic_PRE_sys_sendto) ( TId, UW, UW, UW, UW, UW, UW ); 236 extern void ML_(generic_PRE_sys_send) ( TId, UW, UW, UW ); 237 extern void ML_(generic_PRE_sys_recvfrom) ( TId, UW, UW, UW, UW, UW, UW ); 238 extern void ML_(generic_POST_sys_recvfrom) ( TId, SR, UW, UW, UW, UW, UW, UW ); 239 extern void ML_(generic_PRE_sys_recv) ( TId, UW, UW, UW ); 240 extern void ML_(generic_POST_sys_recv) ( TId, UW, UW, UW, UW ); 241 extern void ML_(generic_PRE_sys_connect) ( TId, UW, UW, UW ); 242 extern void ML_(generic_PRE_sys_setsockopt) ( TId, UW, UW, UW, UW, UW ); 243 extern void ML_(generic_PRE_sys_getsockname) ( TId, UW, UW, UW ); 244 extern void ML_(generic_POST_sys_getsockname) ( TId, SR, UW, UW, UW ); 245 extern void ML_(generic_PRE_sys_getpeername) ( TId, UW, UW, UW ); 246 extern void ML_(generic_POST_sys_getpeername) ( TId, SR, UW, UW, UW ); 247 extern void ML_(generic_PRE_sys_sendmsg) ( TId, const HChar *, 248 struct vki_msghdr * ); 249 extern void ML_(generic_PRE_sys_recvmsg) ( TId, const HChar *, 250 struct vki_msghdr * ); 251 extern void ML_(generic_POST_sys_recvmsg) ( TId, const HChar *, 252 struct vki_msghdr *, UInt ); 253 254 extern void ML_(generic_PRE_sys_semop) ( TId, UW, UW, UW ); 255 extern void ML_(generic_PRE_sys_semtimedop) ( TId, UW, UW, UW, UW ); 256 extern void ML_(generic_PRE_sys_semctl) ( TId, UW, UW, UW, UW ); 257 extern void ML_(generic_POST_sys_semctl) ( TId, UW, UW, UW, UW, UW ); 258 extern UWord ML_(generic_PRE_sys_shmat) ( TId, UW, UW, UW ); 259 extern void ML_(generic_POST_sys_shmat) ( TId, UW, UW, UW, UW ); 260 extern Bool ML_(generic_PRE_sys_shmdt) ( TId, UW ); 261 extern void ML_(generic_POST_sys_shmdt) ( TId, UW, UW ); 262 extern void ML_(generic_PRE_sys_shmctl) ( TId, UW, UW, UW ); 263 extern void ML_(generic_POST_sys_shmctl) ( TId, UW, UW, UW, UW ); 264 265 extern SysRes ML_(generic_PRE_sys_mmap) ( TId, UW, UW, UW, UW, UW, Off64T ); 266 267 #define PRE_timeval_READ(zzname, zzarg) \ 268 do { \ 269 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \ 270 PRE_FIELD_READ(zzname, zztv->tv_sec); \ 271 PRE_FIELD_READ(zzname, zztv->tv_usec); \ 272 } while (0) 273 #define PRE_timeval_WRITE(zzname, zzarg) \ 274 do { \ 275 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \ 276 PRE_FIELD_WRITE(zzname, zztv->tv_sec); \ 277 PRE_FIELD_WRITE(zzname, zztv->tv_usec); \ 278 } while (0) 279 #define POST_timeval_WRITE(zzarg) \ 280 do { \ 281 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \ 282 POST_FIELD_WRITE(zztv->tv_sec); \ 283 POST_FIELD_WRITE(zztv->tv_usec); \ 284 } while (0) 285 286 287 #undef TId 288 #undef UW 289 #undef SR 290 291 292 ///////////////////////////////////////////////////////////////// 293 294 295 #endif // __PRIV_SYSWRAP_GENERIC_H 296 297 /*--------------------------------------------------------------------*/ 298 /*--- end ---*/ 299 /*--------------------------------------------------------------------*/ 300