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-2013
     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*   tls address   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   *parent_tid,
    147                                      Int   *child_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, parent_tidptr, child_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_mmap);
    343 DECL_TEMPLATE(s390x_linux, sys_clone);
    344 DECL_TEMPLATE(s390x_linux, sys_sigreturn);
    345 DECL_TEMPLATE(s390x_linux, sys_rt_sigreturn);
    346 DECL_TEMPLATE(s390x_linux, sys_fadvise64);
    347 
    348 /* PEEK TEXT,DATA and USER are common to all architectures.
    349    PEEKUSR_AREA and POKEUSR_AREA are special, having a memory area
    350    containing the real addr, data, and len field pointed to by ARG3
    351    instead of ARG4.
    352    GETREGSET and SETREGSET use a struct iovec (pointed to by ARG4) for
    353    the address and size of the user buffer. */
    354 
    355 PRE(sys_ptrace)
    356 {
    357    PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
    358    PRE_REG_READ4(int, "ptrace",
    359                  long, request, long, pid, long, addr, long, data);
    360    switch (ARG1) {
    361    case VKI_PTRACE_PEEKTEXT:
    362    case VKI_PTRACE_PEEKDATA:
    363    case VKI_PTRACE_PEEKUSR:
    364       PRE_MEM_WRITE( "ptrace(peek)", ARG4,
    365 		     sizeof (long));
    366       break;
    367    case VKI_PTRACE_GETEVENTMSG:
    368       PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long));
    369       break;
    370    case VKI_PTRACE_GETSIGINFO:
    371       PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t));
    372       break;
    373    case VKI_PTRACE_SETSIGINFO:
    374       PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t));
    375       break;
    376    case VKI_PTRACE_PEEKUSR_AREA:
    377       {
    378          vki_ptrace_area *pa;
    379 
    380          /* Reads a part of the user area into memory at pa->process_addr */
    381 	 pa = (vki_ptrace_area *) ARG3;
    382          PRE_MEM_READ("ptrace(peekusrarea ptrace_area->len)",
    383                       (unsigned long) &pa->vki_len, sizeof(pa->vki_len));
    384          PRE_MEM_READ("ptrace(peekusrarea ptrace_area->kernel_addr)",
    385                       (unsigned long) &pa->vki_kernel_addr, sizeof(pa->vki_kernel_addr));
    386          PRE_MEM_READ("ptrace(peekusrarea ptrace_area->process_addr)",
    387                       (unsigned long) &pa->vki_process_addr, sizeof(pa->vki_process_addr));
    388          PRE_MEM_WRITE("ptrace(peekusrarea *(ptrace_area->process_addr))",
    389                        pa->vki_process_addr, pa->vki_len);
    390          break;
    391       }
    392    case VKI_PTRACE_POKEUSR_AREA:
    393       {
    394          vki_ptrace_area *pa;
    395 
    396          /* Updates a part of the user area from memory at pa->process_addr */
    397 	 pa = (vki_ptrace_area *) ARG3;
    398          PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->len)",
    399                       (unsigned long) &pa->vki_len, sizeof(pa->vki_len));
    400          PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->kernel_addr)",
    401                       (unsigned long) &pa->vki_kernel_addr,
    402                       sizeof(pa->vki_kernel_addr));
    403          PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->process_addr)",
    404                       (unsigned long) &pa->vki_process_addr,
    405                       sizeof(pa->vki_process_addr));
    406          PRE_MEM_READ("ptrace(pokeusrarea *(ptrace_area->process_addr))",
    407                        pa->vki_process_addr, pa->vki_len);
    408          break;
    409       }
    410    case VKI_PTRACE_GETREGSET:
    411       ML_(linux_PRE_getregset)(tid, ARG3, ARG4);
    412       break;
    413    case VKI_PTRACE_SETREGSET:
    414       ML_(linux_PRE_setregset)(tid, ARG3, ARG4);
    415       break;
    416    default:
    417       break;
    418    }
    419 }
    420 
    421 POST(sys_ptrace)
    422 {
    423    switch (ARG1) {
    424    case VKI_PTRACE_PEEKTEXT:
    425    case VKI_PTRACE_PEEKDATA:
    426    case VKI_PTRACE_PEEKUSR:
    427       POST_MEM_WRITE( ARG4, sizeof (long));
    428       break;
    429    case VKI_PTRACE_GETEVENTMSG:
    430       POST_MEM_WRITE( ARG4, sizeof(unsigned long));
    431       break;
    432    case VKI_PTRACE_GETSIGINFO:
    433       /* XXX: This is a simplification. Different parts of the
    434        * siginfo_t are valid depending on the type of signal.
    435        */
    436       POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t));
    437       break;
    438    case VKI_PTRACE_PEEKUSR_AREA:
    439       {
    440          vki_ptrace_area *pa;
    441 
    442 	 pa = (vki_ptrace_area *) ARG3;
    443          POST_MEM_WRITE(pa->vki_process_addr, pa->vki_len);
    444 	 break;
    445       }
    446    case VKI_PTRACE_GETREGSET:
    447       ML_(linux_POST_getregset)(tid, ARG3, ARG4);
    448       break;
    449    default:
    450       break;
    451    }
    452 }
    453 
    454 PRE(sys_mmap)
    455 {
    456    UWord a0, a1, a2, a3, a4, a5;
    457    SysRes r;
    458 
    459    UWord* args = (UWord*)ARG1;
    460    PRE_REG_READ1(long, "sys_mmap", struct mmap_arg_struct *, args);
    461    PRE_MEM_READ( "sys_mmap(args)", (Addr) args, 6*sizeof(UWord) );
    462 
    463    a0 = args[0];
    464    a1 = args[1];
    465    a2 = args[2];
    466    a3 = args[3];
    467    a4 = args[4];
    468    a5 = args[5];
    469 
    470    PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %ld, %ld )",
    471          a0, (ULong)a1, a2, a3, a4, a5 );
    472 
    473    r = ML_(generic_PRE_sys_mmap)( tid, a0, a1, a2, a3, a4, (Off64T)a5 );
    474    SET_STATUS_from_SysRes(r);
    475 }
    476 
    477 PRE(sys_clone)
    478 {
    479    UInt cloneflags;
    480 
    481    PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4, ARG5);
    482    PRE_REG_READ2(int, "clone",
    483                  void *,        child_stack,
    484                  unsigned long, flags);
    485 
    486    if (ARG2 & VKI_CLONE_PARENT_SETTID) {
    487       if (VG_(tdict).track_pre_reg_read)
    488          PRA3("clone(parent_tidptr)", int *, parent_tidptr);
    489       PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
    490       if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
    491                                              VKI_PROT_WRITE)) {
    492          SET_STATUS_Failure( VKI_EFAULT );
    493          return;
    494       }
    495    }
    496    if (ARG2 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
    497       if (VG_(tdict).track_pre_reg_read)
    498          PRA4("clone(child_tidptr)", int *, child_tidptr);
    499       PRE_MEM_WRITE("clone(child_tidptr)", ARG4, sizeof(Int));
    500       if (!VG_(am_is_valid_for_client)(ARG4, sizeof(Int),
    501                                              VKI_PROT_WRITE)) {
    502          SET_STATUS_Failure( VKI_EFAULT );
    503          return;
    504       }
    505    }
    506 
    507    /* The kernel simply copies reg6 (ARG5) into AR0 and AR1, no checks */
    508    if (ARG2 & VKI_CLONE_SETTLS) {
    509       if (VG_(tdict).track_pre_reg_read) {
    510          PRA5("clone", Addr, tlsinfo);
    511       }
    512    }
    513 
    514    cloneflags = ARG2;
    515 
    516    if (!ML_(client_signal_OK)(ARG2 & VKI_CSIGNAL)) {
    517       SET_STATUS_Failure( VKI_EINVAL );
    518       return;
    519    }
    520 
    521    /* Only look at the flags we really care about */
    522    switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
    523                          | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
    524    case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
    525       /* thread creation */
    526       SET_STATUS_from_SysRes(
    527          do_clone(tid,
    528                   (Addr)ARG1,   /* child SP */
    529                   ARG2,         /* flags */
    530                   (Int *)ARG3,  /* parent_tidptr */
    531                   (Int *)ARG4, /* child_tidptr */
    532                   (Addr)ARG5)); /*  tlsaddr */
    533       break;
    534 
    535    case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
    536       /* FALLTHROUGH - assume vfork == fork */
    537       cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
    538 
    539    case 0: /* plain fork */
    540       SET_STATUS_from_SysRes(
    541          ML_(do_fork_clone)(tid,
    542                        cloneflags,      /* flags */
    543                        (Int *)ARG3,     /* parent_tidptr */
    544                        (Int *)ARG4));   /* child_tidptr */
    545       break;
    546 
    547    default:
    548       /* should we just ENOSYS? */
    549       VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx", ARG2);
    550       VG_(message)(Vg_UserMsg, "");
    551       VG_(message)(Vg_UserMsg, "The only supported clone() uses are:");
    552       VG_(message)(Vg_UserMsg, " - via a threads library (NPTL)");
    553       VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork");
    554       VG_(unimplemented)
    555          ("Valgrind does not support general clone().");
    556    }
    557 
    558    if (SUCCESS) {
    559       if (ARG2 & VKI_CLONE_PARENT_SETTID)
    560          POST_MEM_WRITE(ARG3, sizeof(Int));
    561       if (ARG2 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
    562          POST_MEM_WRITE(ARG4, sizeof(Int));
    563 
    564       /* Thread creation was successful; let the child have the chance
    565          to run */
    566       *flags |= SfYieldAfter;
    567    }
    568 }
    569 
    570 PRE(sys_sigreturn)
    571 {
    572    ThreadState* tst;
    573    PRINT("sys_sigreturn ( )");
    574 
    575    vg_assert(VG_(is_valid_tid)(tid));
    576    vg_assert(tid >= 1 && tid < VG_N_THREADS);
    577    vg_assert(VG_(is_running_thread)(tid));
    578 
    579    tst = VG_(get_ThreadState)(tid);
    580 
    581    /* This is only so that the IA is (might be) useful to report if
    582       something goes wrong in the sigreturn */
    583    ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
    584 
    585    /* Restore register state from frame and remove it */
    586    VG_(sigframe_destroy)(tid, False);
    587 
    588    /* Tell the driver not to update the guest state with the "result",
    589       and set a bogus result to keep it happy. */
    590    *flags |= SfNoWriteResult;
    591    SET_STATUS_Success(0);
    592 
    593    /* Check to see if any signals arose as a result of this. */
    594    *flags |= SfPollAfter;
    595 }
    596 
    597 
    598 PRE(sys_rt_sigreturn)
    599 {
    600    /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
    601       an explanation of what follows. */
    602 
    603    ThreadState* tst;
    604    PRINT("sys_rt_sigreturn ( )");
    605 
    606    vg_assert(VG_(is_valid_tid)(tid));
    607    vg_assert(tid >= 1 && tid < VG_N_THREADS);
    608    vg_assert(VG_(is_running_thread)(tid));
    609 
    610    tst = VG_(get_ThreadState)(tid);
    611 
    612    /* This is only so that the IA is (might be) useful to report if
    613       something goes wrong in the sigreturn */
    614    ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
    615 
    616    /* Restore register state from frame and remove it */
    617    VG_(sigframe_destroy)(tid, True);
    618 
    619    /* Tell the driver not to update the guest state with the "result",
    620       and set a bogus result to keep it happy. */
    621    *flags |= SfNoWriteResult;
    622    SET_STATUS_Success(0);
    623 
    624    /* Check to see if any signals arose as a result of this. */
    625    *flags |= SfPollAfter;
    626 }
    627 
    628 /* we cant use the LINX_ version for 64 bit */
    629 PRE(sys_fadvise64)
    630 {
    631    PRINT("sys_fadvise64 ( %ld, %ld, %ld, %ld )", ARG1,ARG2,ARG3,ARG4);
    632    PRE_REG_READ4(long, "fadvise64",
    633                  int, fd, vki_loff_t, offset, vki_loff_t, len, int, advice);
    634 }
    635 
    636 #undef PRE
    637 #undef POST
    638 
    639 /* ---------------------------------------------------------------------
    640    The s390x/Linux syscall table
    641    ------------------------------------------------------------------ */
    642 
    643 /* Add an s390x-linux specific wrapper to a syscall table. */
    644 #define PLAX_(sysno, name)    WRAPPER_ENTRY_X_(s390x_linux, sysno, name)
    645 #define PLAXY(sysno, name)    WRAPPER_ENTRY_XY(s390x_linux, sysno, name)
    646 
    647 // This table maps from __NR_xxx syscall numbers from
    648 // linux/arch/s390/kernel/syscalls.S to the appropriate PRE/POST sys_foo()
    649 // wrappers on s390x. There are several unused numbers, which are only
    650 // defined on s390 (31bit mode) but no longer available on s390x (64 bit).
    651 // For those syscalls not handled by Valgrind, the annotation indicate its
    652 // arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
    653 // (unknown).
    654 
    655 static SyscallTableEntry syscall_table[] = {
    656    GENX_(0, sys_ni_syscall), /* unimplemented (by the kernel) */      // 0
    657    GENX_(__NR_exit,  sys_exit),                                       // 1
    658    GENX_(__NR_fork,  sys_fork),                                       // 2
    659    GENXY(__NR_read,  sys_read),                                       // 3
    660    GENX_(__NR_write,  sys_write),                                     // 4
    661 
    662    GENXY(__NR_open,  sys_open),                                       // 5
    663    GENXY(__NR_close,  sys_close),                                     // 6
    664 // ?????(__NR_restart_syscall, ),                                     // 7
    665    GENXY(__NR_creat,  sys_creat),                                     // 8
    666    GENX_(__NR_link,  sys_link),                                       // 9
    667 
    668    GENX_(__NR_unlink,  sys_unlink),                                   // 10
    669    GENX_(__NR_execve,  sys_execve),                                   // 11
    670    GENX_(__NR_chdir,  sys_chdir),                                     // 12
    671    GENX_(13, sys_ni_syscall), /* unimplemented (by the kernel) */     // 13
    672    GENX_(__NR_mknod,  sys_mknod),                                     // 14
    673 
    674    GENX_(__NR_chmod,  sys_chmod),                                     // 15
    675    GENX_(16, sys_ni_syscall), /* unimplemented (by the kernel) */     // 16
    676    GENX_(17, sys_ni_syscall), /* unimplemented (by the kernel) */     // 17
    677    GENX_(18, sys_ni_syscall), /* unimplemented (by the kernel) */     // 18
    678    LINX_(__NR_lseek,  sys_lseek),                                     // 19
    679 
    680    GENX_(__NR_getpid,  sys_getpid),                                   // 20
    681    LINX_(__NR_mount,  sys_mount),                                     // 21
    682    LINX_(__NR_umount, sys_oldumount),                                 // 22
    683    GENX_(23, sys_ni_syscall), /* unimplemented (by the kernel) */     // 23
    684    GENX_(24, sys_ni_syscall), /* unimplemented (by the kernel) */     // 24
    685 
    686    GENX_(25, sys_ni_syscall), /* unimplemented (by the kernel) */     // 25
    687    PLAXY(__NR_ptrace, sys_ptrace),                                    // 26
    688    GENX_(__NR_alarm,  sys_alarm),                                     // 27
    689    GENX_(28, sys_ni_syscall), /* unimplemented (by the kernel) */     // 28
    690    GENX_(__NR_pause,  sys_pause),                                     // 29
    691 
    692    LINX_(__NR_utime,  sys_utime),                                     // 30
    693    GENX_(31, sys_ni_syscall), /* unimplemented (by the kernel) */     // 31
    694    GENX_(32, sys_ni_syscall), /* unimplemented (by the kernel) */     // 32
    695    GENX_(__NR_access,  sys_access),                                   // 33
    696    GENX_(__NR_nice, sys_nice),                                        // 34
    697 
    698    GENX_(35, sys_ni_syscall), /* unimplemented (by the kernel) */     // 35
    699    GENX_(__NR_sync, sys_sync),                                        // 36
    700    GENX_(__NR_kill,  sys_kill),                                       // 37
    701    GENX_(__NR_rename,  sys_rename),                                   // 38
    702    GENX_(__NR_mkdir,  sys_mkdir),                                     // 39
    703 
    704    GENX_(__NR_rmdir, sys_rmdir),                                      // 40
    705    GENXY(__NR_dup,  sys_dup),                                         // 41
    706    LINXY(__NR_pipe,  sys_pipe),                                       // 42
    707    GENXY(__NR_times,  sys_times),                                     // 43
    708    GENX_(44, sys_ni_syscall), /* unimplemented (by the kernel) */     // 44
    709 
    710    GENX_(__NR_brk,  sys_brk),                                         // 45
    711    GENX_(46, sys_ni_syscall), /* unimplemented (by the kernel) */     // 46
    712    GENX_(47, sys_ni_syscall), /* unimplemented (by the kernel) */     // 47
    713 // ?????(__NR_signal, ),                                              // 48
    714    GENX_(49, sys_ni_syscall), /* unimplemented (by the kernel) */     // 49
    715 
    716    GENX_(50, sys_ni_syscall), /* unimplemented (by the kernel) */     // 50
    717    GENX_(__NR_acct, sys_acct),                                        // 51
    718    LINX_(__NR_umount2, sys_umount),                                   // 52
    719    GENX_(53, sys_ni_syscall), /* unimplemented (by the kernel) */     // 53
    720    LINXY(__NR_ioctl,  sys_ioctl),                                     // 54
    721 
    722    LINXY(__NR_fcntl,  sys_fcntl),                                     // 55
    723    GENX_(56, sys_ni_syscall), /* unimplemented (by the kernel) */     // 56
    724    GENX_(__NR_setpgid,  sys_setpgid),                                 // 57
    725    GENX_(58, sys_ni_syscall), /* unimplemented (by the kernel) */     // 58
    726    GENX_(59, sys_ni_syscall), /* unimplemented (by the kernel) */     // 59
    727 
    728    GENX_(__NR_umask,  sys_umask),                                     // 60
    729    GENX_(__NR_chroot,  sys_chroot),                                   // 61
    730 // ?????(__NR_ustat, sys_ustat), /* deprecated in favor of statfs */  // 62
    731    GENXY(__NR_dup2,  sys_dup2),                                       // 63
    732    GENX_(__NR_getppid,  sys_getppid),                                 // 64
    733 
    734    GENX_(__NR_getpgrp,  sys_getpgrp),                                 // 65
    735    GENX_(__NR_setsid,  sys_setsid),                                   // 66
    736 // ?????(__NR_sigaction, ),   /* userspace uses rt_sigaction */       // 67
    737    GENX_(68, sys_ni_syscall), /* unimplemented (by the kernel) */     // 68
    738    GENX_(69, sys_ni_syscall), /* unimplemented (by the kernel) */     // 69
    739 
    740    GENX_(70, sys_ni_syscall), /* unimplemented (by the kernel) */     // 70
    741    GENX_(71, sys_ni_syscall), /* unimplemented (by the kernel) */     // 71
    742 // ?????(__NR_sigsuspend, ),                                          // 72
    743 // ?????(__NR_sigpending, ),                                          // 73
    744 // ?????(__NR_sethostname, ),                                         // 74
    745 
    746    GENX_(__NR_setrlimit,  sys_setrlimit),                             // 75
    747    GENXY(76,  sys_getrlimit), /* see also 191 */                      // 76
    748    GENXY(__NR_getrusage,  sys_getrusage),                             // 77
    749    GENXY(__NR_gettimeofday,  sys_gettimeofday),                       // 78
    750    GENX_(__NR_settimeofday, sys_settimeofday),                        // 79
    751 
    752    GENX_(80, sys_ni_syscall), /* unimplemented (by the kernel) */     // 80
    753    GENX_(81, sys_ni_syscall), /* unimplemented (by the kernel) */     // 81
    754    GENX_(82, sys_ni_syscall), /* unimplemented (by the kernel) */     // 82
    755    GENX_(__NR_symlink,  sys_symlink),                                 // 83
    756    GENX_(84, sys_ni_syscall), /* unimplemented (by the kernel) */     // 84
    757 
    758    GENX_(__NR_readlink,  sys_readlink),                               // 85
    759 // ?????(__NR_uselib, ),                                              // 86
    760 // ?????(__NR_swapon, ),                                              // 87
    761 // ?????(__NR_reboot, ),                                              // 88
    762    GENX_(89, sys_ni_syscall), /* unimplemented (by the kernel) */     // 89
    763 
    764    PLAX_(__NR_mmap, sys_mmap ),                                       // 90
    765    GENXY(__NR_munmap,  sys_munmap),                                   // 91
    766    GENX_(__NR_truncate,  sys_truncate),                               // 92
    767    GENX_(__NR_ftruncate,  sys_ftruncate),                             // 93
    768    GENX_(__NR_fchmod,  sys_fchmod),                                   // 94
    769 
    770    GENX_(95, sys_ni_syscall), /* unimplemented (by the kernel) */     // 95
    771    GENX_(__NR_getpriority, sys_getpriority),                          // 96
    772    GENX_(__NR_setpriority, sys_setpriority),                          // 97
    773    GENX_(98, sys_ni_syscall), /* unimplemented (by the kernel) */     // 98
    774    GENXY(__NR_statfs,  sys_statfs),                                   // 99
    775 
    776    GENXY(__NR_fstatfs,  sys_fstatfs),                                 // 100
    777    GENX_(101, sys_ni_syscall), /* unimplemented (by the kernel) */    // 101
    778    LINXY(__NR_socketcall, sys_socketcall),                            // 102
    779    LINXY(__NR_syslog,  sys_syslog),                                   // 103
    780    GENXY(__NR_setitimer,  sys_setitimer),                             // 104
    781 
    782    GENXY(__NR_getitimer,  sys_getitimer),                             // 105
    783    GENXY(__NR_stat, sys_newstat),                                     // 106
    784    GENXY(__NR_lstat, sys_newlstat),                                   // 107
    785    GENXY(__NR_fstat, sys_newfstat),                                   // 108
    786    GENX_(109, sys_ni_syscall), /* unimplemented (by the kernel) */    // 109
    787 
    788    LINXY(__NR_lookup_dcookie, sys_lookup_dcookie),                    // 110
    789    LINX_(__NR_vhangup, sys_vhangup),                                  // 111
    790    GENX_(112, sys_ni_syscall), /* unimplemented (by the kernel) */    // 112
    791    GENX_(113, sys_ni_syscall), /* unimplemented (by the kernel) */    // 113
    792    GENXY(__NR_wait4,  sys_wait4),                                     // 114
    793 
    794 // ?????(__NR_swapoff, ),                                             // 115
    795    LINXY(__NR_sysinfo,  sys_sysinfo),                                 // 116
    796    LINXY(__NR_ipc, sys_ipc),                                          // 117
    797    GENX_(__NR_fsync,  sys_fsync),                                     // 118
    798    PLAX_(__NR_sigreturn, sys_sigreturn),                              // 119
    799 
    800    PLAX_(__NR_clone,  sys_clone),                                     // 120
    801 // ?????(__NR_setdomainname, ),                                       // 121
    802    GENXY(__NR_uname, sys_newuname),                                   // 122
    803    GENX_(123, sys_ni_syscall), /* unimplemented (by the kernel) */    // 123
    804 // ?????(__NR_adjtimex, ),                                            // 124
    805 
    806    GENXY(__NR_mprotect,  sys_mprotect),                               // 125
    807 // LINXY(__NR_sigprocmask, sys_sigprocmask),                          // 126
    808    GENX_(127, sys_ni_syscall), /* unimplemented (by the kernel) */    // 127
    809    LINX_(__NR_init_module,  sys_init_module),                         // 128
    810    LINX_(__NR_delete_module,  sys_delete_module),                     // 129
    811 
    812    GENX_(130, sys_ni_syscall), /* unimplemented (by the kernel) */    // 130
    813    LINX_(__NR_quotactl, sys_quotactl),                                // 131
    814    GENX_(__NR_getpgid,  sys_getpgid),                                 // 132
    815    GENX_(__NR_fchdir,  sys_fchdir),                                   // 133
    816 // ?????(__NR_bdflush, ),                                             // 134
    817 
    818 // ?????(__NR_sysfs, ),                                               // 135
    819    LINX_(__NR_personality, sys_personality),                          // 136
    820    GENX_(137, sys_ni_syscall), /* unimplemented (by the kernel) */    // 137
    821    GENX_(138, sys_ni_syscall), /* unimplemented (by the kernel) */    // 138
    822    GENX_(139, sys_ni_syscall), /* unimplemented (by the kernel) */    // 139
    823 
    824 // LINXY(__NR__llseek, sys_llseek), /* 64 bit --> lseek */            // 140
    825    GENXY(__NR_getdents,  sys_getdents),                               // 141
    826    GENX_(__NR_select, sys_select),                                    // 142
    827    GENX_(__NR_flock,  sys_flock),                                     // 143
    828    GENX_(__NR_msync,  sys_msync),                                     // 144
    829 
    830    GENXY(__NR_readv,  sys_readv),                                     // 145
    831    GENX_(__NR_writev,  sys_writev),                                   // 146
    832    GENX_(__NR_getsid, sys_getsid),                                    // 147
    833    GENX_(__NR_fdatasync,  sys_fdatasync),                             // 148
    834    LINXY(__NR__sysctl, sys_sysctl),                                   // 149
    835 
    836    GENX_(__NR_mlock,  sys_mlock),                                     // 150
    837    GENX_(__NR_munlock,  sys_munlock),                                 // 151
    838    GENX_(__NR_mlockall,  sys_mlockall),                               // 152
    839    LINX_(__NR_munlockall,  sys_munlockall),                           // 153
    840    LINXY(__NR_sched_setparam,  sys_sched_setparam),                   // 154
    841 
    842    LINXY(__NR_sched_getparam,  sys_sched_getparam),                   // 155
    843    LINX_(__NR_sched_setscheduler,  sys_sched_setscheduler),           // 156
    844    LINX_(__NR_sched_getscheduler,  sys_sched_getscheduler),           // 157
    845    LINX_(__NR_sched_yield,  sys_sched_yield),                         // 158
    846    LINX_(__NR_sched_get_priority_max,  sys_sched_get_priority_max),   // 159
    847 
    848    LINX_(__NR_sched_get_priority_min,  sys_sched_get_priority_min),   // 160
    849    LINXY(__NR_sched_rr_get_interval, sys_sched_rr_get_interval),      // 162
    850    GENXY(__NR_nanosleep,  sys_nanosleep),                             // 162
    851    GENX_(__NR_mremap,  sys_mremap),                                   // 163
    852    GENX_(164, sys_ni_syscall), /* unimplemented (by the kernel) */    // 164
    853 
    854    GENX_(165, sys_ni_syscall), /* unimplemented (by the kernel) */    // 165
    855    GENX_(166, sys_ni_syscall), /* unimplemented (by the kernel) */    // 166
    856    GENX_(167, sys_ni_syscall), /* unimplemented (by the kernel) */    // 167
    857    GENXY(__NR_poll,  sys_poll),                                       // 168
    858 // ?????(__NR_nfsservctl, ),                                          // 169
    859 
    860    GENX_(170, sys_ni_syscall), /* unimplemented (by the kernel) */    // 170
    861    GENX_(171, sys_ni_syscall), /* unimplemented (by the kernel) */    // 171
    862    LINXY(__NR_prctl, sys_prctl),                                      // 172
    863    PLAX_(__NR_rt_sigreturn,  sys_rt_sigreturn),                       // 173
    864    LINXY(__NR_rt_sigaction,  sys_rt_sigaction),                       // 174
    865 
    866    LINXY(__NR_rt_sigprocmask,  sys_rt_sigprocmask),                   // 175
    867    LINXY(__NR_rt_sigpending, sys_rt_sigpending),                      // 176
    868    LINXY(__NR_rt_sigtimedwait,  sys_rt_sigtimedwait),                 // 177
    869    LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),                  // 178
    870    LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend),                      // 179
    871 
    872    GENXY(__NR_pread64,  sys_pread64),                                 // 180
    873    GENX_(__NR_pwrite64, sys_pwrite64),                                // 181
    874    GENX_(182, sys_ni_syscall), /* unimplemented (by the kernel) */    // 182
    875    GENXY(__NR_getcwd,  sys_getcwd),                                   // 183
    876    LINXY(__NR_capget,  sys_capget),                                   // 184
    877 
    878    LINX_(__NR_capset,  sys_capset),                                   // 185
    879    GENXY(__NR_sigaltstack,  sys_sigaltstack),                         // 186
    880    LINXY(__NR_sendfile, sys_sendfile),                                // 187
    881    GENX_(188, sys_ni_syscall), /* unimplemented (by the kernel) */    // 188
    882    GENX_(189, sys_ni_syscall), /* unimplemented (by the kernel) */    // 189
    883 
    884    GENX_(__NR_vfork,  sys_fork),                                      // 190
    885    GENXY(__NR_getrlimit,  sys_getrlimit),                             // 191
    886    GENX_(192, sys_ni_syscall), /* not exported on 64bit*/             // 192
    887    GENX_(193, sys_ni_syscall), /* unimplemented (by the kernel) */    // 193
    888    GENX_(194, sys_ni_syscall), /* unimplemented (by the kernel) */    // 194
    889 
    890    GENX_(195, sys_ni_syscall), /* unimplemented (by the kernel) */    // 195
    891    GENX_(196, sys_ni_syscall), /* unimplemented (by the kernel) */    // 196
    892    GENX_(197, sys_ni_syscall), /* unimplemented (by the kernel) */    // 197
    893    GENX_(__NR_lchown, sys_lchown),                                    // 198
    894    GENX_(__NR_getuid, sys_getuid),                                    // 199
    895 
    896    GENX_(__NR_getgid, sys_getgid),                                    // 200
    897    GENX_(__NR_geteuid, sys_geteuid),                                  // 201
    898    GENX_(__NR_getegid, sys_getegid),                                  // 202
    899    GENX_(__NR_setreuid, sys_setreuid),                                // 203
    900    GENX_(__NR_setregid, sys_setregid),                                // 204
    901 
    902    GENXY(__NR_getgroups, sys_getgroups),                              // 205
    903    GENX_(__NR_setgroups, sys_setgroups),                              // 206
    904    GENX_(__NR_fchown, sys_fchown),                                    // 207
    905    LINX_(__NR_setresuid, sys_setresuid),                              // 208
    906    LINXY(__NR_getresuid, sys_getresuid),                              // 209
    907 
    908    LINX_(__NR_setresgid, sys_setresgid),                              // 210
    909    LINXY(__NR_getresgid, sys_getresgid),                              // 211
    910    GENX_(__NR_chown, sys_chown),                                      // 212
    911    GENX_(__NR_setuid, sys_setuid),                                    // 213
    912    GENX_(__NR_setgid, sys_setgid),                                    // 214
    913 
    914    LINX_(__NR_setfsuid, sys_setfsuid),                                // 215
    915    LINX_(__NR_setfsgid, sys_setfsgid),                                // 216
    916 // ?????(__NR_pivot_root, ),
    917    GENXY(__NR_mincore, sys_mincore),                                  // 218
    918    GENX_(__NR_madvise,  sys_madvise),                                 // 219
    919 
    920    GENXY(__NR_getdents64,  sys_getdents64),                           // 220
    921    GENX_(221, sys_ni_syscall), /* unimplemented (by the kernel) */    // 221
    922    LINX_(__NR_readahead, sys_readahead),                              // 222
    923    GENX_(223, sys_ni_syscall), /* unimplemented (by the kernel) */    // 223
    924    LINX_(__NR_setxattr, sys_setxattr),                                // 224
    925 
    926    LINX_(__NR_lsetxattr, sys_lsetxattr),                              // 225
    927    LINX_(__NR_fsetxattr, sys_fsetxattr),                              // 226
    928    LINXY(__NR_getxattr,  sys_getxattr),                               // 227
    929    LINXY(__NR_lgetxattr,  sys_lgetxattr),                             // 228
    930    LINXY(__NR_fgetxattr,  sys_fgetxattr),                             // 229
    931 
    932    LINXY(__NR_listxattr,  sys_listxattr),                             // 230
    933    LINXY(__NR_llistxattr,  sys_llistxattr),                           // 231
    934    LINXY(__NR_flistxattr,  sys_flistxattr),                           // 232
    935    LINX_(__NR_removexattr,  sys_removexattr),                         // 233
    936    LINX_(__NR_lremovexattr,  sys_lremovexattr),                       // 234
    937 
    938    LINX_(__NR_fremovexattr,  sys_fremovexattr),                       // 235
    939    LINX_(__NR_gettid,  sys_gettid),                                   // 236
    940    LINXY(__NR_tkill, sys_tkill),                                      // 237
    941    LINXY(__NR_futex,  sys_futex),                                     // 238
    942    LINX_(__NR_sched_setaffinity,  sys_sched_setaffinity),             // 239
    943 
    944    LINXY(__NR_sched_getaffinity,  sys_sched_getaffinity),             // 240
    945    LINXY(__NR_tgkill, sys_tgkill),                                    // 241
    946    GENX_(242, sys_ni_syscall), /* unimplemented (by the kernel) */    // 242
    947    LINXY(__NR_io_setup, sys_io_setup),                                // 243
    948    LINX_(__NR_io_destroy,  sys_io_destroy),                           // 244
    949 
    950    LINXY(__NR_io_getevents,  sys_io_getevents),                       // 245
    951    LINX_(__NR_io_submit,  sys_io_submit),                             // 246
    952    LINXY(__NR_io_cancel,  sys_io_cancel),                             // 247
    953    LINX_(__NR_exit_group,  sys_exit_group),                           // 248
    954    LINXY(__NR_epoll_create,  sys_epoll_create),                       // 249
    955 
    956    LINX_(__NR_epoll_ctl,  sys_epoll_ctl),                             // 250
    957    LINXY(__NR_epoll_wait,  sys_epoll_wait),                           // 251
    958    LINX_(__NR_set_tid_address,  sys_set_tid_address),                 // 252
    959    PLAX_(__NR_fadvise64, sys_fadvise64),                              // 253
    960    LINXY(__NR_timer_create,  sys_timer_create),                       // 254
    961 
    962    LINXY(__NR_timer_settime,  sys_timer_settime),                     // 255
    963    LINXY(__NR_timer_gettime,  sys_timer_gettime),                     // 256
    964    LINX_(__NR_timer_getoverrun,  sys_timer_getoverrun),               // 257
    965    LINX_(__NR_timer_delete,  sys_timer_delete),                       // 258
    966    LINX_(__NR_clock_settime,  sys_clock_settime),                     // 259
    967 
    968    LINXY(__NR_clock_gettime,  sys_clock_gettime),                     // 260
    969    LINXY(__NR_clock_getres,  sys_clock_getres),                       // 261
    970    LINXY(__NR_clock_nanosleep,  sys_clock_nanosleep),                 // 262
    971    GENX_(263, sys_ni_syscall), /* unimplemented (by the kernel) */    // 263
    972    GENX_(264, sys_ni_syscall), /* unimplemented (by the kernel) */    // 264
    973 
    974    GENXY(__NR_statfs64, sys_statfs64),                                // 265
    975    GENXY(__NR_fstatfs64, sys_fstatfs64),                              // 266
    976 // ?????(__NR_remap_file_pages, ),
    977    GENX_(268, sys_ni_syscall), /* unimplemented (by the kernel) */    // 268
    978    GENX_(269, sys_ni_syscall), /* unimplemented (by the kernel) */    // 269
    979 
    980    GENX_(270, sys_ni_syscall), /* unimplemented (by the kernel) */    // 270
    981    LINXY(__NR_mq_open,  sys_mq_open),                                 // 271
    982    LINX_(__NR_mq_unlink,  sys_mq_unlink),                             // 272
    983    LINX_(__NR_mq_timedsend,  sys_mq_timedsend),                       // 273
    984    LINXY(__NR_mq_timedreceive, sys_mq_timedreceive),                  // 274
    985 
    986    LINX_(__NR_mq_notify,  sys_mq_notify),                             // 275
    987    LINXY(__NR_mq_getsetattr,  sys_mq_getsetattr),                     // 276
    988 // ?????(__NR_kexec_load, ),
    989    LINX_(__NR_add_key,  sys_add_key),                                 // 278
    990    LINX_(__NR_request_key,  sys_request_key),                         // 279
    991 
    992    LINXY(__NR_keyctl,  sys_keyctl),                                   // 280
    993    LINXY(__NR_waitid, sys_waitid),                                    // 281
    994    LINX_(__NR_ioprio_set,  sys_ioprio_set),                           // 282
    995    LINX_(__NR_ioprio_get,  sys_ioprio_get),                           // 283
    996    LINX_(__NR_inotify_init,  sys_inotify_init),                       // 284
    997 
    998    LINX_(__NR_inotify_add_watch,  sys_inotify_add_watch),             // 285
    999    LINX_(__NR_inotify_rm_watch,  sys_inotify_rm_watch),               // 286
   1000    GENX_(287, sys_ni_syscall), /* unimplemented (by the kernel) */    // 287
   1001    LINXY(__NR_openat,  sys_openat),                                   // 288
   1002    LINX_(__NR_mkdirat,  sys_mkdirat),                                 // 289
   1003 
   1004    LINX_(__NR_mknodat,  sys_mknodat),                                 // 290
   1005    LINX_(__NR_fchownat,  sys_fchownat),                               // 291
   1006    LINX_(__NR_futimesat,  sys_futimesat),                             // 292
   1007    LINXY(__NR_newfstatat, sys_newfstatat),                            // 293
   1008    LINX_(__NR_unlinkat,  sys_unlinkat),                               // 294
   1009 
   1010    LINX_(__NR_renameat,  sys_renameat),                               // 295
   1011    LINX_(__NR_linkat,  sys_linkat),                                   // 296
   1012    LINX_(__NR_symlinkat,  sys_symlinkat),                             // 297
   1013    LINX_(__NR_readlinkat,  sys_readlinkat),                           // 298
   1014    LINX_(__NR_fchmodat,  sys_fchmodat),                               // 299
   1015 
   1016    LINX_(__NR_faccessat,  sys_faccessat),                             // 300
   1017    LINX_(__NR_pselect6, sys_pselect6),                                // 301
   1018    LINXY(__NR_ppoll, sys_ppoll),                                      // 302
   1019 // ?????(__NR_unshare, ),
   1020    LINX_(__NR_set_robust_list,  sys_set_robust_list),                 // 304
   1021 
   1022    LINXY(__NR_get_robust_list,  sys_get_robust_list),                 // 305
   1023    LINX_(__NR_splice, sys_splice),                                    // 306
   1024    LINX_(__NR_sync_file_range, sys_sync_file_range),                  // 307
   1025    LINX_(__NR_tee, sys_tee),                                          // 308
   1026    LINXY(__NR_vmsplice, sys_vmsplice),                                // 309
   1027 
   1028    GENX_(310, sys_ni_syscall), /* unimplemented (by the kernel) */    // 310
   1029    LINXY(__NR_getcpu, sys_getcpu),                                    // 311
   1030    LINXY(__NR_epoll_pwait,  sys_epoll_pwait),                         // 312
   1031    GENX_(__NR_utimes, sys_utimes),                                    // 313
   1032    LINX_(__NR_fallocate, sys_fallocate),                              // 314
   1033 
   1034    LINX_(__NR_utimensat,  sys_utimensat),                             // 315
   1035    LINXY(__NR_signalfd,  sys_signalfd),                               // 316
   1036    GENX_(317, sys_ni_syscall), /* unimplemented (by the kernel) */    // 317
   1037    LINXY(__NR_eventfd,  sys_eventfd),                                 // 318
   1038    LINXY(__NR_timerfd_create,  sys_timerfd_create),                   // 319
   1039 
   1040    LINXY(__NR_timerfd_settime,  sys_timerfd_settime),                 // 320
   1041    LINXY(__NR_timerfd_gettime,  sys_timerfd_gettime),                 // 321
   1042    LINXY(__NR_signalfd4,  sys_signalfd4),                             // 322
   1043    LINXY(__NR_eventfd2,  sys_eventfd2),                               // 323
   1044    LINXY(__NR_inotify_init1,  sys_inotify_init1),                     // 324
   1045 
   1046    LINXY(__NR_pipe2,  sys_pipe2),                                     // 325
   1047    LINXY(__NR_dup3,  sys_dup3),                                       // 326
   1048    LINXY(__NR_epoll_create1,  sys_epoll_create1),                     // 327
   1049    LINXY(__NR_preadv, sys_preadv),                                    // 328
   1050    LINX_(__NR_pwritev, sys_pwritev),                                  // 329
   1051 
   1052    LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),              // 330
   1053    LINXY(__NR_perf_event_open, sys_perf_event_open),                  // 331
   1054    LINXY(__NR_fanotify_init, sys_fanotify_init),                      // 332
   1055    LINX_(__NR_fanotify_mark, sys_fanotify_mark),                      // 333
   1056    LINXY(__NR_prlimit64, sys_prlimit64),                              // 334
   1057 
   1058    LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),              // 335
   1059    LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),              // 336
   1060    LINXY(__NR_clock_adjtime, sys_clock_adjtime),                      // 337
   1061 // ?????(__NR_syncfs, ),                                              // 338
   1062 // ?????(__NR_setns, ),                                               // 339
   1063 
   1064    LINXY(__NR_process_vm_readv, sys_process_vm_readv),                // 340
   1065    LINX_(__NR_process_vm_writev, sys_process_vm_writev),              // 341
   1066 };
   1067 
   1068 SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
   1069 {
   1070    const UInt syscall_table_size
   1071       = sizeof(syscall_table) / sizeof(syscall_table[0]);
   1072 
   1073    /* Is it in the contiguous initial section of the table? */
   1074    if (sysno < syscall_table_size) {
   1075       SyscallTableEntry* sys = &syscall_table[sysno];
   1076       if (sys->before == NULL)
   1077          return NULL; /* no entry */
   1078       else
   1079          return sys;
   1080    }
   1081 
   1082    /* Can't find a wrapper */
   1083    return NULL;
   1084 }
   1085 
   1086 #endif
   1087 
   1088 /*--------------------------------------------------------------------*/
   1089 /*--- end                                                          ---*/
   1090 /*--------------------------------------------------------------------*/
   1091