Home | History | Annotate | Download | only in m_syswrap
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- Platform-specific syscalls stuff.    syswrap-mips32-linux.c ----*/
      4 /*--------------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2010-2012 RT-RK
     11       mips-valgrind (at) rt-rk.com
     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 #if defined(VGP_mips32_linux)
     32 #include "pub_core_basics.h"
     33 #include "pub_core_vki.h"
     34 #include "pub_core_vkiscnums.h"
     35 #include "pub_core_libcsetjmp.h"    // to keep _threadstate.h happy
     36 #include "pub_core_threadstate.h"
     37 #include "pub_core_aspacemgr.h"
     38 #include "pub_core_debuglog.h"
     39 #include "pub_core_libcbase.h"
     40 #include "pub_core_libcassert.h"
     41 #include "pub_core_libcprint.h"
     42 #include "pub_core_libcproc.h"
     43 #include "pub_core_libcsignal.h"
     44 #include "pub_core_options.h"
     45 #include "pub_core_scheduler.h"
     46 #include "pub_core_sigframe.h"     // For VG_(sigframe_destroy)()
     47 #include "pub_core_signals.h"
     48 #include "pub_core_syscall.h"
     49 #include "pub_core_syswrap.h"
     50 #include "pub_core_tooliface.h"
     51 #include "pub_core_stacks.h"        // VG_(register_stack)
     52 #include "pub_core_transtab.h"      // VG_(discard_translations)
     53 #include "priv_types_n_macros.h"
     54 #include "priv_syswrap-generic.h"   /* for decls of generic wrappers */
     55 #include "priv_syswrap-linux.h"     /* for decls of linux-ish wrappers */
     56 #include "priv_syswrap-main.h"
     57 
     58 #include "pub_core_debuginfo.h"     // VG_(di_notify_*)
     59 #include "pub_core_xarray.h"
     60 #include "pub_core_clientstate.h"   // VG_(brk_base), VG_(brk_limit)
     61 #include "pub_core_errormgr.h"
     62 #include "pub_tool_gdbserver.h"     // VG_(gdbserver)
     63 #include "pub_core_libcfile.h"
     64 #include "pub_core_machine.h"       // VG_(get_SP)
     65 #include "pub_core_mallocfree.h"
     66 #include "pub_core_stacktrace.h"    // For VG_(get_and_pp_StackTrace)()
     67 #include "pub_core_ume.h"
     68 
     69 #include "priv_syswrap-generic.h"
     70 
     71 #include "config.h"
     72 
     73 #include <errno.h>
     74 
     75 /* ---------------------------------------------------------------------
     76                              clone() handling
     77    ------------------------------------------------------------------ */
     78 /* Call f(arg1), but first switch stacks, using 'stack' as the new
     79    stack, and use 'retaddr' as f's return-to address.  Also, clear all
     80    the integer registers before entering f.*/
     81 
     82 __attribute__ ((noreturn))
     83 void ML_ (call_on_new_stack_0_1) (Addr stack, Addr retaddr,
     84                                   void (*f) (Word), Word arg1);
     85 //    a0 = stack
     86 //    a1 = retaddr
     87 //    a2 = f
     88 //    a3 = arg1
     89 asm (
     90 ".text\n"
     91 ".globl vgModuleLocal_call_on_new_stack_0_1\n"
     92 "vgModuleLocal_call_on_new_stack_0_1:\n"
     93 "   move	$29, $4\n\t"	// stack to %sp
     94 "   move	$25, $6\n\t"	// f to t9/$25
     95 "   move 	$4, $7\n\t"	// arg1 to $a0
     96 "   li 		$2, 0\n\t"	// zero all GP regs
     97 "   li 		$3, 0\n\t"
     98 "   li 		$5, 0\n\t"
     99 "   li 		$6, 0\n\t"
    100 "   li 		$7, 0\n\t"
    101 
    102 "   li 		$12, 0\n\t"
    103 "   li 		$13, 0\n\t"
    104 "   li 		$14, 0\n\t"
    105 "   li 		$15, 0\n\t"
    106 "   li 		$16, 0\n\t"
    107 "   li 		$17, 0\n\t"
    108 "   li 		$18, 0\n\t"
    109 "   li 		$19, 0\n\t"
    110 "   li 		$20, 0\n\t"
    111 "   li 		$21, 0\n\t"
    112 "   li 		$22, 0\n\t"
    113 "   li 		$23, 0\n\t"
    114 "   li 		$24, 0\n\t"
    115 "   jr 		$25\n\t"	// jump to dst
    116 "   break	0x7\n"	// should never get here
    117 ".previous\n"
    118 );
    119 
    120 /*
    121         Perform a clone system call.  clone is strange because it has
    122         fork()-like return-twice semantics, so it needs special
    123         handling here.
    124         Upon entry, we have:
    125             int (fn)(void*)     in  $a0       0
    126             void* child_stack   in  $a1       4
    127             int flags           in  $a2       8
    128             void* arg           in  $a3       12
    129             pid_t* child_tid    in  stack     16
    130             pid_t* parent_tid   in  stack     20
    131             void* tls_ptr       in  stack     24
    132 
    133         System call requires:
    134             int    $__NR_clone  in $v0
    135             int    flags        in $a0   0
    136             void*  child_stack  in $a1   4
    137             pid_t* parent_tid   in $a2   8
    138             void*  tls_ptr      in $a3   12
    139             pid_t* child_tid    in stack 16
    140 
    141    int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
    142              void *parent_tidptr, void *tls, void *child_tidptr)
    143 
    144    Returns an Int encoded in the linux-mips way, not a SysRes.
    145  */
    146 #define __NR_CLONE        VG_STRINGIFY(__NR_clone)
    147 #define __NR_EXIT         VG_STRINGIFY(__NR_exit)
    148 
    149 //extern
    150 UInt do_syscall_clone_mips_linux (Word (*fn) (void *), //a0      0     32
    151                                    void *stack,         //a1      4     36
    152                                    Int flags,           //a2      8     40
    153                                    void *arg,           //a3      12    44
    154                                    Int * child_tid,     //stack   16    48
    155                                    Int * parent_tid,    //stack   20    52
    156                                    Int tls);          //stack   24    56
    157 asm (
    158 ".text\n"
    159 "   .globl   do_syscall_clone_mips_linux\n"
    160 "   do_syscall_clone_mips_linux:\n"
    161 "   subu    $29,$29,32\n\t"
    162 "   sw $31, 0($29)\n\t"
    163 "   sw $2, 4($29)\n\t"
    164 "   sw $3, 8($29)\n\t"
    165 "   sw $30, 12($29)\n\t"
    166 "   sw $28, 28($29)\n\t"
    167     /* set up child stack with function and arg */
    168     /* syscall arg 2 child_stack is already in a1 */
    169 "   subu $5, $5, 32\n\t" /* make space on stack */
    170 "   sw $4, 0($5)\n\t" /* fn  */
    171 "   sw $7, 4($5)\n\t" /* fn arg */
    172 "   sw $6, 8($5)\n\t"
    173     /* get other args to clone */
    174 
    175 "   move $4, $a2\n\t" /* a0 = flags */
    176 "   lw $6,  52($29)\n\t" /* a2 = parent_tid */
    177 "   lw $7,  48($29)\n\t" /* a3 = child_tid */
    178 "   sw $7,  16($29)\n\t" /* 16(sp) = child_tid */
    179 "   lw $7,  56($29)\n\t" /* a3 = tls_ptr */
    180     /* do the system call */
    181 
    182 "   li $2, " __NR_CLONE "\n\t" /* __NR_clone */
    183 "   syscall\n\t"
    184 "   nop\n\t"
    185 
    186 "   bnez    $7, .Lerror\n\t"
    187 "   nop\n\t"
    188 "   beqz    $2, .Lstart\n\t"
    189 "   nop\n\t"
    190 
    191 "   lw      $31, 0($sp)\n\t"
    192 "   nop\n\t"
    193 "   lw      $30, 12($sp)\n\t"
    194 "   nop\n\t"
    195 "   addu    $29,$29,32\n\t" /* free stack */
    196 "   nop\n\t"
    197 "   jr      $31\n\t"
    198 "   nop\n\t"
    199 
    200 ".Lerror:\n\t"
    201 "   li      $31, 5\n\t"
    202 "   jr      $31\n\t"
    203 "   nop\n\t"
    204 
    205 ".Lstart:\n\t"
    206 "   lw      $4,  4($29)\n\t"
    207 "   nop\n\t"
    208 "   lw      $25, 0($29)\n\t"
    209 "   nop\n\t"
    210 "   jalr    $25\n\t"
    211 "   nop\n\t"
    212 
    213 "   move $4, $2\n\t" /* retval from fn is in $v0 */
    214 "   li $2, " __NR_EXIT "\n\t" /* NR_exit */
    215 "   syscall\n\t"
    216 "   nop\n\t"
    217 "   .previous\n"
    218 );
    219 
    220 #undef __NR_CLONE
    221 #undef __NR_EXIT
    222 
    223 // forward declarations
    224 
    225 static void setup_child (ThreadArchState *, ThreadArchState *);
    226 static SysRes sys_set_tls (ThreadId tid, Addr tlsptr);
    227 /*
    228    When a client clones, we need to keep track of the new thread.  This means:
    229    1. allocate a ThreadId+ThreadState+stack for the the thread
    230    2. initialize the thread's new VCPU state
    231    3. create the thread using the same args as the client requested,
    232    but using the scheduler entrypoint for IP, and a separate stack
    233    for SP.
    234  */
    235 
    236 static SysRes do_clone (ThreadId ptid,
    237                         UInt flags, Addr sp,
    238                         Int * parent_tidptr,
    239                         Int * child_tidptr,
    240                         Addr child_tls)
    241 {
    242    const Bool debug = False;
    243    ThreadId ctid = VG_ (alloc_ThreadState) ();
    244    ThreadState * ptst = VG_ (get_ThreadState) (ptid);
    245    ThreadState * ctst = VG_ (get_ThreadState) (ctid);
    246    UInt ret = 0;
    247    UWord * stack;
    248    NSegment const *seg;
    249    SysRes res;
    250    vki_sigset_t blockall, savedmask;
    251 
    252    VG_ (sigfillset) (&blockall);
    253    vg_assert (VG_ (is_running_thread) (ptid));
    254    vg_assert (VG_ (is_valid_tid) (ctid));
    255    stack = (UWord *) ML_ (allocstack) (ctid);
    256    if (stack == NULL) {
    257       res = VG_ (mk_SysRes_Error) (VKI_ENOMEM);
    258       goto out;
    259    }
    260    setup_child (&ctst->arch, &ptst->arch);
    261 
    262    /* on MIPS we need to set V0 and A3 to zero */
    263    ctst->arch.vex.guest_r2 = 0;
    264    ctst->arch.vex.guest_r7 = 0;
    265    if (sp != 0)
    266       ctst->arch.vex.guest_r29 = sp;
    267 
    268    ctst->os_state.parent = ptid;
    269    ctst->sig_mask = ptst->sig_mask;
    270    ctst->tmp_sig_mask = ptst->sig_mask;
    271 
    272    /* Start the child with its threadgroup being the same as the
    273       parent's.  This is so that any exit_group calls that happen
    274       after the child is created but before it sets its
    275       os_state.threadgroup field for real (in thread_wrapper in
    276       syswrap-linux.c), really kill the new thread.  a.k.a this avoids
    277       a race condition in which the thread is unkillable (via
    278       exit_group) because its threadgroup is not set.  The race window
    279       is probably only a few hundred or a few thousand cycles long.
    280       See #226116. */
    281 
    282    ctst->os_state.threadgroup = ptst->os_state.threadgroup;
    283    seg = VG_ (am_find_nsegment) ((Addr) sp);
    284 
    285    if (seg && seg->kind != SkResvn) {
    286       ctst->client_stack_highest_word = (Addr) VG_PGROUNDUP (sp);
    287       ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
    288       VG_ (register_stack) (seg->start, ctst->client_stack_highest_word);
    289       if (debug)
    290          VG_ (printf) ("tid %d: guessed client stack range %#lx-%#lx\n",
    291 
    292       ctid, seg->start, VG_PGROUNDUP (sp));
    293    } else {
    294       VG_ (message) (Vg_UserMsg,
    295                      "!? New thread %d starts with sp+%#lx) unmapped\n",
    296                      ctid, sp);
    297       ctst->client_stack_szB = 0;
    298    }
    299 
    300    VG_TRACK (pre_thread_ll_create, ptid, ctid);
    301    if (flags & VKI_CLONE_SETTLS) {
    302       if (debug)
    303         VG_(printf)("clone child has SETTLS: tls at %#lx\n", child_tls);
    304       ctst->arch.vex.guest_r27 = child_tls;
    305       res = sys_set_tls(ctid, child_tls);
    306       if (sr_isError(res))
    307          goto out;
    308       ctst->arch.vex.guest_r27 = child_tls;
    309   }
    310 
    311    flags &= ~VKI_CLONE_SETTLS;
    312    VG_ (sigprocmask) (VKI_SIG_SETMASK, &blockall, &savedmask);
    313    /* Create the new thread */
    314    ret = do_syscall_clone_mips_linux (ML_ (start_thread_NORETURN),
    315                                     stack, flags, &VG_ (threads)[ctid],
    316                                     child_tidptr, parent_tidptr,
    317                                     0 /*child_tls*/);
    318 
    319    /* High half word64 is syscall return value.  Low half is
    320       the entire CR, from which we need to extract CR0.SO. */
    321    if (debug)
    322       VG_(printf)("ret: 0x%x\n", ret);
    323 
    324    res = VG_ (mk_SysRes_mips32_linux) (/*val */ ret, 0, /*errflag */ 0);
    325 
    326    VG_ (sigprocmask) (VKI_SIG_SETMASK, &savedmask, NULL);
    327 
    328    out:
    329    if (sr_isError (res)) {
    330       VG_(cleanup_thread) (&ctst->arch);
    331       ctst->status = VgTs_Empty;
    332       VG_TRACK (pre_thread_ll_exit, ctid);
    333    }
    334    ptst->arch.vex.guest_r2 = 0;
    335 
    336    return res;
    337 }
    338 
    339 /* ---------------------------------------------------------------------
    340    More thread stuff
    341    ------------------------------------------------------------------ */
    342 
    343 // MIPS doesn't have any architecture specific thread stuff that
    344 // needs to be cleaned up da li ????!!!!???
    345 void
    346 VG_ (cleanup_thread) (ThreadArchState * arch) { }
    347 
    348 void
    349 setup_child ( /*OUT*/ ThreadArchState * child,
    350               /*IN*/ ThreadArchState * parent)
    351 {
    352    /* We inherit our parent's guest state. */
    353    child->vex = parent->vex;
    354    child->vex_shadow1 = parent->vex_shadow1;
    355    child->vex_shadow2 = parent->vex_shadow2;
    356 }
    357 
    358 SysRes sys_set_tls ( ThreadId tid, Addr tlsptr )
    359 {
    360    VG_(threads)[tid].arch.vex.guest_ULR = tlsptr;
    361    return VG_(mk_SysRes_Success)( 0 );
    362 }
    363 
    364 /* ---------------------------------------------------------------------
    365    PRE/POST wrappers for mips/Linux-specific syscalls
    366    ------------------------------------------------------------------ */
    367 #define PRE(name)       DEFN_PRE_TEMPLATE(mips_linux, name)
    368 #define POST(name)      DEFN_POST_TEMPLATE(mips_linux, name)
    369 
    370 /* Add prototypes for the wrappers declared here, so that gcc doesn't
    371    harass us for not having prototypes.  Really this is a kludge --
    372    the right thing to do is to make these wrappers 'static' since they
    373    aren't visible outside this file, but that requires even more macro
    374    magic. */
    375 //DECL_TEMPLATE (mips_linux, sys_syscall);
    376 DECL_TEMPLATE (mips_linux, sys_socketcall);
    377 DECL_TEMPLATE (mips_linux, sys_socket);
    378 DECL_TEMPLATE (mips_linux, sys_setsockopt);
    379 DECL_TEMPLATE (mips_linux, sys_getsockopt);
    380 DECL_TEMPLATE (mips_linux, sys_connect);
    381 DECL_TEMPLATE (mips_linux, sys_accept);
    382 DECL_TEMPLATE (mips_linux, sys_sendto);
    383 DECL_TEMPLATE (mips_linux, sys_recvfrom);
    384 DECL_TEMPLATE (mips_linux, sys_ipc);
    385 DECL_TEMPLATE (mips_linux, sys_semget);
    386 DECL_TEMPLATE (mips_linux, sys_semop);
    387 DECL_TEMPLATE (mips_linux, sys_semctl);
    388 DECL_TEMPLATE (mips_linux, sys_semtimedop);
    389 DECL_TEMPLATE (mips_linux, sys_shmget);
    390 DECL_TEMPLATE (mips_linux, sys_shmdt);
    391 DECL_TEMPLATE (mips_linux, sys_shmctl);
    392 DECL_TEMPLATE (mips_linux, sys_sendmsg);
    393 DECL_TEMPLATE (mips_linux, sys_recvmsg);
    394 DECL_TEMPLATE (mips_linux, sys_msgget);
    395 DECL_TEMPLATE (mips_linux, sys_msgrcv);
    396 DECL_TEMPLATE (mips_linux, sys_msgsnd);
    397 DECL_TEMPLATE (mips_linux, sys_msgctl);
    398 DECL_TEMPLATE (mips_linux, sys_shutdown);
    399 DECL_TEMPLATE (mips_linux, sys_bind);
    400 DECL_TEMPLATE (mips_linux, sys_listen);
    401 DECL_TEMPLATE (mips_linux, sys_getsockname);
    402 DECL_TEMPLATE (mips_linux, sys_getpeername);
    403 DECL_TEMPLATE (mips_linux, sys_socketpair);
    404 DECL_TEMPLATE (mips_linux, sys_send);
    405 DECL_TEMPLATE (mips_linux, sys_recv);
    406 DECL_TEMPLATE (mips_linux, sys_mmap);
    407 DECL_TEMPLATE (mips_linux, sys_mmap2);
    408 DECL_TEMPLATE (mips_linux, sys_stat64);
    409 DECL_TEMPLATE (mips_linux, sys_lstat64);
    410 DECL_TEMPLATE (mips_linux, sys_fstatat64);
    411 DECL_TEMPLATE (mips_linux, sys_fstat64);
    412 DECL_TEMPLATE (mips_linux, sys_clone);
    413 DECL_TEMPLATE (mips_linux, sys_sigreturn);
    414 DECL_TEMPLATE (mips_linux, sys_rt_sigreturn);
    415 DECL_TEMPLATE (mips_linux, sys_cacheflush);
    416 DECL_TEMPLATE (mips_linux, sys_set_thread_area);
    417 DECL_TEMPLATE (mips_linux, sys_pipe);
    418 
    419 PRE (sys_socketcall)
    420 {
    421 #  define ARG2_0  (((UWord*)ARG2)[0])
    422 #  define ARG2_1  (((UWord*)ARG2)[1])
    423 #  define ARG2_2  (((UWord*)ARG2)[2])
    424 #  define ARG2_3  (((UWord*)ARG2)[3])
    425 #  define ARG2_4  (((UWord*)ARG2)[4])
    426 #  define ARG2_5  (((UWord*)ARG2)[5])
    427   *flags |= SfMayBlock;
    428   PRINT ("sys_socketcall ( %ld, %#lx )", ARG1, ARG2);
    429   PRE_REG_READ2 (long, "socketcall", int, call, unsigned long *, args);
    430   switch (ARG1 /* request */ )
    431     {
    432       case VKI_SYS_SOCKETPAIR:
    433         /* int socketpair(int d, int type, int protocol, int sv[2]); */
    434         PRE_MEM_READ ("socketcall.socketpair(args)", ARG2,
    435                                                     4 * sizeof (Addr));
    436         ML_ (generic_PRE_sys_socketpair) (tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3);
    437         break;
    438       case VKI_SYS_SOCKET:
    439         /* int socket(int domain, int type, int protocol); */
    440         PRE_MEM_READ ("socketcall.socket(args)", ARG2, 3 * sizeof (Addr));
    441         break;
    442       case VKI_SYS_BIND:
    443         /* int bind(int sockfd, struct sockaddr *my_addr,
    444            int addrlen); */
    445         PRE_MEM_READ ("socketcall.bind(args)", ARG2, 3 * sizeof (Addr));
    446         ML_ (generic_PRE_sys_bind) (tid, ARG2_0, ARG2_1, ARG2_2);
    447         break;
    448       case VKI_SYS_LISTEN:
    449         /* int listen(int s, int backlog); */
    450         PRE_MEM_READ ("socketcall.listen(args)", ARG2, 2 * sizeof (Addr));
    451         break;
    452       case VKI_SYS_ACCEPT:
    453         {
    454           /* int accept(int s, struct sockaddr *addr, int *addrlen); */
    455           PRE_MEM_READ ("socketcall.accept(args)", ARG2, 3 * sizeof (Addr));
    456           ML_ (generic_PRE_sys_accept) (tid, ARG2_0, ARG2_1, ARG2_2);
    457         break;
    458         }
    459       case VKI_SYS_SENDTO:
    460         /* int sendto(int s, const void *msg, int len,
    461            unsigned int flags,
    462            const struct sockaddr *to, int tolen); */
    463         PRE_MEM_READ ("socketcall.sendto(args)", ARG2, 6 * sizeof (Addr));
    464         ML_ (generic_PRE_sys_sendto) (tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3,
    465                                       ARG2_4, ARG2_5);
    466         break;
    467       case VKI_SYS_SEND:
    468         /* int send(int s, const void *msg, size_t len, int flags); */
    469         PRE_MEM_READ ("socketcall.send(args)", ARG2, 4 * sizeof (Addr));
    470         ML_ (generic_PRE_sys_send) (tid, ARG2_0, ARG2_1, ARG2_2);
    471         break;
    472       case VKI_SYS_RECVFROM:
    473         /* int recvfrom(int s, void *buf, int len, unsigned int flags,
    474            struct sockaddr *from, int *fromlen); */
    475         PRE_MEM_READ ("socketcall.recvfrom(args)", ARG2, 6 * sizeof (Addr));
    476         ML_ (generic_PRE_sys_recvfrom) (tid, ARG2_0, ARG2_1, ARG2_2,
    477                                         ARG2_3, ARG2_4, ARG2_5);
    478         break;
    479       case VKI_SYS_RECV:
    480         /* int recv(int s, void *buf, int len, unsigned int flags); */
    481         /* man 2 recv says:
    482            The  recv call is normally used only on a connected socket
    483            (see connect(2)) and is identical to recvfrom with a  NULL
    484            from parameter.
    485         */
    486         PRE_MEM_READ ("socketcall.recv(args)", ARG2, 4 * sizeof (Addr));
    487         ML_ (generic_PRE_sys_recv) (tid, ARG2_0, ARG2_1, ARG2_2);
    488         break;
    489       case VKI_SYS_CONNECT:
    490         /* int connect(int sockfd,
    491            struct sockaddr *serv_addr, int addrlen ); */
    492         PRE_MEM_READ ("socketcall.connect(args)", ARG2, 3 * sizeof (Addr));
    493         ML_ (generic_PRE_sys_connect) (tid, ARG2_0, ARG2_1, ARG2_2);
    494         break;
    495       case VKI_SYS_SETSOCKOPT:
    496         /* int setsockopt(int s, int level, int optname,
    497            const void *optval, int optlen); */
    498         PRE_MEM_READ ("socketcall.setsockopt(args)", ARG2, 5 * sizeof (Addr));
    499         ML_ (generic_PRE_sys_setsockopt) (tid, ARG2_0, ARG2_1, ARG2_2,
    500                                           ARG2_3, ARG2_4);
    501         break;
    502       case VKI_SYS_GETSOCKOPT:
    503         /* int getsockopt(int s, int level, int optname,
    504            void *optval, socklen_t *optlen); */
    505         PRE_MEM_READ ("socketcall.getsockopt(args)", ARG2, 5 * sizeof (Addr));
    506         ML_ (linux_PRE_sys_getsockopt) (tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3, ARG2_4);
    507         break;
    508       case VKI_SYS_GETSOCKNAME:
    509         /* int getsockname(int s, struct sockaddr* name, int* namelen) */
    510         PRE_MEM_READ ("socketcall.getsockname(args)", ARG2, 3 * sizeof (Addr));
    511         ML_ (generic_PRE_sys_getsockname) (tid, ARG2_0, ARG2_1, ARG2_2);
    512         break;
    513       case VKI_SYS_GETPEERNAME:
    514         /* int getpeername(int s, struct sockaddr* name, int* namelen) */
    515         PRE_MEM_READ ("socketcall.getpeername(args)", ARG2, 3 * sizeof (Addr));
    516         ML_ (generic_PRE_sys_getpeername) (tid, ARG2_0, ARG2_1, ARG2_2);
    517         break;
    518       case VKI_SYS_SHUTDOWN:
    519         /* int shutdown(int s, int how); */
    520         PRE_MEM_READ ("socketcall.shutdown(args)", ARG2, 2 * sizeof (Addr));
    521         break;
    522       case VKI_SYS_SENDMSG:
    523         {
    524           /* int sendmsg(int s, const struct msghdr *msg, int flags); */
    525           /* this causes warnings, and I don't get why. glibc bug?
    526            * (after all it's glibc providing the arguments array)
    527              PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
    528           */
    529           ML_ (generic_PRE_sys_sendmsg) (tid, (UChar *)ARG2_0, (struct vki_msghdr *)ARG2_1);
    530           break;
    531         }
    532       case VKI_SYS_RECVMSG:
    533         {
    534           /* int recvmsg(int s, struct msghdr *msg, int flags); */
    535           /* this causes warnings, and I don't get why. glibc bug?
    536            * (after all it's glibc providing the arguments array)
    537              PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
    538            */
    539           ML_ (generic_PRE_sys_recvmsg) (tid, (UChar *)ARG2_0,
    540                                          (struct vki_msghdr *)ARG2_1);
    541           break;
    542         }
    543       default:
    544         VG_ (message) (Vg_DebugMsg, "Warning: unhandled socketcall 0x%lx", ARG1);
    545         SET_STATUS_Failure (VKI_EINVAL);
    546         break;
    547   }
    548 #  undef ARG2_0
    549 #  undef ARG2_1
    550 #  undef ARG2_2
    551 #  undef ARG2_3
    552 #  undef ARG2_4
    553 #  undef ARG2_5
    554 }
    555 
    556 POST (sys_socketcall)
    557 {
    558 #  define ARG2_0  (((UWord*)ARG2)[0])
    559 #  define ARG2_1  (((UWord*)ARG2)[1])
    560 #  define ARG2_2  (((UWord*)ARG2)[2])
    561 #  define ARG2_3  (((UWord*)ARG2)[3])
    562 #  define ARG2_4  (((UWord*)ARG2)[4])
    563 #  define ARG2_5  (((UWord*)ARG2)[5])
    564   SysRes r;
    565   vg_assert (SUCCESS);
    566   switch (ARG1 /* request */ )
    567     {
    568       case VKI_SYS_SOCKETPAIR:
    569         r = ML_ (generic_POST_sys_socketpair) ( tid,
    570                                                 VG_ (mk_SysRes_Success) (RES),
    571                                                 ARG2_0, ARG2_1, ARG2_2, ARG2_3);
    572         SET_STATUS_from_SysRes (r);
    573         break;
    574       case VKI_SYS_SOCKET:
    575         r = ML_ (generic_POST_sys_socket) (tid, VG_ (mk_SysRes_Success) (RES));
    576         SET_STATUS_from_SysRes (r);
    577         break;
    578       case VKI_SYS_BIND:
    579         /* int bind(int sockfd, struct sockaddr *my_addr, int addrlen); */
    580         break;
    581       case VKI_SYS_LISTEN:
    582         /* int listen(int s, int backlog); */
    583         break;
    584       case VKI_SYS_ACCEPT:
    585         /* int accept(int s, struct sockaddr *addr, int *addrlen); */
    586         r = ML_ (generic_POST_sys_accept) (tid, VG_ (mk_SysRes_Success) (RES),
    587                                            ARG2_0, ARG2_1, ARG2_2);
    588         SET_STATUS_from_SysRes (r);
    589         break;
    590       case VKI_SYS_SENDTO:
    591         break;
    592       case VKI_SYS_SEND:
    593         break;
    594       case VKI_SYS_RECVFROM:
    595         ML_ (generic_POST_sys_recvfrom) (tid, VG_ (mk_SysRes_Success) (RES),
    596                                          ARG2_0, ARG2_1, ARG2_2, ARG2_3,
    597                                          ARG2_4, ARG2_5);
    598         break;
    599       case VKI_SYS_RECV:
    600         ML_ (generic_POST_sys_recv) (tid, RES, ARG2_0, ARG2_1, ARG2_2);
    601         break;
    602       case VKI_SYS_CONNECT:
    603         break;
    604       case VKI_SYS_SETSOCKOPT:
    605         break;
    606       case VKI_SYS_GETSOCKOPT:
    607         ML_ (linux_POST_sys_getsockopt) (tid, VG_ (mk_SysRes_Success) (RES),
    608                                          ARG2_0, ARG2_1, ARG2_2,
    609                                          ARG2_3, ARG2_4);
    610         break;
    611       case VKI_SYS_GETSOCKNAME:
    612         ML_ (generic_POST_sys_getsockname) (tid, VG_ (mk_SysRes_Success) (RES),
    613                                             ARG2_0, ARG2_1, ARG2_2);
    614         break;
    615       case VKI_SYS_GETPEERNAME:
    616         ML_ (generic_POST_sys_getpeername) (tid, VG_ (mk_SysRes_Success) (RES),
    617                                             ARG2_0, ARG2_1, ARG2_2);
    618         break;
    619       case VKI_SYS_SHUTDOWN:
    620         break;
    621       case VKI_SYS_SENDMSG:
    622         break;
    623       case VKI_SYS_RECVMSG:
    624         ML_(generic_PRE_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
    625         break;
    626       default:
    627         VG_ (message) (Vg_DebugMsg, "FATAL: unhandled socketcall 0x%lx", ARG1);
    628         VG_ (core_panic) ("... bye!\n");
    629         break;
    630         /*NOTREACHED*/
    631     }
    632 #  undef ARG2_0
    633 #  undef ARG2_1
    634 #  undef ARG2_2
    635 #  undef ARG2_3
    636 #  undef ARG2_4
    637 #  undef ARG2_5
    638 }
    639 
    640 PRE (sys_socket)
    641 {
    642   PRINT ("sys_socket ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
    643   PRE_REG_READ3 (long, "socket", int, domain, int, type, int, protocol);
    644 }
    645 
    646 POST (sys_socket)
    647 {
    648   SysRes r;
    649   vg_assert (SUCCESS);
    650   r = ML_ (generic_POST_sys_socket) (tid, VG_ (mk_SysRes_Success) (RES));
    651   SET_STATUS_from_SysRes (r);
    652 }
    653 
    654 PRE (sys_setsockopt)
    655 {
    656   PRINT ("sys_setsockopt ( %ld, %ld, %ld, %#lx, %ld )", ARG1, ARG2, ARG3,
    657                                                         ARG4, ARG5);
    658   PRE_REG_READ5 (long, "setsockopt", int, s, int, level, int, optname,
    659                  const void *, optval, int, optlen);
    660   ML_ (generic_PRE_sys_setsockopt) (tid, ARG1, ARG2, ARG3, ARG4, ARG5);
    661 }
    662 
    663 PRE (sys_getsockopt)
    664 {
    665   PRINT ("sys_getsockopt ( %ld, %ld, %ld, %#lx, %#lx )", ARG1, ARG2, ARG3,
    666                                                          ARG4, ARG5);
    667   PRE_REG_READ5 (long, "getsockopt", int, s, int, level, int, optname,
    668                  void *, optval, int, *optlen);
    669   ML_ (linux_PRE_sys_getsockopt) (tid, ARG1, ARG2, ARG3, ARG4, ARG5);
    670 }
    671 
    672 POST (sys_getsockopt)
    673 {
    674   vg_assert (SUCCESS);
    675   ML_ (linux_POST_sys_getsockopt) (tid, VG_ (mk_SysRes_Success) (RES),
    676                                    ARG1, ARG2, ARG3, ARG4, ARG5);
    677 }
    678 
    679 PRE(sys_connect)
    680 {
    681    *flags |= SfMayBlock;
    682    PRINT("sys_connect ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
    683    PRE_REG_READ3(long, "connect",
    684                  int, sockfd, struct sockaddr *, serv_addr, int, addrlen);
    685    ML_(generic_PRE_sys_connect)(tid, ARG1,ARG2,ARG3);
    686 }
    687 
    688 PRE (sys_accept)
    689 {
    690   *flags |= SfMayBlock;
    691   PRINT ("sys_accept ( %ld, %#lx, %ld )", ARG1, ARG2, ARG3);
    692   PRE_REG_READ3 (long, "accept",  int, s, struct sockaddr *, addr, int,
    693                  *addrlen);
    694   ML_ (generic_PRE_sys_accept) (tid, ARG1, ARG2, ARG3);
    695 }
    696 
    697 POST (sys_accept)
    698 {
    699   SysRes r;
    700   vg_assert (SUCCESS);
    701   r =
    702     ML_ (generic_POST_sys_accept) (tid, VG_ (mk_SysRes_Success) (RES),
    703                                    ARG1, ARG2, ARG3);
    704   SET_STATUS_from_SysRes (r);
    705 }
    706 
    707 PRE (sys_sendto)
    708 {
    709   *flags |= SfMayBlock;
    710   PRINT ("sys_sendto ( %ld, %#lx, %ld, %lu, %#lx, %ld )", ARG1, ARG2, ARG3,
    711                                                           ARG4, ARG5, ARG6);
    712   PRE_REG_READ6 (long, "sendto", int, s, const void *, msg, int, len,
    713                  unsigned int, flags, const struct sockaddr *, to, int,
    714                  tolen);
    715   ML_ (generic_PRE_sys_sendto) (tid, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
    716 }
    717 
    718 PRE (sys_recvfrom)
    719 {
    720   *flags |= SfMayBlock;
    721   PRINT ("sys_recvfrom ( %ld, %#lx, %ld, %lu, %#lx, %#lx )", ARG1, ARG2,
    722                                                 ARG3, ARG4, ARG5, ARG6);
    723   PRE_REG_READ6 (long, "recvfrom", int, s, void *, buf, int, len,
    724                  unsigned int, flags,
    725   struct sockaddr *, from, int *, fromlen);
    726   ML_ (generic_PRE_sys_recvfrom) (tid, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
    727 }
    728 
    729 POST (sys_recvfrom)
    730 {
    731   vg_assert (SUCCESS);
    732   ML_ (generic_POST_sys_recvfrom) (tid, VG_ (mk_SysRes_Success) (RES),
    733                                    ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
    734 }
    735 
    736 PRE(sys_sendmsg)
    737 {
    738    *flags |= SfMayBlock;
    739    PRINT("sys_sendmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
    740    PRE_REG_READ3(long, "sendmsg",
    741                  int, s, const struct msghdr *, msg, int, flags);
    742    ML_(generic_PRE_sys_sendmsg)(tid, "msg", (struct vki_msghdr *)ARG2);
    743 }
    744 
    745 PRE(sys_recvmsg)
    746 {
    747    *flags |= SfMayBlock;
    748    PRINT("sys_recvmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
    749    PRE_REG_READ3(long, "recvmsg", int, s, struct msghdr *, msg, int, flags);
    750    ML_(generic_PRE_sys_recvmsg)(tid, "msg", (struct vki_msghdr *)ARG2);
    751 }
    752 POST(sys_recvmsg)
    753 {
    754    ML_(generic_POST_sys_recvmsg)(tid, "msg", (struct vki_msghdr *)ARG2, RES);
    755 }
    756 
    757 PRE (sys_semget)
    758 {
    759   PRINT ("sys_semget ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
    760   PRE_REG_READ3 (long, "semget", vki_key_t, key, int, nsems, int, semflg);
    761 }
    762 
    763 PRE (sys_semop)
    764 {
    765   *flags |= SfMayBlock;
    766   PRINT ("sys_semop ( %ld, %#lx, %lu )", ARG1, ARG2, ARG3);
    767   PRE_REG_READ3 (long, "semop", int, semid, struct sembuf *, sops,
    768                  unsigned, nsoops);
    769   ML_ (generic_PRE_sys_semop) (tid, ARG1, ARG2, ARG3);
    770 }
    771 
    772 PRE (sys_semctl)
    773 {
    774   switch (ARG3 & ~VKI_IPC_64)
    775     {
    776       case VKI_IPC_INFO:
    777       case VKI_SEM_INFO:
    778         PRINT ("sys_semctl ( %ld, %ld, %ld, %#lx )", ARG1, ARG2, ARG3, ARG4);
    779                                              PRE_REG_READ4 (long, "semctl",
    780                                         int, semid, int, semnum, int, cmd,
    781                                                 struct seminfo *, arg);
    782       break;
    783       case VKI_IPC_STAT:
    784       case VKI_SEM_STAT:
    785       case VKI_IPC_SET:
    786         PRINT ("sys_semctl ( %ld, %ld, %ld, %#lx )", ARG1, ARG2, ARG3, ARG4);
    787         PRE_REG_READ4 (long, "semctl", int, semid, int, semnum, int, cmd,
    788                        struct semid_ds *, arg);
    789       break;
    790       case VKI_GETALL:
    791       case VKI_SETALL:
    792         PRINT ("sys_semctl ( %ld, %ld, %ld, %#lx )", ARG1, ARG2, ARG3, ARG4);
    793         PRE_REG_READ4 (long, "semctl", int, semid, int, semnum, int, cmd,
    794                        unsigned short *, arg);
    795       break;
    796       default:
    797         PRINT ("sys_semctl ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
    798         PRE_REG_READ3 (long, "semctl", int, semid, int, semnum, int, cmd);
    799         break;
    800     }
    801   ML_ (generic_PRE_sys_semctl) (tid, ARG1, ARG2, ARG3, ARG4);
    802 }
    803 
    804 POST (sys_semctl)
    805 {
    806   ML_ (generic_POST_sys_semctl) (tid, RES, ARG1, ARG2, ARG3, ARG4);
    807 }
    808 
    809 PRE (sys_semtimedop)
    810 {
    811   *flags |= SfMayBlock;
    812   PRINT ("sys_semtimedop ( %ld, %#lx, %lu, %#lx )", ARG1, ARG2, ARG3, ARG4);
    813   PRE_REG_READ4 (long, "semtimedop", int, semid, struct sembuf *, sops,
    814                  unsigned, nsoops,
    815   struct timespec *, timeout);
    816   ML_ (generic_PRE_sys_semtimedop) (tid, ARG1, ARG2, ARG3, ARG4);
    817 }
    818 
    819 PRE (sys_msgget)
    820 {
    821   PRINT ("sys_msgget ( %ld, %ld )", ARG1, ARG2);
    822   PRE_REG_READ2 (long, "msgget", vki_key_t, key, int, msgflg);
    823 }
    824 
    825 PRE (sys_msgsnd)
    826 {
    827   PRINT ("sys_msgsnd ( %ld, %#lx, %ld, %ld )", ARG1, ARG2, ARG3, ARG4);
    828   PRE_REG_READ4 (long, "msgsnd", int, msqid, struct msgbuf *, msgp,
    829                  vki_size_t, msgsz, int, msgflg);
    830   ML_ (linux_PRE_sys_msgsnd) (tid, ARG1, ARG2, ARG3, ARG4);
    831   if ((ARG4 & VKI_IPC_NOWAIT) == 0)
    832     *flags |= SfMayBlock;
    833 }
    834 
    835 PRE (sys_msgrcv)
    836 {
    837   PRINT ("sys_msgrcv ( %ld, %#lx, %ld, %ld, %ld )", ARG1, ARG2, ARG3, ARG4,
    838                                                     ARG5);
    839   PRE_REG_READ5 (long, "msgrcv", int, msqid, struct msgbuf *, msgp,
    840                  vki_size_t, msgsz, long, msgytp, int, msgflg);
    841   ML_ (linux_PRE_sys_msgrcv) (tid, ARG1, ARG2, ARG3, ARG4, ARG5);
    842   if ((ARG4 & VKI_IPC_NOWAIT) == 0)
    843     *flags |= SfMayBlock;
    844 }
    845 
    846 POST (sys_msgrcv)
    847 {
    848   ML_ (linux_POST_sys_msgrcv) (tid, RES, ARG1, ARG2, ARG3, ARG4, ARG5);
    849 }
    850 
    851 PRE (sys_msgctl)
    852 {
    853   PRINT ("sys_msgctl ( %ld, %ld, %#lx )", ARG1, ARG2, ARG3);
    854   PRE_REG_READ3 (long, "msgctl", int, msqid, int, cmd, struct msqid_ds *, buf);
    855   ML_ (linux_PRE_sys_msgctl) (tid, ARG1, ARG2, ARG3);
    856 }
    857 
    858 POST (sys_msgctl)
    859 {
    860   ML_ (linux_POST_sys_msgctl) (tid, RES, ARG1, ARG2, ARG3);
    861 }
    862 
    863 PRE (sys_shmget)
    864 {
    865   PRINT ("sys_shmget ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
    866   PRE_REG_READ3 (long, "shmget", vki_key_t, key, vki_size_t, size, int,
    867                  shmflg);
    868 }
    869 
    870 PRE (sys_shmdt)
    871 {
    872   PRINT ("sys_shmdt ( %#lx )", ARG1);
    873   PRE_REG_READ1 (long, "shmdt", const void *, shmaddr);
    874   if (!ML_ (generic_PRE_sys_shmdt) (tid, ARG1))
    875     SET_STATUS_Failure (VKI_EINVAL);
    876 }
    877 
    878 POST (sys_shmdt)
    879 
    880 {
    881   ML_ (generic_POST_sys_shmdt) (tid, RES, ARG1);
    882 }
    883 
    884 PRE (sys_shmctl)
    885 {
    886   PRINT ("sys_shmctl ( %ld, %ld, %#lx )", ARG1, ARG2, ARG3);
    887   PRE_REG_READ3 (long, "shmctl", int, shmid, int, cmd, struct shmid_ds *, buf);
    888   ML_ (generic_PRE_sys_shmctl) (tid, ARG1, ARG2, ARG3);
    889 }
    890 
    891 POST (sys_shmctl)
    892 {
    893   ML_ (generic_POST_sys_shmctl) (tid, RES, ARG1, ARG2, ARG3);
    894 }
    895 
    896 PRE (sys_shutdown)
    897 {
    898   *flags |= SfMayBlock;
    899   PRINT ("sys_shutdown ( %ld, %ld )", ARG1, ARG2);
    900   PRE_REG_READ2 (int, "shutdown", int, s, int, how);
    901 }
    902 
    903 PRE (sys_bind)
    904 {
    905   PRINT ("sys_bind ( %ld, %#lx, %ld )", ARG1, ARG2, ARG3);
    906   PRE_REG_READ3 (long, "bind", int, sockfd, struct sockaddr *, my_addr,
    907                  int, addrlen);
    908   ML_ (generic_PRE_sys_bind) (tid, ARG1, ARG2, ARG3);
    909 }
    910 
    911 PRE (sys_listen)
    912 {
    913   PRINT ("sys_listen ( %ld, %ld )", ARG1, ARG2);
    914   PRE_REG_READ2 (long, "listen", int, s, int, backlog);
    915 }
    916 
    917 PRE (sys_getsockname)
    918 {
    919   PRINT ("sys_getsockname ( %ld, %#lx, %#lx )", ARG1, ARG2, ARG3);
    920   PRE_REG_READ3 (long, "getsockname", int, s, struct sockaddr *, name,
    921                  int *, namelen);
    922   ML_ (generic_PRE_sys_getsockname) (tid, ARG1, ARG2, ARG3);
    923 }
    924 
    925 POST (sys_getsockname)
    926 {
    927   vg_assert (SUCCESS);
    928   ML_ (generic_POST_sys_getsockname) (tid, VG_ (mk_SysRes_Success) (RES),
    929                                       ARG1, ARG2, ARG3);
    930 }
    931 
    932 PRE (sys_getpeername)
    933 {
    934   PRINT ("sys_getpeername ( %ld, %#lx, %#lx )", ARG1, ARG2, ARG3);
    935   PRE_REG_READ3 (long, "getpeername", int, s, struct sockaddr *, name,
    936                  int *, namelen);
    937   ML_ (generic_PRE_sys_getpeername) (tid, ARG1, ARG2, ARG3);
    938 }
    939 
    940 POST (sys_getpeername)
    941 {
    942   vg_assert (SUCCESS);
    943   ML_ (generic_POST_sys_getpeername) (tid, VG_ (mk_SysRes_Success) (RES),
    944                                       ARG1, ARG2, ARG3);
    945 }
    946 
    947 PRE (sys_socketpair)
    948 {
    949   PRINT ("sys_socketpair ( %ld, %ld, %ld, %#lx )", ARG1, ARG2, ARG3, ARG4);
    950   PRE_REG_READ4 (long, "socketpair", int, d, int, type, int,
    951                  protocol, int *, sv);
    952   ML_ (generic_PRE_sys_socketpair) (tid, ARG1, ARG2, ARG3, ARG4);
    953 }
    954 
    955 POST (sys_socketpair)
    956 {
    957   vg_assert (SUCCESS);
    958   ML_ (generic_POST_sys_socketpair) (tid, VG_ (mk_SysRes_Success) (RES),
    959                                      ARG1, ARG2, ARG3, ARG4);
    960 }
    961 
    962 PRE (sys_send)
    963 {
    964   *flags |= SfMayBlock;
    965   PRINT ("sys_send ( %ld, %#lx, %ld, %lu )", ARG1, ARG2, ARG3, ARG4);
    966   PRE_REG_READ4 (long, "send", int, s, const void *, msg, int, len,
    967                  unsigned int, flags);
    968   ML_ (generic_PRE_sys_send) (tid, ARG1, ARG2, ARG3);
    969 }
    970 
    971 PRE (sys_recv)
    972 {
    973   *flags |= SfMayBlock;
    974   PRINT ("sys_recv ( %ld, %#lx, %ld, %lu )", ARG1, ARG2, ARG3, ARG4);
    975   PRE_REG_READ4 (long, "recv", int, s, void *, buf, int, len,
    976                  unsigned int, flags);
    977   ML_ (generic_PRE_sys_recv) (tid, ARG1, ARG2, ARG3);
    978 }
    979 
    980 POST (sys_recv)
    981 {
    982   ML_ (generic_POST_sys_recv) (tid, RES, ARG1, ARG2, ARG3);
    983 }
    984 
    985 PRE (sys_mmap2)
    986 {
    987   SysRes r;
    988   // Exactly like old_mmap() except:
    989   //  - all 6 args are passed in regs, rather than in a memory-block.
    990   //  - the file offset is specified in pagesize units rather than bytes,
    991   //    so that it can be used for files bigger than 2^32 bytes.
    992   // pagesize or 4K-size units in offset?
    993   vg_assert (VKI_PAGE_SIZE == 4096 || VKI_PAGE_SIZE == 4096 * 4
    994              || VKI_PAGE_SIZE == 4096 * 16);
    995   PRINT ("sys_mmap2 ( %#lx, %llu, %ld, %ld, %ld, %ld )", ARG1, (ULong) ARG2,
    996                                                          ARG3, ARG4,
    997                                                          ARG5, ARG6);
    998   PRE_REG_READ6 (long, "mmap2", unsigned long, start, unsigned long, length,
    999                  unsigned long, prot, unsigned long, flags,
   1000                  unsigned long, fd, unsigned long, offset);
   1001   r =
   1002     ML_ (generic_PRE_sys_mmap) (tid, ARG1, ARG2, ARG3, ARG4, ARG5,
   1003                                 VKI_PAGE_SIZE * (Off64T) ARG6);
   1004   SET_STATUS_from_SysRes (r);
   1005 }
   1006 
   1007 PRE (sys_mmap)
   1008 {
   1009   SysRes r;
   1010   //vg_assert(VKI_PAGE_SIZE == 4096);
   1011   PRINT ("sys_mmap ( %#lx, %llu, %lu, %lu, %lu, %ld )", ARG1, (ULong) ARG2,
   1012                                                         ARG3, ARG4, ARG5, ARG6);
   1013   PRE_REG_READ6 (long, "mmap", unsigned long, start, vki_size_t, length,
   1014                  int, prot, int, flags, int, fd, unsigned long, offset);
   1015   r =
   1016     ML_ (generic_PRE_sys_mmap) (tid, ARG1, ARG2, ARG3, ARG4, ARG5,
   1017                                 (Off64T) ARG6);
   1018   SET_STATUS_from_SysRes (r);
   1019 }
   1020 
   1021 // XXX: lstat64/fstat64/stat64 are generic, but not necessarily
   1022 // applicable to every architecture -- I think only to 32-bit archs.
   1023 // We're going to need something like linux/core_os32.h for such
   1024 // things, eventually, I think.  --njn
   1025 
   1026 PRE (sys_lstat64)
   1027 {
   1028   PRINT ("sys_lstat64 ( %#lx(%s), %#lx )", ARG1, (char *) ARG1, ARG2);
   1029   PRE_REG_READ2 (long, "lstat64", char *, file_name, struct stat64 *, buf);
   1030   PRE_MEM_RASCIIZ ("lstat64(file_name)", ARG1);
   1031   PRE_MEM_WRITE ("lstat64(buf)", ARG2, sizeof (struct vki_stat64));
   1032 }
   1033 
   1034 POST (sys_lstat64)
   1035 {
   1036   vg_assert (SUCCESS);
   1037   if (RES == 0)
   1038     {
   1039       POST_MEM_WRITE (ARG2, sizeof (struct vki_stat64));
   1040     }
   1041 }
   1042 
   1043 PRE (sys_stat64)
   1044 {
   1045   PRINT ("sys_stat64 ( %#lx(%s), %#lx )", ARG1, (char *) ARG1, ARG2);
   1046   PRE_REG_READ2 (long, "stat64", char *, file_name, struct stat64 *, buf);
   1047   PRE_MEM_RASCIIZ ("stat64(file_name)", ARG1);
   1048   PRE_MEM_WRITE ("stat64(buf)", ARG2, sizeof (struct vki_stat64));
   1049 }
   1050 
   1051 POST (sys_stat64)
   1052 {
   1053   POST_MEM_WRITE (ARG2, sizeof (struct vki_stat64));
   1054 }
   1055 
   1056 PRE (sys_fstatat64)
   1057 {
   1058   PRINT ("sys_fstatat64 ( %ld, %#lx(%s), %#lx )", ARG1, ARG2, (char *) ARG2,
   1059                                                   ARG3);
   1060   PRE_REG_READ3 (long, "fstatat64", int, dfd, char *, file_name,
   1061                  struct stat64 *, buf);
   1062   PRE_MEM_RASCIIZ ("fstatat64(file_name)", ARG2);
   1063   PRE_MEM_WRITE ("fstatat64(buf)", ARG3, sizeof (struct vki_stat64));
   1064 }
   1065 
   1066 POST (sys_fstatat64)
   1067 {
   1068   POST_MEM_WRITE (ARG3, sizeof (struct vki_stat64));
   1069 }
   1070 
   1071 PRE (sys_fstat64)
   1072 {
   1073   PRINT ("sys_fstat64 ( %ld, %#lx )", ARG1, ARG2);
   1074   PRE_REG_READ2 (long, "fstat64", unsigned long, fd, struct stat64 *, buf);
   1075   PRE_MEM_WRITE ("fstat64(buf)", ARG2, sizeof (struct vki_stat64));
   1076 }
   1077 
   1078 POST (sys_fstat64)
   1079 {
   1080   POST_MEM_WRITE (ARG2, sizeof (struct vki_stat64));
   1081 }
   1082 
   1083 static Addr
   1084 deref_Addr (ThreadId tid, Addr a, Char * s)
   1085 {
   1086   Addr * a_p = (Addr *) a;
   1087   PRE_MEM_READ (s, (Addr) a_p, sizeof (Addr));
   1088   return *a_p;
   1089 }
   1090 
   1091 PRE (sys_ipc)
   1092 {
   1093   PRINT ("sys_ipc ( %ld, %ld, %ld, %ld, %#lx, %ld )", ARG1, ARG2, ARG3,
   1094                                                       ARG4, ARG5, ARG6);
   1095   // XXX: this is simplistic -- some args are not used in all circumstances.
   1096   PRE_REG_READ6 (int, "ipc", vki_uint, call, int, first, int, second, int,
   1097                  third, void *, ptr, long, fifth)
   1098   switch (ARG1 /* call */ )
   1099     {
   1100       case VKI_SEMOP:
   1101         ML_ (generic_PRE_sys_semop) (tid, ARG2, ARG5, ARG3);
   1102         *flags |= SfMayBlock;
   1103       break;
   1104       case VKI_SEMGET:
   1105       break;
   1106       case VKI_SEMCTL:
   1107         {
   1108           UWord arg = deref_Addr (tid, ARG5, "semctl(arg)");
   1109           ML_ (generic_PRE_sys_semctl) (tid, ARG2, ARG3, ARG4, arg);
   1110           break;
   1111         }
   1112       case VKI_SEMTIMEDOP:
   1113         ML_ (generic_PRE_sys_semtimedop) (tid, ARG2, ARG5, ARG3, ARG6);
   1114         *flags |= SfMayBlock;
   1115         break;
   1116       case VKI_MSGSND:
   1117         ML_ (linux_PRE_sys_msgsnd) (tid, ARG2, ARG5, ARG3, ARG4);
   1118         if ((ARG4 & VKI_IPC_NOWAIT) == 0)
   1119           *flags |= SfMayBlock;
   1120         break;
   1121       case VKI_MSGRCV:
   1122         {
   1123           Addr msgp;
   1124           Word msgtyp;
   1125           msgp = deref_Addr (tid,
   1126                             (Addr)(&((struct vki_ipc_kludge *)ARG5)->msgp),
   1127                             "msgrcv(msgp)");
   1128           msgtyp = deref_Addr (tid,
   1129                               (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
   1130                               "msgrcv(msgp)");
   1131           ML_ (linux_PRE_sys_msgrcv) (tid, ARG2, msgp, ARG3, msgtyp, ARG4);
   1132           if ((ARG4 & VKI_IPC_NOWAIT) == 0)
   1133             *flags |= SfMayBlock;
   1134             break;
   1135         }
   1136       case VKI_MSGGET:
   1137         break;
   1138       case VKI_MSGCTL:
   1139         ML_ (linux_PRE_sys_msgctl) (tid, ARG2, ARG3, ARG5);
   1140         break;
   1141       case VKI_SHMAT:
   1142         {
   1143           PRE_MEM_WRITE ("shmat(raddr)", ARG4, sizeof (Addr));
   1144           break;
   1145         }
   1146       case VKI_SHMDT:
   1147         if (!ML_ (generic_PRE_sys_shmdt) (tid, ARG5))
   1148           SET_STATUS_Failure (VKI_EINVAL);
   1149         break;
   1150       case VKI_SHMGET:
   1151         break;
   1152       case VKI_SHMCTL:		/* IPCOP_shmctl */
   1153         ML_ (generic_PRE_sys_shmctl) (tid, ARG2, ARG3, ARG5);
   1154         break;
   1155       default:
   1156         VG_ (message) (Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %ld\n",
   1157                        ARG1);
   1158         VG_ (core_panic) ("... bye!\n");
   1159         break;
   1160      /*NOTREACHED*/
   1161   }
   1162 }
   1163 
   1164 POST (sys_ipc)
   1165 {
   1166   vg_assert (SUCCESS);
   1167   switch (ARG1 /* call */ )
   1168     {
   1169       case VKI_SEMOP:
   1170       case VKI_SEMGET:
   1171       break;
   1172       case VKI_SEMCTL:
   1173       {
   1174         UWord arg = deref_Addr (tid, ARG5, "semctl(arg)");
   1175         ML_ (generic_PRE_sys_semctl) (tid, ARG2, ARG3, ARG4, arg);
   1176         break;
   1177       }
   1178       case VKI_SEMTIMEDOP:
   1179       case VKI_MSGSND:
   1180       break;
   1181       case VKI_MSGRCV:
   1182         {
   1183           Addr msgp;
   1184           Word msgtyp;
   1185           msgp = deref_Addr (tid, (Addr) (&((struct vki_ipc_kludge *)
   1186                              ARG5)->msgp),
   1187           "msgrcv(msgp)");
   1188           msgtyp = deref_Addr (tid,
   1189                            (Addr) (&((struct vki_ipc_kludge *) ARG5)->msgtyp),
   1190                            "msgrcv(msgp)");
   1191           ML_ (linux_POST_sys_msgrcv)(tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4);
   1192           break;
   1193         }
   1194       case VKI_MSGGET:
   1195       break;
   1196       case VKI_MSGCTL:
   1197         ML_ (linux_POST_sys_msgctl) (tid, RES, ARG2, ARG3, ARG5);
   1198       break;
   1199       case VKI_SHMAT:
   1200         {
   1201           Addr addr;
   1202           /* force readability. before the syscall it is
   1203            * indeed uninitialized, as can be seen in
   1204            * glibc/sysdeps/unix/sysv/linux/shmat.c */
   1205           POST_MEM_WRITE (ARG4, sizeof (Addr));
   1206           addr = deref_Addr (tid, ARG4, "shmat(addr)");
   1207           ML_ (generic_POST_sys_shmat) (tid, addr, ARG2, ARG5, ARG3);
   1208           break;
   1209         }
   1210       case VKI_SHMDT:
   1211         ML_ (generic_POST_sys_shmdt) (tid, RES, ARG5);
   1212       break;
   1213       case VKI_SHMGET:
   1214       break;
   1215       case VKI_SHMCTL:
   1216         ML_ (generic_POST_sys_shmctl) (tid, RES, ARG2, ARG3, ARG5);
   1217       break;
   1218       default:
   1219         VG_ (message) (Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %ld\n",
   1220                        ARG1);
   1221         VG_ (core_panic) ("... bye!\n");
   1222       break;
   1223      /*NOTREACHED*/
   1224   }
   1225 }
   1226 
   1227 PRE (sys_clone)
   1228   {
   1229     Bool badarg = False;
   1230     UInt cloneflags;
   1231     PRINT ("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )", ARG1, ARG2, ARG3,
   1232                                                         ARG4, ARG5);
   1233     PRE_REG_READ2 (int, "clone", unsigned long, flags,  void *, child_stack);
   1234     if (ARG1 & VKI_CLONE_PARENT_SETTID)
   1235       {
   1236         if (VG_ (tdict).track_pre_reg_read)
   1237           {
   1238             PRA3 ("clone", int *, parent_tidptr);
   1239           }
   1240         PRE_MEM_WRITE ("clone(parent_tidptr)", ARG3, sizeof (Int));
   1241         if (!VG_ (am_is_valid_for_client)(ARG3, sizeof (Int), VKI_PROT_WRITE))
   1242         {
   1243           badarg = True;
   1244         }
   1245       }
   1246     if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
   1247       {
   1248         if (VG_ (tdict).track_pre_reg_read)
   1249           {
   1250             PRA5 ("clone", int *, child_tidptr);
   1251           }
   1252         PRE_MEM_WRITE ("clone(child_tidptr)", ARG5, sizeof (Int));
   1253         if (!VG_ (am_is_valid_for_client)(ARG5, sizeof (Int), VKI_PROT_WRITE))
   1254           {
   1255             badarg = True;
   1256           }
   1257       }
   1258     if (badarg)
   1259       {
   1260         SET_STATUS_Failure (VKI_EFAULT);
   1261         return;
   1262       }
   1263     cloneflags = ARG1;
   1264     if (!ML_ (client_signal_OK) (ARG1 & VKI_CSIGNAL))
   1265       {
   1266         SET_STATUS_Failure (VKI_EINVAL);
   1267         return;
   1268       }
   1269     /* Only look at the flags we really care about */
   1270     switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
   1271            |VKI_CLONE_FILES | VKI_CLONE_VFORK))
   1272       {
   1273         case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
   1274         /* thread creation */
   1275         PRINT ("sys_clone1 ( %#lx, %#lx, %#lx, %#lx, %#lx )",
   1276                ARG1, ARG2, ARG3, ARG4, ARG5);
   1277         SET_STATUS_from_SysRes (do_clone (tid,
   1278                                           ARG1, /* flags */
   1279                                           (Addr) ARG2, /* child SP */
   1280                                           (Int *) ARG3, /* parent_tidptr */
   1281                                           (Int *) ARG5, /* child_tidptr */
   1282                                           (Addr) ARG4));	/* child_tls */
   1283 
   1284         break;
   1285         case VKI_CLONE_VFORK | VKI_CLONE_VM:	/* vfork */
   1286           /* FALLTHROUGH - assume vfork == fork */
   1287           cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
   1288         case 0:  /* plain fork */
   1289           SET_STATUS_from_SysRes (ML_ (do_fork_clone) (tid,
   1290                                   cloneflags, /* flags */
   1291                                   (Int *) ARG3, /* parent_tidptr */
   1292                                   (Int *) ARG5));	/* child_tidptr */
   1293         break;
   1294         default:
   1295           /* should we just ENOSYS? */
   1296           VG_ (message) (Vg_UserMsg, "Unsupported clone() flags: 0x%lx\n", ARG1);
   1297           VG_ (message) (Vg_UserMsg, "\n");
   1298           VG_ (message) (Vg_UserMsg, "The only supported clone() uses are:\n");
   1299           VG_ (message) (Vg_UserMsg,
   1300                           " - via a threads library (LinuxThreads or NPTL)\n");
   1301           VG_ (message) (Vg_UserMsg,
   1302                           " - via the implementation of fork or vfork\n");
   1303           VG_ (unimplemented)("Valgrind does not support general clone().");
   1304     }
   1305     if (SUCCESS)
   1306       {
   1307         if (ARG1 & VKI_CLONE_PARENT_SETTID)
   1308           POST_MEM_WRITE (ARG3, sizeof (Int));
   1309         if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
   1310           POST_MEM_WRITE (ARG5, sizeof (Int));
   1311         /* Thread creation was successful; let the child have the chance
   1312          * to run */
   1313         *flags |= SfYieldAfter;
   1314       }
   1315 }
   1316 
   1317 PRE (sys_sigreturn)
   1318 {
   1319   ThreadState * tst;
   1320   PRINT ("sys_sigreturn ( )");
   1321   vg_assert (VG_ (is_valid_tid) (tid));
   1322   vg_assert (tid >= 1 && tid < VG_N_THREADS);
   1323   vg_assert (VG_ (is_running_thread) (tid));
   1324   tst = VG_ (get_ThreadState) (tid);
   1325   VG_ (sigframe_destroy) (tid, False);
   1326   /* Tell the driver not to update the guest state with the "result",
   1327      and set a bogus result to keep it happy. */
   1328   *flags |= SfNoWriteResult;
   1329   SET_STATUS_Success (0);
   1330    /* Check to see if any signals arose as a result of this. */
   1331   *flags |= SfPollAfter;
   1332 }
   1333 
   1334 PRE (sys_rt_sigreturn)
   1335 {
   1336   PRINT ("rt_sigreturn ( )");
   1337   vg_assert (VG_ (is_valid_tid) (tid));
   1338   vg_assert (tid >= 1 && tid < VG_N_THREADS);
   1339   vg_assert (VG_ (is_running_thread) (tid));
   1340   /* Restore register state from frame and remove it */
   1341   VG_ (sigframe_destroy) (tid, True);
   1342   /* Tell the driver not to update the guest state with the "result",
   1343      and set a bogus result to keep it happy. */
   1344   *flags |= SfNoWriteResult;
   1345   SET_STATUS_Success (0);
   1346   /* Check to see if any signals arose as a result of this. */
   1347   *flags |= SfPollAfter;
   1348 }
   1349 
   1350 PRE (sys_set_thread_area)
   1351 {
   1352    PRINT ("set_thread_area (%lx)", ARG1);
   1353    PRE_REG_READ1(long, "set_thread_area", unsigned long, addr);
   1354    SET_STATUS_from_SysRes( sys_set_tls( tid, ARG1 ) );
   1355 }
   1356 
   1357 /* Very much MIPS specific */
   1358 PRE (sys_cacheflush)
   1359 {
   1360   PRINT ("cacheflush (%lx, %#lx, %#lx)", ARG1, ARG2, ARG3);
   1361   PRE_REG_READ3 (long, "cacheflush", void *, addrlow, void *, addrhigh, int,
   1362                  flags);
   1363   VG_ (discard_translations) ((Addr64) ARG1, ((ULong) ARG2) - ((ULong) ARG1) +
   1364                               1ULL /*paranoia */ , "PRE(sys_cacheflush)");
   1365   SET_STATUS_Success (0);
   1366 }
   1367 
   1368 PRE(sys_pipe)
   1369 {
   1370    PRINT("sys_pipe ( %#lx )", ARG1);
   1371    PRE_REG_READ1(int, "pipe", int *, filedes);
   1372    PRE_MEM_WRITE( "pipe(filedes)", ARG1, 2*sizeof(int) );
   1373 }
   1374 
   1375 POST(sys_pipe)
   1376 {
   1377    Int p0, p1;
   1378    vg_assert(SUCCESS);
   1379    p0 = RES;
   1380    p1 = sr_ResEx(status->sres);
   1381 
   1382    if (!ML_(fd_allowed)(p0, "pipe", tid, True) ||
   1383        !ML_(fd_allowed)(p1, "pipe", tid, True)) {
   1384       VG_(close)(p0);
   1385       VG_(close)(p1);
   1386       SET_STATUS_Failure( VKI_EMFILE );
   1387    } else {
   1388       if (VG_(clo_track_fds)) {
   1389          ML_(record_fd_open_nameless)(tid, p0);
   1390          ML_(record_fd_open_nameless)(tid, p1);
   1391       }
   1392    }
   1393 }
   1394 
   1395 #undef PRE
   1396 #undef POST
   1397 
   1398 /* ---------------------------------------------------------------------
   1399    The mips/Linux syscall table
   1400    ------------------------------------------------------------------ */
   1401 #define PLAX_(sysno, name)    WRAPPER_ENTRY_X_(mips_linux, sysno, name)
   1402 #define PLAXY(sysno, name)    WRAPPER_ENTRY_XY(mips_linux, sysno, name)
   1403 
   1404 // This table maps from __NR_xxx syscall numbers (from
   1405 // linux/include/asm-mips/unistd.h) to the appropriate PRE/POST sys_foo()
   1406 // wrappers on mips (as per sys_call_table in linux/arch/mips/kernel/entry.S).
   1407 //
   1408 
   1409 // For those syscalls not handled by Valgrind, the annotation indicate its
   1410 // arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
   1411 // (unknown).
   1412 
   1413 static SyscallTableEntry syscall_main_table[] = {
   1414   //PLAXY (__NR_syscall, sys_syscall),	// 0
   1415   GENX_ (__NR_exit, sys_exit),	// 1
   1416   GENX_ (__NR_fork, sys_fork),	// 2
   1417   GENXY (__NR_read, sys_read),	// 3
   1418   GENX_ (__NR_write, sys_write),	// 4
   1419   GENXY (__NR_open, sys_open),	// 5
   1420   GENXY (__NR_close, sys_close),	// 6
   1421   GENXY (__NR_waitpid, sys_waitpid),	// 7
   1422   GENXY (__NR_creat, sys_creat),	// 8
   1423   GENX_ (__NR_link, sys_link),	// 9
   1424   GENX_ (__NR_unlink, sys_unlink),	// 10
   1425   GENX_ (__NR_execve, sys_execve),	// 11
   1426   GENX_ (__NR_chdir, sys_chdir),	// 12
   1427   GENXY (__NR_time, sys_time),	// 13
   1428   GENX_ (__NR_mknod, sys_mknod),	// 14
   1429   GENX_ (__NR_chmod, sys_chmod),	// 15
   1430   GENX_ (__NR_lchown, sys_lchown),	// 16
   1431   LINX_ (__NR_lseek, sys_lseek),	// 19
   1432   GENX_ (__NR_getpid, sys_getpid),	// 20
   1433   LINX_ (__NR_mount, sys_mount),	// 21
   1434   LINX_ (__NR_umount, sys_oldumount),	// 22
   1435   GENX_ (__NR_setuid, sys_setuid),	// 23 ## P
   1436   GENX_ (__NR_getuid, sys_getuid),	// 24 ## P
   1437   //..    //   (__NR_stime,             sys_stime),
   1438   //..    PLAXY(__NR_ptrace,            sys_ptrace),            // 26
   1439   GENX_ (__NR_alarm, sys_alarm),	// 27
   1440   //..    //   (__NR_oldfstat,          sys_fstat),
   1441   GENX_ (__NR_pause, sys_pause),	// 29
   1442   LINX_ (__NR_utime, sys_utime),	// 30
   1443   //..    GENX_(__NR_stty,              sys_ni_syscall),        // 31
   1444   //..    GENX_(__NR_gtty,              sys_ni_syscall),        // 32
   1445   GENX_ (__NR_access, sys_access),	// 33
   1446   //..    GENX_(__NR_nice,              sys_nice),              // 34
   1447   //..    GENX_(__NR_ftime,             sys_ni_syscall),        // 35
   1448   //..    GENX_(__NR_sync,              sys_sync),              // 36
   1449   GENX_ (__NR_kill, sys_kill),	// 37
   1450   GENX_ (__NR_rename, sys_rename),	// 38
   1451   GENX_ (__NR_mkdir, sys_mkdir),	// 39
   1452   GENX_ (__NR_rmdir, sys_rmdir),	// 40
   1453   GENXY (__NR_dup, sys_dup),	// 41
   1454   PLAXY (__NR_pipe, sys_pipe),	// 42
   1455   GENXY (__NR_times, sys_times),	// 43
   1456   //..    GENX_(__NR_prof,              sys_ni_syscall),   // 44
   1457   //..
   1458   GENX_ (__NR_brk, sys_brk),	// 45
   1459   GENX_ (__NR_setgid, sys_setgid),	// 46
   1460   GENX_ (__NR_getgid, sys_getgid),	// 47
   1461   //..    //   (__NR_signal,            sys_signal),       // 48 */* (ANSI C)
   1462   GENX_ (__NR_geteuid, sys_geteuid),	// 49
   1463   GENX_ (__NR_getegid, sys_getegid),	// 50
   1464   //..    GENX_(__NR_acct,              sys_acct),         // 51
   1465   LINX_ (__NR_umount2, sys_umount),	// 52
   1466   //..    GENX_(__NR_lock,              sys_ni_syscall),   // 53
   1467   LINXY (__NR_ioctl, sys_ioctl),	// 54
   1468   LINXY (__NR_fcntl, sys_fcntl),	// 55
   1469   //..    GENX_(__NR_mpx,               sys_ni_syscall),   // 56
   1470   GENX_ (__NR_setpgid, sys_setpgid),	// 57
   1471   //..    GENX_(__NR_ulimit,            sys_ni_syscall),        // 58
   1472   //..    //   (__NR_oldolduname,       sys_olduname),          // 59
   1473   GENX_ (__NR_umask, sys_umask),	// 60
   1474   GENX_ (__NR_chroot, sys_chroot),	// 61
   1475   //..    //   (__NR_ustat,             sys_ustat)              // 62 SVr4 -- deprecated
   1476   GENXY (__NR_dup2, sys_dup2),	// 63
   1477   GENX_ (__NR_getppid, sys_getppid),	// 64
   1478   GENX_ (__NR_getpgrp, sys_getpgrp),	// 65
   1479   GENX_ (__NR_setsid, sys_setsid),	// 66
   1480   //   PLAXY(__NR_sigaction,         sys_sigaction),         // 67
   1481   //..    //   (__NR_sgetmask,          sys_sgetmask),          // 68 */* (ANSI C)
   1482   //..    //   (__NR_ssetmask,          sys_ssetmask),          // 69 */* (ANSI C)
   1483   //..
   1484   GENX_ (__NR_setreuid, sys_setreuid),	// 70
   1485   GENX_ (__NR_setregid, sys_setregid),	// 71
   1486   //   PLAX_(__NR_sigsuspend,        sys_sigsuspend),        // 72
   1487   LINXY (__NR_sigpending, sys_sigpending),	// 73
   1488   //..    //   (__NR_sethostname,       sys_sethostname),       // 74 */*
   1489   //..
   1490   GENX_ (__NR_setrlimit, sys_setrlimit),	// 75
   1491   //..    GENXY(__NR_getrlimit,         sys_old_getrlimit),     // 76
   1492   GENXY (__NR_getrusage, sys_getrusage),	// 77
   1493   GENXY (__NR_gettimeofday, sys_gettimeofday),	// 78
   1494   //..    GENX_(__NR_settimeofday,      sys_settimeofday),      // 79
   1495   //..
   1496   GENXY (__NR_getgroups, sys_getgroups),	// 80
   1497   GENX_ (__NR_setgroups, sys_setgroups),	// 81
   1498   //..    PLAX_(__NR_select,            old_select),            // 82
   1499   GENX_ (__NR_symlink, sys_symlink),	// 83
   1500   //..    //   (__NR_oldlstat,          sys_lstat),             // 84 -- obsolete
   1501   //..
   1502   GENX_ (__NR_readlink, sys_readlink),	// 85
   1503   //..    //   (__NR_uselib,            sys_uselib),            // 86 */Linux
   1504   //..    //   (__NR_swapon,            sys_swapon),            // 87 */Linux
   1505   //..    //   (__NR_reboot,            sys_reboot),            // 88 */Linux
   1506   //..    //   (__NR_readdir,           old_readdir),           // 89 -- superseded
   1507   PLAX_ (__NR_mmap, sys_mmap),	// 90
   1508   GENXY (__NR_munmap, sys_munmap),	// 91
   1509   GENX_ (__NR_truncate, sys_truncate),	// 92
   1510   GENX_ (__NR_ftruncate, sys_ftruncate),	// 93
   1511   GENX_ (__NR_fchmod, sys_fchmod),	// 94
   1512   GENX_ (__NR_fchown, sys_fchown),	// 95
   1513   GENX_ (__NR_getpriority, sys_getpriority),	// 96
   1514   GENX_ (__NR_setpriority, sys_setpriority),	// 97
   1515   //..    GENX_(__NR_profil,            sys_ni_syscall),        // 98
   1516   GENXY (__NR_statfs, sys_statfs),	// 99
   1517   //..
   1518   GENXY (__NR_fstatfs, sys_fstatfs),	// 100
   1519   //..    LINX_(__NR_ioperm,            sys_ioperm),            // 101
   1520   PLAXY (__NR_socketcall, sys_socketcall),	// 102
   1521   LINXY (__NR_syslog, sys_syslog),	// 103
   1522   GENXY (__NR_setitimer, sys_setitimer),	// 104
   1523   //..
   1524   //..    GENXY(__NR_getitimer,         sys_getitimer),         // 105
   1525   GENXY (__NR_stat, sys_newstat),	// 106
   1526   GENXY (__NR_lstat, sys_newlstat),	// 107
   1527   GENXY (__NR_fstat, sys_newfstat),	// 108
   1528   //..    //   (__NR_olduname,          sys_uname),             // 109 -- obsolete
   1529   //..
   1530   //..    GENX_(__NR_iopl,              sys_iopl),              // 110
   1531   //..    LINX_(__NR_vhangup,           sys_vhangup),           // 111
   1532   //..    GENX_(__NR_idle,              sys_ni_syscall),        // 112
   1533   //..    //   (__NR_vm86old,           sys_vm86old),           // 113 x86/Linux-only
   1534   GENXY (__NR_wait4, sys_wait4),	// 114
   1535   //..
   1536   //..    //   (__NR_swapoff,           sys_swapoff),           // 115 */Linux
   1537   LINXY (__NR_sysinfo, sys_sysinfo),	// 116
   1538   PLAXY (__NR_ipc, sys_ipc),	// 117
   1539   GENX_ (__NR_fsync, sys_fsync),	// 118
   1540   PLAX_ (__NR_sigreturn, sys_sigreturn),	// 119 ?/Linux
   1541   //..
   1542   PLAX_ (__NR_clone, sys_clone),	// 120
   1543   //..    //   (__NR_setdomainname,     sys_setdomainname),     // 121 */*(?)
   1544   GENXY (__NR_uname, sys_newuname),	// 122
   1545   //..    PLAX_(__NR_modify_ldt,        sys_modify_ldt),        // 123
   1546   //..    LINXY(__NR_adjtimex,          sys_adjtimex),          // 124
   1547   //..
   1548   GENXY (__NR_mprotect, sys_mprotect),	// 125
   1549   LINXY (__NR_sigprocmask, sys_sigprocmask),    // 126
   1550   //..    // Nb: create_module() was removed 2.4-->2.6
   1551   //..    GENX_(__NR_create_module,     sys_ni_syscall),        // 127
   1552   //..    GENX_(__NR_init_module,       sys_init_module),       // 128
   1553   //..    //   (__NR_delete_module,     sys_delete_module),     // 129 (*/Linux)?
   1554   //..
   1555   //..    // Nb: get_kernel_syms() was removed 2.4-->2.6
   1556   //..    GENX_(__NR_get_kernel_syms,   sys_ni_syscall),        // 130
   1557   //..    LINX_(__NR_quotactl,          sys_quotactl),          // 131
   1558   GENX_ (__NR_getpgid, sys_getpgid),	// 132
   1559   GENX_ (__NR_fchdir, sys_fchdir),	// 133
   1560   //..    //   (__NR_bdflush,           sys_bdflush),           // 134 */Linux
   1561   //..
   1562   //..    //   (__NR_sysfs,             sys_sysfs),             // 135 SVr4
   1563   LINX_ (__NR_personality, sys_personality),	// 136
   1564   //..    GENX_(__NR_afs_syscall,       sys_ni_syscall),        // 137
   1565   LINX_ (__NR_setfsuid, sys_setfsuid),	// 138
   1566   LINX_ (__NR_setfsgid, sys_setfsgid),	// 139
   1567   LINXY (__NR__llseek, sys_llseek),	// 140
   1568   GENXY (__NR_getdents, sys_getdents),	// 141
   1569   GENX_ (__NR__newselect, sys_select),	// 142
   1570   GENX_ (__NR_flock, sys_flock),	// 143
   1571   GENX_ (__NR_msync, sys_msync),	// 144
   1572   //..
   1573   GENXY (__NR_readv, sys_readv),	// 145
   1574   GENX_ (__NR_writev, sys_writev),	// 146
   1575   PLAX_ (__NR_cacheflush, sys_cacheflush),	// 147
   1576   GENX_ (__NR_getsid, sys_getsid),	// 151
   1577   GENX_ (__NR_fdatasync, sys_fdatasync),	// 152
   1578   LINXY (__NR__sysctl, sys_sysctl),	// 153
   1579   //..
   1580   GENX_ (__NR_mlock, sys_mlock),	// 154
   1581   GENX_ (__NR_munlock, sys_munlock),	// 155
   1582   GENX_ (__NR_mlockall, sys_mlockall),	// 156
   1583   LINX_ (__NR_munlockall, sys_munlockall),	// 157
   1584   //..    LINXY(__NR_sched_setparam,    sys_sched_setparam),    // 158
   1585   //..
   1586   LINXY (__NR_sched_getparam, sys_sched_getparam),	// 159
   1587   LINX_ (__NR_sched_setscheduler, sys_sched_setscheduler),	// 160
   1588   LINX_ (__NR_sched_getscheduler, sys_sched_getscheduler),	// 161
   1589   LINX_ (__NR_sched_yield, sys_sched_yield),	// 162
   1590   LINX_ (__NR_sched_get_priority_max, sys_sched_get_priority_max),	// 163
   1591   LINX_ (__NR_sched_get_priority_min, sys_sched_get_priority_min),	// 164
   1592   //..    //LINX?(__NR_sched_rr_get_interval,  sys_sched_rr_get_interval), // 165 */*
   1593   GENXY (__NR_nanosleep, sys_nanosleep),	// 166
   1594   GENX_ (__NR_mremap, sys_mremap),	// 167
   1595   PLAXY (__NR_accept, sys_accept),	// 168
   1596   PLAX_ (__NR_bind, sys_bind),	// 169
   1597   PLAX_ (__NR_connect, sys_connect),	// 170
   1598   PLAXY (__NR_getpeername, sys_getpeername),	// 171
   1599   PLAXY (__NR_getsockname, sys_getsockname),	// 172
   1600   PLAXY (__NR_getsockopt, sys_getsockopt),	// 173
   1601   PLAX_ (__NR_listen, sys_listen),	// 174
   1602   PLAXY (__NR_recv, sys_recv),	// 175
   1603   PLAXY (__NR_recvfrom, sys_recvfrom),	// 176
   1604   PLAXY (__NR_recvmsg, sys_recvmsg),	// 177
   1605   PLAX_ (__NR_send, sys_send),	// 178
   1606   PLAX_ (__NR_sendmsg, sys_sendmsg),	// 179
   1607   PLAX_ (__NR_sendto, sys_sendto),	// 180
   1608   PLAX_ (__NR_setsockopt, sys_setsockopt),	// 181
   1609   PLAXY (__NR_socket, sys_socket),	// 183
   1610   PLAXY (__NR_socketpair, sys_socketpair),	// 184
   1611   LINX_ (__NR_setresuid, sys_setresuid),	// 185
   1612   LINXY (__NR_getresuid, sys_getresuid),	// 186
   1613   //..    GENX_(__NR_query_module,      sys_ni_syscall),        //
   1614   GENXY (__NR_poll, sys_poll),	// 188
   1615   //..    //   (__NR_nfsservctl,        sys_nfsservctl),        // 168 */Linux
   1616   //..
   1617   LINX_ (__NR_setresgid, sys_setresgid),	// 190
   1618   LINXY (__NR_getresgid, sys_getresgid),	// 191
   1619   LINXY (__NR_prctl, sys_prctl),	// 192
   1620   PLAX_ (__NR_rt_sigreturn, sys_rt_sigreturn),	// 193
   1621   LINXY (__NR_rt_sigaction, sys_rt_sigaction),	// 194
   1622   LINXY (__NR_rt_sigprocmask, sys_rt_sigprocmask),	// 195
   1623   LINXY (__NR_rt_sigpending, sys_rt_sigpending),	// 196
   1624   LINXY (__NR_rt_sigtimedwait, sys_rt_sigtimedwait),	// 197
   1625   LINXY (__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),	// 198
   1626   LINX_ (__NR_rt_sigsuspend, sys_rt_sigsuspend),	// 199
   1627   GENXY (__NR_pread64, sys_pread64),	// 200
   1628   GENX_ (__NR_pwrite64, sys_pwrite64),	// 201
   1629   GENX_ (__NR_chown, sys_chown),   // 202
   1630   GENXY (__NR_getcwd, sys_getcwd), // 203
   1631   LINXY (__NR_capget, sys_capget), // 204
   1632   //..
   1633   //..    LINX_(__NR_capset,            sys_capset),            // 205
   1634   GENXY (__NR_sigaltstack, sys_sigaltstack),	// 206
   1635   LINXY (__NR_sendfile, sys_sendfile),	// 207
   1636   //..    GENXY(__NR_getpmsg,           sys_getpmsg),           // 208
   1637   //..    GENX_(__NR_putpmsg,           sys_putpmsg),           // 209
   1638   // Nb: we treat vfork as fork
   1639   //   GENX_(__NR_vfork,             sys_fork),              //
   1640   GENXY (__NR_getrlimit, sys_getrlimit),	// 76
   1641   //__NR_readahead      // 191 ppc/Linux only?
   1642   PLAX_ (__NR_mmap2, sys_mmap2),	// 210
   1643   //   GENX_(__NR_truncate64,        sys_truncate64),        // 211
   1644   GENX_ (__NR_ftruncate64, sys_ftruncate64),	// 212
   1645   //..
   1646   PLAXY (__NR_stat64, sys_stat64),	// 213
   1647   PLAXY (__NR_lstat64, sys_lstat64),	// 214
   1648   PLAXY (__NR_fstat64, sys_fstat64),	// 215
   1649   GENXY (__NR_getdents64, sys_getdents64),	// 219
   1650   //..    //   (__NR_pivot_root,        sys_pivot_root),        //
   1651   LINXY (__NR_fcntl64, sys_fcntl64),	// 220
   1652   GENX_ (__NR_madvise, sys_madvise),	// 218
   1653   GENXY (__NR_mincore, sys_mincore),	// 217
   1654   LINX_ (__NR_gettid, sys_gettid),	// 222
   1655   //..    LINX_(__NR_tkill,             sys_tkill),             // 208 */Linux
   1656   //..    LINX_(__NR_setxattr,          sys_setxattr),          // 209
   1657   //..    LINX_(__NR_lsetxattr,         sys_lsetxattr),         // 210
   1658   //..    LINX_(__NR_fsetxattr,         sys_fsetxattr),         // 211
   1659   LINXY (__NR_getxattr, sys_getxattr),	// 227
   1660   LINXY (__NR_lgetxattr, sys_lgetxattr),	// 228
   1661   LINXY (__NR_fgetxattr, sys_fgetxattr),	// 229
   1662   LINXY (__NR_listxattr, sys_listxattr),	// 230
   1663   LINXY (__NR_llistxattr, sys_llistxattr),	// 231
   1664   LINXY (__NR_flistxattr, sys_flistxattr),	// 232
   1665   LINX_ (__NR_removexattr, sys_removexattr),	// 233
   1666   LINX_ (__NR_lremovexattr, sys_lremovexattr),	// 234
   1667   LINX_ (__NR_fremovexattr, sys_fremovexattr),	// 235
   1668   LINXY (__NR_futex, sys_futex),	// 238
   1669   LINX_ (__NR_sched_setaffinity, sys_sched_setaffinity),	// 239
   1670   LINXY (__NR_sched_getaffinity, sys_sched_getaffinity),	// 240
   1671   /* 224 currently unused */
   1672   // __NR_tuxcall                                               //
   1673   LINXY (__NR_sendfile64, sys_sendfile64),	// 237
   1674   //..
   1675   LINX_ (__NR_io_setup, sys_io_setup),	// 241
   1676   LINX_ (__NR_io_destroy, sys_io_destroy),	// 242
   1677   LINXY (__NR_io_getevents, sys_io_getevents),	// 243
   1678   LINX_ (__NR_io_submit, sys_io_submit),	// 244
   1679   LINXY (__NR_io_cancel, sys_io_cancel),	// 245
   1680   //..
   1681   LINX_ (__NR_set_tid_address, sys_set_tid_address),	// 252
   1682   LINX_ (__NR_fadvise64, sys_fadvise64),	// 254
   1683   LINX_ (__NR_exit_group, sys_exit_group),	// 246
   1684   //..    GENXY(__NR_lookup_dcookie,    sys_lookup_dcookie),    // 247
   1685   LINXY (__NR_epoll_create, sys_epoll_create),	// 248
   1686   LINX_ (__NR_epoll_ctl, sys_epoll_ctl),	// 249
   1687   LINXY (__NR_epoll_wait, sys_epoll_wait),	// 250
   1688   //..    //   (__NR_remap_file_pages,  sys_remap_file_pages),  // 239 */Linux
   1689   LINXY (__NR_timer_create, sys_timer_create),	// 257
   1690   LINXY (__NR_timer_settime, sys_timer_settime),	// 258
   1691   LINXY (__NR_timer_gettime, sys_timer_gettime),	// 259
   1692   LINX_ (__NR_timer_getoverrun, sys_timer_getoverrun),	// 260
   1693   LINX_ (__NR_timer_delete, sys_timer_delete),	// 261
   1694   LINX_ (__NR_clock_settime, sys_clock_settime),	// 262
   1695   LINXY (__NR_clock_gettime, sys_clock_gettime),	// 263
   1696   LINXY (__NR_clock_getres, sys_clock_getres),	// 264
   1697   LINXY (__NR_clock_nanosleep, sys_clock_nanosleep),	// 265
   1698   // __NR_swapcontext                                           //
   1699   LINXY (__NR_tgkill, sys_tgkill),	// 266 */Linux
   1700   //..    GENX_(__NR_utimes,            sys_utimes),            // 267
   1701   GENXY (__NR_statfs64, sys_statfs64),	// 255
   1702   GENXY (__NR_fstatfs64, sys_fstatfs64),	// 256
   1703   LINXY (__NR_get_mempolicy, sys_get_mempolicy),	// 269
   1704   LINX_ (__NR_set_mempolicy, sys_set_mempolicy),	// 270
   1705   LINXY (__NR_mq_open, sys_mq_open),	// 271
   1706   LINX_ (__NR_mq_unlink, sys_mq_unlink),	// 272
   1707   LINX_ (__NR_mq_timedsend, sys_mq_timedsend),	// 273
   1708   LINXY (__NR_mq_timedreceive, sys_mq_timedreceive),	// 274
   1709   LINX_ (__NR_mq_notify, sys_mq_notify),	// 275
   1710   LINXY (__NR_mq_getsetattr, sys_mq_getsetattr),	// 276
   1711   // __NR_kexec_load                                            //
   1712   LINX_ (__NR_inotify_init, sys_inotify_init),	// 275
   1713   LINX_ (__NR_inotify_add_watch, sys_inotify_add_watch),	// 276
   1714   LINX_ (__NR_inotify_rm_watch, sys_inotify_rm_watch),	// 277
   1715   PLAX_ (__NR_set_thread_area, sys_set_thread_area),	// 283
   1716   LINXY (__NR_openat, sys_openat),	// 288
   1717   LINX_ (__NR_mkdirat, sys_mkdirat),	// 289
   1718   LINX_ (__NR_mknodat, sys_mknodat),	// 290
   1719   LINX_ (__NR_fchownat, sys_fchownat),	// 291
   1720   LINX_ (__NR_futimesat, sys_futimesat),	// 292
   1721   PLAXY (__NR_fstatat64, sys_fstatat64),	// 293
   1722   LINX_ (__NR_unlinkat, sys_unlinkat),	// 294
   1723   LINX_ (__NR_renameat, sys_renameat),	// 295
   1724   LINX_ (__NR_linkat, sys_linkat),	// 296
   1725   LINX_ (__NR_symlinkat, sys_symlinkat),	// 297
   1726   LINX_ (__NR_readlinkat, sys_readlinkat),	// 298
   1727   LINX_ (__NR_fchmodat, sys_fchmodat),	// 299
   1728   LINX_ (__NR_faccessat, sys_faccessat),	// 300
   1729   LINXY (__NR_ppoll, sys_ppoll),	// 302
   1730   LINX_ (__NR_set_robust_list, sys_set_robust_list),	// 309
   1731   LINXY (__NR_get_robust_list, sys_get_robust_list),	// 310
   1732   LINXY (__NR_epoll_pwait, sys_epoll_pwait),	// 313
   1733   LINX_ (__NR_utimensat, sys_utimensat),	// 316
   1734   LINX_ (__NR_fallocate, sys_fallocate),	// 320
   1735   LINXY (__NR_timerfd_create, sys_timerfd_create),    // 321
   1736   LINXY (__NR_timerfd_gettime, sys_timerfd_gettime),  // 322
   1737   LINXY (__NR_timerfd_settime, sys_timerfd_settime),  // 323
   1738   LINXY (__NR_signalfd4, sys_signalfd4),	// 324
   1739   LINX_ (__NR_eventfd2, sys_eventfd2),	// 325
   1740   LINXY (__NR_pipe2, sys_pipe2),	// 328
   1741   LINXY (__NR_inotify_init1, sys_inotify_init1),	// 329
   1742   LINXY (__NR_prlimit64, sys_prlimit64) // 338
   1743 };
   1744 
   1745 SyscallTableEntry* ML_(get_linux_syscall_entry) (UInt sysno)
   1746 {
   1747   const UInt syscall_main_table_size
   1748    = sizeof (syscall_main_table) / sizeof (syscall_main_table[0]);
   1749   /* Is it in the contiguous initial section of the table? */
   1750   if (sysno < syscall_main_table_size)
   1751     {
   1752       SyscallTableEntry * sys = &syscall_main_table[sysno];
   1753       if (sys->before == NULL)
   1754         return NULL;    /* no entry */
   1755       else
   1756         return sys;
   1757     }
   1758   /* Can't find a wrapper */
   1759   return NULL;
   1760 }
   1761 
   1762 #endif // defined(VGP_mips32_linux)
   1763 
   1764 /*--------------------------------------------------------------------*/
   1765 /*--- end                                     syswrap-mips-linux.c ---*/
   1766 /*--------------------------------------------------------------------*/
   1767