Home | History | Annotate | Download | only in m_syswrap
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- Platform-specific syscalls stuff.      syswrap-s390x-linux.c ---*/
      4 /*--------------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright IBM Corp. 2010-2012
     11 
     12    This program is free software; you can redistribute it and/or
     13    modify it under the terms of the GNU General Public License as
     14    published by the Free Software Foundation; either version 2 of the
     15    License, or (at your option) any later version.
     16 
     17    This program is distributed in the hope that it will be useful, but
     18    WITHOUT ANY WARRANTY; without even the implied warranty of
     19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     20    General Public License for more details.
     21 
     22    You should have received a copy of the GNU General Public License
     23    along with this program; if not, write to the Free Software
     24    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     25    02111-1307, USA.
     26 
     27    The GNU General Public License is contained in the file COPYING.
     28 */
     29 
     30 /* Contributed by Christian Borntraeger */
     31 
     32 #if defined(VGP_s390x_linux)
     33 
     34 #include "pub_core_basics.h"
     35 #include "pub_core_vki.h"
     36 #include "pub_core_vkiscnums.h"
     37 #include "pub_core_libcsetjmp.h"    // to keep _threadstate.h happy
     38 #include "pub_core_threadstate.h"
     39 #include "pub_core_aspacemgr.h"
     40 #include "pub_core_debuglog.h"
     41 #include "pub_core_libcbase.h"
     42 #include "pub_core_libcassert.h"
     43 #include "pub_core_libcprint.h"
     44 #include "pub_core_libcproc.h"
     45 #include "pub_core_libcsignal.h"
     46 #include "pub_core_mallocfree.h"
     47 #include "pub_core_options.h"
     48 #include "pub_core_scheduler.h"
     49 #include "pub_core_sigframe.h"      // For VG_(sigframe_destroy)()
     50 #include "pub_core_signals.h"
     51 #include "pub_core_syscall.h"
     52 #include "pub_core_syswrap.h"
     53 #include "pub_core_tooliface.h"
     54 #include "pub_core_stacks.h"        // VG_(register_stack)
     55 
     56 #include "priv_types_n_macros.h"
     57 #include "priv_syswrap-generic.h"    /* for decls of generic wrappers */
     58 #include "priv_syswrap-linux.h"      /* for decls of linux-ish wrappers */
     59 #include "priv_syswrap-linux-variants.h" /* decls of linux variant wrappers */
     60 #include "priv_syswrap-main.h"
     61 
     62 
     63 /* ---------------------------------------------------------------------
     64    clone() handling
     65    ------------------------------------------------------------------ */
     66 
     67 /* Call f(arg1), but first switch stacks, using 'stack' as the new
     68    stack, and use 'retaddr' as f's return-to address.  Also, clear all
     69    the integer registers before entering f.
     70    Thought: Why are we clearing the GPRs ? The callee pointed to by f
     71    is a regular C function which will play by the ABI rules. So there is
     72    no need to zero out the GPRs. If we assumed that f accesses registers at
     73    will, then it would make sense to create a defined register state.
     74    But then, why only for the GPRs and not the FPRs ? */
     75 __attribute__((noreturn))
     76 void ML_(call_on_new_stack_0_1) ( Addr stack,
     77                                   Addr retaddr,
     78                                   void (*f)(Word),
     79                                   Word arg1 );
     80 /* Upon entering this function we have the following setup:
     81      r2 = stack
     82      r3 = retaddr
     83      r4 = f_desc
     84      r5 = arg1
     85 */
     86 asm(
     87     ".text\n"
     88     ".align 4\n"
     89     ".globl vgModuleLocal_call_on_new_stack_0_1\n"
     90     ".type vgModuleLocal_call_on_new_stack_0_1, @function\n"
     91     "vgModuleLocal_call_on_new_stack_0_1:\n"
     92     "   lgr %r15,%r2\n"     // stack to r15
     93     "   lgr %r14,%r3\n"     // retaddr to r14
     94     "   lgr %r2,%r5\n"      // arg1 to r2
     95     // zero all gprs to get a defined state
     96     "   lghi  %r0,0\n"
     97     "   lghi  %r1,0\n"
     98     // r2 holds the argument for the callee
     99     "   lghi  %r3,0\n"
    100     // r4 holds the callee address
    101     "   lghi  %r5,0\n"
    102     "   lghi  %r6,0\n"
    103     "   lghi  %r7,0\n"
    104     "   lghi  %r8,0\n"
    105     "   lghi  %r9,0\n"
    106     "   lghi  %r10,0\n"
    107     "   lghi  %r11,0\n"
    108     "   lghi  %r12,0\n"
    109     "   lghi  %r13,0\n"
    110     // r14 holds the return address for the callee
    111     // r15 is the stack pointer
    112     "   br  %r4\n"          // jump to f
    113     ".previous\n"
    114     );
    115 
    116 /*
    117         Perform a clone system call.  clone is strange because it has
    118         fork()-like return-twice semantics, so it needs special
    119         handling here.
    120 
    121         Upon entry, we have:
    122             void*  child_stack   in r2
    123             long   flags         in r3
    124             int*   parent_tid    in r4
    125             int*   child_tid     in r5
    126             int*   child_tid     in r6
    127             Word   (*fn)(void *) 160(r15)
    128             void   *arg          168(r15)
    129 
    130         System call requires:
    131             void*  child_stack  in r2  (sc arg1)
    132             long   flags        in r3  (sc arg2)
    133             int*   parent_tid   in r4  (sc arg3)
    134             int*   child_tid    in r5  (sc arg4)
    135             void*  tlsaddr      in r6  (sc arg5)
    136 
    137         Returns a ULong encoded as: top half is %cr following syscall,
    138         low half is syscall return value (r3).
    139  */
    140 #define __NR_CLONE        VG_STRINGIFY(__NR_clone)
    141 #define __NR_EXIT         VG_STRINGIFY(__NR_exit)
    142 
    143 extern
    144 ULong do_syscall_clone_s390x_linux ( void  *stack,
    145                                      ULong flags,
    146                                      Int   *child_tid,
    147                                      Int   *parent_tid,
    148                                      Addr  tlsaddr,
    149                                      Word (*fn)(void *),
    150                                      void  *arg);
    151 asm(
    152    "   .text\n"
    153    "   .align  4\n"
    154    ".globl do_syscall_clone_s390x_linux\n"
    155    "do_syscall_clone_s390x_linux:\n"
    156    "   lg    %r1, 160(%r15)\n"   // save fn from parent stack into r1
    157    "   lg    %r0, 168(%r15)\n"   // save arg from parent stack into r0
    158    "   aghi  %r2, -160\n"        // create stack frame for child
    159    // all syscall parameters are already in place (r2-r6)
    160    "   svc " __NR_CLONE"\n"        // clone()
    161    "   ltgr  %r2,%r2\n"           // child if retval == 0
    162    "   jne   1f\n"
    163 
    164    // CHILD - call thread function
    165    "   lgr   %r2, %r0\n"            // get arg from r0
    166    "   basr  %r14,%r1\n"            // call fn
    167 
    168    // exit. The result is already in r2
    169    "   svc " __NR_EXIT"\n"
    170 
    171    // Exit returned?!
    172    "   j +2\n"
    173 
    174    "1:\n"  // PARENT or ERROR
    175    "   br %r14\n"
    176    ".previous\n"
    177 );
    178 
    179 #undef __NR_CLONE
    180 #undef __NR_EXIT
    181 
    182 void VG_(cleanup_thread) ( ThreadArchState* arch )
    183 {
    184   /* only used on x86 for descriptor tables */
    185 }
    186 
    187 static void setup_child ( /*OUT*/ ThreadArchState *child,
    188                    /*IN*/  ThreadArchState *parent )
    189 {
    190    /* We inherit our parent's guest state. */
    191    child->vex = parent->vex;
    192    child->vex_shadow1 = parent->vex_shadow1;
    193    child->vex_shadow2 = parent->vex_shadow2;
    194 }
    195 
    196 
    197 /*
    198    When a client clones, we need to keep track of the new thread.  This means:
    199    1. allocate a ThreadId+ThreadState+stack for the the thread
    200 
    201    2. initialize the thread's new VCPU state
    202 
    203    3. create the thread using the same args as the client requested,
    204    but using the scheduler entrypoint for IP, and a separate stack
    205    for SP.
    206  */
    207 static SysRes do_clone ( ThreadId ptid,
    208                          Addr sp, ULong flags,
    209                          Int *parent_tidptr,
    210                          Int *child_tidptr,
    211                          Addr tlsaddr)
    212 {
    213    static const Bool debug = False;
    214 
    215    ThreadId     ctid = VG_(alloc_ThreadState)();
    216    ThreadState* ptst = VG_(get_ThreadState)(ptid);
    217    ThreadState* ctst = VG_(get_ThreadState)(ctid);
    218    UWord*       stack;
    219    NSegment const* seg;
    220    SysRes       res;
    221    ULong        r2;
    222    vki_sigset_t blockall, savedmask;
    223 
    224    VG_(sigfillset)(&blockall);
    225 
    226    vg_assert(VG_(is_running_thread)(ptid));
    227    vg_assert(VG_(is_valid_tid)(ctid));
    228 
    229    stack = (UWord*)ML_(allocstack)(ctid);
    230    if (stack == NULL) {
    231       res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
    232       goto out;
    233    }
    234 
    235    /* Copy register state
    236 
    237       Both parent and child return to the same place, and the code
    238       following the clone syscall works out which is which, so we
    239       don't need to worry about it.
    240 
    241       The parent gets the child's new tid returned from clone, but the
    242       child gets 0.
    243 
    244       If the clone call specifies a NULL sp for the new thread, then
    245       it actually gets a copy of the parent's sp.
    246    */
    247    setup_child( &ctst->arch, &ptst->arch );
    248 
    249    /* Make sys_clone appear to have returned Success(0) in the
    250       child. */
    251    ctst->arch.vex.guest_r2 = 0;
    252 
    253    if (sp != 0)
    254       ctst->arch.vex.guest_r15 = sp;
    255 
    256    ctst->os_state.parent = ptid;
    257 
    258    /* inherit signal mask */
    259    ctst->sig_mask = ptst->sig_mask;
    260    ctst->tmp_sig_mask = ptst->sig_mask;
    261 
    262    /* have the parents thread group */
    263    ctst->os_state.threadgroup = ptst->os_state.threadgroup;
    264 
    265    /* We don't really know where the client stack is, because its
    266       allocated by the client.  The best we can do is look at the
    267       memory mappings and try to derive some useful information.  We
    268       assume that esp starts near its highest possible value, and can
    269       only go down to the start of the mmaped segment. */
    270    seg = VG_(am_find_nsegment)((Addr)sp);
    271    if (seg && seg->kind != SkResvn) {
    272       ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp);
    273       ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
    274 
    275       VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
    276 
    277       if (debug)
    278 	 VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n",
    279 		     ctid, seg->start, VG_PGROUNDUP(sp));
    280    } else {
    281       VG_(message)(Vg_UserMsg,
    282                    "!? New thread %d starts with SP(%#lx) unmapped\n",
    283 		   ctid, sp);
    284       ctst->client_stack_szB  = 0;
    285    }
    286 
    287    /* Assume the clone will succeed, and tell any tool that wants to
    288       know that this thread has come into existence.  If the clone
    289       fails, we'll send out a ll_exit notification for it at the out:
    290       label below, to clean up. */
    291    vg_assert(VG_(owns_BigLock_LL)(ptid));
    292    VG_TRACK ( pre_thread_ll_create, ptid, ctid );
    293 
    294    if (flags & VKI_CLONE_SETTLS) {
    295       if (debug)
    296 	 VG_(printf)("clone child has SETTLS: tls at %#lx\n", tlsaddr);
    297       ctst->arch.vex.guest_a0 = (UInt) (tlsaddr >> 32);
    298       ctst->arch.vex.guest_a1 = (UInt) tlsaddr;
    299    }
    300    flags &= ~VKI_CLONE_SETTLS;
    301 
    302    /* start the thread with everything blocked */
    303    VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
    304 
    305    /* Create the new thread */
    306    r2 = do_syscall_clone_s390x_linux(
    307             stack, flags, child_tidptr, parent_tidptr, tlsaddr,
    308             ML_(start_thread_NORETURN), &VG_(threads)[ctid]);
    309 
    310    res = VG_(mk_SysRes_s390x_linux)( r2 );
    311 
    312    VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
    313 
    314   out:
    315    if (sr_isError(res)) {
    316       /* clone failed */
    317       ctst->status = VgTs_Empty;
    318       /* oops.  Better tell the tool the thread exited in a hurry :-) */
    319       VG_TRACK( pre_thread_ll_exit, ctid );
    320    }
    321 
    322    return res;
    323 
    324 }
    325 
    326 
    327 
    328 /* ---------------------------------------------------------------------
    329    PRE/POST wrappers for s390x/Linux-specific syscalls
    330    ------------------------------------------------------------------ */
    331 
    332 #define PRE(name)       DEFN_PRE_TEMPLATE(s390x_linux, name)
    333 #define POST(name)      DEFN_POST_TEMPLATE(s390x_linux, name)
    334 
    335 /* Add prototypes for the wrappers declared here, so that gcc doesn't
    336    harass us for not having prototypes.  Really this is a kludge --
    337    the right thing to do is to make these wrappers 'static' since they
    338    aren't visible outside this file, but that requires even more macro
    339    magic. */
    340 
    341 DECL_TEMPLATE(s390x_linux, sys_ptrace);
    342 DECL_TEMPLATE(s390x_linux, sys_socketcall);
    343 DECL_TEMPLATE(s390x_linux, sys_mmap);
    344 DECL_TEMPLATE(s390x_linux, sys_ipc);
    345 DECL_TEMPLATE(s390x_linux, sys_clone);
    346 DECL_TEMPLATE(s390x_linux, sys_sigreturn);
    347 DECL_TEMPLATE(s390x_linux, sys_rt_sigreturn);
    348 DECL_TEMPLATE(s390x_linux, sys_fadvise64);
    349 
    350 // PEEK TEXT,DATA and USER are common to all architectures
    351 // PEEKUSR_AREA and POKEUSR_AREA are special, having a memory area
    352 // containing the real addr, data, and len field pointed to by ARG3
    353 // instead of ARG4
    354 PRE(sys_ptrace)
    355 {
    356    PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
    357    PRE_REG_READ4(int, "ptrace",
    358                  long, request, long, pid, long, addr, long, data);
    359    switch (ARG1) {
    360    case VKI_PTRACE_PEEKTEXT:
    361    case VKI_PTRACE_PEEKDATA:
    362    case VKI_PTRACE_PEEKUSR:
    363       PRE_MEM_WRITE( "ptrace(peek)", ARG4,
    364 		     sizeof (long));
    365       break;
    366    case VKI_PTRACE_GETEVENTMSG:
    367       PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long));
    368       break;
    369    case VKI_PTRACE_GETSIGINFO:
    370       PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t));
    371       break;
    372    case VKI_PTRACE_SETSIGINFO:
    373       PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t));
    374       break;
    375    case VKI_PTRACE_PEEKUSR_AREA:
    376       {
    377          vki_ptrace_area *pa;
    378 
    379          /* Reads a part of the user area into memory at pa->process_addr */
    380 	 pa = (vki_ptrace_area *) ARG3;
    381          PRE_MEM_READ("ptrace(peekusrarea ptrace_area->len)",
    382                       (unsigned long) &pa->vki_len, sizeof(pa->vki_len));
    383          PRE_MEM_READ("ptrace(peekusrarea ptrace_area->kernel_addr)",
    384                       (unsigned long) &pa->vki_kernel_addr, sizeof(pa->vki_kernel_addr));
    385          PRE_MEM_READ("ptrace(peekusrarea ptrace_area->process_addr)",
    386                       (unsigned long) &pa->vki_process_addr, sizeof(pa->vki_process_addr));
    387          PRE_MEM_WRITE("ptrace(peekusrarea *(ptrace_area->process_addr))",
    388                        pa->vki_process_addr, pa->vki_len);
    389          break;
    390       }
    391    case VKI_PTRACE_POKEUSR_AREA:
    392       {
    393          vki_ptrace_area *pa;
    394 
    395          /* Updates a part of the user area from memory at pa->process_addr */
    396 	 pa = (vki_ptrace_area *) ARG3;
    397          PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->len)",
    398                       (unsigned long) &pa->vki_len, sizeof(pa->vki_len));
    399          PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->kernel_addr)",
    400                       (unsigned long) &pa->vki_kernel_addr,
    401                       sizeof(pa->vki_kernel_addr));
    402          PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->process_addr)",
    403                       (unsigned long) &pa->vki_process_addr,
    404                       sizeof(pa->vki_process_addr));
    405          PRE_MEM_READ("ptrace(pokeusrarea *(ptrace_area->process_addr))",
    406                        pa->vki_process_addr, pa->vki_len);
    407          break;
    408       }
    409    default:
    410       break;
    411    }
    412 }
    413 
    414 POST(sys_ptrace)
    415 {
    416    switch (ARG1) {
    417    case VKI_PTRACE_PEEKTEXT:
    418    case VKI_PTRACE_PEEKDATA:
    419    case VKI_PTRACE_PEEKUSR:
    420       POST_MEM_WRITE( ARG4, sizeof (long));
    421       break;
    422    case VKI_PTRACE_GETEVENTMSG:
    423       POST_MEM_WRITE( ARG4, sizeof(unsigned long));
    424       break;
    425    case VKI_PTRACE_GETSIGINFO:
    426       /* XXX: This is a simplification. Different parts of the
    427        * siginfo_t are valid depending on the type of signal.
    428        */
    429       POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t));
    430       break;
    431    case VKI_PTRACE_PEEKUSR_AREA:
    432       {
    433          vki_ptrace_area *pa;
    434 
    435 	 pa = (vki_ptrace_area *) ARG3;
    436          POST_MEM_WRITE(pa->vki_process_addr, pa->vki_len);
    437       }
    438    default:
    439       break;
    440    }
    441 }
    442 
    443 
    444 PRE(sys_socketcall)
    445 {
    446 #  define ARG2_0  (((UWord*)ARG2)[0])
    447 #  define ARG2_1  (((UWord*)ARG2)[1])
    448 #  define ARG2_2  (((UWord*)ARG2)[2])
    449 #  define ARG2_3  (((UWord*)ARG2)[3])
    450 #  define ARG2_4  (((UWord*)ARG2)[4])
    451 #  define ARG2_5  (((UWord*)ARG2)[5])
    452 
    453    *flags |= SfMayBlock;
    454    PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
    455    PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
    456 
    457    switch (ARG1 /* request */) {
    458 
    459    case VKI_SYS_SOCKETPAIR:
    460      /* int socketpair(int d, int type, int protocol, int sv[2]); */
    461       PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
    462       if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) {
    463          SET_STATUS_Failure( VKI_EFAULT );
    464          break;
    465       }
    466       ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
    467       break;
    468 
    469    case VKI_SYS_SOCKET:
    470      /* int socket(int domain, int type, int protocol); */
    471       PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
    472       if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
    473          SET_STATUS_Failure( VKI_EFAULT );
    474          break;
    475       }
    476       break;
    477 
    478    case VKI_SYS_BIND:
    479      /* int bind(int sockfd, struct sockaddr *my_addr,
    480 	int addrlen); */
    481       PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
    482       if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
    483          SET_STATUS_Failure( VKI_EFAULT );
    484          break;
    485       }
    486       ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
    487       break;
    488 
    489    case VKI_SYS_LISTEN:
    490      /* int listen(int s, int backlog); */
    491       PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
    492       if (!ML_(valid_client_addr)(ARG2, 2*sizeof(Addr), tid, NULL)) {
    493          SET_STATUS_Failure( VKI_EFAULT );
    494          break;
    495       }
    496       break;
    497 
    498    case VKI_SYS_ACCEPT: {
    499      /* int accept(int s, struct sockaddr *addr, int *addrlen); */
    500       PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
    501       if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
    502          SET_STATUS_Failure( VKI_EFAULT );
    503          break;
    504       }
    505       ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
    506       break;
    507    }
    508 
    509    case VKI_SYS_SENDTO:
    510      /* int sendto(int s, const void *msg, int len,
    511                     unsigned int flags,
    512                     const struct sockaddr *to, int tolen); */
    513      PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
    514      if (!ML_(valid_client_addr)(ARG2, 6*sizeof(Addr), tid, NULL)) {
    515          SET_STATUS_Failure( VKI_EFAULT );
    516          break;
    517      }
    518      ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
    519 				  ARG2_3, ARG2_4, ARG2_5 );
    520      break;
    521 
    522    case VKI_SYS_SEND:
    523      /* int send(int s, const void *msg, size_t len, int flags); */
    524      PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
    525      if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) {
    526          SET_STATUS_Failure( VKI_EFAULT );
    527          break;
    528      }
    529      ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
    530      break;
    531 
    532    case VKI_SYS_RECVFROM:
    533      /* int recvfrom(int s, void *buf, int len, unsigned int flags,
    534 	struct sockaddr *from, int *fromlen); */
    535      PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
    536      if (!ML_(valid_client_addr)(ARG2, 6*sizeof(Addr), tid, NULL)) {
    537          SET_STATUS_Failure( VKI_EFAULT );
    538          break;
    539      }
    540      ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
    541 				    ARG2_3, ARG2_4, ARG2_5 );
    542      break;
    543 
    544    case VKI_SYS_RECV:
    545      /* int recv(int s, void *buf, int len, unsigned int flags); */
    546      /* man 2 recv says:
    547          The  recv call is normally used only on a connected socket
    548          (see connect(2)) and is identical to recvfrom with a  NULL
    549          from parameter.
    550      */
    551      PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
    552      if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) {
    553          SET_STATUS_Failure( VKI_EFAULT );
    554          break;
    555      }
    556      ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
    557      break;
    558 
    559    case VKI_SYS_CONNECT:
    560      /* int connect(int sockfd,
    561 	struct sockaddr *serv_addr, int addrlen ); */
    562      PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
    563      if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
    564          SET_STATUS_Failure( VKI_EFAULT );
    565          break;
    566      }
    567      ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
    568      break;
    569 
    570    case VKI_SYS_SETSOCKOPT:
    571      /* int setsockopt(int s, int level, int optname,
    572 	const void *optval, int optlen); */
    573      PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
    574      if (!ML_(valid_client_addr)(ARG2, 5*sizeof(Addr), tid, NULL)) {
    575          SET_STATUS_Failure( VKI_EFAULT );
    576          break;
    577      }
    578      ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
    579 				      ARG2_3, ARG2_4 );
    580      break;
    581 
    582    case VKI_SYS_GETSOCKOPT:
    583      /* int getsockopt(int s, int level, int optname,
    584 	void *optval, socklen_t *optlen); */
    585      PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
    586      if (!ML_(valid_client_addr)(ARG2, 5*sizeof(Addr), tid, NULL)) {
    587          SET_STATUS_Failure( VKI_EFAULT );
    588          break;
    589      }
    590      ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
    591 				      ARG2_3, ARG2_4 );
    592      break;
    593 
    594    case VKI_SYS_GETSOCKNAME:
    595      /* int getsockname(int s, struct sockaddr* name, int* namelen) */
    596      PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
    597      if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
    598          SET_STATUS_Failure( VKI_EFAULT );
    599          break;
    600      }
    601      ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
    602      break;
    603 
    604    case VKI_SYS_GETPEERNAME:
    605      /* int getpeername(int s, struct sockaddr* name, int* namelen) */
    606      PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
    607      if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
    608          SET_STATUS_Failure( VKI_EFAULT );
    609          break;
    610      }
    611      ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
    612      break;
    613 
    614    case VKI_SYS_SHUTDOWN:
    615      /* int shutdown(int s, int how); */
    616      PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
    617      if (!ML_(valid_client_addr)(ARG2, 2*sizeof(Addr), tid, NULL)) {
    618          SET_STATUS_Failure( VKI_EFAULT );
    619          break;
    620      }
    621      break;
    622 
    623    case VKI_SYS_SENDMSG: {
    624      /* int sendmsg(int s, const struct msghdr *msg, int flags); */
    625      PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
    626      if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
    627          SET_STATUS_Failure( VKI_EFAULT );
    628          break;
    629      }
    630      ML_(generic_PRE_sys_sendmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
    631      break;
    632    }
    633 
    634    case VKI_SYS_RECVMSG: {
    635      /* int recvmsg(int s, struct msghdr *msg, int flags); */
    636      PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
    637      if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
    638          SET_STATUS_Failure( VKI_EFAULT );
    639          break;
    640      }
    641      ML_(generic_PRE_sys_recvmsg)( tid, "msg2", (struct vki_msghdr *)ARG2_1 );
    642      break;
    643    }
    644 
    645    default:
    646      VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1);
    647      SET_STATUS_Failure( VKI_EINVAL );
    648      break;
    649    }
    650 #  undef ARG2_0
    651 #  undef ARG2_1
    652 #  undef ARG2_2
    653 #  undef ARG2_3
    654 #  undef ARG2_4
    655 #  undef ARG2_5
    656 }
    657 
    658 POST(sys_socketcall)
    659 {
    660 #  define ARG2_0  (((UWord*)ARG2)[0])
    661 #  define ARG2_1  (((UWord*)ARG2)[1])
    662 #  define ARG2_2  (((UWord*)ARG2)[2])
    663 #  define ARG2_3  (((UWord*)ARG2)[3])
    664 #  define ARG2_4  (((UWord*)ARG2)[4])
    665 #  define ARG2_5  (((UWord*)ARG2)[5])
    666 
    667   SysRes r;
    668   vg_assert(SUCCESS);
    669   switch (ARG1 /* request */) {
    670 
    671   case VKI_SYS_SOCKETPAIR:
    672     r = ML_(generic_POST_sys_socketpair)(
    673 					 tid, VG_(mk_SysRes_Success)(RES),
    674 					 ARG2_0, ARG2_1, ARG2_2, ARG2_3
    675 					 );
    676     SET_STATUS_from_SysRes(r);
    677     break;
    678 
    679   case VKI_SYS_SOCKET:
    680     r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
    681     SET_STATUS_from_SysRes(r);
    682     break;
    683 
    684   case VKI_SYS_BIND:
    685     /* int bind(int sockfd, struct sockaddr *my_addr,
    686        int addrlen); */
    687     break;
    688 
    689   case VKI_SYS_LISTEN:
    690     /* int listen(int s, int backlog); */
    691     break;
    692 
    693   case VKI_SYS_ACCEPT:
    694     /* int accept(int s, struct sockaddr *addr, int *addrlen); */
    695     r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
    696 				      ARG2_0, ARG2_1, ARG2_2 );
    697     SET_STATUS_from_SysRes(r);
    698     break;
    699 
    700   case VKI_SYS_SENDTO:
    701     break;
    702 
    703   case VKI_SYS_SEND:
    704     break;
    705 
    706   case VKI_SYS_RECVFROM:
    707     ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
    708 				    ARG2_0, ARG2_1, ARG2_2,
    709 				    ARG2_3, ARG2_4, ARG2_5 );
    710     break;
    711 
    712   case VKI_SYS_RECV:
    713     ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
    714     break;
    715 
    716   case VKI_SYS_CONNECT:
    717     break;
    718 
    719   case VKI_SYS_SETSOCKOPT:
    720     break;
    721 
    722   case VKI_SYS_GETSOCKOPT:
    723     ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
    724 				      ARG2_0, ARG2_1,
    725 				      ARG2_2, ARG2_3, ARG2_4 );
    726     break;
    727 
    728   case VKI_SYS_GETSOCKNAME:
    729     ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
    730 				       ARG2_0, ARG2_1, ARG2_2 );
    731     break;
    732 
    733   case VKI_SYS_GETPEERNAME:
    734     ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
    735 				       ARG2_0, ARG2_1, ARG2_2 );
    736     break;
    737 
    738   case VKI_SYS_SHUTDOWN:
    739     break;
    740 
    741   case VKI_SYS_SENDMSG:
    742     break;
    743 
    744   case VKI_SYS_RECVMSG:
    745     ML_(generic_POST_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1, RES );
    746     break;
    747 
    748   default:
    749     VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1);
    750     VG_(core_panic)("... bye!\n");
    751     break; /*NOTREACHED*/
    752   }
    753 #  undef ARG2_0
    754 #  undef ARG2_1
    755 #  undef ARG2_2
    756 #  undef ARG2_3
    757 #  undef ARG2_4
    758 #  undef ARG2_5
    759 }
    760 
    761 PRE(sys_mmap)
    762 {
    763    UWord a0, a1, a2, a3, a4, a5;
    764    SysRes r;
    765 
    766    UWord* args = (UWord*)ARG1;
    767    PRE_REG_READ1(long, "sys_mmap", struct mmap_arg_struct *, args);
    768    PRE_MEM_READ( "sys_mmap(args)", (Addr) args, 6*sizeof(UWord) );
    769 
    770    a0 = args[0];
    771    a1 = args[1];
    772    a2 = args[2];
    773    a3 = args[3];
    774    a4 = args[4];
    775    a5 = args[5];
    776 
    777    PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %ld, %ld )",
    778          a0, (ULong)a1, a2, a3, a4, a5 );
    779 
    780    r = ML_(generic_PRE_sys_mmap)( tid, a0, a1, a2, a3, a4, (Off64T)a5 );
    781    SET_STATUS_from_SysRes(r);
    782 }
    783 
    784 static Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
    785 {
    786    Addr* a_p = (Addr*)a;
    787    PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
    788    return *a_p;
    789 }
    790 
    791 PRE(sys_ipc)
    792 {
    793   PRINT("sys_ipc ( %ld, %ld, %ld, %ld, %#lx, %ld )",
    794         ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
    795   // XXX: this is simplistic -- some args are not used in all circumstances.
    796   PRE_REG_READ6(int, "ipc",
    797 		vki_uint, call, int, first, int, second, int, third,
    798 		void *, ptr, long, fifth)
    799 
    800     switch (ARG1 /* call */) {
    801     case VKI_SEMOP:
    802       ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
    803       *flags |= SfMayBlock;
    804       break;
    805     case VKI_SEMGET:
    806       break;
    807     case VKI_SEMCTL:
    808       {
    809 	UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
    810 	ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
    811 	break;
    812       }
    813     case VKI_SEMTIMEDOP:
    814       ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
    815       *flags |= SfMayBlock;
    816       break;
    817     case VKI_MSGSND:
    818       ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
    819       if ((ARG4 & VKI_IPC_NOWAIT) == 0)
    820 	*flags |= SfMayBlock;
    821       break;
    822     case VKI_MSGRCV:
    823       {
    824 	Addr msgp;
    825 	Word msgtyp;
    826 
    827 	msgp = deref_Addr( tid,
    828 			   (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
    829 			   "msgrcv(msgp)" );
    830 	msgtyp = deref_Addr( tid,
    831 			     (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
    832 			     "msgrcv(msgp)" );
    833 
    834 	ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
    835 
    836 	if ((ARG4 & VKI_IPC_NOWAIT) == 0)
    837 	  *flags |= SfMayBlock;
    838 	break;
    839       }
    840     case VKI_MSGGET:
    841       break;
    842     case VKI_MSGCTL:
    843       ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
    844       break;
    845     case VKI_SHMAT:
    846       {
    847 	UWord w;
    848 	PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
    849 	w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
    850 	if (w == 0)
    851 	  SET_STATUS_Failure( VKI_EINVAL );
    852 	else
    853 	  ARG5 = w;
    854 	break;
    855       }
    856     case VKI_SHMDT:
    857       if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
    858 	SET_STATUS_Failure( VKI_EINVAL );
    859       break;
    860     case VKI_SHMGET:
    861       break;
    862     case VKI_SHMCTL: /* IPCOP_shmctl */
    863       ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
    864       break;
    865     default:
    866       VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %ld", ARG1 );
    867       VG_(core_panic)("... bye!\n");
    868       break; /*NOTREACHED*/
    869     }
    870 }
    871 
    872 POST(sys_ipc)
    873 {
    874   vg_assert(SUCCESS);
    875   switch (ARG1 /* call */) {
    876   case VKI_SEMOP:
    877   case VKI_SEMGET:
    878     break;
    879   case VKI_SEMCTL:
    880     {
    881       UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
    882       ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
    883       break;
    884     }
    885   case VKI_SEMTIMEDOP:
    886   case VKI_MSGSND:
    887     break;
    888   case VKI_MSGRCV:
    889     {
    890       Addr msgp;
    891       Word msgtyp;
    892 
    893       msgp = deref_Addr( tid,
    894                          (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
    895                          "msgrcv(msgp)" );
    896       msgtyp = deref_Addr( tid,
    897                            (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
    898                            "msgrcv(msgp)" );
    899 
    900       ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
    901       break;
    902     }
    903   case VKI_MSGGET:
    904     break;
    905   case VKI_MSGCTL:
    906     ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
    907     break;
    908   case VKI_SHMAT:
    909     {
    910       Addr addr;
    911 
    912       /* force readability. before the syscall it is
    913        * indeed uninitialized, as can be seen in
    914        * glibc/sysdeps/unix/sysv/linux/shmat.c */
    915       POST_MEM_WRITE( ARG4, sizeof( Addr ) );
    916 
    917       addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
    918       ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
    919       break;
    920     }
    921   case VKI_SHMDT:
    922     ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
    923     break;
    924   case VKI_SHMGET:
    925     break;
    926   case VKI_SHMCTL:
    927     ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
    928     break;
    929   default:
    930     VG_(message)(Vg_DebugMsg,
    931 		 "FATAL: unhandled syscall(ipc) %ld",
    932 		 ARG1 );
    933     VG_(core_panic)("... bye!\n");
    934     break; /*NOTREACHED*/
    935   }
    936 }
    937 
    938 PRE(sys_clone)
    939 {
    940    UInt cloneflags;
    941 
    942    PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4, ARG5);
    943    PRE_REG_READ2(int, "clone",
    944                  void *,        child_stack,
    945                  unsigned long, flags);
    946 
    947    if (ARG2 & VKI_CLONE_PARENT_SETTID) {
    948       if (VG_(tdict).track_pre_reg_read)
    949          PRA3("clone(parent_tidptr)", int *, parent_tidptr);
    950       PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
    951       if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
    952                                              VKI_PROT_WRITE)) {
    953          SET_STATUS_Failure( VKI_EFAULT );
    954          return;
    955       }
    956    }
    957    if (ARG2 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
    958       if (VG_(tdict).track_pre_reg_read)
    959          PRA4("clone(child_tidptr)", int *, child_tidptr);
    960       PRE_MEM_WRITE("clone(child_tidptr)", ARG4, sizeof(Int));
    961       if (!VG_(am_is_valid_for_client)(ARG4, sizeof(Int),
    962                                              VKI_PROT_WRITE)) {
    963          SET_STATUS_Failure( VKI_EFAULT );
    964          return;
    965       }
    966    }
    967 
    968    /* The kernel simply copies reg6 (ARG5) into AR0 and AR1, no checks */
    969    if (ARG2 & VKI_CLONE_SETTLS) {
    970       if (VG_(tdict).track_pre_reg_read) {
    971          PRA5("clone", Addr, tlsinfo);
    972       }
    973    }
    974 
    975    cloneflags = ARG2;
    976 
    977    if (!ML_(client_signal_OK)(ARG2 & VKI_CSIGNAL)) {
    978       SET_STATUS_Failure( VKI_EINVAL );
    979       return;
    980    }
    981 
    982    /* Only look at the flags we really care about */
    983    switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
    984                          | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
    985    case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
    986       /* thread creation */
    987       SET_STATUS_from_SysRes(
    988          do_clone(tid,
    989                   (Addr)ARG1,   /* child SP */
    990                   ARG2,         /* flags */
    991                   (Int *)ARG3,  /* parent_tidptr */
    992                   (Int *)ARG4, /* child_tidptr */
    993                   (Addr)ARG5)); /*  tlsaddr */
    994       break;
    995 
    996    case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
    997       /* FALLTHROUGH - assume vfork == fork */
    998       cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
    999 
   1000    case 0: /* plain fork */
   1001       SET_STATUS_from_SysRes(
   1002          ML_(do_fork_clone)(tid,
   1003                        cloneflags,      /* flags */
   1004                        (Int *)ARG3,     /* parent_tidptr */
   1005                        (Int *)ARG4));   /* child_tidptr */
   1006       break;
   1007 
   1008    default:
   1009       /* should we just ENOSYS? */
   1010       VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx", ARG2);
   1011       VG_(message)(Vg_UserMsg, "");
   1012       VG_(message)(Vg_UserMsg, "The only supported clone() uses are:");
   1013       VG_(message)(Vg_UserMsg, " - via a threads library (NPTL)");
   1014       VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork");
   1015       VG_(unimplemented)
   1016          ("Valgrind does not support general clone().");
   1017    }
   1018 
   1019    if (SUCCESS) {
   1020       if (ARG2 & VKI_CLONE_PARENT_SETTID)
   1021          POST_MEM_WRITE(ARG3, sizeof(Int));
   1022       if (ARG2 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
   1023          POST_MEM_WRITE(ARG4, sizeof(Int));
   1024 
   1025       /* Thread creation was successful; let the child have the chance
   1026          to run */
   1027       *flags |= SfYieldAfter;
   1028    }
   1029 }
   1030 
   1031 PRE(sys_sigreturn)
   1032 {
   1033    ThreadState* tst;
   1034    PRINT("sys_sigreturn ( )");
   1035 
   1036    vg_assert(VG_(is_valid_tid)(tid));
   1037    vg_assert(tid >= 1 && tid < VG_N_THREADS);
   1038    vg_assert(VG_(is_running_thread)(tid));
   1039 
   1040    tst = VG_(get_ThreadState)(tid);
   1041 
   1042    /* This is only so that the IA is (might be) useful to report if
   1043       something goes wrong in the sigreturn */
   1044    ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
   1045 
   1046    /* Restore register state from frame and remove it */
   1047    VG_(sigframe_destroy)(tid, False);
   1048 
   1049    /* Tell the driver not to update the guest state with the "result",
   1050       and set a bogus result to keep it happy. */
   1051    *flags |= SfNoWriteResult;
   1052    SET_STATUS_Success(0);
   1053 
   1054    /* Check to see if any signals arose as a result of this. */
   1055    *flags |= SfPollAfter;
   1056 }
   1057 
   1058 
   1059 PRE(sys_rt_sigreturn)
   1060 {
   1061    /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
   1062       an explanation of what follows. */
   1063 
   1064    ThreadState* tst;
   1065    PRINT("sys_rt_sigreturn ( )");
   1066 
   1067    vg_assert(VG_(is_valid_tid)(tid));
   1068    vg_assert(tid >= 1 && tid < VG_N_THREADS);
   1069    vg_assert(VG_(is_running_thread)(tid));
   1070 
   1071    tst = VG_(get_ThreadState)(tid);
   1072 
   1073    /* This is only so that the IA is (might be) useful to report if
   1074       something goes wrong in the sigreturn */
   1075    ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
   1076 
   1077    /* Restore register state from frame and remove it */
   1078    VG_(sigframe_destroy)(tid, True);
   1079 
   1080    /* Tell the driver not to update the guest state with the "result",
   1081       and set a bogus result to keep it happy. */
   1082    *flags |= SfNoWriteResult;
   1083    SET_STATUS_Success(0);
   1084 
   1085    /* Check to see if any signals arose as a result of this. */
   1086    *flags |= SfPollAfter;
   1087 }
   1088 
   1089 /* we cant use the LINX_ version for 64 bit */
   1090 PRE(sys_fadvise64)
   1091 {
   1092    PRINT("sys_fadvise64 ( %ld, %ld, %ld, %ld )", ARG1,ARG2,ARG3,ARG4);
   1093    PRE_REG_READ4(long, "fadvise64",
   1094                  int, fd, vki_loff_t, offset, vki_loff_t, len, int, advice);
   1095 }
   1096 
   1097 #undef PRE
   1098 #undef POST
   1099 
   1100 /* ---------------------------------------------------------------------
   1101    The s390x/Linux syscall table
   1102    ------------------------------------------------------------------ */
   1103 
   1104 /* Add an s390x-linux specific wrapper to a syscall table. */
   1105 #define PLAX_(sysno, name)    WRAPPER_ENTRY_X_(s390x_linux, sysno, name)
   1106 #define PLAXY(sysno, name)    WRAPPER_ENTRY_XY(s390x_linux, sysno, name)
   1107 
   1108 // This table maps from __NR_xxx syscall numbers from
   1109 // linux/arch/s390/kernel/syscalls.S to the appropriate PRE/POST sys_foo()
   1110 // wrappers on s390x. There are several unused numbers, which are only
   1111 // defined on s390 (31bit mode) but no longer available on s390x (64 bit).
   1112 // For those syscalls not handled by Valgrind, the annotation indicate its
   1113 // arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
   1114 // (unknown).
   1115 
   1116 static SyscallTableEntry syscall_table[] = {
   1117    GENX_(0, sys_ni_syscall), /* unimplemented (by the kernel) */      // 0
   1118    GENX_(__NR_exit,  sys_exit),                                       // 1
   1119    GENX_(__NR_fork,  sys_fork),                                       // 2
   1120    GENXY(__NR_read,  sys_read),                                       // 3
   1121    GENX_(__NR_write,  sys_write),                                     // 4
   1122 
   1123    GENXY(__NR_open,  sys_open),                                       // 5
   1124    GENXY(__NR_close,  sys_close),                                     // 6
   1125 // ?????(__NR_restart_syscall, ),                                     // 7
   1126    GENXY(__NR_creat,  sys_creat),                                     // 8
   1127    GENX_(__NR_link,  sys_link),                                       // 9
   1128 
   1129    GENX_(__NR_unlink,  sys_unlink),                                   // 10
   1130    GENX_(__NR_execve,  sys_execve),                                   // 11
   1131    GENX_(__NR_chdir,  sys_chdir),                                     // 12
   1132    GENX_(13, sys_ni_syscall), /* unimplemented (by the kernel) */     // 13
   1133    GENX_(__NR_mknod,  sys_mknod),                                     // 14
   1134 
   1135    GENX_(__NR_chmod,  sys_chmod),                                     // 15
   1136    GENX_(16, sys_ni_syscall), /* unimplemented (by the kernel) */     // 16
   1137    GENX_(17, sys_ni_syscall), /* unimplemented (by the kernel) */     // 17
   1138    GENX_(18, sys_ni_syscall), /* unimplemented (by the kernel) */     // 18
   1139    LINX_(__NR_lseek,  sys_lseek),                                     // 19
   1140 
   1141    GENX_(__NR_getpid,  sys_getpid),                                   // 20
   1142    LINX_(__NR_mount,  sys_mount),                                     // 21
   1143    LINX_(__NR_umount, sys_oldumount),                                 // 22
   1144    GENX_(23, sys_ni_syscall), /* unimplemented (by the kernel) */     // 23
   1145    GENX_(24, sys_ni_syscall), /* unimplemented (by the kernel) */     // 24
   1146 
   1147    GENX_(25, sys_ni_syscall), /* unimplemented (by the kernel) */     // 25
   1148    PLAXY(__NR_ptrace, sys_ptrace),                                    // 26
   1149    GENX_(__NR_alarm,  sys_alarm),                                     // 27
   1150    GENX_(28, sys_ni_syscall), /* unimplemented (by the kernel) */     // 28
   1151    GENX_(__NR_pause,  sys_pause),                                     // 29
   1152 
   1153    LINX_(__NR_utime,  sys_utime),                                     // 30
   1154    GENX_(31, sys_ni_syscall), /* unimplemented (by the kernel) */     // 31
   1155    GENX_(32, sys_ni_syscall), /* unimplemented (by the kernel) */     // 32
   1156    GENX_(__NR_access,  sys_access),                                   // 33
   1157    GENX_(__NR_nice, sys_nice),                                        // 34
   1158 
   1159    GENX_(35, sys_ni_syscall), /* unimplemented (by the kernel) */     // 35
   1160    GENX_(__NR_sync, sys_sync),                                        // 36
   1161    GENX_(__NR_kill,  sys_kill),                                       // 37
   1162    GENX_(__NR_rename,  sys_rename),                                   // 38
   1163    GENX_(__NR_mkdir,  sys_mkdir),                                     // 39
   1164 
   1165    GENX_(__NR_rmdir, sys_rmdir),                                      // 40
   1166    GENXY(__NR_dup,  sys_dup),                                         // 41
   1167    LINXY(__NR_pipe,  sys_pipe),                                       // 42
   1168    GENXY(__NR_times,  sys_times),                                     // 43
   1169    GENX_(44, sys_ni_syscall), /* unimplemented (by the kernel) */     // 44
   1170 
   1171    GENX_(__NR_brk,  sys_brk),                                         // 45
   1172    GENX_(46, sys_ni_syscall), /* unimplemented (by the kernel) */     // 46
   1173    GENX_(47, sys_ni_syscall), /* unimplemented (by the kernel) */     // 47
   1174 // ?????(__NR_signal, ),                                              // 48
   1175    GENX_(49, sys_ni_syscall), /* unimplemented (by the kernel) */     // 49
   1176 
   1177    GENX_(50, sys_ni_syscall), /* unimplemented (by the kernel) */     // 50
   1178    GENX_(__NR_acct, sys_acct),                                        // 51
   1179    LINX_(__NR_umount2, sys_umount),                                   // 52
   1180    GENX_(53, sys_ni_syscall), /* unimplemented (by the kernel) */     // 53
   1181    LINXY(__NR_ioctl,  sys_ioctl),                                     // 54
   1182 
   1183    LINXY(__NR_fcntl,  sys_fcntl),                                     // 55
   1184    GENX_(56, sys_ni_syscall), /* unimplemented (by the kernel) */     // 56
   1185    GENX_(__NR_setpgid,  sys_setpgid),                                 // 57
   1186    GENX_(58, sys_ni_syscall), /* unimplemented (by the kernel) */     // 58
   1187    GENX_(59, sys_ni_syscall), /* unimplemented (by the kernel) */     // 59
   1188 
   1189    GENX_(__NR_umask,  sys_umask),                                     // 60
   1190    GENX_(__NR_chroot,  sys_chroot),                                   // 61
   1191 // ?????(__NR_ustat, sys_ustat), /* deprecated in favor of statfs */  // 62
   1192    GENXY(__NR_dup2,  sys_dup2),                                       // 63
   1193    GENX_(__NR_getppid,  sys_getppid),                                 // 64
   1194 
   1195    GENX_(__NR_getpgrp,  sys_getpgrp),                                 // 65
   1196    GENX_(__NR_setsid,  sys_setsid),                                   // 66
   1197 // ?????(__NR_sigaction, ),   /* userspace uses rt_sigaction */       // 67
   1198    GENX_(68, sys_ni_syscall), /* unimplemented (by the kernel) */     // 68
   1199    GENX_(69, sys_ni_syscall), /* unimplemented (by the kernel) */     // 69
   1200 
   1201    GENX_(70, sys_ni_syscall), /* unimplemented (by the kernel) */     // 70
   1202    GENX_(71, sys_ni_syscall), /* unimplemented (by the kernel) */     // 71
   1203 // ?????(__NR_sigsuspend, ),                                          // 72
   1204 // ?????(__NR_sigpending, ),                                          // 73
   1205 // ?????(__NR_sethostname, ),                                         // 74
   1206 
   1207    GENX_(__NR_setrlimit,  sys_setrlimit),                             // 75
   1208    GENXY(76,  sys_getrlimit), /* see also 191 */                      // 76
   1209    GENXY(__NR_getrusage,  sys_getrusage),                             // 77
   1210    GENXY(__NR_gettimeofday,  sys_gettimeofday),                       // 78
   1211    GENX_(__NR_settimeofday, sys_settimeofday),                        // 79
   1212 
   1213    GENX_(80, sys_ni_syscall), /* unimplemented (by the kernel) */     // 80
   1214    GENX_(81, sys_ni_syscall), /* unimplemented (by the kernel) */     // 81
   1215    GENX_(82, sys_ni_syscall), /* unimplemented (by the kernel) */     // 82
   1216    GENX_(__NR_symlink,  sys_symlink),                                 // 83
   1217    GENX_(84, sys_ni_syscall), /* unimplemented (by the kernel) */     // 84
   1218 
   1219    GENX_(__NR_readlink,  sys_readlink),                               // 85
   1220 // ?????(__NR_uselib, ),                                              // 86
   1221 // ?????(__NR_swapon, ),                                              // 87
   1222 // ?????(__NR_reboot, ),                                              // 88
   1223    GENX_(89, sys_ni_syscall), /* unimplemented (by the kernel) */     // 89
   1224 
   1225    PLAX_(__NR_mmap, sys_mmap ),                                       // 90
   1226    GENXY(__NR_munmap,  sys_munmap),                                   // 91
   1227    GENX_(__NR_truncate,  sys_truncate),                               // 92
   1228    GENX_(__NR_ftruncate,  sys_ftruncate),                             // 93
   1229    GENX_(__NR_fchmod,  sys_fchmod),                                   // 94
   1230 
   1231    GENX_(95, sys_ni_syscall), /* unimplemented (by the kernel) */     // 95
   1232    GENX_(__NR_getpriority, sys_getpriority),                          // 96
   1233    GENX_(__NR_setpriority, sys_setpriority),                          // 97
   1234    GENX_(98, sys_ni_syscall), /* unimplemented (by the kernel) */     // 98
   1235    GENXY(__NR_statfs,  sys_statfs),                                   // 99
   1236 
   1237    GENXY(__NR_fstatfs,  sys_fstatfs),                                 // 100
   1238    GENX_(101, sys_ni_syscall), /* unimplemented (by the kernel) */    // 101
   1239    PLAXY(__NR_socketcall, sys_socketcall),                            // 102
   1240    LINXY(__NR_syslog,  sys_syslog),                                   // 103
   1241    GENXY(__NR_setitimer,  sys_setitimer),                             // 104
   1242 
   1243    GENXY(__NR_getitimer,  sys_getitimer),                             // 105
   1244    GENXY(__NR_stat, sys_newstat),                                     // 106
   1245    GENXY(__NR_lstat, sys_newlstat),                                   // 107
   1246    GENXY(__NR_fstat, sys_newfstat),                                   // 108
   1247    GENX_(109, sys_ni_syscall), /* unimplemented (by the kernel) */    // 109
   1248 
   1249    LINXY(__NR_lookup_dcookie, sys_lookup_dcookie),                    // 110
   1250    LINX_(__NR_vhangup, sys_vhangup),                                  // 111
   1251    GENX_(112, sys_ni_syscall), /* unimplemented (by the kernel) */    // 112
   1252    GENX_(113, sys_ni_syscall), /* unimplemented (by the kernel) */    // 113
   1253    GENXY(__NR_wait4,  sys_wait4),                                     // 114
   1254 
   1255 // ?????(__NR_swapoff, ),                                             // 115
   1256    LINXY(__NR_sysinfo,  sys_sysinfo),                                 // 116
   1257    PLAXY(__NR_ipc, sys_ipc),                                          // 117
   1258    GENX_(__NR_fsync,  sys_fsync),                                     // 118
   1259    PLAX_(__NR_sigreturn, sys_sigreturn),                              // 119
   1260 
   1261    PLAX_(__NR_clone,  sys_clone),                                     // 120
   1262 // ?????(__NR_setdomainname, ),                                       // 121
   1263    GENXY(__NR_uname, sys_newuname),                                   // 122
   1264    GENX_(123, sys_ni_syscall), /* unimplemented (by the kernel) */    // 123
   1265 // ?????(__NR_adjtimex, ),                                            // 124
   1266 
   1267    GENXY(__NR_mprotect,  sys_mprotect),                               // 125
   1268 // LINXY(__NR_sigprocmask, sys_sigprocmask),                          // 126
   1269    GENX_(127, sys_ni_syscall), /* unimplemented (by the kernel) */    // 127
   1270    LINX_(__NR_init_module,  sys_init_module),                         // 128
   1271    LINX_(__NR_delete_module,  sys_delete_module),                     // 129
   1272 
   1273    GENX_(130, sys_ni_syscall), /* unimplemented (by the kernel) */    // 130
   1274    LINX_(__NR_quotactl, sys_quotactl),                                // 131
   1275    GENX_(__NR_getpgid,  sys_getpgid),                                 // 132
   1276    GENX_(__NR_fchdir,  sys_fchdir),                                   // 133
   1277 // ?????(__NR_bdflush, ),                                             // 134
   1278 
   1279 // ?????(__NR_sysfs, ),                                               // 135
   1280    LINX_(__NR_personality, sys_personality),                          // 136
   1281    GENX_(137, sys_ni_syscall), /* unimplemented (by the kernel) */    // 137
   1282    GENX_(138, sys_ni_syscall), /* unimplemented (by the kernel) */    // 138
   1283    GENX_(139, sys_ni_syscall), /* unimplemented (by the kernel) */    // 139
   1284 
   1285 // LINXY(__NR__llseek, sys_llseek), /* 64 bit --> lseek */            // 140
   1286    GENXY(__NR_getdents,  sys_getdents),                               // 141
   1287    GENX_(__NR_select, sys_select),                                    // 142
   1288    GENX_(__NR_flock,  sys_flock),                                     // 143
   1289    GENX_(__NR_msync,  sys_msync),                                     // 144
   1290 
   1291    GENXY(__NR_readv,  sys_readv),                                     // 145
   1292    GENX_(__NR_writev,  sys_writev),                                   // 146
   1293    GENX_(__NR_getsid, sys_getsid),                                    // 147
   1294    GENX_(__NR_fdatasync,  sys_fdatasync),                             // 148
   1295    LINXY(__NR__sysctl, sys_sysctl),                                   // 149
   1296 
   1297    GENX_(__NR_mlock,  sys_mlock),                                     // 150
   1298    GENX_(__NR_munlock,  sys_munlock),                                 // 151
   1299    GENX_(__NR_mlockall,  sys_mlockall),                               // 152
   1300    LINX_(__NR_munlockall,  sys_munlockall),                           // 153
   1301    LINXY(__NR_sched_setparam,  sys_sched_setparam),                   // 154
   1302 
   1303    LINXY(__NR_sched_getparam,  sys_sched_getparam),                   // 155
   1304    LINX_(__NR_sched_setscheduler,  sys_sched_setscheduler),           // 156
   1305    LINX_(__NR_sched_getscheduler,  sys_sched_getscheduler),           // 157
   1306    LINX_(__NR_sched_yield,  sys_sched_yield),                         // 158
   1307    LINX_(__NR_sched_get_priority_max,  sys_sched_get_priority_max),   // 159
   1308 
   1309    LINX_(__NR_sched_get_priority_min,  sys_sched_get_priority_min),   // 160
   1310 // ?????(__NR_sched_rr_get_interval, ),                               // 161
   1311    GENXY(__NR_nanosleep,  sys_nanosleep),                             // 162
   1312    GENX_(__NR_mremap,  sys_mremap),                                   // 163
   1313    GENX_(164, sys_ni_syscall), /* unimplemented (by the kernel) */    // 164
   1314 
   1315    GENX_(165, sys_ni_syscall), /* unimplemented (by the kernel) */    // 165
   1316    GENX_(166, sys_ni_syscall), /* unimplemented (by the kernel) */    // 166
   1317    GENX_(167, sys_ni_syscall), /* unimplemented (by the kernel) */    // 167
   1318    GENXY(__NR_poll,  sys_poll),                                       // 168
   1319 // ?????(__NR_nfsservctl, ),                                          // 169
   1320 
   1321    GENX_(170, sys_ni_syscall), /* unimplemented (by the kernel) */    // 170
   1322    GENX_(171, sys_ni_syscall), /* unimplemented (by the kernel) */    // 171
   1323    LINXY(__NR_prctl, sys_prctl),                                      // 172
   1324    PLAX_(__NR_rt_sigreturn,  sys_rt_sigreturn),                       // 173
   1325    LINXY(__NR_rt_sigaction,  sys_rt_sigaction),                       // 174
   1326 
   1327    LINXY(__NR_rt_sigprocmask,  sys_rt_sigprocmask),                   // 175
   1328    LINXY(__NR_rt_sigpending, sys_rt_sigpending),                      // 176
   1329    LINXY(__NR_rt_sigtimedwait,  sys_rt_sigtimedwait),                 // 177
   1330    LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),                  // 178
   1331    LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend),                      // 179
   1332 
   1333    GENXY(__NR_pread64,  sys_pread64),                                 // 180
   1334    GENX_(__NR_pwrite64, sys_pwrite64),                                // 181
   1335    GENX_(182, sys_ni_syscall), /* unimplemented (by the kernel) */    // 182
   1336    GENXY(__NR_getcwd,  sys_getcwd),                                   // 183
   1337    LINXY(__NR_capget,  sys_capget),                                   // 184
   1338 
   1339    LINX_(__NR_capset,  sys_capset),                                   // 185
   1340    GENXY(__NR_sigaltstack,  sys_sigaltstack),                         // 186
   1341    LINXY(__NR_sendfile, sys_sendfile),                                // 187
   1342    GENX_(188, sys_ni_syscall), /* unimplemented (by the kernel) */    // 188
   1343    GENX_(189, sys_ni_syscall), /* unimplemented (by the kernel) */    // 189
   1344 
   1345    GENX_(__NR_vfork,  sys_fork),                                      // 190
   1346    GENXY(__NR_getrlimit,  sys_getrlimit),                             // 191
   1347    GENX_(192, sys_ni_syscall), /* not exported on 64bit*/             // 192
   1348    GENX_(193, sys_ni_syscall), /* unimplemented (by the kernel) */    // 193
   1349    GENX_(194, sys_ni_syscall), /* unimplemented (by the kernel) */    // 194
   1350 
   1351    GENX_(195, sys_ni_syscall), /* unimplemented (by the kernel) */    // 195
   1352    GENX_(196, sys_ni_syscall), /* unimplemented (by the kernel) */    // 196
   1353    GENX_(197, sys_ni_syscall), /* unimplemented (by the kernel) */    // 197
   1354    GENX_(__NR_lchown, sys_lchown),                                    // 198
   1355    GENX_(__NR_getuid, sys_getuid),                                    // 199
   1356 
   1357    GENX_(__NR_getgid, sys_getgid),                                    // 200
   1358    GENX_(__NR_geteuid, sys_geteuid),                                  // 201
   1359    GENX_(__NR_getegid, sys_getegid),                                  // 202
   1360    GENX_(__NR_setreuid, sys_setreuid),                                // 203
   1361    GENX_(__NR_setregid, sys_setregid),                                // 204
   1362 
   1363    GENXY(__NR_getgroups, sys_getgroups),                              // 205
   1364    GENX_(__NR_setgroups, sys_setgroups),                              // 206
   1365    GENX_(__NR_fchown, sys_fchown),                                    // 207
   1366    LINX_(__NR_setresuid, sys_setresuid),                              // 208
   1367    LINXY(__NR_getresuid, sys_getresuid),                              // 209
   1368 
   1369    LINX_(__NR_setresgid, sys_setresgid),                              // 210
   1370    LINXY(__NR_getresgid, sys_getresgid),                              // 211
   1371    GENX_(__NR_chown, sys_chown),                                      // 212
   1372    GENX_(__NR_setuid, sys_setuid),                                    // 213
   1373    GENX_(__NR_setgid, sys_setgid),                                    // 214
   1374 
   1375    LINX_(__NR_setfsuid, sys_setfsuid),                                // 215
   1376    LINX_(__NR_setfsgid, sys_setfsgid),                                // 216
   1377 // ?????(__NR_pivot_root, ),
   1378    GENXY(__NR_mincore, sys_mincore),                                  // 218
   1379    GENX_(__NR_madvise,  sys_madvise),                                 // 219
   1380 
   1381    GENXY(__NR_getdents64,  sys_getdents64),                           // 220
   1382    GENX_(221, sys_ni_syscall), /* unimplemented (by the kernel) */    // 221
   1383    LINX_(__NR_readahead, sys_readahead),                              // 222
   1384    GENX_(223, sys_ni_syscall), /* unimplemented (by the kernel) */    // 223
   1385    LINX_(__NR_setxattr, sys_setxattr),                                // 224
   1386 
   1387    LINX_(__NR_lsetxattr, sys_lsetxattr),                              // 225
   1388    LINX_(__NR_fsetxattr, sys_fsetxattr),                              // 226
   1389    LINXY(__NR_getxattr,  sys_getxattr),                               // 227
   1390    LINXY(__NR_lgetxattr,  sys_lgetxattr),                             // 228
   1391    LINXY(__NR_fgetxattr,  sys_fgetxattr),                             // 229
   1392 
   1393    LINXY(__NR_listxattr,  sys_listxattr),                             // 230
   1394    LINXY(__NR_llistxattr,  sys_llistxattr),                           // 231
   1395    LINXY(__NR_flistxattr,  sys_flistxattr),                           // 232
   1396    LINX_(__NR_removexattr,  sys_removexattr),                         // 233
   1397    LINX_(__NR_lremovexattr,  sys_lremovexattr),                       // 234
   1398 
   1399    LINX_(__NR_fremovexattr,  sys_fremovexattr),                       // 235
   1400    LINX_(__NR_gettid,  sys_gettid),                                   // 236
   1401    LINXY(__NR_tkill, sys_tkill),                                      // 237
   1402    LINXY(__NR_futex,  sys_futex),                                     // 238
   1403    LINX_(__NR_sched_setaffinity,  sys_sched_setaffinity),             // 239
   1404 
   1405    LINXY(__NR_sched_getaffinity,  sys_sched_getaffinity),             // 240
   1406    LINXY(__NR_tgkill, sys_tgkill),                                    // 241
   1407    GENX_(242, sys_ni_syscall), /* unimplemented (by the kernel) */    // 242
   1408    LINXY(__NR_io_setup, sys_io_setup),                                // 243
   1409    LINX_(__NR_io_destroy,  sys_io_destroy),                           // 244
   1410 
   1411    LINXY(__NR_io_getevents,  sys_io_getevents),                       // 245
   1412    LINX_(__NR_io_submit,  sys_io_submit),                             // 246
   1413    LINXY(__NR_io_cancel,  sys_io_cancel),                             // 247
   1414    LINX_(__NR_exit_group,  sys_exit_group),                           // 248
   1415    LINXY(__NR_epoll_create,  sys_epoll_create),                       // 249
   1416 
   1417    LINX_(__NR_epoll_ctl,  sys_epoll_ctl),                             // 250
   1418    LINXY(__NR_epoll_wait,  sys_epoll_wait),                           // 251
   1419    LINX_(__NR_set_tid_address,  sys_set_tid_address),                 // 252
   1420    PLAX_(__NR_fadvise64, sys_fadvise64),                              // 253
   1421    LINXY(__NR_timer_create,  sys_timer_create),                       // 254
   1422 
   1423    LINXY(__NR_timer_settime,  sys_timer_settime),                     // 255
   1424    LINXY(__NR_timer_gettime,  sys_timer_gettime),                     // 256
   1425    LINX_(__NR_timer_getoverrun,  sys_timer_getoverrun),               // 257
   1426    LINX_(__NR_timer_delete,  sys_timer_delete),                       // 258
   1427    LINX_(__NR_clock_settime,  sys_clock_settime),                     // 259
   1428 
   1429    LINXY(__NR_clock_gettime,  sys_clock_gettime),                     // 260
   1430    LINXY(__NR_clock_getres,  sys_clock_getres),                       // 261
   1431    LINXY(__NR_clock_nanosleep,  sys_clock_nanosleep),                 // 262
   1432    GENX_(263, sys_ni_syscall), /* unimplemented (by the kernel) */    // 263
   1433    GENX_(264, sys_ni_syscall), /* unimplemented (by the kernel) */    // 264
   1434 
   1435    GENXY(__NR_statfs64, sys_statfs64),                                // 265
   1436    GENXY(__NR_fstatfs64, sys_fstatfs64),                              // 266
   1437 // ?????(__NR_remap_file_pages, ),
   1438    GENX_(268, sys_ni_syscall), /* unimplemented (by the kernel) */    // 268
   1439    GENX_(269, sys_ni_syscall), /* unimplemented (by the kernel) */    // 269
   1440 
   1441    GENX_(270, sys_ni_syscall), /* unimplemented (by the kernel) */    // 270
   1442    LINXY(__NR_mq_open,  sys_mq_open),                                 // 271
   1443    LINX_(__NR_mq_unlink,  sys_mq_unlink),                             // 272
   1444    LINX_(__NR_mq_timedsend,  sys_mq_timedsend),                       // 273
   1445    LINXY(__NR_mq_timedreceive, sys_mq_timedreceive),                  // 274
   1446 
   1447    LINX_(__NR_mq_notify,  sys_mq_notify),                             // 275
   1448    LINXY(__NR_mq_getsetattr,  sys_mq_getsetattr),                     // 276
   1449 // ?????(__NR_kexec_load, ),
   1450    LINX_(__NR_add_key,  sys_add_key),                                 // 278
   1451    LINX_(__NR_request_key,  sys_request_key),                         // 279
   1452 
   1453    LINXY(__NR_keyctl,  sys_keyctl),                                   // 280
   1454    LINXY(__NR_waitid, sys_waitid),                                    // 281
   1455    LINX_(__NR_ioprio_set,  sys_ioprio_set),                           // 282
   1456    LINX_(__NR_ioprio_get,  sys_ioprio_get),                           // 283
   1457    LINX_(__NR_inotify_init,  sys_inotify_init),                       // 284
   1458 
   1459    LINX_(__NR_inotify_add_watch,  sys_inotify_add_watch),             // 285
   1460    LINX_(__NR_inotify_rm_watch,  sys_inotify_rm_watch),               // 286
   1461    GENX_(287, sys_ni_syscall), /* unimplemented (by the kernel) */    // 287
   1462    LINXY(__NR_openat,  sys_openat),                                   // 288
   1463    LINX_(__NR_mkdirat,  sys_mkdirat),                                 // 289
   1464 
   1465    LINX_(__NR_mknodat,  sys_mknodat),                                 // 290
   1466    LINX_(__NR_fchownat,  sys_fchownat),                               // 291
   1467    LINX_(__NR_futimesat,  sys_futimesat),                             // 292
   1468    LINXY(__NR_newfstatat, sys_newfstatat),                            // 293
   1469    LINX_(__NR_unlinkat,  sys_unlinkat),                               // 294
   1470 
   1471    LINX_(__NR_renameat,  sys_renameat),                               // 295
   1472    LINX_(__NR_linkat,  sys_linkat),                                   // 296
   1473    LINX_(__NR_symlinkat,  sys_symlinkat),                             // 297
   1474    LINX_(__NR_readlinkat,  sys_readlinkat),                           // 298
   1475    LINX_(__NR_fchmodat,  sys_fchmodat),                               // 299
   1476 
   1477    LINX_(__NR_faccessat,  sys_faccessat),                             // 300
   1478    LINX_(__NR_pselect6, sys_pselect6),                                // 301
   1479    LINXY(__NR_ppoll, sys_ppoll),                                      // 302
   1480 // ?????(__NR_unshare, ),
   1481    LINX_(__NR_set_robust_list,  sys_set_robust_list),                 // 304
   1482 
   1483    LINXY(__NR_get_robust_list,  sys_get_robust_list),                 // 305
   1484 // ?????(__NR_splice, ),
   1485    LINX_(__NR_sync_file_range, sys_sync_file_range),                  // 307
   1486 // ?????(__NR_tee, ),
   1487 // ?????(__NR_vmsplice, ),
   1488 
   1489    GENX_(310, sys_ni_syscall), /* unimplemented (by the kernel) */    // 310
   1490 // ?????(__NR_getcpu, ),
   1491    LINXY(__NR_epoll_pwait,  sys_epoll_pwait),                         // 312
   1492    GENX_(__NR_utimes, sys_utimes),                                    // 313
   1493    LINX_(__NR_fallocate, sys_fallocate),                              // 314
   1494 
   1495    LINX_(__NR_utimensat,  sys_utimensat),                             // 315
   1496    LINXY(__NR_signalfd,  sys_signalfd),                               // 316
   1497    GENX_(317, sys_ni_syscall), /* unimplemented (by the kernel) */    // 317
   1498    LINX_(__NR_eventfd,  sys_eventfd),                                 // 318
   1499    LINXY(__NR_timerfd_create,  sys_timerfd_create),                   // 319
   1500 
   1501    LINXY(__NR_timerfd_settime,  sys_timerfd_settime),                 // 320
   1502    LINXY(__NR_timerfd_gettime,  sys_timerfd_gettime),                 // 321
   1503    LINXY(__NR_signalfd4,  sys_signalfd4),                             // 322
   1504    LINX_(__NR_eventfd2,  sys_eventfd2),                               // 323
   1505    LINXY(__NR_inotify_init1,  sys_inotify_init1),                     // 324
   1506 
   1507    LINXY(__NR_pipe2,  sys_pipe2),                                     // 325
   1508    // (__NR_dup3,  ),
   1509    LINXY(__NR_epoll_create1,  sys_epoll_create1),                     // 327
   1510    LINXY(__NR_preadv, sys_preadv),                                    // 328
   1511    LINX_(__NR_pwritev, sys_pwritev),                                  // 329
   1512 
   1513 // ?????(__NR_rt_tgsigqueueinfo, ),
   1514    LINXY(__NR_perf_event_open, sys_perf_event_open),                  // 331
   1515 // ?????(__NR_fanotify_init, ),                                       // 332
   1516 // ?????(__NR_fanotify_mark, ),                                       // 333
   1517    LINXY(__NR_prlimit64, sys_prlimit64),                              // 334
   1518 // ?????(__NR_name_to_handle_at, ),                                   // 335
   1519 // ?????(__NR_open_by_handle_at, ),                                   // 336
   1520 // ?????(__NR_clock_adjtime, ),                                       // 337
   1521 // ?????(__NR_syncfs, ),                                              // 338
   1522 // ?????(__NR_setns, ),                                               // 339
   1523    LINXY(__NR_process_vm_readv, sys_process_vm_readv),                // 340
   1524    LINX_(__NR_process_vm_writev, sys_process_vm_writev),              // 341
   1525 };
   1526 
   1527 SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
   1528 {
   1529    const UInt syscall_table_size
   1530       = sizeof(syscall_table) / sizeof(syscall_table[0]);
   1531 
   1532    /* Is it in the contiguous initial section of the table? */
   1533    if (sysno < syscall_table_size) {
   1534       SyscallTableEntry* sys = &syscall_table[sysno];
   1535       if (sys->before == NULL)
   1536          return NULL; /* no entry */
   1537       else
   1538          return sys;
   1539    }
   1540 
   1541    /* Can't find a wrapper */
   1542    return NULL;
   1543 }
   1544 
   1545 #endif
   1546 
   1547 /*--------------------------------------------------------------------*/
   1548 /*--- end                                                          ---*/
   1549 /*--------------------------------------------------------------------*/
   1550