Home | History | Annotate | Download | only in m_syswrap
      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 (at) 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