Home | History | Annotate | Download | only in m_syswrap
      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-2013 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 extern SysRes ML_(do_fork_clone) ( ThreadId tid, UInt flags,
     43                                    Int* parent_tidptr, Int* child_tidptr );
     44 
     45 
     46 // Linux-specific (but non-arch-specific) syscalls
     47 
     48 DECL_TEMPLATE(linux, sys_mount);
     49 DECL_TEMPLATE(linux, sys_oldumount);
     50 DECL_TEMPLATE(linux, sys_umount);
     51 DECL_TEMPLATE(linux, sys_perf_event_open);
     52 DECL_TEMPLATE(linux, sys_preadv);
     53 DECL_TEMPLATE(linux, sys_pwritev);
     54 DECL_TEMPLATE(linux, sys_sendmmsg);
     55 DECL_TEMPLATE(linux, sys_recvmmsg);
     56 DECL_TEMPLATE(linux, sys_dup3);
     57 DECL_TEMPLATE(linux, sys_getcpu);
     58 DECL_TEMPLATE(linux, sys_splice);
     59 DECL_TEMPLATE(linux, sys_tee);
     60 DECL_TEMPLATE(linux, sys_vmsplice);
     61 DECL_TEMPLATE(linux, sys_readahead);
     62 DECL_TEMPLATE(linux, sys_move_pages);
     63 
     64 // POSIX, but various sub-cases differ between Linux and Darwin.
     65 DECL_TEMPLATE(linux, sys_fcntl);
     66 DECL_TEMPLATE(linux, sys_fcntl64);
     67 DECL_TEMPLATE(linux, sys_ioctl);
     68 
     69 DECL_TEMPLATE(linux, sys_setfsuid16);
     70 DECL_TEMPLATE(linux, sys_setfsuid);
     71 DECL_TEMPLATE(linux, sys_setfsgid16);
     72 DECL_TEMPLATE(linux, sys_setfsgid);
     73 DECL_TEMPLATE(linux, sys_setresuid16);  // man page says "non-standard";
     74 DECL_TEMPLATE(linux, sys_setresuid);    // man page says "non-standard"
     75 DECL_TEMPLATE(linux, sys_getresuid16);
     76 DECL_TEMPLATE(linux, sys_getresuid);
     77 DECL_TEMPLATE(linux, sys_setresgid16);  // man page says "non-standard"
     78 DECL_TEMPLATE(linux, sys_setresgid);    // man page says "non-standard"
     79 DECL_TEMPLATE(linux, sys_getresgid16);
     80 DECL_TEMPLATE(linux, sys_getresgid);
     81 
     82 DECL_TEMPLATE(linux, sys_exit_group);
     83 DECL_TEMPLATE(linux, sys_llseek);
     84 DECL_TEMPLATE(linux, sys_adjtimex);
     85 DECL_TEMPLATE(linux, sys_ioperm);
     86 DECL_TEMPLATE(linux, sys_syslog);
     87 DECL_TEMPLATE(linux, sys_vhangup);
     88 DECL_TEMPLATE(linux, sys_sysinfo);
     89 DECL_TEMPLATE(linux, sys_personality);
     90 DECL_TEMPLATE(linux, sys_sysctl);
     91 DECL_TEMPLATE(linux, sys_prctl);
     92 DECL_TEMPLATE(linux, sys_sendfile);
     93 DECL_TEMPLATE(linux, sys_sendfile64);
     94 DECL_TEMPLATE(linux, sys_futex);
     95 DECL_TEMPLATE(linux, sys_set_robust_list);
     96 DECL_TEMPLATE(linux, sys_get_robust_list);
     97 DECL_TEMPLATE(linux, sys_pselect6);
     98 DECL_TEMPLATE(linux, sys_ppoll);
     99 
    100 DECL_TEMPLATE(linux, sys_epoll_create);
    101 DECL_TEMPLATE(linux, sys_epoll_create1);
    102 DECL_TEMPLATE(linux, sys_epoll_ctl);
    103 DECL_TEMPLATE(linux, sys_epoll_wait);
    104 DECL_TEMPLATE(linux, sys_epoll_pwait);
    105 DECL_TEMPLATE(linux, sys_eventfd);
    106 DECL_TEMPLATE(linux, sys_eventfd2);
    107 
    108 DECL_TEMPLATE(linux, sys_fallocate);
    109 
    110 DECL_TEMPLATE(linux, sys_prlimit64);
    111 
    112 DECL_TEMPLATE(linux, sys_gettid);
    113 DECL_TEMPLATE(linux, sys_set_tid_address);
    114 DECL_TEMPLATE(linux, sys_tkill);
    115 DECL_TEMPLATE(linux, sys_tgkill);
    116 
    117 DECL_TEMPLATE(linux, sys_fadvise64);
    118 DECL_TEMPLATE(linux, sys_fadvise64_64);
    119 
    120 DECL_TEMPLATE(linux, sys_io_setup);
    121 DECL_TEMPLATE(linux, sys_io_destroy);
    122 DECL_TEMPLATE(linux, sys_io_getevents);
    123 DECL_TEMPLATE(linux, sys_io_submit);
    124 DECL_TEMPLATE(linux, sys_io_cancel);
    125 
    126 DECL_TEMPLATE(linux, sys_ioprio_set);
    127 DECL_TEMPLATE(linux, sys_ioprio_get);
    128 
    129 DECL_TEMPLATE(linux, sys_mbind);
    130 DECL_TEMPLATE(linux, sys_set_mempolicy);
    131 DECL_TEMPLATE(linux, sys_get_mempolicy);
    132 
    133 DECL_TEMPLATE(linux, sys_inotify_init);
    134 DECL_TEMPLATE(linux, sys_inotify_init1);
    135 DECL_TEMPLATE(linux, sys_inotify_add_watch);
    136 DECL_TEMPLATE(linux, sys_inotify_rm_watch);
    137 
    138 DECL_TEMPLATE(linux, sys_mq_open);
    139 DECL_TEMPLATE(linux, sys_mq_unlink);
    140 DECL_TEMPLATE(linux, sys_mq_timedsend);
    141 DECL_TEMPLATE(linux, sys_mq_timedreceive);
    142 DECL_TEMPLATE(linux, sys_mq_notify);
    143 DECL_TEMPLATE(linux, sys_mq_getsetattr);
    144 
    145 DECL_TEMPLATE(linux, sys_clock_settime);
    146 DECL_TEMPLATE(linux, sys_clock_gettime);
    147 DECL_TEMPLATE(linux, sys_clock_getres);
    148 DECL_TEMPLATE(linux, sys_clock_nanosleep);
    149 DECL_TEMPLATE(linux, sys_clock_adjtime);
    150 
    151 DECL_TEMPLATE(linux, sys_timer_create);      // Linux: varies across archs?
    152 DECL_TEMPLATE(linux, sys_timer_settime);
    153 DECL_TEMPLATE(linux, sys_timer_gettime);
    154 DECL_TEMPLATE(linux, sys_timer_getoverrun);
    155 DECL_TEMPLATE(linux, sys_timer_delete);
    156 DECL_TEMPLATE(linux, sys_timerfd_create);
    157 DECL_TEMPLATE(linux, sys_timerfd_gettime);
    158 DECL_TEMPLATE(linux, sys_timerfd_settime);
    159 
    160 DECL_TEMPLATE(linux, sys_signalfd);
    161 DECL_TEMPLATE(linux, sys_signalfd4);
    162 
    163 DECL_TEMPLATE(linux, sys_capget);
    164 DECL_TEMPLATE(linux, sys_capset);
    165 
    166 DECL_TEMPLATE(linux, sys_openat);
    167 DECL_TEMPLATE(linux, sys_mkdirat);
    168 DECL_TEMPLATE(linux, sys_mknodat);
    169 DECL_TEMPLATE(linux, sys_fchownat);
    170 DECL_TEMPLATE(linux, sys_futimesat);
    171 DECL_TEMPLATE(linux, sys_newfstatat);
    172 DECL_TEMPLATE(linux, sys_unlinkat);
    173 DECL_TEMPLATE(linux, sys_renameat);
    174 DECL_TEMPLATE(linux, sys_linkat);
    175 DECL_TEMPLATE(linux, sys_symlinkat);
    176 DECL_TEMPLATE(linux, sys_readlinkat);
    177 DECL_TEMPLATE(linux, sys_fchmodat);
    178 DECL_TEMPLATE(linux, sys_faccessat);
    179 DECL_TEMPLATE(linux, sys_utimensat);
    180 DECL_TEMPLATE(linux, sys_name_to_handle_at);
    181 DECL_TEMPLATE(linux, sys_open_by_handle_at);
    182 
    183 DECL_TEMPLATE(linux, sys_add_key);
    184 DECL_TEMPLATE(linux, sys_request_key);
    185 DECL_TEMPLATE(linux, sys_keyctl);
    186 
    187 // These ones have 32-bit generic equivalents, but the 16-bit versions (they
    188 // use 16-bit gid_t and uid_t types) seem to be Linux-specific.
    189 DECL_TEMPLATE(linux, sys_getuid16);
    190 DECL_TEMPLATE(linux, sys_setuid16);
    191 DECL_TEMPLATE(linux, sys_getgid16);
    192 DECL_TEMPLATE(linux, sys_setgid16);
    193 DECL_TEMPLATE(linux, sys_geteuid16);
    194 DECL_TEMPLATE(linux, sys_getegid16);
    195 DECL_TEMPLATE(linux, sys_setreuid16);
    196 DECL_TEMPLATE(linux, sys_setregid16);
    197 DECL_TEMPLATE(linux, sys_getgroups16);
    198 DECL_TEMPLATE(linux, sys_setgroups16);
    199 
    200 // Again, these 16-bit versions are Linux-specific, the 32-bit versions are
    201 // generic.
    202 DECL_TEMPLATE(linux, sys_chown16);
    203 DECL_TEMPLATE(linux, sys_fchown16);
    204 //DECL_TEMPLATE(linux, sys_lchown16);      // not yet encountered
    205 
    206 // Are these POSIX?  In Darwin they have an extra parameter 'position',
    207 // so put them here.
    208 DECL_TEMPLATE(linux, sys_setxattr);
    209 DECL_TEMPLATE(linux, sys_lsetxattr);
    210 DECL_TEMPLATE(linux, sys_fsetxattr);
    211 DECL_TEMPLATE(linux, sys_getxattr);
    212 DECL_TEMPLATE(linux, sys_lgetxattr);
    213 DECL_TEMPLATE(linux, sys_fgetxattr);
    214 DECL_TEMPLATE(linux, sys_listxattr);
    215 DECL_TEMPLATE(linux, sys_llistxattr);
    216 DECL_TEMPLATE(linux, sys_flistxattr);
    217 DECL_TEMPLATE(linux, sys_removexattr);
    218 DECL_TEMPLATE(linux, sys_lremovexattr);
    219 DECL_TEMPLATE(linux, sys_fremovexattr);
    220 
    221 // These are Posix, but not necessarily syscalls.  Darwin only supports
    222 // sched_get_priority_{min,max} and sched_yield, but as libc functions, not
    223 // syscalls.
    224 DECL_TEMPLATE(linux, sys_sched_setparam);
    225 DECL_TEMPLATE(linux, sys_sched_getparam);
    226 DECL_TEMPLATE(linux, sys_sched_setscheduler);
    227 DECL_TEMPLATE(linux, sys_sched_getscheduler);
    228 DECL_TEMPLATE(linux, sys_sched_yield);
    229 DECL_TEMPLATE(linux, sys_sched_get_priority_max);
    230 DECL_TEMPLATE(linux, sys_sched_get_priority_min);
    231 DECL_TEMPLATE(linux, sys_sched_rr_get_interval);
    232 DECL_TEMPLATE(linux, sys_sched_setaffinity);
    233 DECL_TEMPLATE(linux, sys_sched_getaffinity);
    234 
    235 // These ones have different parameters and/or return values on Darwin.
    236 // Also, some archs on Linux do not match the generic wrapper for sys_pipe.
    237 DECL_TEMPLATE(linux, sys_munlockall);
    238 DECL_TEMPLATE(linux, sys_pipe);
    239 DECL_TEMPLATE(linux, sys_pipe2);
    240 DECL_TEMPLATE(linux, sys_quotactl);
    241 DECL_TEMPLATE(linux, sys_waitid);
    242 
    243 // Posix, but in Darwin utime is a libc function that calls syscall utimes.
    244 DECL_TEMPLATE(linux, sys_utime);
    245 
    246 // On Darwin, off_t is 64-bits even on 32-bit platforms.
    247 DECL_TEMPLATE(linux, sys_lseek);
    248 
    249 // Darwin (and probably other OSes) don't have the old_sigset_t type.
    250 DECL_TEMPLATE(linux, sys_sigpending);
    251 DECL_TEMPLATE(linux, sys_sigprocmask);
    252 DECL_TEMPLATE(linux, sys_sigaction);
    253 
    254 // I think these are Linux-specific?
    255 DECL_TEMPLATE(linux, sys_rt_sigaction);
    256 DECL_TEMPLATE(linux, sys_rt_sigprocmask);
    257 DECL_TEMPLATE(linux, sys_rt_sigpending);
    258 DECL_TEMPLATE(linux, sys_rt_sigtimedwait);
    259 DECL_TEMPLATE(linux, sys_rt_sigqueueinfo);
    260 DECL_TEMPLATE(linux, sys_rt_tgsigqueueinfo);
    261 DECL_TEMPLATE(linux, sys_rt_sigsuspend);
    262 
    263 // Linux-specific?
    264 DECL_TEMPLATE(linux, sys_sync_file_range);
    265 DECL_TEMPLATE(linux, sys_sync_file_range2);
    266 DECL_TEMPLATE(linux, sys_stime);  /* maybe generic?  I'm not sure */
    267 
    268 // Linux specific (kernel modules)
    269 DECL_TEMPLATE(linux, sys_init_module);
    270 DECL_TEMPLATE(linux, sys_delete_module);
    271 
    272 // Linux-specific (oprofile-related)
    273 DECL_TEMPLATE(linux, sys_lookup_dcookie);        // (*/32/64) L
    274 
    275 // Linux-specific (new in Linux 3.2)
    276 DECL_TEMPLATE(linux, sys_process_vm_readv);
    277 DECL_TEMPLATE(linux, sys_process_vm_writev);
    278 
    279 // Linux-specific (new in Linux 2.6.36)
    280 DECL_TEMPLATE(linux, sys_fanotify_init);
    281 DECL_TEMPLATE(linux, sys_fanotify_mark);
    282 
    283 /* ---------------------------------------------------------------------
    284    Wrappers for sockets and ipc-ery.  These are split into standalone
    285    procedures because x86-linux hides them inside multiplexors
    286    (sys_socketcall and sys_ipc).
    287    ------------------------------------------------------------------ */
    288 
    289 #define TId ThreadId
    290 #define UW  UWord
    291 #define SR  SysRes
    292 
    293 extern void ML_(linux_PRE_sys_msgsnd)      ( TId, UW, UW, UW, UW );
    294 extern void ML_(linux_PRE_sys_msgrcv)      ( TId, UW, UW, UW, UW, UW );
    295 extern void ML_(linux_POST_sys_msgrcv)     ( TId, UW, UW, UW, UW, UW, UW );
    296 extern void ML_(linux_PRE_sys_msgctl)      ( TId, UW, UW, UW );
    297 extern void ML_(linux_POST_sys_msgctl)     ( TId, UW, UW, UW, UW );
    298 extern void ML_(linux_PRE_sys_getsockopt)  ( TId, UW, UW, UW, UW, UW );
    299 extern void ML_(linux_POST_sys_getsockopt) ( TId, SR, UW, UW, UW, UW, UW );
    300 extern void ML_(linux_PRE_sys_setsockopt)  ( TId, UW, UW, UW, UW, UW );
    301 
    302 // Linux-specific (but non-arch-specific) ptrace wrapper helpers
    303 extern void ML_(linux_PRE_getregset) ( ThreadId, long, long );
    304 extern void ML_(linux_PRE_setregset) ( ThreadId, long, long );
    305 extern void ML_(linux_POST_getregset)( ThreadId, long, long );
    306 
    307 #undef TId
    308 #undef UW
    309 #undef SR
    310 
    311 /* sys_ipc and sys_socketcall are multiplexors which implements several syscalls.
    312    Used e.g. by x86, ppc32, ppc64, ... */
    313 DECL_TEMPLATE(linux, sys_ipc);
    314 DECL_TEMPLATE(linux, sys_socketcall);
    315 
    316 /* Depending on the platform, the below are implemented as
    317    direct syscalls or via the above sys_socketcall multiplexor. */
    318 
    319 /* Direct ipc related syscalls. */
    320 /* Semaphore */
    321 DECL_TEMPLATE(linux, sys_semget);
    322 DECL_TEMPLATE(linux, sys_semop);
    323 DECL_TEMPLATE(linux, sys_semctl);
    324 DECL_TEMPLATE(linux, sys_semtimedop);
    325 /* Shared memory */
    326 DECL_TEMPLATE(linux, wrap_sys_shmat);
    327 DECL_TEMPLATE(linux, sys_shmget);
    328 DECL_TEMPLATE(linux, sys_shmdt);
    329 DECL_TEMPLATE(linux, sys_shmctl);
    330 /* Message queue */
    331 DECL_TEMPLATE(linux, sys_msgget);
    332 DECL_TEMPLATE(linux, sys_msgrcv);
    333 DECL_TEMPLATE(linux, sys_msgsnd);
    334 DECL_TEMPLATE(linux, sys_msgctl);
    335 
    336 /* Direct socket related syscalls. */
    337 DECL_TEMPLATE(linux, sys_socket);
    338 DECL_TEMPLATE(linux, sys_setsockopt);
    339 DECL_TEMPLATE(linux, sys_getsockopt);
    340 DECL_TEMPLATE(linux, sys_connect);
    341 DECL_TEMPLATE(linux, sys_accept);
    342 DECL_TEMPLATE(linux, sys_accept4);
    343 DECL_TEMPLATE(linux, sys_send);
    344 DECL_TEMPLATE(linux, sys_sendto);
    345 DECL_TEMPLATE(linux, sys_recv);
    346 DECL_TEMPLATE(linux, sys_recvfrom);
    347 DECL_TEMPLATE(linux, sys_sendmsg);
    348 DECL_TEMPLATE(linux, sys_recvmsg);
    349 DECL_TEMPLATE(linux, sys_shutdown);
    350 DECL_TEMPLATE(linux, sys_bind);
    351 DECL_TEMPLATE(linux, sys_listen);
    352 DECL_TEMPLATE(linux, sys_getsockname);
    353 DECL_TEMPLATE(linux, sys_getpeername);
    354 DECL_TEMPLATE(linux, sys_socketpair);
    355 
    356 
    357 #endif   // __PRIV_SYSWRAP_LINUX_H
    358 
    359 /*--------------------------------------------------------------------*/
    360 /*--- end                                                          ---*/
    361 /*--------------------------------------------------------------------*/
    362