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