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