Home | History | Annotate | Download | only in m_syswrap
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- Linux-specific syscalls, etc.                syswrap-linux.c ---*/
      4 /*--------------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2000-2012 Nicholas Nethercote
     11       njn (at) valgrind.org
     12 
     13    This program is free software; you can redistribute it and/or
     14    modify it under the terms of the GNU General Public License as
     15    published by the Free Software Foundation; either version 2 of the
     16    License, or (at your option) any later version.
     17 
     18    This program is distributed in the hope that it will be useful, but
     19    WITHOUT ANY WARRANTY; without even the implied warranty of
     20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     21    General Public License for more details.
     22 
     23    You should have received a copy of the GNU General Public License
     24    along with this program; if not, write to the Free Software
     25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     26    02111-1307, USA.
     27 
     28    The GNU General Public License is contained in the file COPYING.
     29 */
     30 
     31 #if defined(VGO_linux)
     32 
     33 #include "pub_core_basics.h"
     34 #include "pub_core_vki.h"
     35 #include "pub_core_vkiscnums.h"
     36 #include "pub_core_libcsetjmp.h"   // to keep _threadstate.h happy
     37 #include "pub_core_threadstate.h"
     38 #include "pub_core_aspacemgr.h"
     39 #include "pub_core_debuginfo.h"    // VG_(di_notify_*)
     40 #include "pub_core_transtab.h"     // VG_(discard_translations)
     41 #include "pub_core_xarray.h"
     42 #include "pub_core_clientstate.h"
     43 #include "pub_core_debuglog.h"
     44 #include "pub_core_libcbase.h"
     45 #include "pub_core_libcassert.h"
     46 #include "pub_core_libcfile.h"
     47 #include "pub_core_libcprint.h"
     48 #include "pub_core_libcproc.h"
     49 #include "pub_core_libcsignal.h"
     50 #include "pub_core_machine.h"      // VG_(get_SP)
     51 #include "pub_core_mallocfree.h"
     52 #include "pub_core_tooliface.h"
     53 #include "pub_core_options.h"
     54 #include "pub_core_scheduler.h"
     55 #include "pub_core_signals.h"
     56 #include "pub_core_syscall.h"
     57 #include "pub_core_syswrap.h"
     58 #include "pub_tool_inner.h"
     59 #if defined(ENABLE_INNER_CLIENT_REQUEST)
     60 #include "valgrind.h"
     61 #endif
     62 
     63 #include "priv_types_n_macros.h"
     64 #include "priv_syswrap-generic.h"
     65 #include "priv_syswrap-linux.h"
     66 
     67 
     68 // Run a thread from beginning to end and return the thread's
     69 // scheduler-return-code.
     70 static VgSchedReturnCode thread_wrapper(Word /*ThreadId*/ tidW)
     71 {
     72    VgSchedReturnCode ret;
     73    ThreadId     tid = (ThreadId)tidW;
     74    ThreadState* tst = VG_(get_ThreadState)(tid);
     75 
     76    VG_(debugLog)(1, "syswrap-linux",
     77                     "thread_wrapper(tid=%lld): entry\n",
     78                     (ULong)tidW);
     79 
     80    vg_assert(tst->status == VgTs_Init);
     81 
     82    /* make sure we get the CPU lock before doing anything significant */
     83    VG_(acquire_BigLock)(tid, "thread_wrapper(starting new thread)");
     84 
     85    if (0)
     86       VG_(printf)("thread tid %d started: stack = %p\n",
     87 		  tid, &tid);
     88 
     89    /* Make sure error reporting is enabled in the new thread. */
     90    tst->err_disablement_level = 0;
     91 
     92    VG_TRACK(pre_thread_first_insn, tid);
     93 
     94    tst->os_state.lwpid = VG_(gettid)();
     95    /* Set the threadgroup for real.  This overwrites the provisional
     96       value set in do_clone() syswrap-*-linux.c.  See comments in
     97       do_clone for background, also #226116. */
     98    tst->os_state.threadgroup = VG_(getpid)();
     99 
    100    /* Thread created with all signals blocked; scheduler will set the
    101       appropriate mask */
    102 
    103    ret = VG_(scheduler)(tid);
    104 
    105    vg_assert(VG_(is_exiting)(tid));
    106 
    107    vg_assert(tst->status == VgTs_Runnable);
    108    vg_assert(VG_(is_running_thread)(tid));
    109 
    110    VG_(debugLog)(1, "syswrap-linux",
    111                     "thread_wrapper(tid=%lld): exit\n",
    112                     (ULong)tidW);
    113 
    114    /* Return to caller, still holding the lock. */
    115    return ret;
    116 }
    117 
    118 
    119 /* ---------------------------------------------------------------------
    120    clone-related stuff
    121    ------------------------------------------------------------------ */
    122 
    123 /* Run a thread all the way to the end, then do appropriate exit actions
    124    (this is the last-one-out-turn-off-the-lights bit).  */
    125 static void run_a_thread_NORETURN ( Word tidW )
    126 {
    127    ThreadId          tid = (ThreadId)tidW;
    128    VgSchedReturnCode src;
    129    Int               c;
    130    ThreadState*      tst;
    131 #ifdef ENABLE_INNER_CLIENT_REQUEST
    132    Int               registered_vgstack_id;
    133 #endif
    134 
    135    VG_(debugLog)(1, "syswrap-linux",
    136                     "run_a_thread_NORETURN(tid=%lld): pre-thread_wrapper\n",
    137                     (ULong)tidW);
    138 
    139    tst = VG_(get_ThreadState)(tid);
    140    vg_assert(tst);
    141 
    142    /* An thread has two stacks:
    143       * the simulated stack (used by the synthetic cpu. Guest process
    144         is using this stack).
    145       * the valgrind stack (used by the real cpu. Valgrind code is running
    146         on this stack).
    147       When Valgrind runs as an inner, it must signals that its (real) stack
    148       is the stack to use by the outer to e.g. do stacktraces.
    149    */
    150    INNER_REQUEST
    151       (registered_vgstack_id
    152        = VALGRIND_STACK_REGISTER (tst->os_state.valgrind_stack_base,
    153                                   tst->os_state.valgrind_stack_init_SP));
    154 
    155    /* Run the thread all the way through. */
    156    src = thread_wrapper(tid);
    157 
    158    VG_(debugLog)(1, "syswrap-linux",
    159                     "run_a_thread_NORETURN(tid=%lld): post-thread_wrapper\n",
    160                     (ULong)tidW);
    161 
    162    c = VG_(count_living_threads)();
    163    vg_assert(c >= 1); /* stay sane */
    164 
    165    // Tell the tool this thread is exiting
    166    VG_TRACK( pre_thread_ll_exit, tid );
    167 
    168    /* If the thread is exiting with errors disabled, complain loudly;
    169       doing so is bad (does the user know this has happened?)  Also,
    170       in all cases, be paranoid and clear the flag anyway so that the
    171       thread slot is safe in this respect if later reallocated.  This
    172       should be unnecessary since the flag should be cleared when the
    173       slot is reallocated, in thread_wrapper(). */
    174    if (tst->err_disablement_level > 0) {
    175       VG_(umsg)(
    176          "WARNING: exiting thread has error reporting disabled.\n"
    177          "WARNING: possibly as a result of some mistake in the use\n"
    178          "WARNING: of the VALGRIND_DISABLE_ERROR_REPORTING macros.\n"
    179       );
    180       VG_(debugLog)(
    181          1, "syswrap-linux",
    182             "run_a_thread_NORETURN(tid=%lld): "
    183             "WARNING: exiting thread has err_disablement_level = %u\n",
    184             (ULong)tidW, tst->err_disablement_level
    185       );
    186    }
    187    tst->err_disablement_level = 0;
    188 
    189    if (c == 1) {
    190 
    191       VG_(debugLog)(1, "syswrap-linux",
    192                        "run_a_thread_NORETURN(tid=%lld): "
    193                           "last one standing\n",
    194                           (ULong)tidW);
    195 
    196       /* We are the last one standing.  Keep hold of the lock and
    197          carry on to show final tool results, then exit the entire system.
    198          Use the continuation pointer set at startup in m_main. */
    199       ( * VG_(address_of_m_main_shutdown_actions_NORETURN) ) (tid, src);
    200 
    201    } else {
    202 
    203       VG_(debugLog)(1, "syswrap-linux",
    204                        "run_a_thread_NORETURN(tid=%lld): "
    205                           "not last one standing\n",
    206                           (ULong)tidW);
    207 
    208       /* OK, thread is dead, but others still exist.  Just exit. */
    209 
    210       /* This releases the run lock */
    211       VG_(exit_thread)(tid);
    212       vg_assert(tst->status == VgTs_Zombie);
    213 
    214       INNER_REQUEST (VALGRIND_STACK_DEREGISTER (registered_vgstack_id));
    215 
    216       /* We have to use this sequence to terminate the thread to
    217          prevent a subtle race.  If VG_(exit_thread)() had left the
    218          ThreadState as Empty, then it could have been reallocated,
    219          reusing the stack while we're doing these last cleanups.
    220          Instead, VG_(exit_thread) leaves it as Zombie to prevent
    221          reallocation.  We need to make sure we don't touch the stack
    222          between marking it Empty and exiting.  Hence the
    223          assembler. */
    224 #if defined(VGP_x86_linux)
    225       asm volatile (
    226          "pushl %%ebx\n"
    227          "movl	%1, %0\n"	/* set tst->status = VgTs_Empty */
    228          "movl	%2, %%eax\n"    /* set %eax = __NR_exit */
    229          "movl	%3, %%ebx\n"    /* set %ebx = tst->os_state.exitcode */
    230          "int	$0x80\n"	/* exit(tst->os_state.exitcode) */
    231 	 "popl %%ebx\n"
    232          : "=m" (tst->status)
    233          : "n" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
    234          : "eax"
    235       );
    236 #elif defined(VGP_amd64_linux)
    237       asm volatile (
    238          "movl	%1, %0\n"	/* set tst->status = VgTs_Empty */
    239          "movq	%2, %%rax\n"    /* set %rax = __NR_exit */
    240          "movq	%3, %%rdi\n"    /* set %rdi = tst->os_state.exitcode */
    241          "syscall\n"		/* exit(tst->os_state.exitcode) */
    242          : "=m" (tst->status)
    243          : "n" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
    244          : "rax", "rdi"
    245       );
    246 #elif defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux)
    247       { UInt vgts_empty = (UInt)VgTs_Empty;
    248         asm volatile (
    249           "stw %1,%0\n\t"          /* set tst->status = VgTs_Empty */
    250           "li  0,%2\n\t"           /* set r0 = __NR_exit */
    251           "lwz 3,%3\n\t"           /* set r3 = tst->os_state.exitcode */
    252           "sc\n\t"                 /* exit(tst->os_state.exitcode) */
    253           : "=m" (tst->status)
    254           : "r" (vgts_empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
    255           : "r0", "r3"
    256         );
    257       }
    258 #elif defined(VGP_arm_linux)
    259       asm volatile (
    260          "str  %1, %0\n"      /* set tst->status = VgTs_Empty */
    261          "mov  r7, %2\n"      /* set %r7 = __NR_exit */
    262          "ldr  r0, %3\n"      /* set %r0 = tst->os_state.exitcode */
    263          "svc  0x00000000\n"  /* exit(tst->os_state.exitcode) */
    264          : "=m" (tst->status)
    265          : "r" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
    266          : "r0", "r7"
    267       );
    268 #elif defined(VGP_s390x_linux)
    269       asm volatile (
    270          "st   %1, %0\n"        /* set tst->status = VgTs_Empty */
    271          "lg   2, %3\n"         /* set r2 = tst->os_state.exitcode */
    272          "svc %2\n"             /* exit(tst->os_state.exitcode) */
    273          : "=m" (tst->status)
    274          : "d" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
    275          : "2"
    276       );
    277 #elif defined(VGP_mips32_linux)
    278       asm volatile (
    279          "sw   %1, %0\n\t"     /* set tst->status = VgTs_Empty */
    280          "li  	$2, %2\n\t"     /* set v0 = __NR_exit */
    281          "lw   $4, %3\n\t"     /* set a0 = tst->os_state.exitcode */
    282          "syscall\n\t"         /* exit(tst->os_state.exitcode) */
    283          "nop"
    284          : "=m" (tst->status)
    285          : "r" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
    286          : "cc", "memory" , "v0", "a0"
    287       );
    288 #else
    289 # error Unknown platform
    290 #endif
    291 
    292       VG_(core_panic)("Thread exit failed?\n");
    293    }
    294 
    295    /*NOTREACHED*/
    296    vg_assert(0);
    297 }
    298 
    299 Word ML_(start_thread_NORETURN) ( void* arg )
    300 {
    301    ThreadState* tst = (ThreadState*)arg;
    302    ThreadId     tid = tst->tid;
    303 
    304    run_a_thread_NORETURN ( (Word)tid );
    305    /*NOTREACHED*/
    306    vg_assert(0);
    307 }
    308 
    309 /* Allocate a stack for this thread, if it doesn't already have one.
    310    They're allocated lazily, and never freed.  Returns the initial stack
    311    pointer value to use, or 0 if allocation failed. */
    312 Addr ML_(allocstack)(ThreadId tid)
    313 {
    314    ThreadState* tst = VG_(get_ThreadState)(tid);
    315    VgStack*     stack;
    316    Addr         initial_SP;
    317 
    318    /* Either the stack_base and stack_init_SP are both zero (in which
    319       case a stack hasn't been allocated) or they are both non-zero,
    320       in which case it has. */
    321 
    322    if (tst->os_state.valgrind_stack_base == 0)
    323       vg_assert(tst->os_state.valgrind_stack_init_SP == 0);
    324 
    325    if (tst->os_state.valgrind_stack_base != 0)
    326       vg_assert(tst->os_state.valgrind_stack_init_SP != 0);
    327 
    328    /* If no stack is present, allocate one. */
    329 
    330    if (tst->os_state.valgrind_stack_base == 0) {
    331       stack = VG_(am_alloc_VgStack)( &initial_SP );
    332       if (stack) {
    333          tst->os_state.valgrind_stack_base    = (Addr)stack;
    334          tst->os_state.valgrind_stack_init_SP = initial_SP;
    335       }
    336    }
    337 
    338    if (0)
    339       VG_(printf)( "stack for tid %d at %p; init_SP=%p\n",
    340                    tid,
    341                    (void*)tst->os_state.valgrind_stack_base,
    342                    (void*)tst->os_state.valgrind_stack_init_SP );
    343 
    344    return tst->os_state.valgrind_stack_init_SP;
    345 }
    346 
    347 /* Allocate a stack for the main thread, and run it all the way to the
    348    end.  Although we already have a working VgStack
    349    (VG_(interim_stack)) it's better to allocate a new one, so that
    350    overflow detection works uniformly for all threads.
    351 */
    352 void VG_(main_thread_wrapper_NORETURN)(ThreadId tid)
    353 {
    354    Addr sp;
    355    VG_(debugLog)(1, "syswrap-linux",
    356                     "entering VG_(main_thread_wrapper_NORETURN)\n");
    357 
    358    sp = ML_(allocstack)(tid);
    359 #if defined(ENABLE_INNER_CLIENT_REQUEST)
    360    {
    361       // we must register the main thread stack before the call
    362       // to ML_(call_on_new_stack_0_1), otherwise the outer valgrind
    363       // reports 'write error' on the non registered stack.
    364       ThreadState* tst = VG_(get_ThreadState)(tid);
    365       INNER_REQUEST
    366          ((void)
    367           VALGRIND_STACK_REGISTER (tst->os_state.valgrind_stack_base,
    368                                    tst->os_state.valgrind_stack_init_SP));
    369    }
    370 #endif
    371 
    372 #if defined(VGP_ppc32_linux)
    373    /* make a stack frame */
    374    sp -= 16;
    375    sp &= ~0xF;
    376    *(UWord *)sp = 0;
    377 #elif defined(VGP_ppc64_linux)
    378    /* make a stack frame */
    379    sp -= 112;
    380    sp &= ~((Addr)0xF);
    381    *(UWord *)sp = 0;
    382 #elif defined(VGP_s390x_linux)
    383    /* make a stack frame */
    384    sp -= 160;
    385    sp &= ~((Addr)0xF);
    386    *(UWord *)sp = 0;
    387 #endif
    388 
    389    /* If we can't even allocate the first thread's stack, we're hosed.
    390       Give up. */
    391    vg_assert2(sp != 0, "Cannot allocate main thread's stack.");
    392 
    393    /* shouldn't be any other threads around yet */
    394    vg_assert( VG_(count_living_threads)() == 1 );
    395 
    396    ML_(call_on_new_stack_0_1)(
    397       (Addr)sp,               /* stack */
    398       0,                      /* bogus return address */
    399       run_a_thread_NORETURN,  /* fn to call */
    400       (Word)tid               /* arg to give it */
    401    );
    402 
    403    /*NOTREACHED*/
    404    vg_assert(0);
    405 }
    406 
    407 
    408 /* Do a clone which is really a fork() */
    409 SysRes ML_(do_fork_clone) ( ThreadId tid, UInt flags,
    410                             Int* parent_tidptr, Int* child_tidptr )
    411 {
    412    vki_sigset_t fork_saved_mask;
    413    vki_sigset_t mask;
    414    SysRes       res;
    415 
    416    if (flags & (VKI_CLONE_SETTLS | VKI_CLONE_FS | VKI_CLONE_VM
    417                 | VKI_CLONE_FILES | VKI_CLONE_VFORK))
    418       return VG_(mk_SysRes_Error)( VKI_EINVAL );
    419 
    420    /* Block all signals during fork, so that we can fix things up in
    421       the child without being interrupted. */
    422    VG_(sigfillset)(&mask);
    423    VG_(sigprocmask)(VKI_SIG_SETMASK, &mask, &fork_saved_mask);
    424 
    425    VG_(do_atfork_pre)(tid);
    426 
    427    /* Since this is the fork() form of clone, we don't need all that
    428       VG_(clone) stuff */
    429 #if defined(VGP_x86_linux) \
    430     || defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux) \
    431     || defined(VGP_arm_linux) || defined(VGP_mips32_linux)
    432    res = VG_(do_syscall5)( __NR_clone, flags,
    433                            (UWord)NULL, (UWord)parent_tidptr,
    434                            (UWord)NULL, (UWord)child_tidptr );
    435 #elif defined(VGP_amd64_linux)
    436    /* note that the last two arguments are the opposite way round to x86 and
    437       ppc32 as the amd64 kernel expects the arguments in a different order */
    438    res = VG_(do_syscall5)( __NR_clone, flags,
    439                            (UWord)NULL, (UWord)parent_tidptr,
    440                            (UWord)child_tidptr, (UWord)NULL );
    441 #elif defined(VGP_s390x_linux)
    442    /* Note that s390 has the stack first and then the flags */
    443    res = VG_(do_syscall4)( __NR_clone, (UWord) NULL, flags,
    444                           (UWord)parent_tidptr, (UWord)child_tidptr);
    445 #else
    446 # error Unknown platform
    447 #endif
    448 
    449    if (!sr_isError(res) && sr_Res(res) == 0) {
    450       /* child */
    451       VG_(do_atfork_child)(tid);
    452 
    453       /* restore signal mask */
    454       VG_(sigprocmask)(VKI_SIG_SETMASK, &fork_saved_mask, NULL);
    455 
    456       /* If --child-silent-after-fork=yes was specified, set the
    457          output file descriptors to 'impossible' values.  This is
    458          noticed by send_bytes_to_logging_sink in m_libcprint.c, which
    459          duly stops writing any further output. */
    460       if (VG_(clo_child_silent_after_fork)) {
    461          if (!VG_(log_output_sink).is_socket)
    462             VG_(log_output_sink).fd = -1;
    463          if (!VG_(xml_output_sink).is_socket)
    464             VG_(xml_output_sink).fd = -1;
    465       }
    466    }
    467    else
    468    if (!sr_isError(res) && sr_Res(res) > 0) {
    469       /* parent */
    470       VG_(do_atfork_parent)(tid);
    471 
    472       if (VG_(clo_trace_syscalls))
    473 	  VG_(printf)("   clone(fork): process %d created child %ld\n",
    474                       VG_(getpid)(), sr_Res(res));
    475 
    476       /* restore signal mask */
    477       VG_(sigprocmask)(VKI_SIG_SETMASK, &fork_saved_mask, NULL);
    478    }
    479 
    480    return res;
    481 }
    482 
    483 
    484 /* ---------------------------------------------------------------------
    485    PRE/POST wrappers for arch-generic, Linux-specific syscalls
    486    ------------------------------------------------------------------ */
    487 
    488 // Nb: See the comment above the generic PRE/POST wrappers in
    489 // m_syswrap/syswrap-generic.c for notes about how they work.
    490 
    491 #define PRE(name)       DEFN_PRE_TEMPLATE(linux, name)
    492 #define POST(name)      DEFN_POST_TEMPLATE(linux, name)
    493 
    494 // Macros to support 64-bit syscall args split into two 32 bit values
    495 #define LOHI64(lo,hi)   ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
    496 #if defined(VG_LITTLEENDIAN)
    497 #define MERGE64(lo,hi)   ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
    498 #define MERGE64_FIRST(name) name##_low
    499 #define MERGE64_SECOND(name) name##_high
    500 #elif defined(VG_BIGENDIAN)
    501 #define MERGE64(hi,lo)   ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
    502 #define MERGE64_FIRST(name) name##_high
    503 #define MERGE64_SECOND(name) name##_low
    504 #else
    505 #error Unknown endianness
    506 #endif
    507 
    508 /* ---------------------------------------------------------------------
    509    *mount wrappers
    510    ------------------------------------------------------------------ */
    511 
    512 PRE(sys_mount)
    513 {
    514    // Nb: depending on 'flags', the 'type' and 'data' args may be ignored.
    515    // We are conservative and check everything, except the memory pointed to
    516    // by 'data'.
    517    *flags |= SfMayBlock;
    518    PRINT("sys_mount( %#lx(%s), %#lx(%s), %#lx(%s), %#lx, %#lx )",
    519          ARG1,(Char*)ARG1, ARG2,(Char*)ARG2, ARG3,(Char*)ARG3, ARG4, ARG5);
    520    PRE_REG_READ5(long, "mount",
    521                  char *, source, char *, target, char *, type,
    522                  unsigned long, flags, void *, data);
    523    if (ARG1)
    524       PRE_MEM_RASCIIZ( "mount(source)", ARG1);
    525    PRE_MEM_RASCIIZ( "mount(target)", ARG2);
    526    PRE_MEM_RASCIIZ( "mount(type)", ARG3);
    527 }
    528 
    529 PRE(sys_oldumount)
    530 {
    531    PRINT("sys_oldumount( %#lx )", ARG1);
    532    PRE_REG_READ1(long, "umount", char *, path);
    533    PRE_MEM_RASCIIZ( "umount(path)", ARG1);
    534 }
    535 
    536 PRE(sys_umount)
    537 {
    538    PRINT("sys_umount( %#lx, %ld )", ARG1, ARG2);
    539    PRE_REG_READ2(long, "umount2", char *, path, int, flags);
    540    PRE_MEM_RASCIIZ( "umount2(path)", ARG1);
    541 }
    542 
    543 /* ---------------------------------------------------------------------
    544    16- and 32-bit uid/gid wrappers
    545    ------------------------------------------------------------------ */
    546 
    547 PRE(sys_setfsuid16)
    548 {
    549    PRINT("sys_setfsuid16 ( %ld )", ARG1);
    550    PRE_REG_READ1(long, "setfsuid16", vki_old_uid_t, uid);
    551 }
    552 
    553 PRE(sys_setfsuid)
    554 {
    555    PRINT("sys_setfsuid ( %ld )", ARG1);
    556    PRE_REG_READ1(long, "setfsuid", vki_uid_t, uid);
    557 }
    558 
    559 PRE(sys_setfsgid16)
    560 {
    561    PRINT("sys_setfsgid16 ( %ld )", ARG1);
    562    PRE_REG_READ1(long, "setfsgid16", vki_old_gid_t, gid);
    563 }
    564 
    565 PRE(sys_setfsgid)
    566 {
    567    PRINT("sys_setfsgid ( %ld )", ARG1);
    568    PRE_REG_READ1(long, "setfsgid", vki_gid_t, gid);
    569 }
    570 
    571 PRE(sys_setresuid16)
    572 {
    573    PRINT("sys_setresuid16 ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
    574    PRE_REG_READ3(long, "setresuid16",
    575                  vki_old_uid_t, ruid, vki_old_uid_t, euid, vki_old_uid_t, suid);
    576 }
    577 
    578 PRE(sys_setresuid)
    579 {
    580    PRINT("sys_setresuid ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
    581    PRE_REG_READ3(long, "setresuid",
    582                  vki_uid_t, ruid, vki_uid_t, euid, vki_uid_t, suid);
    583 }
    584 
    585 PRE(sys_getresuid16)
    586 {
    587    PRINT("sys_getresuid16 ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
    588    PRE_REG_READ3(long, "getresuid16",
    589                  vki_old_uid_t *, ruid, vki_old_uid_t *, euid,
    590                  vki_old_uid_t *, suid);
    591    PRE_MEM_WRITE( "getresuid16(ruid)", ARG1, sizeof(vki_old_uid_t) );
    592    PRE_MEM_WRITE( "getresuid16(euid)", ARG2, sizeof(vki_old_uid_t) );
    593    PRE_MEM_WRITE( "getresuid16(suid)", ARG3, sizeof(vki_old_uid_t) );
    594 }
    595 POST(sys_getresuid16)
    596 {
    597    vg_assert(SUCCESS);
    598    if (RES == 0) {
    599       POST_MEM_WRITE( ARG1, sizeof(vki_old_uid_t) );
    600       POST_MEM_WRITE( ARG2, sizeof(vki_old_uid_t) );
    601       POST_MEM_WRITE( ARG3, sizeof(vki_old_uid_t) );
    602    }
    603 }
    604 
    605 PRE(sys_getresuid)
    606 {
    607    PRINT("sys_getresuid ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
    608    PRE_REG_READ3(long, "getresuid",
    609                  vki_uid_t *, ruid, vki_uid_t *, euid, vki_uid_t *, suid);
    610    PRE_MEM_WRITE( "getresuid(ruid)", ARG1, sizeof(vki_uid_t) );
    611    PRE_MEM_WRITE( "getresuid(euid)", ARG2, sizeof(vki_uid_t) );
    612    PRE_MEM_WRITE( "getresuid(suid)", ARG3, sizeof(vki_uid_t) );
    613 }
    614 POST(sys_getresuid)
    615 {
    616    vg_assert(SUCCESS);
    617    if (RES == 0) {
    618       POST_MEM_WRITE( ARG1, sizeof(vki_uid_t) );
    619       POST_MEM_WRITE( ARG2, sizeof(vki_uid_t) );
    620       POST_MEM_WRITE( ARG3, sizeof(vki_uid_t) );
    621    }
    622 }
    623 
    624 PRE(sys_setresgid16)
    625 {
    626    PRINT("sys_setresgid16 ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
    627    PRE_REG_READ3(long, "setresgid16",
    628                  vki_old_gid_t, rgid,
    629                  vki_old_gid_t, egid, vki_old_gid_t, sgid);
    630 }
    631 
    632 PRE(sys_setresgid)
    633 {
    634    PRINT("sys_setresgid ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
    635    PRE_REG_READ3(long, "setresgid",
    636                  vki_gid_t, rgid, vki_gid_t, egid, vki_gid_t, sgid);
    637 }
    638 
    639 PRE(sys_getresgid16)
    640 {
    641    PRINT("sys_getresgid16 ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
    642    PRE_REG_READ3(long, "getresgid16",
    643                  vki_old_gid_t *, rgid, vki_old_gid_t *, egid,
    644                  vki_old_gid_t *, sgid);
    645    PRE_MEM_WRITE( "getresgid16(rgid)", ARG1, sizeof(vki_old_gid_t) );
    646    PRE_MEM_WRITE( "getresgid16(egid)", ARG2, sizeof(vki_old_gid_t) );
    647    PRE_MEM_WRITE( "getresgid16(sgid)", ARG3, sizeof(vki_old_gid_t) );
    648 }
    649 POST(sys_getresgid16)
    650 {
    651    vg_assert(SUCCESS);
    652    if (RES == 0) {
    653       POST_MEM_WRITE( ARG1, sizeof(vki_old_gid_t) );
    654       POST_MEM_WRITE( ARG2, sizeof(vki_old_gid_t) );
    655       POST_MEM_WRITE( ARG3, sizeof(vki_old_gid_t) );
    656    }
    657 }
    658 
    659 PRE(sys_getresgid)
    660 {
    661    PRINT("sys_getresgid ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
    662    PRE_REG_READ3(long, "getresgid",
    663                  vki_gid_t *, rgid, vki_gid_t *, egid, vki_gid_t *, sgid);
    664    PRE_MEM_WRITE( "getresgid(rgid)", ARG1, sizeof(vki_gid_t) );
    665    PRE_MEM_WRITE( "getresgid(egid)", ARG2, sizeof(vki_gid_t) );
    666    PRE_MEM_WRITE( "getresgid(sgid)", ARG3, sizeof(vki_gid_t) );
    667 }
    668 POST(sys_getresgid)
    669 {
    670    vg_assert(SUCCESS);
    671    if (RES == 0) {
    672       POST_MEM_WRITE( ARG1, sizeof(vki_gid_t) );
    673       POST_MEM_WRITE( ARG2, sizeof(vki_gid_t) );
    674       POST_MEM_WRITE( ARG3, sizeof(vki_gid_t) );
    675    }
    676 }
    677 
    678 /* ---------------------------------------------------------------------
    679    miscellaneous wrappers
    680    ------------------------------------------------------------------ */
    681 
    682 PRE(sys_exit_group)
    683 {
    684    ThreadId     t;
    685    ThreadState* tst;
    686 
    687    PRINT("exit_group( %ld )", ARG1);
    688    PRE_REG_READ1(void, "exit_group", int, status);
    689 
    690    tst = VG_(get_ThreadState)(tid);
    691 
    692    /* A little complex; find all the threads with the same threadgroup
    693       as this one (including this one), and mark them to exit */
    694    for (t = 1; t < VG_N_THREADS; t++) {
    695       if ( /* not alive */
    696            VG_(threads)[t].status == VgTs_Empty
    697            ||
    698 	   /* not our group */
    699            VG_(threads)[t].os_state.threadgroup != tst->os_state.threadgroup
    700          )
    701          continue;
    702 
    703       VG_(threads)[t].exitreason = VgSrc_ExitThread;
    704       VG_(threads)[t].os_state.exitcode = ARG1;
    705 
    706       if (t != tid)
    707 	 VG_(get_thread_out_of_syscall)(t); /* unblock it, if blocked */
    708    }
    709 
    710    /* We have to claim the syscall already succeeded. */
    711    SET_STATUS_Success(0);
    712 }
    713 
    714 PRE(sys_llseek)
    715 {
    716    PRINT("sys_llseek ( %ld, 0x%lx, 0x%lx, %#lx, %ld )", ARG1,ARG2,ARG3,ARG4,ARG5);
    717    PRE_REG_READ5(long, "llseek",
    718                  unsigned int, fd, unsigned long, offset_high,
    719                  unsigned long, offset_low, vki_loff_t *, result,
    720                  unsigned int, whence);
    721    if (!ML_(fd_allowed)(ARG1, "llseek", tid, False))
    722       SET_STATUS_Failure( VKI_EBADF );
    723    else
    724       PRE_MEM_WRITE( "llseek(result)", ARG4, sizeof(vki_loff_t));
    725 }
    726 POST(sys_llseek)
    727 {
    728    vg_assert(SUCCESS);
    729    if (RES == 0)
    730       POST_MEM_WRITE( ARG4, sizeof(vki_loff_t) );
    731 }
    732 
    733 PRE(sys_adjtimex)
    734 {
    735    struct vki_timex *tx = (struct vki_timex *)ARG1;
    736    PRINT("sys_adjtimex ( %#lx )", ARG1);
    737    PRE_REG_READ1(long, "adjtimex", struct timex *, buf);
    738    PRE_MEM_READ( "adjtimex(timex->modes)", ARG1, sizeof(tx->modes));
    739 
    740 #define ADJX(bits,field) 				\
    741    if (tx->modes & (bits))                              \
    742       PRE_MEM_READ( "adjtimex(timex->"#field")",	\
    743 		    (Addr)&tx->field, sizeof(tx->field))
    744 
    745    if (tx->modes & VKI_ADJ_ADJTIME) {
    746       if (!(tx->modes & VKI_ADJ_OFFSET_READONLY))
    747          PRE_MEM_READ( "adjtimex(timex->offset)", (Addr)&tx->offset, sizeof(tx->offset));
    748    } else {
    749       ADJX(VKI_ADJ_OFFSET, offset);
    750       ADJX(VKI_ADJ_FREQUENCY, freq);
    751       ADJX(VKI_ADJ_MAXERROR, maxerror);
    752       ADJX(VKI_ADJ_ESTERROR, esterror);
    753       ADJX(VKI_ADJ_STATUS, status);
    754       ADJX(VKI_ADJ_TIMECONST|VKI_ADJ_TAI, constant);
    755       ADJX(VKI_ADJ_TICK, tick);
    756    }
    757 #undef ADJX
    758 
    759    PRE_MEM_WRITE( "adjtimex(timex)", ARG1, sizeof(struct vki_timex));
    760 }
    761 
    762 POST(sys_adjtimex)
    763 {
    764    POST_MEM_WRITE( ARG1, sizeof(struct vki_timex) );
    765 }
    766 
    767 PRE(sys_ioperm)
    768 {
    769    PRINT("sys_ioperm ( %ld, %ld, %ld )", ARG1, ARG2, ARG3 );
    770    PRE_REG_READ3(long, "ioperm",
    771                  unsigned long, from, unsigned long, num, int, turn_on);
    772 }
    773 
    774 PRE(sys_syslog)
    775 {
    776    *flags |= SfMayBlock;
    777    PRINT("sys_syslog (%ld, %#lx, %ld)", ARG1,ARG2,ARG3);
    778    PRE_REG_READ3(long, "syslog", int, type, char *, bufp, int, len);
    779    switch (ARG1) {
    780    // The kernel uses magic numbers here, rather than named constants,
    781    // therefore so do we.
    782    case 2: case 3: case 4:
    783       PRE_MEM_WRITE( "syslog(bufp)", ARG2, ARG3);
    784       break;
    785    default:
    786       break;
    787    }
    788 }
    789 POST(sys_syslog)
    790 {
    791    switch (ARG1) {
    792    case 2: case 3: case 4:
    793       POST_MEM_WRITE( ARG2, ARG3 );
    794       break;
    795    default:
    796       break;
    797    }
    798 }
    799 
    800 PRE(sys_vhangup)
    801 {
    802    PRINT("sys_vhangup ( )");
    803    PRE_REG_READ0(long, "vhangup");
    804 }
    805 
    806 PRE(sys_sysinfo)
    807 {
    808    PRINT("sys_sysinfo ( %#lx )",ARG1);
    809    PRE_REG_READ1(long, "sysinfo", struct sysinfo *, info);
    810    PRE_MEM_WRITE( "sysinfo(info)", ARG1, sizeof(struct vki_sysinfo) );
    811 }
    812 POST(sys_sysinfo)
    813 {
    814    POST_MEM_WRITE( ARG1, sizeof(struct vki_sysinfo) );
    815 }
    816 
    817 PRE(sys_personality)
    818 {
    819    PRINT("sys_personality ( %llu )", (ULong)ARG1);
    820    PRE_REG_READ1(long, "personality", vki_u_long, persona);
    821 }
    822 
    823 PRE(sys_sysctl)
    824 {
    825    struct __vki_sysctl_args *args;
    826    PRINT("sys_sysctl ( %#lx )", ARG1 );
    827    args = (struct __vki_sysctl_args *)ARG1;
    828    PRE_REG_READ1(long, "sysctl", struct __sysctl_args *, args);
    829    PRE_MEM_WRITE( "sysctl(args)", ARG1, sizeof(struct __vki_sysctl_args) );
    830    if (!VG_(am_is_valid_for_client)(ARG1, sizeof(struct __vki_sysctl_args),
    831                                           VKI_PROT_READ)) {
    832       SET_STATUS_Failure( VKI_EFAULT );
    833       return;
    834    }
    835 
    836    PRE_MEM_READ("sysctl(name)", (Addr)args->name, args->nlen * sizeof(*args->name));
    837    if (args->newval != NULL)
    838       PRE_MEM_READ("sysctl(newval)", (Addr)args->newval, args->newlen);
    839    if (args->oldlenp != NULL) {
    840       PRE_MEM_READ("sysctl(oldlenp)", (Addr)args->oldlenp, sizeof(*args->oldlenp));
    841       PRE_MEM_WRITE("sysctl(oldval)", (Addr)args->oldval, *args->oldlenp);
    842    }
    843 }
    844 POST(sys_sysctl)
    845 {
    846    struct __vki_sysctl_args *args;
    847    args = (struct __vki_sysctl_args *)ARG1;
    848    if (args->oldlenp != NULL) {
    849       POST_MEM_WRITE((Addr)args->oldlenp, sizeof(*args->oldlenp));
    850       POST_MEM_WRITE((Addr)args->oldval, 1 + *args->oldlenp);
    851    }
    852 }
    853 
    854 PRE(sys_prctl)
    855 {
    856    *flags |= SfMayBlock;
    857    PRINT( "sys_prctl ( %ld, %ld, %ld, %ld, %ld )", ARG1, ARG2, ARG3, ARG4, ARG5 );
    858    switch (ARG1) {
    859    case VKI_PR_SET_PDEATHSIG:
    860       PRE_REG_READ2(int, "prctl", int, option, int, signal);
    861       break;
    862    case VKI_PR_GET_PDEATHSIG:
    863       PRE_REG_READ2(int, "prctl", int, option, int *, signal);
    864       PRE_MEM_WRITE("prctl(get-death-signal)", ARG2, sizeof(Int));
    865       break;
    866    case VKI_PR_GET_DUMPABLE:
    867       PRE_REG_READ1(int, "prctl", int, option);
    868       break;
    869    case VKI_PR_SET_DUMPABLE:
    870       PRE_REG_READ2(int, "prctl", int, option, int, dump);
    871       break;
    872    case VKI_PR_GET_UNALIGN:
    873       PRE_REG_READ2(int, "prctl", int, option, int *, value);
    874       PRE_MEM_WRITE("prctl(get-unalign)", ARG2, sizeof(Int));
    875       break;
    876    case VKI_PR_SET_UNALIGN:
    877       PRE_REG_READ2(int, "prctl", int, option, int, value);
    878       break;
    879    case VKI_PR_GET_KEEPCAPS:
    880       PRE_REG_READ1(int, "prctl", int, option);
    881       break;
    882    case VKI_PR_SET_KEEPCAPS:
    883       PRE_REG_READ2(int, "prctl", int, option, int, keepcaps);
    884       break;
    885    case VKI_PR_GET_FPEMU:
    886       PRE_REG_READ2(int, "prctl", int, option, int *, value);
    887       PRE_MEM_WRITE("prctl(get-fpemu)", ARG2, sizeof(Int));
    888       break;
    889    case VKI_PR_SET_FPEMU:
    890       PRE_REG_READ2(int, "prctl", int, option, int, value);
    891       break;
    892    case VKI_PR_GET_FPEXC:
    893       PRE_REG_READ2(int, "prctl", int, option, int *, value);
    894       PRE_MEM_WRITE("prctl(get-fpexc)", ARG2, sizeof(Int));
    895       break;
    896    case VKI_PR_SET_FPEXC:
    897       PRE_REG_READ2(int, "prctl", int, option, int, value);
    898       break;
    899    case VKI_PR_GET_TIMING:
    900       PRE_REG_READ1(int, "prctl", int, option);
    901       break;
    902    case VKI_PR_SET_TIMING:
    903       PRE_REG_READ2(int, "prctl", int, option, int, timing);
    904       break;
    905    case VKI_PR_SET_NAME:
    906       PRE_REG_READ2(int, "prctl", int, option, char *, name);
    907       PRE_MEM_RASCIIZ("prctl(set-name)", ARG2);
    908       break;
    909    case VKI_PR_GET_NAME:
    910       PRE_REG_READ2(int, "prctl", int, option, char *, name);
    911       PRE_MEM_WRITE("prctl(get-name)", ARG2, VKI_TASK_COMM_LEN);
    912       break;
    913    case VKI_PR_GET_ENDIAN:
    914       PRE_REG_READ2(int, "prctl", int, option, int *, value);
    915       PRE_MEM_WRITE("prctl(get-endian)", ARG2, sizeof(Int));
    916       break;
    917    case VKI_PR_SET_ENDIAN:
    918       PRE_REG_READ2(int, "prctl", int, option, int, value);
    919       break;
    920    default:
    921       PRE_REG_READ5(long, "prctl",
    922                     int, option, unsigned long, arg2, unsigned long, arg3,
    923                     unsigned long, arg4, unsigned long, arg5);
    924       break;
    925    }
    926 }
    927 POST(sys_prctl)
    928 {
    929    switch (ARG1) {
    930    case VKI_PR_GET_PDEATHSIG:
    931       POST_MEM_WRITE(ARG2, sizeof(Int));
    932       break;
    933    case VKI_PR_GET_UNALIGN:
    934       POST_MEM_WRITE(ARG2, sizeof(Int));
    935       break;
    936    case VKI_PR_GET_FPEMU:
    937       POST_MEM_WRITE(ARG2, sizeof(Int));
    938       break;
    939    case VKI_PR_GET_FPEXC:
    940       POST_MEM_WRITE(ARG2, sizeof(Int));
    941       break;
    942    case VKI_PR_GET_NAME:
    943       POST_MEM_WRITE(ARG2, VKI_TASK_COMM_LEN);
    944       break;
    945    case VKI_PR_GET_ENDIAN:
    946       POST_MEM_WRITE(ARG2, sizeof(Int));
    947       break;
    948    }
    949 }
    950 
    951 PRE(sys_sendfile)
    952 {
    953    *flags |= SfMayBlock;
    954    PRINT("sys_sendfile ( %ld, %ld, %#lx, %lu )", ARG1,ARG2,ARG3,ARG4);
    955    PRE_REG_READ4(ssize_t, "sendfile",
    956                  int, out_fd, int, in_fd, vki_off_t *, offset,
    957                  vki_size_t, count);
    958    if (ARG3 != 0)
    959       PRE_MEM_WRITE( "sendfile(offset)", ARG3, sizeof(vki_off_t) );
    960 }
    961 POST(sys_sendfile)
    962 {
    963    if (ARG3 != 0 ) {
    964       POST_MEM_WRITE( ARG3, sizeof( vki_off_t ) );
    965    }
    966 }
    967 
    968 PRE(sys_sendfile64)
    969 {
    970    *flags |= SfMayBlock;
    971    PRINT("sendfile64 ( %ld, %ld, %#lx, %lu )",ARG1,ARG2,ARG3,ARG4);
    972    PRE_REG_READ4(ssize_t, "sendfile64",
    973                  int, out_fd, int, in_fd, vki_loff_t *, offset,
    974                  vki_size_t, count);
    975    if (ARG3 != 0)
    976       PRE_MEM_WRITE( "sendfile64(offset)", ARG3, sizeof(vki_loff_t) );
    977 }
    978 POST(sys_sendfile64)
    979 {
    980    if (ARG3 != 0 ) {
    981       POST_MEM_WRITE( ARG3, sizeof(vki_loff_t) );
    982    }
    983 }
    984 
    985 PRE(sys_futex)
    986 {
    987    /*
    988       arg    param                              used by ops
    989 
    990       ARG1 - u32 *futex				all
    991       ARG2 - int op
    992       ARG3 - int val				WAIT,WAKE,FD,REQUEUE,CMP_REQUEUE
    993       ARG4 - struct timespec *utime		WAIT:time*	REQUEUE,CMP_REQUEUE:val2
    994       ARG5 - u32 *uaddr2			REQUEUE,CMP_REQUEUE
    995       ARG6 - int val3				CMP_REQUEUE
    996     */
    997    PRINT("sys_futex ( %#lx, %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4,ARG5);
    998    switch(ARG2 & ~(VKI_FUTEX_PRIVATE_FLAG|VKI_FUTEX_CLOCK_REALTIME)) {
    999    case VKI_FUTEX_CMP_REQUEUE:
   1000    case VKI_FUTEX_WAKE_OP:
   1001    case VKI_FUTEX_CMP_REQUEUE_PI:
   1002       PRE_REG_READ6(long, "futex",
   1003                     vki_u32 *, futex, int, op, int, val,
   1004                     struct timespec *, utime, vki_u32 *, uaddr2, int, val3);
   1005       break;
   1006    case VKI_FUTEX_REQUEUE:
   1007    case VKI_FUTEX_WAIT_REQUEUE_PI:
   1008       PRE_REG_READ5(long, "futex",
   1009                     vki_u32 *, futex, int, op, int, val,
   1010                     struct timespec *, utime, vki_u32 *, uaddr2);
   1011       break;
   1012    case VKI_FUTEX_WAIT_BITSET:
   1013       /* Check that the address at least begins in client-accessible area. */
   1014       if (!VG_(am_is_valid_for_client)( ARG1, 1, VKI_PROT_READ )) {
   1015             SET_STATUS_Failure( VKI_EFAULT );
   1016             return;
   1017       }
   1018       if (*(vki_u32 *)ARG1 != ARG3) {
   1019          PRE_REG_READ5(long, "futex",
   1020                        vki_u32 *, futex, int, op, int, val,
   1021                        struct timespec *, utime, int, dummy);
   1022       } else {
   1023          PRE_REG_READ6(long, "futex",
   1024                        vki_u32 *, futex, int, op, int, val,
   1025                        struct timespec *, utime, int, dummy, int, val3);
   1026       }
   1027       break;
   1028    case VKI_FUTEX_WAKE_BITSET:
   1029       PRE_REG_READ6(long, "futex",
   1030                     vki_u32 *, futex, int, op, int, val,
   1031                     int, dummy, int, dummy2, int, val3);
   1032       break;
   1033    case VKI_FUTEX_WAIT:
   1034    case VKI_FUTEX_LOCK_PI:
   1035       PRE_REG_READ4(long, "futex",
   1036                     vki_u32 *, futex, int, op, int, val,
   1037                     struct timespec *, utime);
   1038       break;
   1039    case VKI_FUTEX_WAKE:
   1040    case VKI_FUTEX_FD:
   1041    case VKI_FUTEX_TRYLOCK_PI:
   1042       PRE_REG_READ3(long, "futex",
   1043                     vki_u32 *, futex, int, op, int, val);
   1044       break;
   1045    case VKI_FUTEX_UNLOCK_PI:
   1046    default:
   1047       PRE_REG_READ2(long, "futex", vki_u32 *, futex, int, op);
   1048       break;
   1049    }
   1050 
   1051    *flags |= SfMayBlock;
   1052 
   1053    switch(ARG2 & ~(VKI_FUTEX_PRIVATE_FLAG|VKI_FUTEX_CLOCK_REALTIME)) {
   1054    case VKI_FUTEX_WAIT:
   1055    case VKI_FUTEX_LOCK_PI:
   1056    case VKI_FUTEX_WAIT_BITSET:
   1057    case VKI_FUTEX_WAIT_REQUEUE_PI:
   1058       PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
   1059       if (ARG4 != 0)
   1060 	 PRE_MEM_READ( "futex(timeout)", ARG4, sizeof(struct vki_timespec) );
   1061       break;
   1062 
   1063    case VKI_FUTEX_REQUEUE:
   1064    case VKI_FUTEX_CMP_REQUEUE:
   1065    case VKI_FUTEX_CMP_REQUEUE_PI:
   1066    case VKI_FUTEX_WAKE_OP:
   1067       PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
   1068       PRE_MEM_READ( "futex(futex2)", ARG5, sizeof(Int) );
   1069       break;
   1070 
   1071    case VKI_FUTEX_FD:
   1072    case VKI_FUTEX_TRYLOCK_PI:
   1073    case VKI_FUTEX_UNLOCK_PI:
   1074       PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
   1075      break;
   1076 
   1077    case VKI_FUTEX_WAKE:
   1078    case VKI_FUTEX_WAKE_BITSET:
   1079       /* no additional pointers */
   1080       break;
   1081 
   1082    default:
   1083       SET_STATUS_Failure( VKI_ENOSYS );   // some futex function we don't understand
   1084       break;
   1085    }
   1086 }
   1087 POST(sys_futex)
   1088 {
   1089    vg_assert(SUCCESS);
   1090    POST_MEM_WRITE( ARG1, sizeof(int) );
   1091    if (ARG2 == VKI_FUTEX_FD) {
   1092       if (!ML_(fd_allowed)(RES, "futex", tid, True)) {
   1093          VG_(close)(RES);
   1094          SET_STATUS_Failure( VKI_EMFILE );
   1095       } else {
   1096          if (VG_(clo_track_fds))
   1097             ML_(record_fd_open_nameless)(tid, RES);
   1098       }
   1099    }
   1100 }
   1101 
   1102 PRE(sys_set_robust_list)
   1103 {
   1104    PRINT("sys_set_robust_list ( %#lx, %ld )", ARG1,ARG2);
   1105    PRE_REG_READ2(long, "set_robust_list",
   1106                  struct vki_robust_list_head *, head, vki_size_t, len);
   1107 
   1108    /* Just check the robust_list_head structure is readable - don't
   1109       try and chase the list as the kernel will only read it when
   1110       the thread exits so the current contents is irrelevant. */
   1111    if (ARG1 != 0)
   1112       PRE_MEM_READ("set_robust_list(head)", ARG1, ARG2);
   1113 }
   1114 
   1115 PRE(sys_get_robust_list)
   1116 {
   1117    PRINT("sys_get_robust_list ( %ld, %#lx, %ld )", ARG1,ARG2,ARG3);
   1118    PRE_REG_READ3(long, "get_robust_list",
   1119                  int, pid,
   1120                  struct vki_robust_list_head **, head_ptr,
   1121                  vki_size_t *, len_ptr);
   1122    PRE_MEM_WRITE("get_robust_list(head_ptr)",
   1123                  ARG2, sizeof(struct vki_robust_list_head *));
   1124    PRE_MEM_WRITE("get_robust_list(len_ptr)",
   1125                  ARG3, sizeof(struct vki_size_t *));
   1126 }
   1127 POST(sys_get_robust_list)
   1128 {
   1129    POST_MEM_WRITE(ARG2, sizeof(struct vki_robust_list_head *));
   1130    POST_MEM_WRITE(ARG3, sizeof(struct vki_size_t *));
   1131 }
   1132 
   1133 PRE(sys_pselect6)
   1134 {
   1135    *flags |= SfMayBlock;
   1136    PRINT("sys_pselect6 ( %ld, %#lx, %#lx, %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
   1137    PRE_REG_READ6(long, "pselect6",
   1138                  int, n, vki_fd_set *, readfds, vki_fd_set *, writefds,
   1139                  vki_fd_set *, exceptfds, struct vki_timeval *, timeout,
   1140                  void *, sig);
   1141    // XXX: this possibly understates how much memory is read.
   1142    if (ARG2 != 0)
   1143       PRE_MEM_READ( "pselect6(readfds)",
   1144 		     ARG2, ARG1/8 /* __FD_SETSIZE/8 */ );
   1145    if (ARG3 != 0)
   1146       PRE_MEM_READ( "pselect6(writefds)",
   1147 		     ARG3, ARG1/8 /* __FD_SETSIZE/8 */ );
   1148    if (ARG4 != 0)
   1149       PRE_MEM_READ( "pselect6(exceptfds)",
   1150 		     ARG4, ARG1/8 /* __FD_SETSIZE/8 */ );
   1151    if (ARG5 != 0)
   1152       PRE_MEM_READ( "pselect6(timeout)", ARG5, sizeof(struct vki_timeval) );
   1153    if (ARG6 != 0)
   1154       PRE_MEM_READ( "pselect6(sig)", ARG6, sizeof(void *)+sizeof(vki_size_t) );
   1155 }
   1156 
   1157 PRE(sys_ppoll)
   1158 {
   1159    UInt i;
   1160    struct vki_pollfd* ufds = (struct vki_pollfd *)ARG1;
   1161    *flags |= SfMayBlock;
   1162    PRINT("sys_ppoll ( %#lx, %ld, %#lx, %#lx, %llu )\n", ARG1,ARG2,ARG3,ARG4,(ULong)ARG5);
   1163    PRE_REG_READ5(long, "ppoll",
   1164                  struct vki_pollfd *, ufds, unsigned int, nfds,
   1165                  struct vki_timespec *, tsp, vki_sigset_t *, sigmask,
   1166                  vki_size_t, sigsetsize);
   1167 
   1168    for (i = 0; i < ARG2; i++) {
   1169       PRE_MEM_READ( "ppoll(ufds.fd)",
   1170                     (Addr)(&ufds[i].fd), sizeof(ufds[i].fd) );
   1171       PRE_MEM_READ( "ppoll(ufds.events)",
   1172                     (Addr)(&ufds[i].events), sizeof(ufds[i].events) );
   1173       PRE_MEM_WRITE( "ppoll(ufd.reventss)",
   1174                      (Addr)(&ufds[i].revents), sizeof(ufds[i].revents) );
   1175    }
   1176 
   1177    if (ARG3)
   1178       PRE_MEM_READ( "ppoll(tsp)", ARG3, sizeof(struct vki_timespec) );
   1179    if (ARG4)
   1180       PRE_MEM_READ( "ppoll(sigmask)", ARG4, sizeof(vki_sigset_t) );
   1181 }
   1182 
   1183 POST(sys_ppoll)
   1184 {
   1185    if (RES > 0) {
   1186       UInt i;
   1187       struct vki_pollfd* ufds = (struct vki_pollfd *)ARG1;
   1188       for (i = 0; i < ARG2; i++)
   1189 	 POST_MEM_WRITE( (Addr)(&ufds[i].revents), sizeof(ufds[i].revents) );
   1190    }
   1191 }
   1192 
   1193 
   1194 /* ---------------------------------------------------------------------
   1195    epoll_* wrappers
   1196    ------------------------------------------------------------------ */
   1197 
   1198 PRE(sys_epoll_create)
   1199 {
   1200    PRINT("sys_epoll_create ( %ld )", ARG1);
   1201    PRE_REG_READ1(long, "epoll_create", int, size);
   1202 }
   1203 POST(sys_epoll_create)
   1204 {
   1205    vg_assert(SUCCESS);
   1206    if (!ML_(fd_allowed)(RES, "epoll_create", tid, True)) {
   1207       VG_(close)(RES);
   1208       SET_STATUS_Failure( VKI_EMFILE );
   1209    } else {
   1210       if (VG_(clo_track_fds))
   1211          ML_(record_fd_open_nameless) (tid, RES);
   1212    }
   1213 }
   1214 
   1215 PRE(sys_epoll_create1)
   1216 {
   1217    PRINT("sys_epoll_create1 ( %ld )", ARG1);
   1218    PRE_REG_READ1(long, "epoll_create1", int, flags);
   1219 }
   1220 POST(sys_epoll_create1)
   1221 {
   1222    vg_assert(SUCCESS);
   1223    if (!ML_(fd_allowed)(RES, "epoll_create1", tid, True)) {
   1224       VG_(close)(RES);
   1225       SET_STATUS_Failure( VKI_EMFILE );
   1226    } else {
   1227       if (VG_(clo_track_fds))
   1228          ML_(record_fd_open_nameless) (tid, RES);
   1229    }
   1230 }
   1231 
   1232 PRE(sys_epoll_ctl)
   1233 {
   1234    static const HChar* epoll_ctl_s[3] = {
   1235       "EPOLL_CTL_ADD",
   1236       "EPOLL_CTL_DEL",
   1237       "EPOLL_CTL_MOD"
   1238    };
   1239    PRINT("sys_epoll_ctl ( %ld, %s, %ld, %#lx )",
   1240          ARG1, ( ARG2<3 ? epoll_ctl_s[ARG2] : "?" ), ARG3, ARG4);
   1241    PRE_REG_READ4(long, "epoll_ctl",
   1242                  int, epfd, int, op, int, fd, struct vki_epoll_event *, event);
   1243    if (ARG2 != VKI_EPOLL_CTL_DEL)
   1244       PRE_MEM_READ( "epoll_ctl(event)", ARG4, sizeof(struct vki_epoll_event) );
   1245 }
   1246 
   1247 PRE(sys_epoll_wait)
   1248 {
   1249    *flags |= SfMayBlock;
   1250    PRINT("sys_epoll_wait ( %ld, %#lx, %ld, %ld )", ARG1, ARG2, ARG3, ARG4);
   1251    PRE_REG_READ4(long, "epoll_wait",
   1252                  int, epfd, struct vki_epoll_event *, events,
   1253                  int, maxevents, int, timeout);
   1254    PRE_MEM_WRITE( "epoll_wait(events)", ARG2, sizeof(struct vki_epoll_event)*ARG3);
   1255 }
   1256 POST(sys_epoll_wait)
   1257 {
   1258    vg_assert(SUCCESS);
   1259    if (RES > 0)
   1260       POST_MEM_WRITE( ARG2, sizeof(struct vki_epoll_event)*RES ) ;
   1261 }
   1262 
   1263 PRE(sys_epoll_pwait)
   1264 {
   1265    *flags |= SfMayBlock;
   1266    PRINT("sys_epoll_pwait ( %ld, %#lx, %ld, %ld, %#lx, %llu )", ARG1,ARG2,ARG3,ARG4,ARG5,(ULong)ARG6);
   1267    PRE_REG_READ6(long, "epoll_pwait",
   1268                  int, epfd, struct vki_epoll_event *, events,
   1269                  int, maxevents, int, timeout, vki_sigset_t *, sigmask,
   1270                  vki_size_t, sigsetsize);
   1271    PRE_MEM_WRITE( "epoll_pwait(events)", ARG2, sizeof(struct vki_epoll_event)*ARG3);
   1272    if (ARG4)
   1273       PRE_MEM_READ( "epoll_pwait(sigmask)", ARG5, sizeof(vki_sigset_t) );
   1274 }
   1275 POST(sys_epoll_pwait)
   1276 {
   1277    vg_assert(SUCCESS);
   1278    if (RES > 0)
   1279       POST_MEM_WRITE( ARG2, sizeof(struct vki_epoll_event)*RES ) ;
   1280 }
   1281 
   1282 PRE(sys_eventfd)
   1283 {
   1284    PRINT("sys_eventfd ( %lu )", ARG1);
   1285    PRE_REG_READ1(long, "sys_eventfd", unsigned int, count);
   1286 }
   1287 POST(sys_eventfd)
   1288 {
   1289    if (!ML_(fd_allowed)(RES, "eventfd", tid, True)) {
   1290       VG_(close)(RES);
   1291       SET_STATUS_Failure( VKI_EMFILE );
   1292    } else {
   1293       if (VG_(clo_track_fds))
   1294          ML_(record_fd_open_nameless) (tid, RES);
   1295    }
   1296 }
   1297 
   1298 PRE(sys_eventfd2)
   1299 {
   1300    PRINT("sys_eventfd2 ( %lu, %ld )", ARG1,ARG2);
   1301    PRE_REG_READ2(long, "sys_eventfd2", unsigned int, count, int, flags);
   1302 }
   1303 POST(sys_eventfd2)
   1304 {
   1305    if (!ML_(fd_allowed)(RES, "eventfd2", tid, True)) {
   1306       VG_(close)(RES);
   1307       SET_STATUS_Failure( VKI_EMFILE );
   1308    } else {
   1309       if (VG_(clo_track_fds))
   1310          ML_(record_fd_open_nameless) (tid, RES);
   1311    }
   1312 }
   1313 
   1314 PRE(sys_fallocate)
   1315 {
   1316    *flags |= SfMayBlock;
   1317 #if VG_WORDSIZE == 4
   1318    PRINT("sys_fallocate ( %ld, %ld, %lld, %lld )",
   1319          ARG1, ARG2, MERGE64(ARG3,ARG4), MERGE64(ARG5,ARG6));
   1320    PRE_REG_READ6(long, "fallocate",
   1321                  int, fd, int, mode,
   1322                  unsigned, MERGE64_FIRST(offset), unsigned, MERGE64_SECOND(offset),
   1323                  unsigned, MERGE64_FIRST(len), unsigned, MERGE64_SECOND(len));
   1324 #elif VG_WORDSIZE == 8
   1325    PRINT("sys_fallocate ( %ld, %ld, %lld, %lld )",
   1326          ARG1, ARG2, (Long)ARG3, (Long)ARG4);
   1327    PRE_REG_READ4(long, "fallocate",
   1328                  int, fd, int, mode, vki_loff_t, offset, vki_loff_t, len);
   1329 #else
   1330 #  error Unexpected word size
   1331 #endif
   1332    if (!ML_(fd_allowed)(ARG1, "fallocate", tid, False))
   1333       SET_STATUS_Failure( VKI_EBADF );
   1334 }
   1335 
   1336 PRE(sys_prlimit64)
   1337 {
   1338    PRINT("sys_prlimit64 ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
   1339    PRE_REG_READ4(long, "prlimit64",
   1340                  vki_pid_t, pid, unsigned int, resource,
   1341                  const struct rlimit64 *, new_rlim,
   1342                  struct rlimit64 *, old_rlim);
   1343    if (ARG3)
   1344       PRE_MEM_READ( "rlimit64(new_rlim)", ARG3, sizeof(struct vki_rlimit64) );
   1345    if (ARG4)
   1346       PRE_MEM_WRITE( "rlimit64(old_rlim)", ARG4, sizeof(struct vki_rlimit64) );
   1347 
   1348    if (ARG3 &&
   1349        ((struct vki_rlimit64 *)ARG3)->rlim_cur > ((struct vki_rlimit64 *)ARG3)->rlim_max) {
   1350       SET_STATUS_Failure( VKI_EINVAL );
   1351    }
   1352    else if (ARG1 == 0 || ARG1 == VG_(getpid)()) {
   1353       switch (ARG2) {
   1354       case VKI_RLIMIT_NOFILE:
   1355          SET_STATUS_Success( 0 );
   1356          if (ARG4) {
   1357             ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(fd_soft_limit);
   1358             ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(fd_hard_limit);
   1359          }
   1360          if (ARG3) {
   1361             if (((struct vki_rlimit64 *)ARG3)->rlim_cur > VG_(fd_hard_limit) ||
   1362                 ((struct vki_rlimit64 *)ARG3)->rlim_max != VG_(fd_hard_limit)) {
   1363                SET_STATUS_Failure( VKI_EPERM );
   1364             }
   1365             else {
   1366                VG_(fd_soft_limit) = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
   1367             }
   1368          }
   1369          break;
   1370 
   1371       case VKI_RLIMIT_DATA:
   1372          SET_STATUS_Success( 0 );
   1373          if (ARG4) {
   1374             ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(client_rlimit_data).rlim_cur;
   1375             ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(client_rlimit_data).rlim_max;
   1376          }
   1377          if (ARG3) {
   1378             if (((struct vki_rlimit64 *)ARG3)->rlim_cur > VG_(client_rlimit_data).rlim_max ||
   1379                 ((struct vki_rlimit64 *)ARG3)->rlim_max > VG_(client_rlimit_data).rlim_max) {
   1380                SET_STATUS_Failure( VKI_EPERM );
   1381             }
   1382             else {
   1383                VG_(client_rlimit_data).rlim_cur = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
   1384                VG_(client_rlimit_data).rlim_max = ((struct vki_rlimit64 *)ARG3)->rlim_max;
   1385             }
   1386          }
   1387          break;
   1388 
   1389       case VKI_RLIMIT_STACK:
   1390          SET_STATUS_Success( 0 );
   1391          if (ARG4) {
   1392             ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(client_rlimit_stack).rlim_cur;
   1393             ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(client_rlimit_stack).rlim_max;
   1394          }
   1395          if (ARG3) {
   1396             if (((struct vki_rlimit64 *)ARG3)->rlim_cur > VG_(client_rlimit_stack).rlim_max ||
   1397                 ((struct vki_rlimit64 *)ARG3)->rlim_max > VG_(client_rlimit_stack).rlim_max) {
   1398                SET_STATUS_Failure( VKI_EPERM );
   1399             }
   1400             else {
   1401                VG_(threads)[tid].client_stack_szB = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
   1402                VG_(client_rlimit_stack).rlim_cur = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
   1403                VG_(client_rlimit_stack).rlim_max = ((struct vki_rlimit64 *)ARG3)->rlim_max;
   1404            }
   1405          }
   1406          break;
   1407       }
   1408    }
   1409 }
   1410 
   1411 POST(sys_prlimit64)
   1412 {
   1413    if (ARG4)
   1414       POST_MEM_WRITE( ARG4, sizeof(struct vki_rlimit64) );
   1415 }
   1416 
   1417 /* ---------------------------------------------------------------------
   1418    tid-related wrappers
   1419    ------------------------------------------------------------------ */
   1420 
   1421 PRE(sys_gettid)
   1422 {
   1423    PRINT("sys_gettid ()");
   1424    PRE_REG_READ0(long, "gettid");
   1425 }
   1426 
   1427 PRE(sys_set_tid_address)
   1428 {
   1429    PRINT("sys_set_tid_address ( %#lx )", ARG1);
   1430    PRE_REG_READ1(long, "set_tid_address", int *, tidptr);
   1431 }
   1432 
   1433 PRE(sys_tkill)
   1434 {
   1435    PRINT("sys_tgkill ( %ld, %ld )", ARG1,ARG2);
   1436    PRE_REG_READ2(long, "tkill", int, tid, int, sig);
   1437    if (!ML_(client_signal_OK)(ARG2)) {
   1438       SET_STATUS_Failure( VKI_EINVAL );
   1439       return;
   1440    }
   1441 
   1442    /* Check to see if this kill gave us a pending signal */
   1443    *flags |= SfPollAfter;
   1444 
   1445    if (VG_(clo_trace_signals))
   1446       VG_(message)(Vg_DebugMsg, "tkill: sending signal %ld to pid %ld\n",
   1447 		   ARG2, ARG1);
   1448 
   1449    /* If we're sending SIGKILL, check to see if the target is one of
   1450       our threads and handle it specially. */
   1451    if (ARG2 == VKI_SIGKILL && ML_(do_sigkill)(ARG1, -1)) {
   1452       SET_STATUS_Success(0);
   1453       return;
   1454    }
   1455 
   1456    /* Ask to handle this syscall via the slow route, since that's the
   1457       only one that sets tst->status to VgTs_WaitSys.  If the result
   1458       of doing the syscall is an immediate run of
   1459       async_signalhandler() in m_signals, then we need the thread to
   1460       be properly tidied away.  I have the impression the previous
   1461       version of this wrapper worked on x86/amd64 only because the
   1462       kernel did not immediately deliver the async signal to this
   1463       thread (on ppc it did, which broke the assertion re tst->status
   1464       at the top of async_signalhandler()). */
   1465    *flags |= SfMayBlock;
   1466 }
   1467 POST(sys_tkill)
   1468 {
   1469    if (VG_(clo_trace_signals))
   1470       VG_(message)(Vg_DebugMsg, "tkill: sent signal %ld to pid %ld\n",
   1471                    ARG2, ARG1);
   1472 }
   1473 
   1474 PRE(sys_tgkill)
   1475 {
   1476    PRINT("sys_tgkill ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   1477    PRE_REG_READ3(long, "tgkill", int, tgid, int, tid, int, sig);
   1478    if (!ML_(client_signal_OK)(ARG3)) {
   1479       SET_STATUS_Failure( VKI_EINVAL );
   1480       return;
   1481    }
   1482 
   1483    /* Check to see if this kill gave us a pending signal */
   1484    *flags |= SfPollAfter;
   1485 
   1486    if (VG_(clo_trace_signals))
   1487       VG_(message)(Vg_DebugMsg,
   1488                    "tgkill: sending signal %ld to pid %ld/%ld\n",
   1489 		   ARG3, ARG1, ARG2);
   1490 
   1491    /* If we're sending SIGKILL, check to see if the target is one of
   1492       our threads and handle it specially. */
   1493    if (ARG3 == VKI_SIGKILL && ML_(do_sigkill)(ARG2, ARG1)) {
   1494       SET_STATUS_Success(0);
   1495       return;
   1496    }
   1497 
   1498    /* Ask to handle this syscall via the slow route, since that's the
   1499       only one that sets tst->status to VgTs_WaitSys.  If the result
   1500       of doing the syscall is an immediate run of
   1501       async_signalhandler() in m_signals, then we need the thread to
   1502       be properly tidied away.  I have the impression the previous
   1503       version of this wrapper worked on x86/amd64 only because the
   1504       kernel did not immediately deliver the async signal to this
   1505       thread (on ppc it did, which broke the assertion re tst->status
   1506       at the top of async_signalhandler()). */
   1507    *flags |= SfMayBlock;
   1508 }
   1509 POST(sys_tgkill)
   1510 {
   1511    if (VG_(clo_trace_signals))
   1512       VG_(message)(Vg_DebugMsg,
   1513                    "tgkill: sent signal %ld to pid %ld/%ld\n",
   1514                    ARG3, ARG1, ARG2);
   1515 }
   1516 
   1517 /* ---------------------------------------------------------------------
   1518    fadvise64* wrappers
   1519    ------------------------------------------------------------------ */
   1520 
   1521 PRE(sys_fadvise64)
   1522 {
   1523    PRINT("sys_fadvise64 ( %ld, %lld, %lu, %ld )",
   1524          ARG1, MERGE64(ARG2,ARG3), ARG4, ARG5);
   1525    PRE_REG_READ5(long, "fadvise64",
   1526                  int, fd, vki_u32, MERGE64_FIRST(offset), vki_u32, MERGE64_SECOND(offset),
   1527                  vki_size_t, len, int, advice);
   1528 }
   1529 
   1530 PRE(sys_fadvise64_64)
   1531 {
   1532    PRINT("sys_fadvise64_64 ( %ld, %lld, %lld, %ld )",
   1533          ARG1, MERGE64(ARG2,ARG3), MERGE64(ARG4,ARG5), ARG6);
   1534    PRE_REG_READ6(long, "fadvise64_64",
   1535                  int, fd, vki_u32, MERGE64_FIRST(offset), vki_u32, MERGE64_SECOND(offset),
   1536                  vki_u32, MERGE64_FIRST(len), vki_u32, MERGE64_SECOND(len), int, advice);
   1537 }
   1538 
   1539 /* ---------------------------------------------------------------------
   1540    io_* wrappers
   1541    ------------------------------------------------------------------ */
   1542 
   1543 // Nb: this wrapper has to pad/unpad memory around the syscall itself,
   1544 // and this allows us to control exactly the code that gets run while
   1545 // the padding is in place.
   1546 
   1547 PRE(sys_io_setup)
   1548 {
   1549    PRINT("sys_io_setup ( %lu, %#lx )", ARG1,ARG2);
   1550    PRE_REG_READ2(long, "io_setup",
   1551                  unsigned, nr_events, vki_aio_context_t *, ctxp);
   1552    PRE_MEM_WRITE( "io_setup(ctxp)", ARG2, sizeof(vki_aio_context_t) );
   1553 }
   1554 
   1555 POST(sys_io_setup)
   1556 {
   1557    SizeT size;
   1558    struct vki_aio_ring *r;
   1559 
   1560    size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) +
   1561                        ARG1*sizeof(struct vki_io_event));
   1562    r = *(struct vki_aio_ring **)ARG2;
   1563    vg_assert(ML_(valid_client_addr)((Addr)r, size, tid, "io_setup"));
   1564 
   1565    ML_(notify_core_and_tool_of_mmap)( (Addr)r, size,
   1566                                       VKI_PROT_READ | VKI_PROT_WRITE,
   1567                                       VKI_MAP_ANONYMOUS, -1, 0 );
   1568 
   1569    POST_MEM_WRITE( ARG2, sizeof(vki_aio_context_t) );
   1570 }
   1571 
   1572 // Nb: This wrapper is "Special" because we need 'size' to do the unmap
   1573 // after the syscall.  We must get 'size' from the aio_ring structure,
   1574 // before the syscall, while the aio_ring structure still exists.  (And we
   1575 // know that we must look at the aio_ring structure because Tom inspected the
   1576 // kernel and glibc sources to see what they do, yuk.)
   1577 //
   1578 // XXX This segment can be implicitly unmapped when aio
   1579 // file-descriptors are closed...
   1580 PRE(sys_io_destroy)
   1581 {
   1582    SizeT size = 0;
   1583 
   1584    PRINT("sys_io_destroy ( %llu )", (ULong)ARG1);
   1585    PRE_REG_READ1(long, "io_destroy", vki_aio_context_t, ctx);
   1586 
   1587    // If we are going to seg fault (due to a bogus ARG1) do it as late as
   1588    // possible...
   1589    if (ML_(safe_to_deref)( (void*)ARG1, sizeof(struct vki_aio_ring))) {
   1590       struct vki_aio_ring *r = (struct vki_aio_ring *)ARG1;
   1591       size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) +
   1592                           r->nr*sizeof(struct vki_io_event));
   1593    }
   1594 
   1595    SET_STATUS_from_SysRes( VG_(do_syscall1)(SYSNO, ARG1) );
   1596 
   1597    if (SUCCESS && RES == 0) {
   1598       Bool d = VG_(am_notify_munmap)( ARG1, size );
   1599       VG_TRACK( die_mem_munmap, ARG1, size );
   1600       if (d)
   1601          VG_(discard_translations)( (Addr64)ARG1, (ULong)size,
   1602                                     "PRE(sys_io_destroy)" );
   1603    }
   1604 }
   1605 
   1606 PRE(sys_io_getevents)
   1607 {
   1608    *flags |= SfMayBlock;
   1609    PRINT("sys_io_getevents ( %llu, %lld, %lld, %#lx, %#lx )",
   1610          (ULong)ARG1,(Long)ARG2,(Long)ARG3,ARG4,ARG5);
   1611    PRE_REG_READ5(long, "io_getevents",
   1612                  vki_aio_context_t, ctx_id, long, min_nr, long, nr,
   1613                  struct io_event *, events,
   1614                  struct timespec *, timeout);
   1615    if (ARG3 > 0)
   1616       PRE_MEM_WRITE( "io_getevents(events)",
   1617                      ARG4, sizeof(struct vki_io_event)*ARG3 );
   1618    if (ARG5 != 0)
   1619       PRE_MEM_READ( "io_getevents(timeout)",
   1620                     ARG5, sizeof(struct vki_timespec));
   1621 }
   1622 POST(sys_io_getevents)
   1623 {
   1624    Int i;
   1625    vg_assert(SUCCESS);
   1626    if (RES > 0) {
   1627       POST_MEM_WRITE( ARG4, sizeof(struct vki_io_event)*RES );
   1628       for (i = 0; i < RES; i++) {
   1629          const struct vki_io_event *vev = ((struct vki_io_event *)ARG4) + i;
   1630          const struct vki_iocb *cb = (struct vki_iocb *)(Addr)vev->obj;
   1631 
   1632          switch (cb->aio_lio_opcode) {
   1633          case VKI_IOCB_CMD_PREAD:
   1634             if (vev->result > 0)
   1635                POST_MEM_WRITE( cb->aio_buf, vev->result );
   1636             break;
   1637 
   1638          case VKI_IOCB_CMD_PWRITE:
   1639             break;
   1640 
   1641          case VKI_IOCB_CMD_FSYNC:
   1642             break;
   1643 
   1644          case VKI_IOCB_CMD_FDSYNC:
   1645             break;
   1646 
   1647          case VKI_IOCB_CMD_PREADV:
   1648 	     if (vev->result > 0) {
   1649                   struct vki_iovec * vec = (struct vki_iovec *)(Addr)cb->aio_buf;
   1650                   Int remains = vev->result;
   1651                   Int j;
   1652 
   1653                   for (j = 0; j < cb->aio_nbytes; j++) {
   1654                        Int nReadThisBuf = vec[j].iov_len;
   1655                        if (nReadThisBuf > remains) nReadThisBuf = remains;
   1656                        POST_MEM_WRITE( (Addr)vec[j].iov_base, nReadThisBuf );
   1657                        remains -= nReadThisBuf;
   1658                        if (remains < 0) VG_(core_panic)("io_getevents(PREADV): remains < 0");
   1659                   }
   1660 	     }
   1661              break;
   1662 
   1663          case VKI_IOCB_CMD_PWRITEV:
   1664              break;
   1665 
   1666          default:
   1667             VG_(message)(Vg_DebugMsg,
   1668                         "Warning: unhandled io_getevents opcode: %u\n",
   1669                         cb->aio_lio_opcode);
   1670             break;
   1671          }
   1672       }
   1673    }
   1674 }
   1675 
   1676 PRE(sys_io_submit)
   1677 {
   1678    Int i, j;
   1679 
   1680    PRINT("sys_io_submit ( %llu, %ld, %#lx )", (ULong)ARG1,ARG2,ARG3);
   1681    PRE_REG_READ3(long, "io_submit",
   1682                  vki_aio_context_t, ctx_id, long, nr,
   1683                  struct iocb **, iocbpp);
   1684    PRE_MEM_READ( "io_submit(iocbpp)", ARG3, ARG2*sizeof(struct vki_iocb *) );
   1685    if (ARG3 != 0) {
   1686       for (i = 0; i < ARG2; i++) {
   1687          struct vki_iocb *cb = ((struct vki_iocb **)ARG3)[i];
   1688          struct vki_iovec *iov;
   1689 
   1690          PRE_MEM_READ( "io_submit(iocb)", (Addr)cb, sizeof(struct vki_iocb) );
   1691          switch (cb->aio_lio_opcode) {
   1692          case VKI_IOCB_CMD_PREAD:
   1693             PRE_MEM_WRITE( "io_submit(PREAD)", cb->aio_buf, cb->aio_nbytes );
   1694             break;
   1695 
   1696          case VKI_IOCB_CMD_PWRITE:
   1697             PRE_MEM_READ( "io_submit(PWRITE)", cb->aio_buf, cb->aio_nbytes );
   1698             break;
   1699 
   1700          case VKI_IOCB_CMD_FSYNC:
   1701             break;
   1702 
   1703          case VKI_IOCB_CMD_FDSYNC:
   1704             break;
   1705 
   1706          case VKI_IOCB_CMD_PREADV:
   1707             iov = (struct vki_iovec *)(Addr)cb->aio_buf;
   1708             PRE_MEM_READ( "io_submit(PREADV)", cb->aio_buf, cb->aio_nbytes * sizeof(struct vki_iovec) );
   1709             for (j = 0; j < cb->aio_nbytes; j++)
   1710                 PRE_MEM_WRITE( "io_submit(PREADV(iov[i]))", (Addr)iov[j].iov_base, iov[j].iov_len );
   1711             break;
   1712 
   1713          case VKI_IOCB_CMD_PWRITEV:
   1714             iov = (struct vki_iovec *)(Addr)cb->aio_buf;
   1715             PRE_MEM_READ( "io_submit(PWRITEV)", cb->aio_buf, cb->aio_nbytes * sizeof(struct vki_iovec) );
   1716             for (j = 0; j < cb->aio_nbytes; j++)
   1717                 PRE_MEM_READ( "io_submit(PWRITEV(iov[i]))", (Addr)iov[j].iov_base, iov[j].iov_len );
   1718             break;
   1719 
   1720          default:
   1721             VG_(message)(Vg_DebugMsg,"Warning: unhandled io_submit opcode: %u\n",
   1722                          cb->aio_lio_opcode);
   1723             break;
   1724          }
   1725       }
   1726    }
   1727 }
   1728 
   1729 PRE(sys_io_cancel)
   1730 {
   1731    PRINT("sys_io_cancel ( %llu, %#lx, %#lx )", (ULong)ARG1,ARG2,ARG3);
   1732    PRE_REG_READ3(long, "io_cancel",
   1733                  vki_aio_context_t, ctx_id, struct iocb *, iocb,
   1734                  struct io_event *, result);
   1735    PRE_MEM_READ( "io_cancel(iocb)", ARG2, sizeof(struct vki_iocb) );
   1736    PRE_MEM_WRITE( "io_cancel(result)", ARG3, sizeof(struct vki_io_event) );
   1737 }
   1738 POST(sys_io_cancel)
   1739 {
   1740    POST_MEM_WRITE( ARG3, sizeof(struct vki_io_event) );
   1741 }
   1742 
   1743 /* ---------------------------------------------------------------------
   1744    *_mempolicy wrappers
   1745    ------------------------------------------------------------------ */
   1746 
   1747 PRE(sys_mbind)
   1748 {
   1749    PRINT("sys_mbind ( %#lx, %lu, %ld, %#lx, %lu, %lu )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
   1750    PRE_REG_READ6(long, "mbind",
   1751                  unsigned long, start, unsigned long, len,
   1752                  unsigned long, policy, unsigned long *, nodemask,
   1753                  unsigned long, maxnode, unsigned, flags);
   1754    if (ARG1 != 0)
   1755       PRE_MEM_READ( "mbind(nodemask)", ARG4,
   1756                     VG_ROUNDUP( ARG5-1, sizeof(UWord) * 8 ) / 8 );
   1757 }
   1758 
   1759 PRE(sys_set_mempolicy)
   1760 {
   1761    PRINT("sys_set_mempolicy ( %ld, %#lx, %ld )", ARG1,ARG2,ARG3);
   1762    PRE_REG_READ3(long, "set_mempolicy",
   1763                  int, policy, unsigned long *, nodemask,
   1764                  unsigned long, maxnode);
   1765    PRE_MEM_READ( "set_mempolicy(nodemask)", ARG2,
   1766                  VG_ROUNDUP( ARG3-1, sizeof(UWord) * 8 ) / 8 );
   1767 }
   1768 
   1769 PRE(sys_get_mempolicy)
   1770 {
   1771    PRINT("sys_get_mempolicy ( %#lx, %#lx, %ld, %#lx, %lx )", ARG1,ARG2,ARG3,ARG4,ARG5);
   1772    PRE_REG_READ5(long, "get_mempolicy",
   1773                  int *, policy, unsigned long *, nodemask,
   1774                  unsigned long, maxnode, unsigned long, addr,
   1775                  unsigned long, flags);
   1776    if (ARG1 != 0)
   1777       PRE_MEM_WRITE( "get_mempolicy(policy)", ARG1, sizeof(Int) );
   1778    if (ARG2 != 0)
   1779       PRE_MEM_WRITE( "get_mempolicy(nodemask)", ARG2,
   1780                      VG_ROUNDUP( ARG3-1, sizeof(UWord) * 8 ) / 8 );
   1781 }
   1782 POST(sys_get_mempolicy)
   1783 {
   1784    if (ARG1 != 0)
   1785       POST_MEM_WRITE( ARG1, sizeof(Int) );
   1786    if (ARG2 != 0)
   1787       POST_MEM_WRITE( ARG2, VG_ROUNDUP( ARG3-1, sizeof(UWord) * 8 ) / 8 );
   1788 }
   1789 
   1790 /* ---------------------------------------------------------------------
   1791    inotify_* wrappers
   1792    ------------------------------------------------------------------ */
   1793 
   1794 PRE(sys_inotify_init)
   1795 {
   1796    PRINT("sys_inotify_init ( )");
   1797    PRE_REG_READ0(long, "inotify_init");
   1798 }
   1799 POST(sys_inotify_init)
   1800 {
   1801    vg_assert(SUCCESS);
   1802    if (!ML_(fd_allowed)(RES, "inotify_init", tid, True)) {
   1803       VG_(close)(RES);
   1804       SET_STATUS_Failure( VKI_EMFILE );
   1805    } else {
   1806       if (VG_(clo_track_fds))
   1807          ML_(record_fd_open_nameless) (tid, RES);
   1808    }
   1809 }
   1810 
   1811 PRE(sys_inotify_init1)
   1812 {
   1813    PRINT("sys_inotify_init ( %ld )", ARG1);
   1814    PRE_REG_READ1(long, "inotify_init", int, flag);
   1815 }
   1816 
   1817 POST(sys_inotify_init1)
   1818 {
   1819    vg_assert(SUCCESS);
   1820    if (!ML_(fd_allowed)(RES, "inotify_init", tid, True)) {
   1821       VG_(close)(RES);
   1822       SET_STATUS_Failure( VKI_EMFILE );
   1823    } else {
   1824       if (VG_(clo_track_fds))
   1825          ML_(record_fd_open_nameless) (tid, RES);
   1826    }
   1827 }
   1828 
   1829 PRE(sys_inotify_add_watch)
   1830 {
   1831    PRINT( "sys_inotify_add_watch ( %ld, %#lx, %lx )", ARG1,ARG2,ARG3);
   1832    PRE_REG_READ3(long, "inotify_add_watch", int, fd, char *, path, int, mask);
   1833    PRE_MEM_RASCIIZ( "inotify_add_watch(path)", ARG2 );
   1834 }
   1835 
   1836 PRE(sys_inotify_rm_watch)
   1837 {
   1838    PRINT( "sys_inotify_rm_watch ( %ld, %lx )", ARG1,ARG2);
   1839    PRE_REG_READ2(long, "inotify_rm_watch", int, fd, int, wd);
   1840 }
   1841 
   1842 /* ---------------------------------------------------------------------
   1843    mq_* wrappers
   1844    ------------------------------------------------------------------ */
   1845 
   1846 PRE(sys_mq_open)
   1847 {
   1848    PRINT("sys_mq_open( %#lx(%s), %ld, %lld, %#lx )",
   1849          ARG1,(char*)ARG1,ARG2,(ULong)ARG3,ARG4);
   1850    PRE_REG_READ4(long, "mq_open",
   1851                  const char *, name, int, oflag, vki_mode_t, mode,
   1852                  struct mq_attr *, attr);
   1853    PRE_MEM_RASCIIZ( "mq_open(name)", ARG1 );
   1854    if ((ARG2 & VKI_O_CREAT) != 0 && ARG4 != 0) {
   1855       const struct vki_mq_attr *attr = (struct vki_mq_attr *)ARG4;
   1856       PRE_MEM_READ( "mq_open(attr->mq_maxmsg)",
   1857                      (Addr)&attr->mq_maxmsg, sizeof(attr->mq_maxmsg) );
   1858       PRE_MEM_READ( "mq_open(attr->mq_msgsize)",
   1859                      (Addr)&attr->mq_msgsize, sizeof(attr->mq_msgsize) );
   1860    }
   1861 }
   1862 POST(sys_mq_open)
   1863 {
   1864    vg_assert(SUCCESS);
   1865    if (!ML_(fd_allowed)(RES, "mq_open", tid, True)) {
   1866       VG_(close)(RES);
   1867       SET_STATUS_Failure( VKI_EMFILE );
   1868    } else {
   1869       if (VG_(clo_track_fds))
   1870          ML_(record_fd_open_with_given_name)(tid, RES, (Char*)ARG1);
   1871    }
   1872 }
   1873 
   1874 PRE(sys_mq_unlink)
   1875 {
   1876    PRINT("sys_mq_unlink ( %#lx(%s) )", ARG1,(char*)ARG1);
   1877    PRE_REG_READ1(long, "mq_unlink", const char *, name);
   1878    PRE_MEM_RASCIIZ( "mq_unlink(name)", ARG1 );
   1879 }
   1880 
   1881 PRE(sys_mq_timedsend)
   1882 {
   1883    *flags |= SfMayBlock;
   1884    PRINT("sys_mq_timedsend ( %ld, %#lx, %llu, %ld, %#lx )",
   1885          ARG1,ARG2,(ULong)ARG3,ARG4,ARG5);
   1886    PRE_REG_READ5(long, "mq_timedsend",
   1887                  vki_mqd_t, mqdes, const char *, msg_ptr, vki_size_t, msg_len,
   1888                  unsigned int, msg_prio, const struct timespec *, abs_timeout);
   1889    if (!ML_(fd_allowed)(ARG1, "mq_timedsend", tid, False)) {
   1890       SET_STATUS_Failure( VKI_EBADF );
   1891    } else {
   1892       PRE_MEM_READ( "mq_timedsend(msg_ptr)", ARG2, ARG3 );
   1893       if (ARG5 != 0)
   1894          PRE_MEM_READ( "mq_timedsend(abs_timeout)", ARG5,
   1895                         sizeof(struct vki_timespec) );
   1896    }
   1897 }
   1898 
   1899 PRE(sys_mq_timedreceive)
   1900 {
   1901    *flags |= SfMayBlock;
   1902    PRINT("sys_mq_timedreceive( %ld, %#lx, %llu, %#lx, %#lx )",
   1903          ARG1,ARG2,(ULong)ARG3,ARG4,ARG5);
   1904    PRE_REG_READ5(ssize_t, "mq_timedreceive",
   1905                  vki_mqd_t, mqdes, char *, msg_ptr, vki_size_t, msg_len,
   1906                  unsigned int *, msg_prio,
   1907                  const struct timespec *, abs_timeout);
   1908    if (!ML_(fd_allowed)(ARG1, "mq_timedreceive", tid, False)) {
   1909       SET_STATUS_Failure( VKI_EBADF );
   1910    } else {
   1911       PRE_MEM_WRITE( "mq_timedreceive(msg_ptr)", ARG2, ARG3 );
   1912       if (ARG4 != 0)
   1913          PRE_MEM_WRITE( "mq_timedreceive(msg_prio)",
   1914                         ARG4, sizeof(unsigned int) );
   1915       if (ARG5 != 0)
   1916          PRE_MEM_READ( "mq_timedreceive(abs_timeout)",
   1917                         ARG5, sizeof(struct vki_timespec) );
   1918    }
   1919 }
   1920 POST(sys_mq_timedreceive)
   1921 {
   1922    POST_MEM_WRITE( ARG2, RES );
   1923    if (ARG4 != 0)
   1924       POST_MEM_WRITE( ARG4, sizeof(unsigned int) );
   1925 }
   1926 
   1927 PRE(sys_mq_notify)
   1928 {
   1929    PRINT("sys_mq_notify( %ld, %#lx )", ARG1,ARG2 );
   1930    PRE_REG_READ2(long, "mq_notify",
   1931                  vki_mqd_t, mqdes, const struct sigevent *, notification);
   1932    if (!ML_(fd_allowed)(ARG1, "mq_notify", tid, False))
   1933       SET_STATUS_Failure( VKI_EBADF );
   1934    else if (ARG2 != 0)
   1935       PRE_MEM_READ( "mq_notify(notification)",
   1936                     ARG2, sizeof(struct vki_sigevent) );
   1937 }
   1938 
   1939 PRE(sys_mq_getsetattr)
   1940 {
   1941    PRINT("sys_mq_getsetattr( %ld, %#lx, %#lx )", ARG1,ARG2,ARG3 );
   1942    PRE_REG_READ3(long, "mq_getsetattr",
   1943                  vki_mqd_t, mqdes, const struct mq_attr *, mqstat,
   1944                  struct mq_attr *, omqstat);
   1945    if (!ML_(fd_allowed)(ARG1, "mq_getsetattr", tid, False)) {
   1946       SET_STATUS_Failure( VKI_EBADF );
   1947    } else {
   1948       if (ARG2 != 0) {
   1949          const struct vki_mq_attr *attr = (struct vki_mq_attr *)ARG2;
   1950          PRE_MEM_READ( "mq_getsetattr(mqstat->mq_flags)",
   1951                         (Addr)&attr->mq_flags, sizeof(attr->mq_flags) );
   1952       }
   1953       if (ARG3 != 0)
   1954          PRE_MEM_WRITE( "mq_getsetattr(omqstat)", ARG3,
   1955                         sizeof(struct vki_mq_attr) );
   1956    }
   1957 }
   1958 POST(sys_mq_getsetattr)
   1959 {
   1960    if (ARG3 != 0)
   1961       POST_MEM_WRITE( ARG3, sizeof(struct vki_mq_attr) );
   1962 }
   1963 
   1964 /* ---------------------------------------------------------------------
   1965    clock_* wrappers
   1966    ------------------------------------------------------------------ */
   1967 
   1968 PRE(sys_clock_settime)
   1969 {
   1970    PRINT("sys_clock_settime( %ld, %#lx )", ARG1,ARG2);
   1971    PRE_REG_READ2(long, "clock_settime",
   1972                  vki_clockid_t, clk_id, const struct timespec *, tp);
   1973    PRE_MEM_READ( "clock_settime(tp)", ARG2, sizeof(struct vki_timespec) );
   1974 }
   1975 
   1976 PRE(sys_clock_gettime)
   1977 {
   1978    PRINT("sys_clock_gettime( %ld, %#lx )" , ARG1,ARG2);
   1979    PRE_REG_READ2(long, "clock_gettime",
   1980                  vki_clockid_t, clk_id, struct timespec *, tp);
   1981    PRE_MEM_WRITE( "clock_gettime(tp)", ARG2, sizeof(struct vki_timespec) );
   1982 }
   1983 POST(sys_clock_gettime)
   1984 {
   1985    POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
   1986 }
   1987 
   1988 PRE(sys_clock_getres)
   1989 {
   1990    PRINT("sys_clock_getres( %ld, %#lx )" , ARG1,ARG2);
   1991    // Nb: we can't use "RES" as the param name because that's a macro
   1992    // defined above!
   1993    PRE_REG_READ2(long, "clock_getres",
   1994                  vki_clockid_t, clk_id, struct timespec *, res);
   1995    if (ARG2 != 0)
   1996       PRE_MEM_WRITE( "clock_getres(res)", ARG2, sizeof(struct vki_timespec) );
   1997 }
   1998 POST(sys_clock_getres)
   1999 {
   2000    if (ARG2 != 0)
   2001       POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
   2002 }
   2003 
   2004 PRE(sys_clock_nanosleep)
   2005 {
   2006    *flags |= SfMayBlock|SfPostOnFail;
   2007    PRINT("sys_clock_nanosleep( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
   2008    PRE_REG_READ4(int32_t, "clock_nanosleep",
   2009                  vki_clockid_t, clkid, int, flags,
   2010                  const struct timespec *, rqtp, struct timespec *, rmtp);
   2011    PRE_MEM_READ( "clock_nanosleep(rqtp)", ARG3, sizeof(struct vki_timespec) );
   2012    if (ARG4 != 0)
   2013       PRE_MEM_WRITE( "clock_nanosleep(rmtp)", ARG4, sizeof(struct vki_timespec) );
   2014 }
   2015 POST(sys_clock_nanosleep)
   2016 {
   2017    if (ARG4 != 0 && FAILURE && ERR == VKI_EINTR)
   2018       POST_MEM_WRITE( ARG4, sizeof(struct vki_timespec) );
   2019 }
   2020 
   2021 /* ---------------------------------------------------------------------
   2022    timer_* wrappers
   2023    ------------------------------------------------------------------ */
   2024 
   2025 PRE(sys_timer_create)
   2026 {
   2027    PRINT("sys_timer_create( %ld, %#lx, %#lx )", ARG1,ARG2,ARG3);
   2028    PRE_REG_READ3(long, "timer_create",
   2029                  vki_clockid_t, clockid, struct sigevent *, evp,
   2030                  vki_timer_t *, timerid);
   2031    if (ARG2 != 0)
   2032       PRE_MEM_READ( "timer_create(evp)", ARG2, sizeof(struct vki_sigevent) );
   2033    PRE_MEM_WRITE( "timer_create(timerid)", ARG3, sizeof(vki_timer_t) );
   2034 }
   2035 POST(sys_timer_create)
   2036 {
   2037    POST_MEM_WRITE( ARG3, sizeof(vki_timer_t) );
   2038 }
   2039 
   2040 PRE(sys_timer_settime)
   2041 {
   2042    PRINT("sys_timer_settime( %lld, %ld, %#lx, %#lx )", (ULong)ARG1,ARG2,ARG3,ARG4);
   2043    PRE_REG_READ4(long, "timer_settime",
   2044                  vki_timer_t, timerid, int, flags,
   2045                  const struct itimerspec *, value,
   2046                  struct itimerspec *, ovalue);
   2047    PRE_MEM_READ( "timer_settime(value)", ARG3,
   2048                   sizeof(struct vki_itimerspec) );
   2049    if (ARG4 != 0)
   2050        PRE_MEM_WRITE( "timer_settime(ovalue)", ARG4,
   2051                       sizeof(struct vki_itimerspec) );
   2052 }
   2053 POST(sys_timer_settime)
   2054 {
   2055    if (ARG4 != 0)
   2056       POST_MEM_WRITE( ARG4, sizeof(struct vki_itimerspec) );
   2057 }
   2058 
   2059 PRE(sys_timer_gettime)
   2060 {
   2061    PRINT("sys_timer_gettime( %lld, %#lx )", (ULong)ARG1,ARG2);
   2062    PRE_REG_READ2(long, "timer_gettime",
   2063                  vki_timer_t, timerid, struct itimerspec *, value);
   2064    PRE_MEM_WRITE( "timer_gettime(value)", ARG2,
   2065                   sizeof(struct vki_itimerspec));
   2066 }
   2067 POST(sys_timer_gettime)
   2068 {
   2069    POST_MEM_WRITE( ARG2, sizeof(struct vki_itimerspec) );
   2070 }
   2071 
   2072 PRE(sys_timer_getoverrun)
   2073 {
   2074    PRINT("sys_timer_getoverrun( %#lx )", ARG1);
   2075    PRE_REG_READ1(long, "timer_getoverrun", vki_timer_t, timerid);
   2076 }
   2077 
   2078 PRE(sys_timer_delete)
   2079 {
   2080    PRINT("sys_timer_delete( %#lx )", ARG1);
   2081    PRE_REG_READ1(long, "timer_delete", vki_timer_t, timerid);
   2082 }
   2083 
   2084 /* ---------------------------------------------------------------------
   2085    timerfd* wrappers
   2086    See also http://lwn.net/Articles/260172/ for an overview.
   2087    See also /usr/src/linux/fs/timerfd.c for the implementation.
   2088    ------------------------------------------------------------------ */
   2089 
   2090 /* Returns True if running on 2.6.22, else False (or False if
   2091    cannot be determined). */
   2092 static Bool linux_kernel_2_6_22(void)
   2093 {
   2094    static Int result = -1;
   2095    Int fd, read;
   2096    HChar release[64];
   2097    SysRes res;
   2098 
   2099    if (result == -1) {
   2100       res = VG_(open)("/proc/sys/kernel/osrelease", 0, 0);
   2101       if (sr_isError(res))
   2102          return False;
   2103       fd = sr_Res(res);
   2104       read = VG_(read)(fd, release, sizeof(release) - 1);
   2105       vg_assert(read >= 0);
   2106       release[read] = 0;
   2107       VG_(close)(fd);
   2108       //VG_(printf)("kernel release = %s\n", release);
   2109       result = (VG_(strncmp)(release, "2.6.22", 6) == 0
   2110                 && (release[6] < '0' || release[6] > '9'));
   2111    }
   2112    vg_assert(result == 0 || result == 1);
   2113    return result == 1;
   2114 }
   2115 
   2116 PRE(sys_timerfd_create)
   2117 {
   2118    if (linux_kernel_2_6_22()) {
   2119       /* 2.6.22 kernel: timerfd system call. */
   2120       PRINT("sys_timerfd ( %ld, %ld, %#lx )", ARG1, ARG2, ARG3);
   2121       PRE_REG_READ3(long, "sys_timerfd",
   2122                     int, fd, int, clockid, const struct itimerspec *, tmr);
   2123       PRE_MEM_READ("timerfd(tmr)", ARG3,
   2124                    sizeof(struct vki_itimerspec) );
   2125       if ((Word)ARG1 != -1L && !ML_(fd_allowed)(ARG1, "timerfd", tid, False))
   2126          SET_STATUS_Failure( VKI_EBADF );
   2127    } else {
   2128       /* 2.6.24 and later kernels: timerfd_create system call. */
   2129       PRINT("sys_timerfd_create (%ld, %ld )", ARG1, ARG2);
   2130       PRE_REG_READ2(long, "timerfd_create", int, clockid, int, flags);
   2131    }
   2132 }
   2133 POST(sys_timerfd_create)
   2134 {
   2135    if (linux_kernel_2_6_22())
   2136    {
   2137       /* 2.6.22 kernel: timerfd system call. */
   2138       if (!ML_(fd_allowed)(RES, "timerfd", tid, True)) {
   2139          VG_(close)(RES);
   2140          SET_STATUS_Failure( VKI_EMFILE );
   2141       } else {
   2142          if (VG_(clo_track_fds))
   2143             ML_(record_fd_open_nameless) (tid, RES);
   2144       }
   2145    }
   2146    else
   2147    {
   2148       /* 2.6.24 and later kernels: timerfd_create system call. */
   2149       if (!ML_(fd_allowed)(RES, "timerfd_create", tid, True)) {
   2150          VG_(close)(RES);
   2151          SET_STATUS_Failure( VKI_EMFILE );
   2152       } else {
   2153          if (VG_(clo_track_fds))
   2154             ML_(record_fd_open_nameless) (tid, RES);
   2155       }
   2156    }
   2157 }
   2158 
   2159 PRE(sys_timerfd_gettime)
   2160 {
   2161    PRINT("sys_timerfd_gettime ( %ld, %#lx )", ARG1, ARG2);
   2162    PRE_REG_READ2(long, "timerfd_gettime",
   2163                  int, ufd,
   2164                  struct vki_itimerspec*, otmr);
   2165    if (!ML_(fd_allowed)(ARG1, "timerfd_gettime", tid, False))
   2166       SET_STATUS_Failure(VKI_EBADF);
   2167    else
   2168       PRE_MEM_WRITE("timerfd_gettime(result)",
   2169                     ARG2, sizeof(struct vki_itimerspec));
   2170 }
   2171 POST(sys_timerfd_gettime)
   2172 {
   2173    if (RES == 0)
   2174       POST_MEM_WRITE(ARG2, sizeof(struct vki_itimerspec));
   2175 }
   2176 
   2177 PRE(sys_timerfd_settime)
   2178 {
   2179    PRINT("sys_timerfd_settime ( %ld, %ld, %#lx, %#lx )", ARG1, ARG2, ARG3, ARG4);
   2180    PRE_REG_READ4(long, "timerfd_settime",
   2181                  int, ufd,
   2182                  int, flags,
   2183                  const struct vki_itimerspec*, utmr,
   2184                  struct vki_itimerspec*, otmr);
   2185    if (!ML_(fd_allowed)(ARG1, "timerfd_settime", tid, False))
   2186       SET_STATUS_Failure(VKI_EBADF);
   2187    else
   2188    {
   2189       PRE_MEM_READ("timerfd_settime(result)",
   2190                    ARG3, sizeof(struct vki_itimerspec));
   2191       if (ARG4)
   2192       {
   2193          PRE_MEM_WRITE("timerfd_settime(result)",
   2194                        ARG4, sizeof(struct vki_itimerspec));
   2195       }
   2196    }
   2197 }
   2198 POST(sys_timerfd_settime)
   2199 {
   2200    if (RES == 0 && ARG4 != 0)
   2201       POST_MEM_WRITE(ARG4, sizeof(struct vki_itimerspec));
   2202 }
   2203 
   2204 /* ---------------------------------------------------------------------
   2205    capabilities wrappers
   2206    ------------------------------------------------------------------ */
   2207 
   2208 PRE(sys_capget)
   2209 {
   2210    PRINT("sys_capget ( %#lx, %#lx )", ARG1, ARG2 );
   2211    PRE_REG_READ2(long, "capget",
   2212                  vki_cap_user_header_t, header, vki_cap_user_data_t, data);
   2213    PRE_MEM_READ( "capget(header)", ARG1,
   2214                   sizeof(struct __vki_user_cap_header_struct) );
   2215    PRE_MEM_WRITE( "capget(data)", ARG2,
   2216                   sizeof(struct __vki_user_cap_data_struct) );
   2217 }
   2218 POST(sys_capget)
   2219 {
   2220    if (ARG2 != (Addr)NULL)
   2221       POST_MEM_WRITE( ARG2, sizeof(struct __vki_user_cap_data_struct) );
   2222 }
   2223 
   2224 PRE(sys_capset)
   2225 {
   2226    PRINT("sys_capset ( %#lx, %#lx )", ARG1, ARG2 );
   2227    PRE_REG_READ2(long, "capset",
   2228                  vki_cap_user_header_t, header,
   2229                  const vki_cap_user_data_t, data);
   2230    PRE_MEM_READ( "capset(header)",
   2231                   ARG1, sizeof(struct __vki_user_cap_header_struct) );
   2232    PRE_MEM_READ( "capset(data)",
   2233                   ARG2, sizeof(struct __vki_user_cap_data_struct) );
   2234 }
   2235 
   2236 /* ---------------------------------------------------------------------
   2237    16-bit uid/gid/groups wrappers
   2238    ------------------------------------------------------------------ */
   2239 
   2240 PRE(sys_getuid16)
   2241 {
   2242    PRINT("sys_getuid16 ( )");
   2243    PRE_REG_READ0(long, "getuid16");
   2244 }
   2245 
   2246 PRE(sys_setuid16)
   2247 {
   2248    PRINT("sys_setuid16 ( %ld )", ARG1);
   2249    PRE_REG_READ1(long, "setuid16", vki_old_uid_t, uid);
   2250 }
   2251 
   2252 PRE(sys_getgid16)
   2253 {
   2254    PRINT("sys_getgid16 ( )");
   2255    PRE_REG_READ0(long, "getgid16");
   2256 }
   2257 
   2258 PRE(sys_setgid16)
   2259 {
   2260    PRINT("sys_setgid16 ( %ld )", ARG1);
   2261    PRE_REG_READ1(long, "setgid16", vki_old_gid_t, gid);
   2262 }
   2263 
   2264 PRE(sys_geteuid16)
   2265 {
   2266    PRINT("sys_geteuid16 ( )");
   2267    PRE_REG_READ0(long, "geteuid16");
   2268 }
   2269 
   2270 PRE(sys_getegid16)
   2271 {
   2272    PRINT("sys_getegid16 ( )");
   2273    PRE_REG_READ0(long, "getegid16");
   2274 }
   2275 
   2276 PRE(sys_setreuid16)
   2277 {
   2278    PRINT("setreuid16 ( 0x%lx, 0x%lx )", ARG1, ARG2);
   2279    PRE_REG_READ2(long, "setreuid16", vki_old_uid_t, ruid, vki_old_uid_t, euid);
   2280 }
   2281 
   2282 PRE(sys_setregid16)
   2283 {
   2284    PRINT("sys_setregid16 ( %ld, %ld )", ARG1, ARG2);
   2285    PRE_REG_READ2(long, "setregid16", vki_old_gid_t, rgid, vki_old_gid_t, egid);
   2286 }
   2287 
   2288 PRE(sys_getgroups16)
   2289 {
   2290    PRINT("sys_getgroups16 ( %ld, %#lx )", ARG1, ARG2);
   2291    PRE_REG_READ2(long, "getgroups16", int, size, vki_old_gid_t *, list);
   2292    if (ARG1 > 0)
   2293       PRE_MEM_WRITE( "getgroups16(list)", ARG2, ARG1 * sizeof(vki_old_gid_t) );
   2294 }
   2295 POST(sys_getgroups16)
   2296 {
   2297    vg_assert(SUCCESS);
   2298    if (ARG1 > 0 && RES > 0)
   2299       POST_MEM_WRITE( ARG2, RES * sizeof(vki_old_gid_t) );
   2300 }
   2301 
   2302 PRE(sys_setgroups16)
   2303 {
   2304    PRINT("sys_setgroups16 ( %llu, %#lx )", (ULong)ARG1, ARG2);
   2305    PRE_REG_READ2(long, "setgroups16", int, size, vki_old_gid_t *, list);
   2306    if (ARG1 > 0)
   2307       PRE_MEM_READ( "setgroups16(list)", ARG2, ARG1 * sizeof(vki_old_gid_t) );
   2308 }
   2309 
   2310 /* ---------------------------------------------------------------------
   2311    *chown16 wrappers
   2312    ------------------------------------------------------------------ */
   2313 
   2314 PRE(sys_chown16)
   2315 {
   2316    PRINT("sys_chown16 ( %#lx, 0x%lx, 0x%lx )", ARG1,ARG2,ARG3);
   2317    PRE_REG_READ3(long, "chown16",
   2318                  const char *, path,
   2319                  vki_old_uid_t, owner, vki_old_gid_t, group);
   2320    PRE_MEM_RASCIIZ( "chown16(path)", ARG1 );
   2321 }
   2322 
   2323 PRE(sys_fchown16)
   2324 {
   2325    PRINT("sys_fchown16 ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   2326    PRE_REG_READ3(long, "fchown16",
   2327                  unsigned int, fd, vki_old_uid_t, owner, vki_old_gid_t, group);
   2328 }
   2329 
   2330 /* ---------------------------------------------------------------------
   2331    *xattr wrappers
   2332    ------------------------------------------------------------------ */
   2333 
   2334 PRE(sys_setxattr)
   2335 {
   2336    *flags |= SfMayBlock;
   2337    PRINT("sys_setxattr ( %#lx, %#lx, %#lx, %llu, %ld )",
   2338          ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
   2339    PRE_REG_READ5(long, "setxattr",
   2340                  char *, path, char *, name,
   2341                  void *, value, vki_size_t, size, int, flags);
   2342    PRE_MEM_RASCIIZ( "setxattr(path)", ARG1 );
   2343    PRE_MEM_RASCIIZ( "setxattr(name)", ARG2 );
   2344    PRE_MEM_READ( "setxattr(value)", ARG3, ARG4 );
   2345 }
   2346 
   2347 PRE(sys_lsetxattr)
   2348 {
   2349    *flags |= SfMayBlock;
   2350    PRINT("sys_lsetxattr ( %#lx, %#lx, %#lx, %llu, %ld )",
   2351          ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
   2352    PRE_REG_READ5(long, "lsetxattr",
   2353                  char *, path, char *, name,
   2354                  void *, value, vki_size_t, size, int, flags);
   2355    PRE_MEM_RASCIIZ( "lsetxattr(path)", ARG1 );
   2356    PRE_MEM_RASCIIZ( "lsetxattr(name)", ARG2 );
   2357    PRE_MEM_READ( "lsetxattr(value)", ARG3, ARG4 );
   2358 }
   2359 
   2360 PRE(sys_fsetxattr)
   2361 {
   2362    *flags |= SfMayBlock;
   2363    PRINT("sys_fsetxattr ( %ld, %#lx, %#lx, %llu, %ld )",
   2364          ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
   2365    PRE_REG_READ5(long, "fsetxattr",
   2366                  int, fd, char *, name, void *, value,
   2367                  vki_size_t, size, int, flags);
   2368    PRE_MEM_RASCIIZ( "fsetxattr(name)", ARG2 );
   2369    PRE_MEM_READ( "fsetxattr(value)", ARG3, ARG4 );
   2370 }
   2371 
   2372 PRE(sys_getxattr)
   2373 {
   2374    *flags |= SfMayBlock;
   2375    PRINT("sys_getxattr ( %#lx, %#lx, %#lx, %llu )", ARG1,ARG2,ARG3, (ULong)ARG4);
   2376    PRE_REG_READ4(ssize_t, "getxattr",
   2377                  char *, path, char *, name, void *, value, vki_size_t, size);
   2378    PRE_MEM_RASCIIZ( "getxattr(path)", ARG1 );
   2379    PRE_MEM_RASCIIZ( "getxattr(name)", ARG2 );
   2380    PRE_MEM_WRITE( "getxattr(value)", ARG3, ARG4 );
   2381 }
   2382 POST(sys_getxattr)
   2383 {
   2384    vg_assert(SUCCESS);
   2385    if (RES > 0 && ARG3 != (Addr)NULL) {
   2386       POST_MEM_WRITE( ARG3, RES );
   2387    }
   2388 }
   2389 
   2390 PRE(sys_lgetxattr)
   2391 {
   2392    *flags |= SfMayBlock;
   2393    PRINT("sys_lgetxattr ( %#lx, %#lx, %#lx, %llu )", ARG1,ARG2,ARG3, (ULong)ARG4);
   2394    PRE_REG_READ4(ssize_t, "lgetxattr",
   2395                  char *, path, char *, name, void *, value, vki_size_t, size);
   2396    PRE_MEM_RASCIIZ( "lgetxattr(path)", ARG1 );
   2397    PRE_MEM_RASCIIZ( "lgetxattr(name)", ARG2 );
   2398    PRE_MEM_WRITE( "lgetxattr(value)", ARG3, ARG4 );
   2399 }
   2400 POST(sys_lgetxattr)
   2401 {
   2402    vg_assert(SUCCESS);
   2403    if (RES > 0 && ARG3 != (Addr)NULL) {
   2404       POST_MEM_WRITE( ARG3, RES );
   2405    }
   2406 }
   2407 
   2408 PRE(sys_fgetxattr)
   2409 {
   2410    *flags |= SfMayBlock;
   2411    PRINT("sys_fgetxattr ( %ld, %#lx, %#lx, %llu )", ARG1, ARG2, ARG3, (ULong)ARG4);
   2412    PRE_REG_READ4(ssize_t, "fgetxattr",
   2413                  int, fd, char *, name, void *, value, vki_size_t, size);
   2414    PRE_MEM_RASCIIZ( "fgetxattr(name)", ARG2 );
   2415    PRE_MEM_WRITE( "fgetxattr(value)", ARG3, ARG4 );
   2416 }
   2417 POST(sys_fgetxattr)
   2418 {
   2419    if (RES > 0 && ARG3 != (Addr)NULL)
   2420       POST_MEM_WRITE( ARG3, RES );
   2421 }
   2422 
   2423 PRE(sys_listxattr)
   2424 {
   2425    *flags |= SfMayBlock;
   2426    PRINT("sys_listxattr ( %#lx, %#lx, %llu )", ARG1, ARG2, (ULong)ARG3);
   2427    PRE_REG_READ3(ssize_t, "listxattr",
   2428                  char *, path, char *, list, vki_size_t, size);
   2429    PRE_MEM_RASCIIZ( "listxattr(path)", ARG1 );
   2430    PRE_MEM_WRITE( "listxattr(list)", ARG2, ARG3 );
   2431 }
   2432 POST(sys_listxattr)
   2433 {
   2434    if (RES > 0 && ARG2 != (Addr)NULL)
   2435       POST_MEM_WRITE( ARG2, RES );
   2436 }
   2437 
   2438 PRE(sys_llistxattr)
   2439 {
   2440    *flags |= SfMayBlock;
   2441    PRINT("sys_llistxattr ( %#lx, %#lx, %llu )", ARG1, ARG2, (ULong)ARG3);
   2442    PRE_REG_READ3(ssize_t, "llistxattr",
   2443                  char *, path, char *, list, vki_size_t, size);
   2444    PRE_MEM_RASCIIZ( "llistxattr(path)", ARG1 );
   2445    PRE_MEM_WRITE( "llistxattr(list)", ARG2, ARG3 );
   2446 }
   2447 POST(sys_llistxattr)
   2448 {
   2449    if (RES > 0 && ARG2 != (Addr)NULL)
   2450       POST_MEM_WRITE( ARG2, RES );
   2451 }
   2452 
   2453 PRE(sys_flistxattr)
   2454 {
   2455    *flags |= SfMayBlock;
   2456    PRINT("sys_flistxattr ( %ld, %#lx, %llu )", ARG1, ARG2, (ULong)ARG3);
   2457    PRE_REG_READ3(ssize_t, "flistxattr",
   2458                  int, fd, char *, list, vki_size_t, size);
   2459    PRE_MEM_WRITE( "flistxattr(list)", ARG2, ARG3 );
   2460 }
   2461 POST(sys_flistxattr)
   2462 {
   2463    if (RES > 0 && ARG2 != (Addr)NULL)
   2464       POST_MEM_WRITE( ARG2, RES );
   2465 }
   2466 
   2467 PRE(sys_removexattr)
   2468 {
   2469    *flags |= SfMayBlock;
   2470    PRINT("sys_removexattr ( %#lx, %#lx )", ARG1, ARG2);
   2471    PRE_REG_READ2(long, "removexattr", char *, path, char *, name);
   2472    PRE_MEM_RASCIIZ( "removexattr(path)", ARG1 );
   2473    PRE_MEM_RASCIIZ( "removexattr(name)", ARG2 );
   2474 }
   2475 
   2476 PRE(sys_lremovexattr)
   2477 {
   2478    *flags |= SfMayBlock;
   2479    PRINT("sys_lremovexattr ( %#lx, %#lx )", ARG1, ARG2);
   2480    PRE_REG_READ2(long, "lremovexattr", char *, path, char *, name);
   2481    PRE_MEM_RASCIIZ( "lremovexattr(path)", ARG1 );
   2482    PRE_MEM_RASCIIZ( "lremovexattr(name)", ARG2 );
   2483 }
   2484 
   2485 PRE(sys_fremovexattr)
   2486 {
   2487    *flags |= SfMayBlock;
   2488    PRINT("sys_fremovexattr ( %ld, %#lx )", ARG1, ARG2);
   2489    PRE_REG_READ2(long, "fremovexattr", int, fd, char *, name);
   2490    PRE_MEM_RASCIIZ( "fremovexattr(name)", ARG2 );
   2491 }
   2492 
   2493 /* ---------------------------------------------------------------------
   2494    sched_* wrappers
   2495    ------------------------------------------------------------------ */
   2496 
   2497 PRE(sys_sched_setparam)
   2498 {
   2499    PRINT("sched_setparam ( %ld, %#lx )", ARG1, ARG2 );
   2500    PRE_REG_READ2(long, "sched_setparam",
   2501                  vki_pid_t, pid, struct sched_param *, p);
   2502    PRE_MEM_READ( "sched_setparam(p)", ARG2, sizeof(struct vki_sched_param) );
   2503 }
   2504 POST(sys_sched_setparam)
   2505 {
   2506    POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) );
   2507 }
   2508 
   2509 PRE(sys_sched_getparam)
   2510 {
   2511    PRINT("sched_getparam ( %ld, %#lx )", ARG1, ARG2 );
   2512    PRE_REG_READ2(long, "sched_getparam",
   2513                  vki_pid_t, pid, struct sched_param *, p);
   2514    PRE_MEM_WRITE( "sched_getparam(p)", ARG2, sizeof(struct vki_sched_param) );
   2515 }
   2516 POST(sys_sched_getparam)
   2517 {
   2518    POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) );
   2519 }
   2520 
   2521 PRE(sys_sched_getscheduler)
   2522 {
   2523    PRINT("sys_sched_getscheduler ( %ld )", ARG1);
   2524    PRE_REG_READ1(long, "sched_getscheduler", vki_pid_t, pid);
   2525 }
   2526 
   2527 PRE(sys_sched_setscheduler)
   2528 {
   2529    PRINT("sys_sched_setscheduler ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3);
   2530    PRE_REG_READ3(long, "sched_setscheduler",
   2531                  vki_pid_t, pid, int, policy, struct sched_param *, p);
   2532    if (ARG3 != 0)
   2533       PRE_MEM_READ( "sched_setscheduler(p)",
   2534 		    ARG3, sizeof(struct vki_sched_param));
   2535 }
   2536 
   2537 PRE(sys_sched_yield)
   2538 {
   2539    *flags |= SfMayBlock;
   2540    PRINT("sched_yield()");
   2541    PRE_REG_READ0(long, "sys_sched_yield");
   2542 }
   2543 
   2544 PRE(sys_sched_get_priority_max)
   2545 {
   2546    PRINT("sched_get_priority_max ( %ld )", ARG1);
   2547    PRE_REG_READ1(long, "sched_get_priority_max", int, policy);
   2548 }
   2549 
   2550 PRE(sys_sched_get_priority_min)
   2551 {
   2552    PRINT("sched_get_priority_min ( %ld )", ARG1);
   2553    PRE_REG_READ1(long, "sched_get_priority_min", int, policy);
   2554 }
   2555 
   2556 PRE(sys_sched_rr_get_interval)
   2557 {
   2558    PRINT("sys_sched_rr_get_interval ( %ld, %#lx )", ARG1, ARG2);
   2559    PRE_REG_READ2(int, "sched_rr_get_interval",
   2560                  vki_pid_t, pid,
   2561                  struct vki_timespec *, tp);
   2562    PRE_MEM_WRITE("sched_rr_get_interval(timespec)",
   2563                  ARG2, sizeof(struct vki_timespec));
   2564 }
   2565 
   2566 POST(sys_sched_rr_get_interval)
   2567 {
   2568    POST_MEM_WRITE(ARG2, sizeof(struct vki_timespec));
   2569 }
   2570 
   2571 PRE(sys_sched_setaffinity)
   2572 {
   2573    PRINT("sched_setaffinity ( %ld, %ld, %#lx )", ARG1, ARG2, ARG3);
   2574    PRE_REG_READ3(long, "sched_setaffinity",
   2575                  vki_pid_t, pid, unsigned int, len, unsigned long *, mask);
   2576    PRE_MEM_READ( "sched_setaffinity(mask)", ARG3, ARG2);
   2577 }
   2578 
   2579 PRE(sys_sched_getaffinity)
   2580 {
   2581    PRINT("sched_getaffinity ( %ld, %ld, %#lx )", ARG1, ARG2, ARG3);
   2582    PRE_REG_READ3(long, "sched_getaffinity",
   2583                  vki_pid_t, pid, unsigned int, len, unsigned long *, mask);
   2584    PRE_MEM_WRITE( "sched_getaffinity(mask)", ARG3, ARG2);
   2585 }
   2586 POST(sys_sched_getaffinity)
   2587 {
   2588    POST_MEM_WRITE(ARG3, ARG2);
   2589 }
   2590 
   2591 /* ---------------------------------------------------------------------
   2592    miscellaneous wrappers
   2593    ------------------------------------------------------------------ */
   2594 
   2595 PRE(sys_munlockall)
   2596 {
   2597    *flags |= SfMayBlock;
   2598    PRINT("sys_munlockall ( )");
   2599    PRE_REG_READ0(long, "munlockall");
   2600 }
   2601 
   2602 // This has different signatures for different platforms.
   2603 //
   2604 //  x86:   int  sys_pipe(unsigned long __user *fildes);
   2605 //  AMD64: long sys_pipe(int *fildes);
   2606 //  ppc32: int  sys_pipe(int __user *fildes);
   2607 //  ppc64: int  sys_pipe(int __user *fildes);
   2608 //
   2609 // The type of the argument is most important, and it is an array of 32 bit
   2610 // values in all cases.  (The return type differs across platforms, but it
   2611 // is not used.)  So we use 'int' as its type.  This fixed bug #113230 which
   2612 // was caused by using an array of 'unsigned long's, which didn't work on
   2613 // AMD64.
   2614 PRE(sys_pipe)
   2615 {
   2616    PRINT("sys_pipe ( %#lx )", ARG1);
   2617    PRE_REG_READ1(int, "pipe", int *, filedes);
   2618    PRE_MEM_WRITE( "pipe(filedes)", ARG1, 2*sizeof(int) );
   2619 }
   2620 POST(sys_pipe)
   2621 {
   2622    Int *p = (Int *)ARG1;
   2623    if (!ML_(fd_allowed)(p[0], "pipe", tid, True) ||
   2624        !ML_(fd_allowed)(p[1], "pipe", tid, True)) {
   2625       VG_(close)(p[0]);
   2626       VG_(close)(p[1]);
   2627       SET_STATUS_Failure( VKI_EMFILE );
   2628    } else {
   2629       POST_MEM_WRITE( ARG1, 2*sizeof(int) );
   2630       if (VG_(clo_track_fds)) {
   2631          ML_(record_fd_open_nameless)(tid, p[0]);
   2632          ML_(record_fd_open_nameless)(tid, p[1]);
   2633       }
   2634    }
   2635 }
   2636 
   2637 /* pipe2 (a kernel 2.6.twentysomething invention) is like pipe, except
   2638    there's a second arg containing flags to be applied to the new file
   2639    descriptors.  It hardly seems worth the effort to factor out the
   2640    duplicated code, hence: */
   2641 PRE(sys_pipe2)
   2642 {
   2643    PRINT("sys_pipe2 ( %#lx, %#lx )", ARG1, ARG2);
   2644    PRE_REG_READ2(int, "pipe", int *, filedes, long, flags);
   2645    PRE_MEM_WRITE( "pipe2(filedes)", ARG1, 2*sizeof(int) );
   2646 }
   2647 POST(sys_pipe2)
   2648 {
   2649    Int *p = (Int *)ARG1;
   2650    if (!ML_(fd_allowed)(p[0], "pipe2", tid, True) ||
   2651        !ML_(fd_allowed)(p[1], "pipe2", tid, True)) {
   2652       VG_(close)(p[0]);
   2653       VG_(close)(p[1]);
   2654       SET_STATUS_Failure( VKI_EMFILE );
   2655    } else {
   2656       POST_MEM_WRITE( ARG1, 2*sizeof(int) );
   2657       if (VG_(clo_track_fds)) {
   2658          ML_(record_fd_open_nameless)(tid, p[0]);
   2659          ML_(record_fd_open_nameless)(tid, p[1]);
   2660       }
   2661    }
   2662 }
   2663 
   2664 PRE(sys_dup3)
   2665 {
   2666    PRINT("sys_dup3 ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   2667    PRE_REG_READ3(long, "dup3", unsigned int, oldfd, unsigned int, newfd, int, flags);
   2668    if (!ML_(fd_allowed)(ARG2, "dup3", tid, True))
   2669       SET_STATUS_Failure( VKI_EBADF );
   2670 }
   2671 
   2672 POST(sys_dup3)
   2673 {
   2674    vg_assert(SUCCESS);
   2675    if (VG_(clo_track_fds))
   2676       ML_(record_fd_open_named)(tid, RES);
   2677 }
   2678 
   2679 PRE(sys_quotactl)
   2680 {
   2681    PRINT("sys_quotactl (0x%lx, %#lx, 0x%lx, 0x%lx )", ARG1,ARG2,ARG3, ARG4);
   2682    PRE_REG_READ4(long, "quotactl",
   2683                  unsigned int, cmd, const char *, special, vki_qid_t, id,
   2684                  void *, addr);
   2685    PRE_MEM_RASCIIZ( "quotactl(special)", ARG2 );
   2686 }
   2687 
   2688 PRE(sys_waitid)
   2689 {
   2690    *flags |= SfMayBlock;
   2691    PRINT("sys_waitid( %ld, %ld, %#lx, %ld, %#lx )", ARG1,ARG2,ARG3,ARG4,ARG5);
   2692    PRE_REG_READ5(int32_t, "sys_waitid",
   2693                  int, which, vki_pid_t, pid, struct vki_siginfo *, infop,
   2694                  int, options, struct vki_rusage *, ru);
   2695    PRE_MEM_WRITE( "waitid(infop)", ARG3, sizeof(struct vki_siginfo) );
   2696    if (ARG5 != 0)
   2697       PRE_MEM_WRITE( "waitid(ru)", ARG5, sizeof(struct vki_rusage) );
   2698 }
   2699 POST(sys_waitid)
   2700 {
   2701    POST_MEM_WRITE( ARG3, sizeof(struct vki_siginfo) );
   2702    if (ARG5 != 0)
   2703       POST_MEM_WRITE( ARG5, sizeof(struct vki_rusage) );
   2704 }
   2705 
   2706 PRE(sys_sync_file_range)
   2707 {
   2708    *flags |= SfMayBlock;
   2709 #if VG_WORDSIZE == 4
   2710    PRINT("sys_sync_file_range ( %ld, %lld, %lld, %ld )",
   2711          ARG1,MERGE64(ARG2,ARG3),MERGE64(ARG4,ARG5),ARG6);
   2712    PRE_REG_READ6(long, "sync_file_range",
   2713                  int, fd,
   2714                  unsigned, MERGE64_FIRST(offset), unsigned, MERGE64_SECOND(offset),
   2715                  unsigned, MERGE64_FIRST(nbytes), unsigned, MERGE64_SECOND(nbytes),
   2716                  unsigned int, flags);
   2717 #elif VG_WORDSIZE == 8
   2718    PRINT("sys_sync_file_range ( %ld, %lld, %lld, %ld )",
   2719          ARG1,(Long)ARG2,(Long)ARG3,ARG4);
   2720    PRE_REG_READ4(long, "sync_file_range",
   2721                  int, fd, vki_loff_t, offset, vki_loff_t, nbytes,
   2722                  unsigned int, flags);
   2723 #else
   2724 #  error Unexpected word size
   2725 #endif
   2726    if (!ML_(fd_allowed)(ARG1, "sync_file_range", tid, False))
   2727       SET_STATUS_Failure( VKI_EBADF );
   2728 }
   2729 
   2730 PRE(sys_sync_file_range2)
   2731 {
   2732    *flags |= SfMayBlock;
   2733 #if VG_WORDSIZE == 4
   2734    PRINT("sys_sync_file_range2 ( %ld, %ld, %lld, %lld )",
   2735          ARG1,ARG2,MERGE64(ARG3,ARG4),MERGE64(ARG5,ARG6));
   2736    PRE_REG_READ6(long, "sync_file_range2",
   2737                  int, fd, unsigned int, flags,
   2738                  unsigned, MERGE64_FIRST(offset), unsigned, MERGE64_SECOND(offset),
   2739                  unsigned, MERGE64_FIRST(nbytes), unsigned, MERGE64_SECOND(nbytes));
   2740 #elif VG_WORDSIZE == 8
   2741    PRINT("sys_sync_file_range2 ( %ld, %ld, %lld, %lld )",
   2742          ARG1,ARG2,(Long)ARG3,(Long)ARG4);
   2743    PRE_REG_READ4(long, "sync_file_range2",
   2744                  int, fd, unsigned int, flags,
   2745                  vki_loff_t, offset, vki_loff_t, nbytes);
   2746 #else
   2747 #  error Unexpected word size
   2748 #endif
   2749    if (!ML_(fd_allowed)(ARG1, "sync_file_range2", tid, False))
   2750       SET_STATUS_Failure( VKI_EBADF );
   2751 }
   2752 
   2753 PRE(sys_stime)
   2754 {
   2755    PRINT("sys_stime ( %#lx )", ARG1);
   2756    PRE_REG_READ1(int, "stime", vki_time_t*, t);
   2757    PRE_MEM_READ( "stime(t)", ARG1, sizeof(vki_time_t) );
   2758 }
   2759 
   2760 PRE(sys_perf_event_open)
   2761 {
   2762    struct vki_perf_event_attr *attr;
   2763    PRINT("sys_perf_event_open ( %#lx, %ld, %ld, %ld, %ld )",
   2764          ARG1,ARG2,ARG3,ARG4,ARG5);
   2765    PRE_REG_READ5(long, "perf_event_open",
   2766                  struct vki_perf_event_attr *, attr,
   2767                  vki_pid_t, pid, int, cpu, int, group_fd,
   2768                  unsigned long, flags);
   2769    attr = (struct vki_perf_event_attr *)ARG1;
   2770    PRE_MEM_READ( "perf_event_open(attr->size)",
   2771                  (Addr)&attr->size, sizeof(attr->size) );
   2772    PRE_MEM_READ( "perf_event_open(attr)",
   2773                  (Addr)attr, attr->size );
   2774 }
   2775 
   2776 POST(sys_perf_event_open)
   2777 {
   2778    vg_assert(SUCCESS);
   2779    if (!ML_(fd_allowed)(RES, "perf_event_open", tid, True)) {
   2780       VG_(close)(RES);
   2781       SET_STATUS_Failure( VKI_EMFILE );
   2782    } else {
   2783       if (VG_(clo_track_fds))
   2784          ML_(record_fd_open_nameless)(tid, RES);
   2785    }
   2786 }
   2787 
   2788 PRE(sys_getcpu)
   2789 {
   2790    PRINT("sys_getcpu ( %#lx, %#lx, %#lx )" , ARG1,ARG2,ARG3);
   2791    PRE_REG_READ3(int, "getcpu",
   2792                  unsigned *, cpu, unsigned *, node, struct vki_getcpu_cache *, tcache);
   2793    if (ARG1 != 0)
   2794       PRE_MEM_WRITE( "getcpu(cpu)", ARG1, sizeof(unsigned) );
   2795    if (ARG2 != 0)
   2796       PRE_MEM_WRITE( "getcpu(node)", ARG2, sizeof(unsigned) );
   2797    if (ARG3 != 0)
   2798       PRE_MEM_WRITE( "getcpu(tcache)", ARG3, sizeof(struct vki_getcpu_cache) );
   2799 }
   2800 
   2801 POST(sys_getcpu)
   2802 {
   2803    if (ARG1 != 0)
   2804       POST_MEM_WRITE( ARG1, sizeof(unsigned) );
   2805    if (ARG2 != 0)
   2806       POST_MEM_WRITE( ARG2, sizeof(unsigned) );
   2807    if (ARG3 != 0)
   2808       POST_MEM_WRITE( ARG3, sizeof(struct vki_getcpu_cache) );
   2809 }
   2810 
   2811 PRE(sys_move_pages)
   2812 {
   2813    PRINT("sys_move_pages ( %ld, %ld, %#lx, %#lx, %#lx, %lx )",
   2814          ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
   2815    PRE_REG_READ6(int, "move_pages",
   2816                  vki_pid_t, pid, unsigned long, nr_pages, const void **, pages,
   2817                  const int *, nodes, int *, status, int, flags);
   2818    PRE_MEM_READ("move_pages(pages)", ARG3, ARG2 * sizeof(void *));
   2819    if (ARG4)
   2820       PRE_MEM_READ("move_pages(nodes)", ARG4, ARG2 * sizeof(int));
   2821    PRE_MEM_WRITE("move_pages(status)", ARG5, ARG2 * sizeof(int));
   2822 }
   2823 
   2824 POST(sys_move_pages)
   2825 {
   2826    POST_MEM_WRITE(ARG5, ARG2 * sizeof(int));
   2827 }
   2828 
   2829 /* ---------------------------------------------------------------------
   2830    utime wrapper
   2831    ------------------------------------------------------------------ */
   2832 
   2833 PRE(sys_utime)
   2834 {
   2835    *flags |= SfMayBlock;
   2836    PRINT("sys_utime ( %#lx, %#lx )", ARG1,ARG2);
   2837    PRE_REG_READ2(long, "utime", char *, filename, struct utimbuf *, buf);
   2838    PRE_MEM_RASCIIZ( "utime(filename)", ARG1 );
   2839    if (ARG2 != 0)
   2840       PRE_MEM_READ( "utime(buf)", ARG2, sizeof(struct vki_utimbuf) );
   2841 }
   2842 
   2843 /* ---------------------------------------------------------------------
   2844    lseek wrapper
   2845    ------------------------------------------------------------------ */
   2846 
   2847 PRE(sys_lseek)
   2848 {
   2849    PRINT("sys_lseek ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   2850    PRE_REG_READ3(vki_off_t, "lseek",
   2851                  unsigned int, fd, vki_off_t, offset, unsigned int, whence);
   2852 }
   2853 
   2854 /* ---------------------------------------------------------------------
   2855    readahead wrapper
   2856    ------------------------------------------------------------------ */
   2857 
   2858 PRE(sys_readahead)
   2859 {
   2860    *flags |= SfMayBlock;
   2861 #if VG_WORDSIZE == 4
   2862    PRINT("sys_readahead ( %ld, %lld, %ld )", ARG1, MERGE64(ARG2,ARG3), ARG4);
   2863    PRE_REG_READ4(vki_off_t, "readahead",
   2864                  int, fd, unsigned, MERGE64_FIRST(offset),
   2865                  unsigned, MERGE64_SECOND(offset), vki_size_t, count);
   2866 #elif VG_WORDSIZE == 8
   2867    PRINT("sys_readahead ( %ld, %lld, %ld )", ARG1, (Long)ARG2, ARG3);
   2868    PRE_REG_READ3(vki_off_t, "readahead",
   2869                  int, fd, vki_loff_t, offset, vki_size_t, count);
   2870 #else
   2871 #  error Unexpected word size
   2872 #endif
   2873    if (!ML_(fd_allowed)(ARG1, "readahead", tid, False))
   2874       SET_STATUS_Failure( VKI_EBADF );
   2875 }
   2876 
   2877 /* ---------------------------------------------------------------------
   2878    sig* wrappers
   2879    ------------------------------------------------------------------ */
   2880 
   2881 PRE(sys_sigpending)
   2882 {
   2883    PRINT( "sys_sigpending ( %#lx )", ARG1 );
   2884    PRE_REG_READ1(long, "sigpending", vki_old_sigset_t *, set);
   2885    PRE_MEM_WRITE( "sigpending(set)", ARG1, sizeof(vki_old_sigset_t));
   2886 }
   2887 POST(sys_sigpending)
   2888 {
   2889    POST_MEM_WRITE( ARG1, sizeof(vki_old_sigset_t) ) ;
   2890 }
   2891 
   2892 // This syscall is not used on amd64/Linux -- it only provides
   2893 // sys_rt_sigprocmask, which uses sigset_t rather than old_sigset_t.
   2894 // This wrapper is only suitable for 32-bit architectures.
   2895 // (XXX: so how is it that PRE(sys_sigpending) above doesn't need
   2896 // conditional compilation like this?)
   2897 #if defined(VGP_x86_linux) || defined(VGP_ppc32_linux) \
   2898     || defined(VGP_arm_linux) || defined(VGP_mips32_linux)
   2899 PRE(sys_sigprocmask)
   2900 {
   2901    vki_old_sigset_t* set;
   2902    vki_old_sigset_t* oldset;
   2903    vki_sigset_t bigger_set;
   2904    vki_sigset_t bigger_oldset;
   2905 
   2906    PRINT("sys_sigprocmask ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3);
   2907    PRE_REG_READ3(long, "sigprocmask",
   2908                  int, how, vki_old_sigset_t *, set, vki_old_sigset_t *, oldset);
   2909    if (ARG2 != 0)
   2910       PRE_MEM_READ( "sigprocmask(set)", ARG2, sizeof(vki_old_sigset_t));
   2911    if (ARG3 != 0)
   2912       PRE_MEM_WRITE( "sigprocmask(oldset)", ARG3, sizeof(vki_old_sigset_t));
   2913 
   2914    // Nb: We must convert the smaller vki_old_sigset_t params into bigger
   2915    // vki_sigset_t params.
   2916    set    = (vki_old_sigset_t*)ARG2;
   2917    oldset = (vki_old_sigset_t*)ARG3;
   2918 
   2919    VG_(memset)(&bigger_set,    0, sizeof(vki_sigset_t));
   2920    VG_(memset)(&bigger_oldset, 0, sizeof(vki_sigset_t));
   2921    if (set)
   2922       bigger_set.sig[0] = *(vki_old_sigset_t*)set;
   2923 
   2924    SET_STATUS_from_SysRes(
   2925       VG_(do_sys_sigprocmask) ( tid, ARG1 /*how*/,
   2926                                 set ? &bigger_set    : NULL,
   2927                              oldset ? &bigger_oldset : NULL)
   2928    );
   2929 
   2930    if (oldset)
   2931       *oldset = bigger_oldset.sig[0];
   2932 
   2933    if (SUCCESS)
   2934       *flags |= SfPollAfter;
   2935 }
   2936 POST(sys_sigprocmask)
   2937 {
   2938    vg_assert(SUCCESS);
   2939    if (RES == 0 && ARG3 != 0)
   2940       POST_MEM_WRITE( ARG3, sizeof(vki_old_sigset_t));
   2941 }
   2942 
   2943 /* Convert from non-RT to RT sigset_t's */
   2944 static
   2945 void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigset_t *set)
   2946 {
   2947    VG_(sigemptyset)(set);
   2948    set->sig[0] = *oldset;
   2949 }
   2950 PRE(sys_sigaction)
   2951 {
   2952    vki_sigaction_toK_t   new, *newp;
   2953    vki_sigaction_fromK_t old, *oldp;
   2954 
   2955    PRINT("sys_sigaction ( %ld, %#lx, %#lx )", ARG1,ARG2,ARG3);
   2956    PRE_REG_READ3(int, "sigaction",
   2957                  int, signum, const struct old_sigaction *, act,
   2958                  struct old_sigaction *, oldact);
   2959 
   2960    newp = oldp = NULL;
   2961 
   2962    if (ARG2 != 0) {
   2963       struct vki_old_sigaction *sa = (struct vki_old_sigaction *)ARG2;
   2964       PRE_MEM_READ( "sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
   2965       PRE_MEM_READ( "sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
   2966       PRE_MEM_READ( "sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
   2967       if (ML_(safe_to_deref)(sa,sizeof(sa))
   2968           && (sa->sa_flags & VKI_SA_RESTORER))
   2969          PRE_MEM_READ( "sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
   2970    }
   2971 
   2972    if (ARG3 != 0) {
   2973       PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction));
   2974       oldp = &old;
   2975    }
   2976 
   2977    if (ARG2 != 0) {
   2978       struct vki_old_sigaction *oldnew = (struct vki_old_sigaction *)ARG2;
   2979 
   2980       new.ksa_handler = oldnew->ksa_handler;
   2981       new.sa_flags = oldnew->sa_flags;
   2982       new.sa_restorer = oldnew->sa_restorer;
   2983       convert_sigset_to_rt(&oldnew->sa_mask, &new.sa_mask);
   2984       newp = &new;
   2985    }
   2986 
   2987    SET_STATUS_from_SysRes( VG_(do_sys_sigaction)(ARG1, newp, oldp) );
   2988 
   2989    if (ARG3 != 0 && SUCCESS && RES == 0) {
   2990       struct vki_old_sigaction *oldold = (struct vki_old_sigaction *)ARG3;
   2991 
   2992       oldold->ksa_handler = oldp->ksa_handler;
   2993       oldold->sa_flags = oldp->sa_flags;
   2994       oldold->sa_restorer = oldp->sa_restorer;
   2995       oldold->sa_mask = oldp->sa_mask.sig[0];
   2996    }
   2997 }
   2998 POST(sys_sigaction)
   2999 {
   3000    vg_assert(SUCCESS);
   3001    if (RES == 0 && ARG3 != 0)
   3002       POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
   3003 }
   3004 #endif
   3005 
   3006 PRE(sys_signalfd)
   3007 {
   3008    PRINT("sys_signalfd ( %d, %#lx, %llu )", (Int)ARG1,ARG2,(ULong)ARG3);
   3009    PRE_REG_READ3(long, "sys_signalfd",
   3010                  int, fd, vki_sigset_t *, sigmask, vki_size_t, sigsetsize);
   3011    PRE_MEM_READ( "signalfd(sigmask)", ARG2, sizeof(vki_sigset_t) );
   3012    if ((int)ARG1 != -1 && !ML_(fd_allowed)(ARG1, "signalfd", tid, False))
   3013       SET_STATUS_Failure( VKI_EBADF );
   3014 }
   3015 POST(sys_signalfd)
   3016 {
   3017    if (!ML_(fd_allowed)(RES, "signalfd", tid, True)) {
   3018       VG_(close)(RES);
   3019       SET_STATUS_Failure( VKI_EMFILE );
   3020    } else {
   3021       if (VG_(clo_track_fds))
   3022          ML_(record_fd_open_nameless) (tid, RES);
   3023    }
   3024 }
   3025 
   3026 PRE(sys_signalfd4)
   3027 {
   3028    PRINT("sys_signalfd4 ( %d, %#lx, %llu, %ld )", (Int)ARG1,ARG2,(ULong)ARG3,ARG4);
   3029    PRE_REG_READ4(long, "sys_signalfd4",
   3030                  int, fd, vki_sigset_t *, sigmask, vki_size_t, sigsetsize, int, flags);
   3031    PRE_MEM_READ( "signalfd(sigmask)", ARG2, sizeof(vki_sigset_t) );
   3032    if ((int)ARG1 != -1 && !ML_(fd_allowed)(ARG1, "signalfd", tid, False))
   3033       SET_STATUS_Failure( VKI_EBADF );
   3034 }
   3035 POST(sys_signalfd4)
   3036 {
   3037    if (!ML_(fd_allowed)(RES, "signalfd4", tid, True)) {
   3038       VG_(close)(RES);
   3039       SET_STATUS_Failure( VKI_EMFILE );
   3040    } else {
   3041       if (VG_(clo_track_fds))
   3042          ML_(record_fd_open_nameless) (tid, RES);
   3043    }
   3044 }
   3045 
   3046 
   3047 /* ---------------------------------------------------------------------
   3048    rt_sig* wrappers
   3049    ------------------------------------------------------------------ */
   3050 
   3051 PRE(sys_rt_sigaction)
   3052 {
   3053    PRINT("sys_rt_sigaction ( %ld, %#lx, %#lx, %ld )", ARG1,ARG2,ARG3,ARG4);
   3054    PRE_REG_READ4(long, "rt_sigaction",
   3055                  int, signum, const struct sigaction *, act,
   3056                  struct sigaction *, oldact, vki_size_t, sigsetsize);
   3057 
   3058    if (ARG2 != 0) {
   3059       vki_sigaction_toK_t *sa = (vki_sigaction_toK_t *)ARG2;
   3060       PRE_MEM_READ( "rt_sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
   3061       PRE_MEM_READ( "rt_sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
   3062       PRE_MEM_READ( "rt_sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
   3063       if (sa->sa_flags & VKI_SA_RESTORER)
   3064          PRE_MEM_READ( "rt_sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
   3065    }
   3066    if (ARG3 != 0)
   3067       PRE_MEM_WRITE( "rt_sigaction(oldact)", ARG3, sizeof(vki_sigaction_fromK_t));
   3068 
   3069    // XXX: doesn't seem right to be calling do_sys_sigaction for
   3070    // sys_rt_sigaction... perhaps this function should be renamed
   3071    // VG_(do_sys_rt_sigaction)()  --njn
   3072 
   3073    SET_STATUS_from_SysRes(
   3074       VG_(do_sys_sigaction)(ARG1, (const vki_sigaction_toK_t *)ARG2,
   3075                             (vki_sigaction_fromK_t *)ARG3)
   3076    );
   3077 }
   3078 POST(sys_rt_sigaction)
   3079 {
   3080    vg_assert(SUCCESS);
   3081    if (RES == 0 && ARG3 != 0)
   3082       POST_MEM_WRITE( ARG3, sizeof(vki_sigaction_fromK_t));
   3083 }
   3084 
   3085 PRE(sys_rt_sigprocmask)
   3086 {
   3087    PRINT("sys_rt_sigprocmask ( %ld, %#lx, %#lx, %llu )",ARG1,ARG2,ARG3,(ULong)ARG4);
   3088    PRE_REG_READ4(long, "rt_sigprocmask",
   3089                  int, how, vki_sigset_t *, set, vki_sigset_t *, oldset,
   3090                  vki_size_t, sigsetsize);
   3091    if (ARG2 != 0)
   3092       PRE_MEM_READ( "rt_sigprocmask(set)", ARG2, sizeof(vki_sigset_t));
   3093    if (ARG3 != 0)
   3094       PRE_MEM_WRITE( "rt_sigprocmask(oldset)", ARG3, sizeof(vki_sigset_t));
   3095 
   3096    // Like the kernel, we fail if the sigsetsize is not exactly what we expect.
   3097    if (sizeof(vki_sigset_t) != ARG4)
   3098       SET_STATUS_Failure( VKI_EMFILE );
   3099    else {
   3100       SET_STATUS_from_SysRes(
   3101                   VG_(do_sys_sigprocmask) ( tid, ARG1 /*how*/,
   3102                                             (vki_sigset_t*) ARG2,
   3103                                             (vki_sigset_t*) ARG3 )
   3104       );
   3105    }
   3106 
   3107    if (SUCCESS)
   3108       *flags |= SfPollAfter;
   3109 }
   3110 POST(sys_rt_sigprocmask)
   3111 {
   3112    vg_assert(SUCCESS);
   3113    if (RES == 0 && ARG3 != 0)
   3114       POST_MEM_WRITE( ARG3, sizeof(vki_sigset_t));
   3115 }
   3116 
   3117 PRE(sys_rt_sigpending)
   3118 {
   3119    PRINT( "sys_rt_sigpending ( %#lx )", ARG1 );
   3120    PRE_REG_READ2(long, "rt_sigpending",
   3121                  vki_sigset_t *, set, vki_size_t, sigsetsize);
   3122    PRE_MEM_WRITE( "rt_sigpending(set)", ARG1, sizeof(vki_sigset_t));
   3123 }
   3124 POST(sys_rt_sigpending)
   3125 {
   3126    POST_MEM_WRITE( ARG1, sizeof(vki_sigset_t) ) ;
   3127 }
   3128 
   3129 PRE(sys_rt_sigtimedwait)
   3130 {
   3131    *flags |= SfMayBlock;
   3132    PRINT("sys_rt_sigtimedwait ( %#lx, %#lx, %#lx, %lld )",
   3133          ARG1,ARG2,ARG3,(ULong)ARG4);
   3134    PRE_REG_READ4(long, "rt_sigtimedwait",
   3135                  const vki_sigset_t *, set, vki_siginfo_t *, info,
   3136                  const struct timespec *, timeout, vki_size_t, sigsetsize);
   3137    if (ARG1 != 0)
   3138       PRE_MEM_READ(  "rt_sigtimedwait(set)",  ARG1, sizeof(vki_sigset_t));
   3139    if (ARG2 != 0)
   3140       PRE_MEM_WRITE( "rt_sigtimedwait(info)", ARG2, sizeof(vki_siginfo_t) );
   3141    if (ARG3 != 0)
   3142       PRE_MEM_READ( "rt_sigtimedwait(timeout)",
   3143                     ARG3, sizeof(struct vki_timespec) );
   3144 }
   3145 POST(sys_rt_sigtimedwait)
   3146 {
   3147    if (ARG2 != 0)
   3148       POST_MEM_WRITE( ARG2, sizeof(vki_siginfo_t) );
   3149 }
   3150 
   3151 PRE(sys_rt_sigqueueinfo)
   3152 {
   3153    PRINT("sys_rt_sigqueueinfo(%ld, %ld, %#lx)", ARG1, ARG2, ARG3);
   3154    PRE_REG_READ3(long, "rt_sigqueueinfo",
   3155                  int, pid, int, sig, vki_siginfo_t *, uinfo);
   3156    if (ARG2 != 0)
   3157       PRE_MEM_READ( "rt_sigqueueinfo(uinfo)", ARG3, VKI_SI_MAX_SIZE );
   3158 }
   3159 POST(sys_rt_sigqueueinfo)
   3160 {
   3161    if (!ML_(client_signal_OK)(ARG2))
   3162       SET_STATUS_Failure( VKI_EINVAL );
   3163 }
   3164 
   3165 PRE(sys_rt_tgsigqueueinfo)
   3166 {
   3167    PRINT("sys_rt_tgsigqueueinfo(%ld, %ld, %ld, %#lx)", ARG1, ARG2, ARG3, ARG4);
   3168    PRE_REG_READ4(long, "rt_tgsigqueueinfo",
   3169                  int, tgid, int, pid, int, sig, vki_siginfo_t *, uinfo);
   3170    if (ARG3 != 0)
   3171       PRE_MEM_READ( "rt_tgsigqueueinfo(uinfo)", ARG4, VKI_SI_MAX_SIZE );
   3172 }
   3173 
   3174 POST(sys_rt_tgsigqueueinfo)
   3175 {
   3176    if (!ML_(client_signal_OK)(ARG3))
   3177       SET_STATUS_Failure( VKI_EINVAL );
   3178 }
   3179 
   3180 // XXX: x86-specific?  The kernel prototypes for the different archs are
   3181 //      hard to decipher.
   3182 PRE(sys_rt_sigsuspend)
   3183 {
   3184    /* The C library interface to sigsuspend just takes a pointer to
   3185       a signal mask but this system call has two arguments - a pointer
   3186       to the mask and the number of bytes used by it. The kernel insists
   3187       on the size being equal to sizeof(sigset_t) however and will just
   3188       return EINVAL if it isn't.
   3189     */
   3190    *flags |= SfMayBlock;
   3191    PRINT("sys_rt_sigsuspend ( %#lx, %ld )", ARG1,ARG2 );
   3192    PRE_REG_READ2(int, "rt_sigsuspend", vki_sigset_t *, mask, vki_size_t, size)
   3193    if (ARG1 != (Addr)NULL) {
   3194       PRE_MEM_READ( "rt_sigsuspend(mask)", ARG1, sizeof(vki_sigset_t) );
   3195    }
   3196 }
   3197 
   3198 /* ---------------------------------------------------------------------
   3199    linux msg* wrapper helpers
   3200    ------------------------------------------------------------------ */
   3201 
   3202 void
   3203 ML_(linux_PRE_sys_msgsnd) ( ThreadId tid,
   3204                             UWord arg0, UWord arg1, UWord arg2, UWord arg3 )
   3205 {
   3206    /* int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg); */
   3207    struct vki_msgbuf *msgp = (struct vki_msgbuf *)arg1;
   3208    PRE_MEM_READ( "msgsnd(msgp->mtype)", (Addr)&msgp->mtype, sizeof(msgp->mtype) );
   3209    PRE_MEM_READ( "msgsnd(msgp->mtext)", (Addr)&msgp->mtext, arg2 );
   3210 }
   3211 
   3212 void
   3213 ML_(linux_PRE_sys_msgrcv) ( ThreadId tid,
   3214                             UWord arg0, UWord arg1, UWord arg2,
   3215                             UWord arg3, UWord arg4 )
   3216 {
   3217    /* ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz,
   3218                      long msgtyp, int msgflg); */
   3219    struct vki_msgbuf *msgp = (struct vki_msgbuf *)arg1;
   3220    PRE_MEM_WRITE( "msgrcv(msgp->mtype)", (Addr)&msgp->mtype, sizeof(msgp->mtype) );
   3221    PRE_MEM_WRITE( "msgrcv(msgp->mtext)", (Addr)&msgp->mtext, arg2 );
   3222 }
   3223 void
   3224 ML_(linux_POST_sys_msgrcv) ( ThreadId tid,
   3225                              UWord res,
   3226                              UWord arg0, UWord arg1, UWord arg2,
   3227                              UWord arg3, UWord arg4 )
   3228 {
   3229    struct vki_msgbuf *msgp = (struct vki_msgbuf *)arg1;
   3230    POST_MEM_WRITE( (Addr)&msgp->mtype, sizeof(msgp->mtype) );
   3231    POST_MEM_WRITE( (Addr)&msgp->mtext, res );
   3232 }
   3233 
   3234 void
   3235 ML_(linux_PRE_sys_msgctl) ( ThreadId tid,
   3236                             UWord arg0, UWord arg1, UWord arg2 )
   3237 {
   3238    /* int msgctl(int msqid, int cmd, struct msqid_ds *buf); */
   3239    switch (arg1 /* cmd */) {
   3240    case VKI_IPC_INFO:
   3241    case VKI_MSG_INFO:
   3242    case VKI_IPC_INFO|VKI_IPC_64:
   3243    case VKI_MSG_INFO|VKI_IPC_64:
   3244       PRE_MEM_WRITE( "msgctl(IPC_INFO, buf)",
   3245                      arg2, sizeof(struct vki_msginfo) );
   3246       break;
   3247    case VKI_IPC_STAT:
   3248    case VKI_MSG_STAT:
   3249       PRE_MEM_WRITE( "msgctl(IPC_STAT, buf)",
   3250                      arg2, sizeof(struct vki_msqid_ds) );
   3251       break;
   3252    case VKI_IPC_STAT|VKI_IPC_64:
   3253    case VKI_MSG_STAT|VKI_IPC_64:
   3254       PRE_MEM_WRITE( "msgctl(IPC_STAT, arg.buf)",
   3255                      arg2, sizeof(struct vki_msqid64_ds) );
   3256       break;
   3257    case VKI_IPC_SET:
   3258       PRE_MEM_READ( "msgctl(IPC_SET, arg.buf)",
   3259                     arg2, sizeof(struct vki_msqid_ds) );
   3260       break;
   3261    case VKI_IPC_SET|VKI_IPC_64:
   3262       PRE_MEM_READ( "msgctl(IPC_SET, arg.buf)",
   3263                     arg2, sizeof(struct vki_msqid64_ds) );
   3264       break;
   3265    }
   3266 }
   3267 void
   3268 ML_(linux_POST_sys_msgctl) ( ThreadId tid,
   3269                              UWord res,
   3270                              UWord arg0, UWord arg1, UWord arg2 )
   3271 {
   3272    switch (arg1 /* cmd */) {
   3273    case VKI_IPC_INFO:
   3274    case VKI_MSG_INFO:
   3275    case VKI_IPC_INFO|VKI_IPC_64:
   3276    case VKI_MSG_INFO|VKI_IPC_64:
   3277       POST_MEM_WRITE( arg2, sizeof(struct vki_msginfo) );
   3278       break;
   3279    case VKI_IPC_STAT:
   3280    case VKI_MSG_STAT:
   3281       POST_MEM_WRITE( arg2, sizeof(struct vki_msqid_ds) );
   3282       break;
   3283    case VKI_IPC_STAT|VKI_IPC_64:
   3284    case VKI_MSG_STAT|VKI_IPC_64:
   3285       POST_MEM_WRITE( arg2, sizeof(struct vki_msqid64_ds) );
   3286       break;
   3287    }
   3288 }
   3289 
   3290 /* ---------------------------------------------------------------------
   3291    *at wrappers
   3292    ------------------------------------------------------------------ */
   3293 
   3294 PRE(sys_openat)
   3295 {
   3296    HChar  name[30];
   3297    SysRes sres;
   3298 
   3299    if (ARG3 & VKI_O_CREAT) {
   3300       // 4-arg version
   3301       PRINT("sys_openat ( %ld, %#lx(%s), %ld, %ld )",ARG1,ARG2,(char*)ARG2,ARG3,ARG4);
   3302       PRE_REG_READ4(long, "openat",
   3303                     int, dfd, const char *, filename, int, flags, int, mode);
   3304    } else {
   3305       // 3-arg version
   3306       PRINT("sys_openat ( %ld, %#lx(%s), %ld )",ARG1,ARG2,(char*)ARG2,ARG3);
   3307       PRE_REG_READ3(long, "openat",
   3308                     int, dfd, const char *, filename, int, flags);
   3309    }
   3310 
   3311    if (ARG1 != VKI_AT_FDCWD && !ML_(fd_allowed)(ARG1, "openat", tid, False))
   3312       SET_STATUS_Failure( VKI_EBADF );
   3313    else
   3314       PRE_MEM_RASCIIZ( "openat(filename)", ARG2 );
   3315 
   3316    /* Handle the case where the open is of /proc/self/cmdline or
   3317       /proc/<pid>/cmdline, and just give it a copy of the fd for the
   3318       fake file we cooked up at startup (in m_main).  Also, seek the
   3319       cloned fd back to the start. */
   3320 
   3321    VG_(sprintf)(name, "/proc/%d/cmdline", VG_(getpid)());
   3322    if (ML_(safe_to_deref)( (void*)ARG2, 1 )
   3323        && (VG_(strcmp)((Char *)ARG2, name) == 0
   3324            || VG_(strcmp)((Char *)ARG2, "/proc/self/cmdline") == 0)) {
   3325       sres = VG_(dup)( VG_(cl_cmdline_fd) );
   3326       SET_STATUS_from_SysRes( sres );
   3327       if (!sr_isError(sres)) {
   3328          OffT off = VG_(lseek)( sr_Res(sres), 0, VKI_SEEK_SET );
   3329          if (off < 0)
   3330             SET_STATUS_Failure( VKI_EMFILE );
   3331       }
   3332       return;
   3333    }
   3334 
   3335    /* Otherwise handle normally */
   3336    *flags |= SfMayBlock;
   3337 }
   3338 
   3339 POST(sys_openat)
   3340 {
   3341    vg_assert(SUCCESS);
   3342    if (!ML_(fd_allowed)(RES, "openat", tid, True)) {
   3343       VG_(close)(RES);
   3344       SET_STATUS_Failure( VKI_EMFILE );
   3345    } else {
   3346       if (VG_(clo_track_fds))
   3347          ML_(record_fd_open_with_given_name)(tid, RES, (Char*)ARG2);
   3348    }
   3349 }
   3350 
   3351 PRE(sys_mkdirat)
   3352 {
   3353    *flags |= SfMayBlock;
   3354    PRINT("sys_mkdirat ( %ld, %#lx(%s), %ld )", ARG1,ARG2,(char*)ARG2,ARG3);
   3355    PRE_REG_READ3(long, "mkdirat",
   3356                  int, dfd, const char *, pathname, int, mode);
   3357    PRE_MEM_RASCIIZ( "mkdirat(pathname)", ARG2 );
   3358 }
   3359 
   3360 PRE(sys_mknodat)
   3361 {
   3362   PRINT("sys_mknodat ( %ld, %#lx(%s), 0x%lx, 0x%lx )", ARG1,ARG2,(char*)ARG2,ARG3,ARG4 );
   3363    PRE_REG_READ4(long, "mknodat",
   3364                  int, dfd, const char *, pathname, int, mode, unsigned, dev);
   3365    PRE_MEM_RASCIIZ( "mknodat(pathname)", ARG2 );
   3366 }
   3367 
   3368 PRE(sys_fchownat)
   3369 {
   3370    PRINT("sys_fchownat ( %ld, %#lx(%s), 0x%lx, 0x%lx )", ARG1,ARG2,(char*)ARG2,ARG3,ARG4);
   3371    PRE_REG_READ4(long, "fchownat",
   3372                  int, dfd, const char *, path,
   3373                  vki_uid_t, owner, vki_gid_t, group);
   3374    PRE_MEM_RASCIIZ( "fchownat(path)", ARG2 );
   3375 }
   3376 
   3377 PRE(sys_futimesat)
   3378 {
   3379    PRINT("sys_futimesat ( %ld, %#lx(%s), %#lx )", ARG1,ARG2,(char*)ARG2,ARG3);
   3380    PRE_REG_READ3(long, "futimesat",
   3381                  int, dfd, char *, filename, struct timeval *, tvp);
   3382    if (ARG2 != 0)
   3383       PRE_MEM_RASCIIZ( "futimesat(filename)", ARG2 );
   3384    if (ARG3 != 0)
   3385       PRE_MEM_READ( "futimesat(tvp)", ARG3, 2 * sizeof(struct vki_timeval) );
   3386 }
   3387 
   3388 PRE(sys_utimensat)
   3389 {
   3390    PRINT("sys_utimensat ( %ld, %#lx(%s), %#lx, 0x%lx )", ARG1,ARG2,(char*)ARG2,ARG3,ARG4);
   3391    PRE_REG_READ4(long, "utimensat",
   3392                  int, dfd, char *, filename, struct timespec *, utimes, int, flags);
   3393    if (ARG2 != 0)
   3394       PRE_MEM_RASCIIZ( "utimensat(filename)", ARG2 );
   3395    if (ARG3 != 0)
   3396       PRE_MEM_READ( "utimensat(tvp)", ARG3, 2 * sizeof(struct vki_timespec) );
   3397 }
   3398 
   3399 PRE(sys_newfstatat)
   3400 {
   3401    FUSE_COMPATIBLE_MAY_BLOCK();
   3402    PRINT("sys_newfstatat ( %ld, %#lx(%s), %#lx )", ARG1,ARG2,(char*)ARG2,ARG3);
   3403    PRE_REG_READ3(long, "fstatat",
   3404                  int, dfd, char *, file_name, struct stat *, buf);
   3405    PRE_MEM_RASCIIZ( "fstatat(file_name)", ARG2 );
   3406    PRE_MEM_WRITE( "fstatat(buf)", ARG3, sizeof(struct vki_stat) );
   3407 }
   3408 
   3409 POST(sys_newfstatat)
   3410 {
   3411    POST_MEM_WRITE( ARG3, sizeof(struct vki_stat) );
   3412 }
   3413 
   3414 PRE(sys_unlinkat)
   3415 {
   3416    *flags |= SfMayBlock;
   3417    PRINT("sys_unlinkat ( %ld, %#lx(%s) )", ARG1,ARG2,(char*)ARG2);
   3418    PRE_REG_READ2(long, "unlinkat", int, dfd, const char *, pathname);
   3419    PRE_MEM_RASCIIZ( "unlinkat(pathname)", ARG2 );
   3420 }
   3421 
   3422 PRE(sys_renameat)
   3423 {
   3424    PRINT("sys_renameat ( %ld, %#lx(%s), %ld, %#lx(%s) )", ARG1,ARG2,(char*)ARG2,ARG3,ARG4,(char*)ARG4);
   3425    PRE_REG_READ4(long, "renameat",
   3426                  int, olddfd, const char *, oldpath,
   3427                  int, newdfd, const char *, newpath);
   3428    PRE_MEM_RASCIIZ( "renameat(oldpath)", ARG2 );
   3429    PRE_MEM_RASCIIZ( "renameat(newpath)", ARG4 );
   3430 }
   3431 
   3432 PRE(sys_linkat)
   3433 {
   3434    *flags |= SfMayBlock;
   3435    PRINT("sys_linkat ( %ld, %#lx(%s), %ld, %#lx(%s), %ld )",ARG1,ARG2,(char*)ARG2,ARG3,ARG4,(char*)ARG4,ARG5);
   3436    PRE_REG_READ5(long, "linkat",
   3437                  int, olddfd, const char *, oldpath,
   3438                  int, newdfd, const char *, newpath,
   3439                  int, flags);
   3440    PRE_MEM_RASCIIZ( "linkat(oldpath)", ARG2);
   3441    PRE_MEM_RASCIIZ( "linkat(newpath)", ARG4);
   3442 }
   3443 
   3444 PRE(sys_symlinkat)
   3445 {
   3446    *flags |= SfMayBlock;
   3447    PRINT("sys_symlinkat ( %#lx(%s), %ld, %#lx(%s) )",ARG1,(char*)ARG1,ARG2,ARG3,(char*)ARG3);
   3448    PRE_REG_READ3(long, "symlinkat",
   3449                  const char *, oldpath, int, newdfd, const char *, newpath);
   3450    PRE_MEM_RASCIIZ( "symlinkat(oldpath)", ARG1 );
   3451    PRE_MEM_RASCIIZ( "symlinkat(newpath)", ARG3 );
   3452 }
   3453 
   3454 PRE(sys_readlinkat)
   3455 {
   3456    HChar name[25];
   3457    Word  saved = SYSNO;
   3458 
   3459    PRINT("sys_readlinkat ( %ld, %#lx(%s), %#lx, %llu )", ARG1,ARG2,(char*)ARG2,ARG3,(ULong)ARG4);
   3460    PRE_REG_READ4(long, "readlinkat",
   3461                  int, dfd, const char *, path, char *, buf, int, bufsiz);
   3462    PRE_MEM_RASCIIZ( "readlinkat(path)", ARG2 );
   3463    PRE_MEM_WRITE( "readlinkat(buf)", ARG3,ARG4 );
   3464 
   3465    /*
   3466     * Handle the case where readlinkat is looking at /proc/self/exe or
   3467     * /proc/<pid>/exe.
   3468     */
   3469    VG_(sprintf)(name, "/proc/%d/exe", VG_(getpid)());
   3470    if (ML_(safe_to_deref)((void*)ARG2, 1)
   3471        && (VG_(strcmp)((Char *)ARG2, name) == 0
   3472            || VG_(strcmp)((Char *)ARG2, "/proc/self/exe") == 0)) {
   3473       VG_(sprintf)(name, "/proc/self/fd/%d", VG_(cl_exec_fd));
   3474       SET_STATUS_from_SysRes( VG_(do_syscall4)(saved, ARG1, (UWord)name,
   3475                                                       ARG3, ARG4));
   3476    } else {
   3477       /* Normal case */
   3478       SET_STATUS_from_SysRes( VG_(do_syscall4)(saved, ARG1, ARG2, ARG3, ARG4));
   3479    }
   3480 
   3481    if (SUCCESS && RES > 0)
   3482       POST_MEM_WRITE( ARG3, RES );
   3483 }
   3484 
   3485 PRE(sys_fchmodat)
   3486 {
   3487    PRINT("sys_fchmodat ( %ld, %#lx(%s), %ld )", ARG1,ARG2,(char*)ARG2,ARG3);
   3488    PRE_REG_READ3(long, "fchmodat",
   3489                  int, dfd, const char *, path, vki_mode_t, mode);
   3490    PRE_MEM_RASCIIZ( "fchmodat(path)", ARG2 );
   3491 }
   3492 
   3493 PRE(sys_faccessat)
   3494 {
   3495    PRINT("sys_faccessat ( %ld, %#lx(%s), %ld )", ARG1,ARG2,(char*)ARG2,ARG3);
   3496    PRE_REG_READ3(long, "faccessat",
   3497                  int, dfd, const char *, pathname, int, mode);
   3498    PRE_MEM_RASCIIZ( "faccessat(pathname)", ARG2 );
   3499 }
   3500 
   3501 /* ---------------------------------------------------------------------
   3502    p{read,write}v wrappers
   3503    ------------------------------------------------------------------ */
   3504 
   3505 PRE(sys_preadv)
   3506 {
   3507    Int i;
   3508    struct vki_iovec * vec;
   3509    *flags |= SfMayBlock;
   3510 #if VG_WORDSIZE == 4
   3511    /* Note that the offset argument here is in lo+hi order on both
   3512       big and little endian platforms... */
   3513    PRINT("sys_preadv ( %ld, %#lx, %llu, %lld )",ARG1,ARG2,(ULong)ARG3,LOHI64(ARG4,ARG5));
   3514    PRE_REG_READ5(ssize_t, "preadv",
   3515                  unsigned long, fd, const struct iovec *, vector,
   3516                  unsigned long, count, vki_u32, offset_low,
   3517                  vki_u32, offset_high);
   3518 #elif VG_WORDSIZE == 8
   3519    PRINT("sys_preadv ( %ld, %#lx, %llu, %lld )",ARG1,ARG2,(ULong)ARG3,(Long)ARG4);
   3520    PRE_REG_READ4(ssize_t, "preadv",
   3521                  unsigned long, fd, const struct iovec *, vector,
   3522                  unsigned long, count, Word, offset);
   3523 #else
   3524 #  error Unexpected word size
   3525 #endif
   3526    if (!ML_(fd_allowed)(ARG1, "preadv", tid, False)) {
   3527       SET_STATUS_Failure( VKI_EBADF );
   3528    } else {
   3529       PRE_MEM_READ( "preadv(vector)", ARG2, ARG3 * sizeof(struct vki_iovec) );
   3530 
   3531       if (ARG2 != 0) {
   3532          /* ToDo: don't do any of the following if the vector is invalid */
   3533          vec = (struct vki_iovec *)ARG2;
   3534          for (i = 0; i < (Int)ARG3; i++)
   3535             PRE_MEM_WRITE( "preadv(vector[...])",
   3536                            (Addr)vec[i].iov_base, vec[i].iov_len );
   3537       }
   3538    }
   3539 }
   3540 
   3541 POST(sys_preadv)
   3542 {
   3543    vg_assert(SUCCESS);
   3544    if (RES > 0) {
   3545       Int i;
   3546       struct vki_iovec * vec = (struct vki_iovec *)ARG2;
   3547       Int remains = RES;
   3548 
   3549       /* RES holds the number of bytes read. */
   3550       for (i = 0; i < (Int)ARG3; i++) {
   3551 	 Int nReadThisBuf = vec[i].iov_len;
   3552 	 if (nReadThisBuf > remains) nReadThisBuf = remains;
   3553 	 POST_MEM_WRITE( (Addr)vec[i].iov_base, nReadThisBuf );
   3554 	 remains -= nReadThisBuf;
   3555 	 if (remains < 0) VG_(core_panic)("preadv: remains < 0");
   3556       }
   3557    }
   3558 }
   3559 
   3560 PRE(sys_pwritev)
   3561 {
   3562    Int i;
   3563    struct vki_iovec * vec;
   3564    *flags |= SfMayBlock;
   3565 #if VG_WORDSIZE == 4
   3566    /* Note that the offset argument here is in lo+hi order on both
   3567       big and little endian platforms... */
   3568    PRINT("sys_pwritev ( %ld, %#lx, %llu, %lld )",ARG1,ARG2,(ULong)ARG3,LOHI64(ARG4,ARG5));
   3569    PRE_REG_READ5(ssize_t, "pwritev",
   3570                  unsigned long, fd, const struct iovec *, vector,
   3571                  unsigned long, count, vki_u32, offset_low,
   3572                  vki_u32, offset_high);
   3573 #elif VG_WORDSIZE == 8
   3574    PRINT("sys_pwritev ( %ld, %#lx, %llu, %lld )",ARG1,ARG2,(ULong)ARG3,(Long)ARG4);
   3575    PRE_REG_READ4(ssize_t, "pwritev",
   3576                  unsigned long, fd, const struct iovec *, vector,
   3577                  unsigned long, count, Word, offset);
   3578 #else
   3579 #  error Unexpected word size
   3580 #endif
   3581    if (!ML_(fd_allowed)(ARG1, "pwritev", tid, False)) {
   3582       SET_STATUS_Failure( VKI_EBADF );
   3583    } else {
   3584       PRE_MEM_READ( "pwritev(vector)",
   3585 		     ARG2, ARG3 * sizeof(struct vki_iovec) );
   3586       if (ARG2 != 0) {
   3587          /* ToDo: don't do any of the following if the vector is invalid */
   3588          vec = (struct vki_iovec *)ARG2;
   3589          for (i = 0; i < (Int)ARG3; i++)
   3590             PRE_MEM_READ( "pwritev(vector[...])",
   3591                            (Addr)vec[i].iov_base, vec[i].iov_len );
   3592       }
   3593    }
   3594 }
   3595 
   3596 /* ---------------------------------------------------------------------
   3597    process_vm_{read,write}v wrappers
   3598    ------------------------------------------------------------------ */
   3599 
   3600 PRE(sys_process_vm_readv)
   3601 {
   3602    PRINT("sys_process_vm_readv ( %lu, %#lx, %lu, %#lx, %lu, %lu )",
   3603          ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
   3604    PRE_REG_READ6(ssize_t, "process_vm_readv",
   3605                  vki_pid_t, pid,
   3606                  const struct iovec *, lvec,
   3607                  unsigned long, liovcnt,
   3608                  const struct iovec *, rvec,
   3609                  unsigned long, riovcnt,
   3610                  unsigned long, flags);
   3611    PRE_MEM_READ( "process_vm_readv(lvec)",
   3612                  ARG2, ARG3 * sizeof(struct vki_iovec) );
   3613    PRE_MEM_READ( "process_vm_readv(rvec)",
   3614                  ARG4, ARG5 * sizeof(struct vki_iovec) );
   3615    if (ARG2 != 0) {
   3616       /* TODO: Don't do any of the following if lvec is invalid */
   3617       const struct vki_iovec *vec = (const struct vki_iovec *)ARG2;
   3618       UInt i;
   3619       for (i = 0; i < ARG3; i++)
   3620          PRE_MEM_WRITE( "process_vm_readv(lvec[...])",
   3621                         (Addr)vec[i].iov_base, vec[i].iov_len );
   3622    }
   3623 }
   3624 
   3625 POST(sys_process_vm_readv)
   3626 {
   3627    const struct vki_iovec *vec = (const struct vki_iovec *)ARG2;
   3628    UInt remains = RES;
   3629    UInt i;
   3630    for (i = 0; i < ARG3; i++) {
   3631       UInt nReadThisBuf = vec[i].iov_len <= remains ?
   3632                           vec[i].iov_len : remains;
   3633       POST_MEM_WRITE( (Addr)vec[i].iov_base, nReadThisBuf );
   3634       remains -= nReadThisBuf;
   3635    }
   3636 }
   3637 
   3638 PRE(sys_process_vm_writev)
   3639 {
   3640    PRINT("sys_process_vm_writev ( %lu, %#lx, %lu, %#lx, %lu, %lu )",
   3641          ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
   3642    PRE_REG_READ6(ssize_t, "process_vm_writev",
   3643                  vki_pid_t, pid,
   3644                  const struct iovec *, lvec,
   3645                  unsigned long, liovcnt,
   3646                  const struct iovec *, rvec,
   3647                  unsigned long, riovcnt,
   3648                  unsigned long, flags);
   3649    PRE_MEM_READ( "process_vm_writev(lvec)",
   3650                  ARG2, ARG3 * sizeof(struct vki_iovec) );
   3651    PRE_MEM_READ( "process_vm_writev(rvec)",
   3652                  ARG4, ARG5 * sizeof(struct vki_iovec) );
   3653    if (ARG2 != 0) {
   3654       /* TODO: Don't do any of the following if lvec is invalid */
   3655       const struct vki_iovec *vec = (const struct vki_iovec *)ARG2;
   3656       UInt i;
   3657       for (i = 0; i < ARG3; i++)
   3658          PRE_MEM_READ( "process_vm_writev(lvec[...])",
   3659                        (Addr)vec[i].iov_base, vec[i].iov_len );
   3660    }
   3661 }
   3662 
   3663 /* ---------------------------------------------------------------------
   3664    {send,recv}mmsg wrappers
   3665    ------------------------------------------------------------------ */
   3666 
   3667 PRE(sys_sendmmsg)
   3668 {
   3669    struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)ARG2;
   3670    Char name[32];
   3671    UInt i;
   3672    *flags |= SfMayBlock;
   3673    PRINT("sys_sendmmsg ( %ld, %#lx, %ld, %ld )",ARG1,ARG2,ARG3,ARG4);
   3674    PRE_REG_READ4(long, "sendmmsg",
   3675                  int, s, const struct mmsghdr *, mmsg, int, vlen, int, flags);
   3676    for (i = 0; i < ARG3; i++) {
   3677       VG_(sprintf)(name, "mmsg[%u].msg_hdr", i);
   3678       ML_(generic_PRE_sys_sendmsg)(tid, name, &mmsg[i].msg_hdr);
   3679       VG_(sprintf)(name, "sendmmsg(mmsg[%u].msg_len)", i);
   3680       PRE_MEM_WRITE( name, (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
   3681    }
   3682 }
   3683 
   3684 POST(sys_sendmmsg)
   3685 {
   3686    if (RES > 0) {
   3687       struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)ARG2;
   3688       UInt i;
   3689       for (i = 0; i < RES; i++) {
   3690          POST_MEM_WRITE( (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
   3691       }
   3692    }
   3693 }
   3694 
   3695 PRE(sys_recvmmsg)
   3696 {
   3697    struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)ARG2;
   3698    Char name[32];
   3699    UInt i;
   3700    *flags |= SfMayBlock;
   3701    PRINT("sys_recvmmsg ( %ld, %#lx, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
   3702    PRE_REG_READ5(long, "recvmmsg",
   3703                  int, s, struct mmsghdr *, mmsg, int, vlen,
   3704                  int, flags, struct timespec *, timeout);
   3705    for (i = 0; i < ARG3; i++) {
   3706       VG_(sprintf)(name, "mmsg[%u].msg_hdr", i);
   3707       ML_(generic_PRE_sys_recvmsg)(tid, name, &mmsg[i].msg_hdr);
   3708       VG_(sprintf)(name, "recvmmsg(mmsg[%u].msg_len)", i);
   3709       PRE_MEM_WRITE( name, (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
   3710    }
   3711    if (ARG5)
   3712       PRE_MEM_READ( "recvmmsg(timeout)", ARG5, sizeof(struct vki_timespec) );
   3713 }
   3714 
   3715 POST(sys_recvmmsg)
   3716 {
   3717    if (RES > 0) {
   3718       struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)ARG2;
   3719       Char name[32];
   3720       UInt i;
   3721       for (i = 0; i < RES; i++) {
   3722          VG_(sprintf)(name, "mmsg[%u].msg_hdr", i);
   3723          ML_(generic_POST_sys_recvmsg)(tid, name, &mmsg[i].msg_hdr, mmsg[i].msg_len);
   3724          POST_MEM_WRITE( (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
   3725       }
   3726    }
   3727 }
   3728 
   3729 /* ---------------------------------------------------------------------
   3730    key retention service wrappers
   3731    ------------------------------------------------------------------ */
   3732 
   3733 PRE(sys_request_key)
   3734 {
   3735    PRINT("sys_request_key ( %#lx(%s), %#lx(%s), %#lx(%s), %ld )",
   3736          ARG1,(char*)ARG1,ARG2,(char*)ARG2,ARG3,(char*)ARG3,ARG4);
   3737    PRE_REG_READ4(long, "request_key",
   3738                  const char *, type, const char *, description,
   3739                  const char *, callout_info, vki_key_serial_t, keyring);
   3740    PRE_MEM_RASCIIZ( "request_key(type)", ARG1);
   3741    PRE_MEM_RASCIIZ( "request_key(description)", ARG2);
   3742    if (ARG3 != (UWord)NULL)
   3743       PRE_MEM_RASCIIZ( "request_key(callout_info)", ARG3);
   3744 }
   3745 
   3746 PRE(sys_add_key)
   3747 {
   3748    PRINT("sys_add_key ( %#lx(%s), %#lx(%s), %#lx, %ld, %ld )",
   3749          ARG1,(char*)ARG1,ARG2,(char*)ARG2,ARG3,ARG4,ARG5);
   3750    PRE_REG_READ5(long, "add_key",
   3751                  const char *, type, const char *, description,
   3752                  const void *, payload, vki_size_t, plen,
   3753                  vki_key_serial_t, keyring);
   3754    PRE_MEM_RASCIIZ( "add_key(type)", ARG1);
   3755    PRE_MEM_RASCIIZ( "add_key(description)", ARG2);
   3756    if (ARG3 != (UWord)NULL)
   3757       PRE_MEM_READ( "request_key(payload)", ARG3, ARG4);
   3758 }
   3759 
   3760 PRE(sys_keyctl)
   3761 {
   3762    switch (ARG1 /* option */) {
   3763    case VKI_KEYCTL_GET_KEYRING_ID:
   3764       PRINT("sys_keyctl ( KEYCTL_GET_KEYRING_ID, %ld, %ld )", ARG2,ARG3);
   3765       PRE_REG_READ3(long, "keyctl(KEYCTL_GET_KEYRING_ID)",
   3766                     int, option, vki_key_serial_t, id, int, create);
   3767       break;
   3768    case VKI_KEYCTL_JOIN_SESSION_KEYRING:
   3769       PRINT("sys_keyctl ( KEYCTL_JOIN_SESSION_KEYRING, %#lx(%s) )", ARG2,(char*)ARG2);
   3770       PRE_REG_READ2(long, "keyctl(KEYCTL_JOIN_SESSION_KEYRING)",
   3771                     int, option, const char *, name);
   3772       if (ARG2 != (UWord)NULL)
   3773          PRE_MEM_RASCIIZ("keyctl(KEYCTL_JOIN_SESSION_KEYRING, name)", ARG2);
   3774       break;
   3775    case VKI_KEYCTL_UPDATE:
   3776       PRINT("sys_keyctl ( KEYCTL_UPDATE, %ld, %#lx, %ld )", ARG2,ARG3,ARG4);
   3777       PRE_REG_READ4(long, "keyctl(KEYCTL_UPDATE)",
   3778                     int, option, vki_key_serial_t, key,
   3779                     const void *, payload, vki_size_t, plen);
   3780       if (ARG3 != (UWord)NULL)
   3781          PRE_MEM_READ("keyctl(KEYCTL_UPDATE, payload)", ARG3, ARG4);
   3782       break;
   3783    case VKI_KEYCTL_REVOKE:
   3784       PRINT("sys_keyctl ( KEYCTL_REVOKE, %ld )", ARG2);
   3785       PRE_REG_READ2(long, "keyctl(KEYCTL_REVOKE)",
   3786                     int, option, vki_key_serial_t, id);
   3787       break;
   3788    case VKI_KEYCTL_CHOWN:
   3789       PRINT("sys_keyctl ( KEYCTL_CHOWN, %ld, %ld, %ld )", ARG2,ARG3,ARG4);
   3790       PRE_REG_READ4(long, "keyctl(KEYCTL_CHOWN)",
   3791                     int, option, vki_key_serial_t, id,
   3792                     vki_uid_t, uid, vki_gid_t, gid);
   3793       break;
   3794    case VKI_KEYCTL_SETPERM:
   3795       PRINT("sys_keyctl ( KEYCTL_SETPERM, %ld, %ld )", ARG2,ARG3);
   3796       PRE_REG_READ3(long, "keyctl(KEYCTL_SETPERM)",
   3797                     int, option, vki_key_serial_t, id, vki_key_perm_t, perm);
   3798       break;
   3799    case VKI_KEYCTL_DESCRIBE:
   3800       PRINT("sys_keyctl ( KEYCTL_DESCRIBE, %ld, %#lx, %ld )", ARG2,ARG3,ARG4);
   3801       PRE_REG_READ4(long, "keyctl(KEYCTL_DESCRIBE)",
   3802                     int, option, vki_key_serial_t, id,
   3803                     char *, buffer, vki_size_t, buflen);
   3804       if (ARG3 != (UWord)NULL)
   3805          PRE_MEM_WRITE("keyctl(KEYCTL_DESCRIBE, buffer)", ARG3, ARG4);
   3806       break;
   3807    case VKI_KEYCTL_CLEAR:
   3808       PRINT("sys_keyctl ( KEYCTL_CLEAR, %ld )", ARG2);
   3809       PRE_REG_READ2(long, "keyctl(KEYCTL_CLEAR)",
   3810                     int, option, vki_key_serial_t, keyring);
   3811       break;
   3812    case VKI_KEYCTL_LINK:
   3813       PRINT("sys_keyctl ( KEYCTL_LINK, %ld, %ld )", ARG2,ARG3);
   3814       PRE_REG_READ3(long, "keyctl(KEYCTL_LINK)", int, option,
   3815                     vki_key_serial_t, keyring, vki_key_serial_t, key);
   3816       break;
   3817    case VKI_KEYCTL_UNLINK:
   3818       PRINT("sys_keyctl ( KEYCTL_UNLINK, %ld, %ld )", ARG2,ARG3);
   3819       PRE_REG_READ3(long, "keyctl(KEYCTL_UNLINK)", int, option,
   3820                     vki_key_serial_t, keyring, vki_key_serial_t, key);
   3821       break;
   3822    case VKI_KEYCTL_SEARCH:
   3823       PRINT("sys_keyctl ( KEYCTL_SEARCH, %ld, %#lx(%s), %#lx(%s), %ld )",
   3824             ARG2,ARG3,(char*)ARG3,ARG4,(char*)ARG4,ARG5);
   3825       PRE_REG_READ5(long, "keyctl(KEYCTL_SEARCH)",
   3826                     int, option, vki_key_serial_t, keyring,
   3827                     const char *, type, const char *, description,
   3828                     vki_key_serial_t, destring);
   3829       PRE_MEM_RASCIIZ("sys_keyctl(KEYCTL_SEARCH, type)", ARG3);
   3830       PRE_MEM_RASCIIZ("sys_keyctl(KEYCTL_SEARCH, description)", ARG4);
   3831       break;
   3832    case VKI_KEYCTL_READ:
   3833       PRINT("sys_keyctl ( KEYCTL_READ, %ld, %#lx, %ld )", ARG2,ARG3,ARG4);
   3834       PRE_REG_READ4(long, "keyctl(KEYCTL_READ)",
   3835                     int, option, vki_key_serial_t, keyring,
   3836                     char *, buffer, vki_size_t, buflen);
   3837       if (ARG3 != (UWord)NULL)
   3838          PRE_MEM_WRITE("keyctl(KEYCTL_READ, buffer)", ARG3, ARG4);
   3839       break;
   3840    case VKI_KEYCTL_INSTANTIATE:
   3841       PRINT("sys_keyctl ( KEYCTL_INSTANTIATE, %ld, %#lx, %ld, %ld )",
   3842             ARG2,ARG3,ARG4,ARG5);
   3843       PRE_REG_READ5(long, "keyctl(KEYCTL_INSTANTIATE)",
   3844                     int, option, vki_key_serial_t, key,
   3845                     char *, payload, vki_size_t, plen,
   3846                     vki_key_serial_t, keyring);
   3847       if (ARG3 != (UWord)NULL)
   3848          PRE_MEM_READ("keyctl(KEYCTL_INSTANTIATE, payload)", ARG3, ARG4);
   3849       break;
   3850    case VKI_KEYCTL_NEGATE:
   3851       PRINT("sys_keyctl ( KEYCTL_NEGATE, %ld, %lu, %ld )", ARG2,ARG3,ARG4);
   3852       PRE_REG_READ4(long, "keyctl(KEYCTL_NEGATE)",
   3853                     int, option, vki_key_serial_t, key,
   3854                     unsigned, timeout, vki_key_serial_t, keyring);
   3855       break;
   3856    case VKI_KEYCTL_SET_REQKEY_KEYRING:
   3857       PRINT("sys_keyctl ( KEYCTL_SET_REQKEY_KEYRING, %ld )", ARG2);
   3858       PRE_REG_READ2(long, "keyctl(KEYCTL_SET_REQKEY_KEYRING)",
   3859                     int, option, int, reqkey_defl);
   3860       break;
   3861    case VKI_KEYCTL_SET_TIMEOUT:
   3862       PRINT("sys_keyctl ( KEYCTL_SET_TIMEOUT, %ld, %ld )", ARG2,ARG3);
   3863       PRE_REG_READ3(long, "keyctl(KEYCTL_SET_TIMEOUT)",
   3864                     int, option, vki_key_serial_t, key, unsigned, timeout);
   3865       break;
   3866    case VKI_KEYCTL_ASSUME_AUTHORITY:
   3867       PRINT("sys_keyctl ( KEYCTL_ASSUME_AUTHORITY, %ld )", ARG2);
   3868       PRE_REG_READ2(long, "keyctl(KEYCTL_ASSUME_AUTHORITY)",
   3869                     int, option, vki_key_serial_t, key);
   3870       break;
   3871    default:
   3872       PRINT("sys_keyctl ( %ld ) ", ARG1);
   3873       PRE_REG_READ1(long, "keyctl", int, option);
   3874       break;
   3875    }
   3876 }
   3877 
   3878 POST(sys_keyctl)
   3879 {
   3880    vg_assert(SUCCESS);
   3881    switch (ARG1 /* option */) {
   3882    case VKI_KEYCTL_DESCRIBE:
   3883    case VKI_KEYCTL_READ:
   3884       if (RES > ARG4)
   3885          POST_MEM_WRITE(ARG3, ARG4);
   3886       else
   3887          POST_MEM_WRITE(ARG3, RES);
   3888       break;
   3889    default:
   3890       break;
   3891    }
   3892 }
   3893 
   3894 /* ---------------------------------------------------------------------
   3895    ioprio_ wrappers
   3896    ------------------------------------------------------------------ */
   3897 
   3898 PRE(sys_ioprio_set)
   3899 {
   3900    PRINT("sys_ioprio_set ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   3901    PRE_REG_READ3(int, "ioprio_set", int, which, int, who, int, ioprio);
   3902 }
   3903 
   3904 PRE(sys_ioprio_get)
   3905 {
   3906    PRINT("sys_ioprio_get ( %ld, %ld )", ARG1,ARG2);
   3907    PRE_REG_READ2(int, "ioprio_get", int, which, int, who);
   3908 }
   3909 
   3910 /* ---------------------------------------------------------------------
   3911    _module wrappers
   3912    ------------------------------------------------------------------ */
   3913 
   3914 PRE(sys_init_module)
   3915 {
   3916    *flags |= SfMayBlock;
   3917    PRINT("sys_init_module ( %#lx, %llu, %#lx(\"%s\") )",
   3918          ARG1, (ULong)ARG2, ARG3, (char*)ARG3);
   3919    PRE_REG_READ3(long, "init_module",
   3920                  void *, umod, unsigned long, len, const char *, uargs);
   3921    PRE_MEM_READ( "init_module(umod)", ARG1, ARG2 );
   3922    PRE_MEM_RASCIIZ( "init_module(uargs)", ARG3 );
   3923 }
   3924 
   3925 PRE(sys_delete_module)
   3926 {
   3927    *flags |= SfMayBlock;
   3928    PRINT("sys_delete_module ( %#lx(\"%s\"), 0x%lx )", ARG1,(char*)ARG1, ARG2);
   3929    PRE_REG_READ2(long, "delete_module",
   3930                  const char *, name_user, unsigned int, flags);
   3931    PRE_MEM_RASCIIZ("delete_module(name_user)", ARG1);
   3932 }
   3933 
   3934 /* ---------------------------------------------------------------------
   3935    splice wrappers
   3936    ------------------------------------------------------------------ */
   3937 
   3938 PRE(sys_splice)
   3939 {
   3940    *flags |= SfMayBlock;
   3941    PRINT("sys_splice ( %ld, %#lx, %ld, %#lx, %ld, %ld )",
   3942          ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
   3943    PRE_REG_READ6(vki_ssize_t, "splice",
   3944                  int, fd_in, vki_loff_t *, off_in,
   3945                  int, fd_out, vki_loff_t *, off_out,
   3946                  vki_size_t, len, unsigned int, flags);
   3947    if (!ML_(fd_allowed)(ARG1, "splice(fd_in)", tid, False) ||
   3948        !ML_(fd_allowed)(ARG3, "splice(fd_out)", tid, False)) {
   3949       SET_STATUS_Failure( VKI_EBADF );
   3950    } else {
   3951       if (ARG2 != 0)
   3952          PRE_MEM_READ( "splice(off_in)", ARG2, sizeof(vki_loff_t));
   3953       if (ARG4 != 0)
   3954          PRE_MEM_READ( "splice(off_out)", ARG4, sizeof(vki_loff_t));
   3955    }
   3956 }
   3957 
   3958 PRE(sys_tee)
   3959 {
   3960    *flags |= SfMayBlock;
   3961    PRINT("sys_tree ( %ld, %ld, %ld, %ld )", ARG1,ARG2,ARG3,ARG4);
   3962    PRE_REG_READ4(vki_ssize_t, "tee",
   3963                  int, fd_in, int, fd_out,
   3964                  vki_size_t, len, unsigned int, flags);
   3965    if (!ML_(fd_allowed)(ARG1, "tee(fd_in)", tid, False) ||
   3966        !ML_(fd_allowed)(ARG2, "tee(fd_out)", tid, False)) {
   3967       SET_STATUS_Failure( VKI_EBADF );
   3968    }
   3969 }
   3970 
   3971 PRE(sys_vmsplice)
   3972 {
   3973    Int fdfl;
   3974    *flags |= SfMayBlock;
   3975    PRINT("sys_vmsplice ( %ld, %#lx, %ld, %ld )",
   3976          ARG1,ARG2,ARG3,ARG4);
   3977    PRE_REG_READ4(vki_ssize_t, "splice",
   3978                  int, fd, struct vki_iovec *, iov,
   3979                  unsigned long, nr_segs, unsigned int, flags);
   3980    if (!ML_(fd_allowed)(ARG1, "vmsplice(fd)", tid, False)) {
   3981       SET_STATUS_Failure( VKI_EBADF );
   3982    } else if ((fdfl = VG_(fcntl)(ARG1, VKI_F_GETFL, 0)) < 0) {
   3983       SET_STATUS_Failure( VKI_EBADF );
   3984    } else {
   3985       const struct vki_iovec *iov;
   3986       PRE_MEM_READ( "vmsplice(iov)", ARG2, sizeof(struct vki_iovec) * ARG3 );
   3987       for (iov = (struct vki_iovec *)ARG2;
   3988            iov < (struct vki_iovec *)ARG2 + ARG3; iov++)
   3989       {
   3990          if ((fdfl & (VKI_O_WRONLY|VKI_O_RDWR)) != 0)
   3991             PRE_MEM_READ( "vmsplice(iov[...])", (Addr)iov->iov_base, iov->iov_len );
   3992          else if ((fdfl & VKI_O_RDONLY) != 0)
   3993             PRE_MEM_WRITE( "vmsplice(iov[...])", (Addr)iov->iov_base, iov->iov_len );
   3994       }
   3995    }
   3996 }
   3997 
   3998 POST(sys_vmsplice)
   3999 {
   4000    vg_assert(SUCCESS);
   4001    if (RES > 0) {
   4002       Int fdfl = VG_(fcntl)(ARG1, VKI_F_GETFL, 0);
   4003       vg_assert(fdfl >= 0);
   4004       if ((fdfl & VKI_O_RDONLY) != 0)
   4005       {
   4006          const struct vki_iovec *iov;
   4007          for (iov = (struct vki_iovec *)ARG2;
   4008               iov < (struct vki_iovec *)ARG2 + ARG3; iov++)
   4009          {
   4010             POST_MEM_WRITE( (Addr)iov->iov_base, iov->iov_len );
   4011          }
   4012       }
   4013    }
   4014 }
   4015 
   4016 /* ---------------------------------------------------------------------
   4017    oprofile-related wrappers
   4018    ------------------------------------------------------------------ */
   4019 
   4020 #if defined(VGP_x86_linux)
   4021 PRE(sys_lookup_dcookie)
   4022 {
   4023    PRINT("sys_lookup_dcookie (0x%llx, %#lx, %ld)",
   4024          MERGE64(ARG1,ARG2), ARG3, ARG4);
   4025    PRE_REG_READ4(long, "lookup_dcookie",
   4026                  vki_u32, MERGE64_FIRST(cookie), vki_u32, MERGE64_SECOND(cookie),
   4027                  char *, buf, vki_size_t, len);
   4028    PRE_MEM_WRITE( "lookup_dcookie(buf)", ARG3, ARG4);
   4029 }
   4030 POST(sys_lookup_dcookie)
   4031 {
   4032    vg_assert(SUCCESS);
   4033    if (ARG3 != (Addr)NULL)
   4034       POST_MEM_WRITE( ARG3, RES);
   4035 }
   4036 #endif
   4037 
   4038 #if defined(VGP_amd64_linux) || defined(VGP_s390x_linux)
   4039 PRE(sys_lookup_dcookie)
   4040 {
   4041    *flags |= SfMayBlock;
   4042    PRINT("sys_lookup_dcookie ( %llu, %#lx, %llu )",
   4043 	 (ULong)ARG1, ARG2, (ULong)ARG3);
   4044    PRE_REG_READ3(int, "lookup_dcookie",
   4045                  unsigned long long, cookie, char *, buf, vki_size_t, len);
   4046 
   4047    PRE_MEM_WRITE( "sys_lookup_dcookie(buf)", ARG2, ARG3 );
   4048 }
   4049 
   4050 POST(sys_lookup_dcookie)
   4051 {
   4052    vg_assert(SUCCESS);
   4053    if (ARG2 != (Addr)NULL)
   4054      POST_MEM_WRITE( ARG2, RES );
   4055 }
   4056 #endif
   4057 
   4058 /* ---------------------------------------------------------------------
   4059    fcntl wrappers
   4060    ------------------------------------------------------------------ */
   4061 
   4062 PRE(sys_fcntl)
   4063 {
   4064    switch (ARG2) {
   4065    // These ones ignore ARG3.
   4066    case VKI_F_GETFD:
   4067    case VKI_F_GETFL:
   4068    case VKI_F_GETOWN:
   4069    case VKI_F_GETSIG:
   4070    case VKI_F_GETLEASE:
   4071    case VKI_F_GETPIPE_SZ:
   4072       PRINT("sys_fcntl ( %ld, %ld )", ARG1,ARG2);
   4073       PRE_REG_READ2(long, "fcntl", unsigned int, fd, unsigned int, cmd);
   4074       break;
   4075 
   4076    // These ones use ARG3 as "arg".
   4077    case VKI_F_DUPFD:
   4078    case VKI_F_DUPFD_CLOEXEC:
   4079    case VKI_F_SETFD:
   4080    case VKI_F_SETFL:
   4081    case VKI_F_SETLEASE:
   4082    case VKI_F_NOTIFY:
   4083    case VKI_F_SETOWN:
   4084    case VKI_F_SETSIG:
   4085    case VKI_F_SETPIPE_SZ:
   4086       PRINT("sys_fcntl[ARG3=='arg'] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   4087       PRE_REG_READ3(long, "fcntl",
   4088                     unsigned int, fd, unsigned int, cmd, unsigned long, arg);
   4089       break;
   4090 
   4091    // These ones use ARG3 as "lock".
   4092    case VKI_F_GETLK:
   4093    case VKI_F_SETLK:
   4094    case VKI_F_SETLKW:
   4095 #  if defined(VGP_x86_linux)
   4096    case VKI_F_GETLK64:
   4097    case VKI_F_SETLK64:
   4098    case VKI_F_SETLKW64:
   4099 #  endif
   4100       PRINT("sys_fcntl[ARG3=='lock'] ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3);
   4101       PRE_REG_READ3(long, "fcntl",
   4102                     unsigned int, fd, unsigned int, cmd,
   4103                     struct flock64 *, lock);
   4104       break;
   4105 
   4106    case VKI_F_SETOWN_EX:
   4107       PRINT("sys_fcntl[F_SETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   4108       PRE_REG_READ3(long, "fcntl",
   4109                     unsigned int, fd, unsigned int, cmd,
   4110                     struct vki_f_owner_ex *, arg);
   4111       PRE_MEM_READ("fcntl(F_SETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
   4112       break;
   4113 
   4114    case VKI_F_GETOWN_EX:
   4115       PRINT("sys_fcntl[F_GETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   4116       PRE_REG_READ3(long, "fcntl",
   4117                     unsigned int, fd, unsigned int, cmd,
   4118                     struct vki_f_owner_ex *, arg);
   4119       PRE_MEM_WRITE("fcntl(F_GETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
   4120       break;
   4121 
   4122    default:
   4123       PRINT("sys_fcntl[UNKNOWN] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   4124       I_die_here;
   4125       break;
   4126    }
   4127 
   4128 #  if defined(VGP_x86_linux)
   4129    if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64)
   4130 #  else
   4131    if (ARG2 == VKI_F_SETLKW)
   4132 #  endif
   4133       *flags |= SfMayBlock;
   4134 }
   4135 
   4136 POST(sys_fcntl)
   4137 {
   4138    vg_assert(SUCCESS);
   4139    if (ARG2 == VKI_F_DUPFD) {
   4140       if (!ML_(fd_allowed)(RES, "fcntl(DUPFD)", tid, True)) {
   4141          VG_(close)(RES);
   4142          SET_STATUS_Failure( VKI_EMFILE );
   4143       } else {
   4144          if (VG_(clo_track_fds))
   4145             ML_(record_fd_open_named)(tid, RES);
   4146       }
   4147    }
   4148    else if (ARG2 == VKI_F_DUPFD_CLOEXEC) {
   4149       if (!ML_(fd_allowed)(RES, "fcntl(DUPFD_CLOEXEC)", tid, True)) {
   4150          VG_(close)(RES);
   4151          SET_STATUS_Failure( VKI_EMFILE );
   4152       } else {
   4153          if (VG_(clo_track_fds))
   4154             ML_(record_fd_open_named)(tid, RES);
   4155       }
   4156    } else if (ARG2 == VKI_F_GETOWN_EX) {
   4157       POST_MEM_WRITE(ARG3, sizeof(struct vki_f_owner_ex));
   4158    }
   4159 }
   4160 
   4161 // XXX: wrapper only suitable for 32-bit systems
   4162 PRE(sys_fcntl64)
   4163 {
   4164    switch (ARG2) {
   4165    // These ones ignore ARG3.
   4166    case VKI_F_GETFD:
   4167    case VKI_F_GETFL:
   4168    case VKI_F_GETOWN:
   4169    case VKI_F_SETOWN:
   4170    case VKI_F_GETSIG:
   4171    case VKI_F_SETSIG:
   4172    case VKI_F_GETLEASE:
   4173       PRINT("sys_fcntl64 ( %ld, %ld )", ARG1,ARG2);
   4174       PRE_REG_READ2(long, "fcntl64", unsigned int, fd, unsigned int, cmd);
   4175       break;
   4176 
   4177    // These ones use ARG3 as "arg".
   4178    case VKI_F_DUPFD:
   4179    case VKI_F_DUPFD_CLOEXEC:
   4180    case VKI_F_SETFD:
   4181    case VKI_F_SETFL:
   4182    case VKI_F_SETLEASE:
   4183    case VKI_F_NOTIFY:
   4184       PRINT("sys_fcntl64[ARG3=='arg'] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   4185       PRE_REG_READ3(long, "fcntl64",
   4186                     unsigned int, fd, unsigned int, cmd, unsigned long, arg);
   4187       break;
   4188 
   4189    // These ones use ARG3 as "lock".
   4190    case VKI_F_GETLK:
   4191    case VKI_F_SETLK:
   4192    case VKI_F_SETLKW:
   4193 #  if defined(VGP_x86_linux)
   4194    case VKI_F_GETLK64:
   4195    case VKI_F_SETLK64:
   4196    case VKI_F_SETLKW64:
   4197 #  endif
   4198       PRINT("sys_fcntl64[ARG3=='lock'] ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3);
   4199       PRE_REG_READ3(long, "fcntl64",
   4200                     unsigned int, fd, unsigned int, cmd,
   4201                     struct flock64 *, lock);
   4202       break;
   4203 
   4204    case VKI_F_SETOWN_EX:
   4205       PRINT("sys_fcntl[F_SETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   4206       PRE_REG_READ3(long, "fcntl",
   4207                     unsigned int, fd, unsigned int, cmd,
   4208                     struct vki_f_owner_ex *, arg);
   4209       PRE_MEM_READ("fcntl(F_SETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
   4210       break;
   4211 
   4212    case VKI_F_GETOWN_EX:
   4213       PRINT("sys_fcntl[F_GETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
   4214       PRE_REG_READ3(long, "fcntl",
   4215                     unsigned int, fd, unsigned int, cmd,
   4216                     struct vki_f_owner_ex *, arg);
   4217       PRE_MEM_WRITE("fcntl(F_GETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
   4218       break;
   4219    }
   4220 
   4221 #  if defined(VGP_x86_linux)
   4222    if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64)
   4223 #  else
   4224    if (ARG2 == VKI_F_SETLKW)
   4225 #  endif
   4226       *flags |= SfMayBlock;
   4227 }
   4228 
   4229 POST(sys_fcntl64)
   4230 {
   4231    vg_assert(SUCCESS);
   4232    if (ARG2 == VKI_F_DUPFD) {
   4233       if (!ML_(fd_allowed)(RES, "fcntl64(DUPFD)", tid, True)) {
   4234          VG_(close)(RES);
   4235          SET_STATUS_Failure( VKI_EMFILE );
   4236       } else {
   4237          if (VG_(clo_track_fds))
   4238             ML_(record_fd_open_named)(tid, RES);
   4239       }
   4240    }
   4241    else if (ARG2 == VKI_F_DUPFD_CLOEXEC) {
   4242       if (!ML_(fd_allowed)(RES, "fcntl64(DUPFD_CLOEXEC)", tid, True)) {
   4243          VG_(close)(RES);
   4244          SET_STATUS_Failure( VKI_EMFILE );
   4245       } else {
   4246          if (VG_(clo_track_fds))
   4247             ML_(record_fd_open_named)(tid, RES);
   4248       }
   4249    } else if (ARG2 == VKI_F_GETOWN_EX) {
   4250       POST_MEM_WRITE(ARG3, sizeof(struct vki_f_owner_ex));
   4251    }
   4252 }
   4253 
   4254 /* ---------------------------------------------------------------------
   4255    ioctl wrappers
   4256    ------------------------------------------------------------------ */
   4257 
   4258 PRE(sys_ioctl)
   4259 {
   4260    *flags |= SfMayBlock;
   4261 
   4262    // We first handle the ones that don't use ARG3 (even as a
   4263    // scalar/non-pointer argument).
   4264    switch (ARG2 /* request */) {
   4265 
   4266       /* linux/soundcard interface (ALSA) */
   4267    case VKI_SNDRV_PCM_IOCTL_HW_FREE:
   4268    case VKI_SNDRV_PCM_IOCTL_HWSYNC:
   4269    case VKI_SNDRV_PCM_IOCTL_PREPARE:
   4270    case VKI_SNDRV_PCM_IOCTL_RESET:
   4271    case VKI_SNDRV_PCM_IOCTL_START:
   4272    case VKI_SNDRV_PCM_IOCTL_DROP:
   4273    case VKI_SNDRV_PCM_IOCTL_DRAIN:
   4274    case VKI_SNDRV_PCM_IOCTL_RESUME:
   4275    case VKI_SNDRV_PCM_IOCTL_XRUN:
   4276    case VKI_SNDRV_PCM_IOCTL_UNLINK:
   4277    case VKI_SNDRV_TIMER_IOCTL_START:
   4278    case VKI_SNDRV_TIMER_IOCTL_STOP:
   4279    case VKI_SNDRV_TIMER_IOCTL_CONTINUE:
   4280    case VKI_SNDRV_TIMER_IOCTL_PAUSE:
   4281 
   4282       /* SCSI no operand */
   4283    case VKI_SCSI_IOCTL_DOORLOCK:
   4284    case VKI_SCSI_IOCTL_DOORUNLOCK:
   4285 
   4286    /* KVM ioctls that dont check for a numeric value as parameter */
   4287    case VKI_KVM_S390_ENABLE_SIE:
   4288    case VKI_KVM_S390_INITIAL_RESET:
   4289 
   4290    /* User input device creation */
   4291    case VKI_UI_DEV_CREATE:
   4292    case VKI_UI_DEV_DESTROY:
   4293       PRINT("sys_ioctl ( %ld, 0x%lx )",ARG1,ARG2);
   4294       PRE_REG_READ2(long, "ioctl",
   4295                     unsigned int, fd, unsigned int, request);
   4296       return;
   4297 
   4298 #  if defined(ANDROID_HARDWARE_nexus_10)
   4299    /* undocumented ioctl ids noted on the device */
   4300    case 0x4d07:
   4301    case 0x6101:
   4302    case 0xfa01: /* used by NFC */
   4303    case 0xfa05: /* used by NFC */
   4304       return;
   4305 #  elif defined(ANDROID_HARDWARE_nexus_7)
   4306    /* undocumented ioctl ids noted on the device */
   4307    case 0x4e04:
   4308    case 0x7231:
   4309    case 0x4004e901: /* used by NFC */
   4310       return;
   4311 #  elif defined(ANDROID_HARDWARE_nexus_4)
   4312 
   4313 #  endif
   4314 
   4315    default:
   4316       PRINT("sys_ioctl ( %ld, 0x%lx, 0x%lx )",ARG1,ARG2,ARG3);
   4317       PRE_REG_READ3(long, "ioctl",
   4318                     unsigned int, fd, unsigned int, request, unsigned long, arg);
   4319       break;
   4320    }
   4321 
   4322 
   4323 #  if defined(ANDROID_HARDWARE_nexus_10)
   4324 
   4325    /* undocumented ioctl ids noted on the device */
   4326    if (ARG2 >= 0xc0108000 && ARG2 <= 0xc1e8820b && ARG3 != 0) {
   4327        int size = (ARG2 >> 16) & 0x3fff;
   4328        PRE_MEM_WRITE("ioctl(GL_UNDOCUMENTED)", (Addr)ARG3,  size);
   4329        return;
   4330    }
   4331 
   4332 #  endif
   4333 
   4334    // We now handle those that do look at ARG3 (and unknown ones fall into
   4335    // this category).  Nb: some of these may well belong in the
   4336    // doesn't-use-ARG3 switch above.
   4337    switch (ARG2 /* request */) {
   4338    case VKI_TCSETS:
   4339    case VKI_TCSETSW:
   4340    case VKI_TCSETSF:
   4341       PRE_MEM_READ( "ioctl(TCSET{S,SW,SF})", ARG3, sizeof(struct vki_termios) );
   4342       break;
   4343    case VKI_TCGETS:
   4344       PRE_MEM_WRITE( "ioctl(TCGETS)", ARG3, sizeof(struct vki_termios) );
   4345       break;
   4346    case VKI_TCSETA:
   4347    case VKI_TCSETAW:
   4348    case VKI_TCSETAF:
   4349       PRE_MEM_READ( "ioctl(TCSET{A,AW,AF})", ARG3, sizeof(struct vki_termio) );
   4350       break;
   4351    case VKI_TCGETA:
   4352       PRE_MEM_WRITE( "ioctl(TCGETA)", ARG3, sizeof(struct vki_termio) );
   4353       break;
   4354    case VKI_TCSBRK:
   4355    case VKI_TCXONC:
   4356    case VKI_TCSBRKP:
   4357    case VKI_TCFLSH:
   4358       /* These just take an int by value */
   4359       break;
   4360    case VKI_TIOCGWINSZ:
   4361       PRE_MEM_WRITE( "ioctl(TIOCGWINSZ)", ARG3, sizeof(struct vki_winsize) );
   4362       break;
   4363    case VKI_TIOCSWINSZ:
   4364       PRE_MEM_READ( "ioctl(TIOCSWINSZ)",  ARG3, sizeof(struct vki_winsize) );
   4365       break;
   4366    case VKI_TIOCMBIS:
   4367       PRE_MEM_READ( "ioctl(TIOCMBIS)",    ARG3, sizeof(unsigned int) );
   4368       break;
   4369    case VKI_TIOCMBIC:
   4370       PRE_MEM_READ( "ioctl(TIOCMBIC)",    ARG3, sizeof(unsigned int) );
   4371       break;
   4372    case VKI_TIOCMSET:
   4373       PRE_MEM_READ( "ioctl(TIOCMSET)",    ARG3, sizeof(unsigned int) );
   4374       break;
   4375    case VKI_TIOCMGET:
   4376       PRE_MEM_WRITE( "ioctl(TIOCMGET)",   ARG3, sizeof(unsigned int) );
   4377       break;
   4378    case VKI_TIOCLINUX:
   4379       PRE_MEM_READ( "ioctl(TIOCLINUX)",   ARG3, sizeof(char *) );
   4380       if (*(char *)ARG3 == 11) {
   4381 	 PRE_MEM_READ( "ioctl(TIOCLINUX, 11)", ARG3, 2 * sizeof(char *) );
   4382       }
   4383       break;
   4384    case VKI_TIOCGPGRP:
   4385       /* Get process group ID for foreground processing group. */
   4386       PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
   4387       break;
   4388    case VKI_TIOCSPGRP:
   4389       /* Set a process group ID? */
   4390       PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
   4391       break;
   4392    case VKI_TIOCGPTN: /* Get Pty Number (of pty-mux device) */
   4393       PRE_MEM_WRITE( "ioctl(TIOCGPTN)", ARG3, sizeof(int) );
   4394       break;
   4395    case VKI_TIOCSCTTY:
   4396       /* Just takes an int value.  */
   4397       break;
   4398    case VKI_TIOCSPTLCK: /* Lock/unlock Pty */
   4399       PRE_MEM_READ( "ioctl(TIOCSPTLCK)", ARG3, sizeof(int) );
   4400       break;
   4401    case VKI_FIONBIO:
   4402       PRE_MEM_READ( "ioctl(FIONBIO)",    ARG3, sizeof(int) );
   4403       break;
   4404    case VKI_FIOASYNC:
   4405       PRE_MEM_READ( "ioctl(FIOASYNC)",   ARG3, sizeof(int) );
   4406       break;
   4407    case VKI_FIONREAD:                /* identical to SIOCINQ */
   4408       PRE_MEM_WRITE( "ioctl(FIONREAD)",  ARG3, sizeof(int) );
   4409       break;
   4410    case VKI_FIOQSIZE:
   4411       PRE_MEM_WRITE( "ioctl(FIOQSIZE)",  ARG3, sizeof(vki_loff_t) );
   4412       break;
   4413 
   4414    case VKI_TIOCSERGETLSR:
   4415       PRE_MEM_WRITE( "ioctl(TIOCSERGETLSR)", ARG3, sizeof(int) );
   4416       break;
   4417    case VKI_TIOCGICOUNT:
   4418       PRE_MEM_WRITE( "ioctl(TIOCGICOUNT)", ARG3,
   4419                      sizeof(struct vki_serial_icounter_struct) );
   4420       break;
   4421 
   4422    case VKI_SG_SET_COMMAND_Q:
   4423       PRE_MEM_READ( "ioctl(SG_SET_COMMAND_Q)", ARG3, sizeof(int) );
   4424       break;
   4425    case VKI_SG_IO:
   4426       PRE_MEM_WRITE( "ioctl(SG_IO)", ARG3, sizeof(vki_sg_io_hdr_t) );
   4427       break;
   4428    case VKI_SG_GET_SCSI_ID:
   4429       PRE_MEM_WRITE( "ioctl(SG_GET_SCSI_ID)", ARG3, sizeof(vki_sg_scsi_id_t) );
   4430       break;
   4431    case VKI_SG_SET_RESERVED_SIZE:
   4432       PRE_MEM_READ( "ioctl(SG_SET_RESERVED_SIZE)", ARG3, sizeof(int) );
   4433       break;
   4434    case VKI_SG_SET_TIMEOUT:
   4435       PRE_MEM_READ( "ioctl(SG_SET_TIMEOUT)", ARG3, sizeof(int) );
   4436       break;
   4437    case VKI_SG_GET_RESERVED_SIZE:
   4438       PRE_MEM_WRITE( "ioctl(SG_GET_RESERVED_SIZE)", ARG3, sizeof(int) );
   4439       break;
   4440    case VKI_SG_GET_TIMEOUT:
   4441       break;
   4442    case VKI_SG_GET_VERSION_NUM:
   4443       PRE_MEM_WRITE(  "ioctl(SG_GET_VERSION_NUM)",  ARG3, sizeof(int) );
   4444       break;
   4445    case VKI_SG_EMULATED_HOST: /* 0x2203 */
   4446       PRE_MEM_WRITE( "ioctl(SG_EMULATED_HOST)",    ARG3, sizeof(int) );
   4447       break;
   4448    case VKI_SG_GET_SG_TABLESIZE: /* 0x227f */
   4449       PRE_MEM_WRITE( "ioctl(SG_GET_SG_TABLESIZE)", ARG3, sizeof(int) );
   4450       break;
   4451 
   4452    case VKI_IIOCGETCPS:
   4453       PRE_MEM_WRITE( "ioctl(IIOCGETCPS)", ARG3,
   4454 		     VKI_ISDN_MAX_CHANNELS * 2 * sizeof(unsigned long) );
   4455       break;
   4456    case VKI_IIOCNETGPN:
   4457       PRE_MEM_READ( "ioctl(IIOCNETGPN)",
   4458 		     (Addr)&((vki_isdn_net_ioctl_phone *)ARG3)->name,
   4459 		     sizeof(((vki_isdn_net_ioctl_phone *)ARG3)->name) );
   4460       PRE_MEM_WRITE( "ioctl(IIOCNETGPN)", ARG3,
   4461 		     sizeof(vki_isdn_net_ioctl_phone) );
   4462       break;
   4463 
   4464       /* These all use struct ifreq AFAIK */
   4465    case VKI_SIOCGIFINDEX:        /* get iface index              */
   4466       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFINDEX)",
   4467                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4468       PRE_MEM_WRITE( "ioctl(SIOCGIFINDEX)", ARG3, sizeof(struct vki_ifreq));
   4469       break;
   4470    case VKI_SIOCGIFFLAGS:        /* get flags                    */
   4471       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFFLAGS)",
   4472                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4473       PRE_MEM_WRITE( "ioctl(SIOCGIFFLAGS)", ARG3, sizeof(struct vki_ifreq));
   4474       break;
   4475    case VKI_SIOCGIFHWADDR:       /* Get hardware address         */
   4476       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFHWADDR)",
   4477                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4478       PRE_MEM_WRITE( "ioctl(SIOCGIFHWADDR)", ARG3, sizeof(struct vki_ifreq));
   4479       break;
   4480    case VKI_SIOCGIFMTU:          /* get MTU size                 */
   4481       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMTU)",
   4482                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4483       PRE_MEM_WRITE( "ioctl(SIOCGIFMTU)", ARG3, sizeof(struct vki_ifreq));
   4484       break;
   4485    case VKI_SIOCGIFADDR:         /* get PA address               */
   4486       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFADDR)",
   4487                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4488       PRE_MEM_WRITE( "ioctl(SIOCGIFADDR)", ARG3, sizeof(struct vki_ifreq));
   4489       break;
   4490    case VKI_SIOCGIFNETMASK:      /* get network PA mask          */
   4491       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFNETMASK)",
   4492                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4493       PRE_MEM_WRITE( "ioctl(SIOCGIFNETMASK)", ARG3, sizeof(struct vki_ifreq));
   4494       break;
   4495    case VKI_SIOCGIFMETRIC:       /* get metric                   */
   4496       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMETRIC)",
   4497                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4498       PRE_MEM_WRITE( "ioctl(SIOCGIFMETRIC)", ARG3, sizeof(struct vki_ifreq));
   4499       break;
   4500    case VKI_SIOCGIFMAP:          /* Get device parameters        */
   4501       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMAP)",
   4502                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4503       PRE_MEM_WRITE( "ioctl(SIOCGIFMAP)", ARG3, sizeof(struct vki_ifreq));
   4504       break;
   4505    case VKI_SIOCGIFTXQLEN:       /* Get the tx queue length      */
   4506       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFTXQLEN)",
   4507                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4508       PRE_MEM_WRITE( "ioctl(SIOCGIFTXQLEN)", ARG3, sizeof(struct vki_ifreq));
   4509       break;
   4510    case VKI_SIOCGIFDSTADDR:      /* get remote PA address        */
   4511       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFDSTADDR)",
   4512                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4513       PRE_MEM_WRITE( "ioctl(SIOCGIFDSTADDR)", ARG3, sizeof(struct vki_ifreq));
   4514       break;
   4515    case VKI_SIOCGIFBRDADDR:      /* get broadcast PA address     */
   4516       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFBRDADDR)",
   4517                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4518       PRE_MEM_WRITE( "ioctl(SIOCGIFBRDADDR)", ARG3, sizeof(struct vki_ifreq));
   4519       break;
   4520    case VKI_SIOCGIFNAME:         /* get iface name               */
   4521       PRE_MEM_READ( "ioctl(SIOCGIFNAME)",
   4522                      (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_ifindex,
   4523                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_ifindex) );
   4524       PRE_MEM_WRITE( "ioctl(SIOCGIFNAME)", ARG3, sizeof(struct vki_ifreq));
   4525       break;
   4526    case VKI_SIOCGMIIPHY:         /* get hardware entry           */
   4527       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMIIPHY)",
   4528                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4529       PRE_MEM_WRITE( "ioctl(SIOCGIFMIIPHY)", ARG3, sizeof(struct vki_ifreq));
   4530       break;
   4531    case VKI_SIOCGMIIREG:         /* get hardware entry registers */
   4532       PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMIIREG)",
   4533                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4534       PRE_MEM_READ( "ioctl(SIOCGIFMIIREG)",
   4535                      (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
   4536                      sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
   4537       PRE_MEM_READ( "ioctl(SIOCGIFMIIREG)",
   4538                      (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num,
   4539                      sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num) );
   4540       PRE_MEM_WRITE( "ioctl(SIOCGIFMIIREG)", ARG3,
   4541 		     sizeof(struct vki_ifreq));
   4542       break;
   4543    case VKI_SIOCGIFCONF:         /* get iface list               */
   4544       /* WAS:
   4545 	 PRE_MEM_WRITE( "ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
   4546 	 KERNEL_DO_SYSCALL(tid,RES);
   4547 	 if (!VG_(is_kerror)(RES) && RES == 0)
   4548 	 POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
   4549       */
   4550       PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
   4551                     (Addr)&((struct vki_ifconf *)ARG3)->ifc_len,
   4552                     sizeof(((struct vki_ifconf *)ARG3)->ifc_len));
   4553       PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
   4554                     (Addr)&((struct vki_ifconf *)ARG3)->vki_ifc_buf,
   4555                     sizeof(((struct vki_ifconf *)ARG3)->vki_ifc_buf));
   4556       if ( ARG3 ) {
   4557 	 // TODO len must be readable and writable
   4558 	 // buf pointer only needs to be readable
   4559 	 struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
   4560 	 PRE_MEM_WRITE( "ioctl(SIOCGIFCONF).ifc_buf",
   4561 			(Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
   4562       }
   4563       break;
   4564    case VKI_SIOCGSTAMP:
   4565       PRE_MEM_WRITE( "ioctl(SIOCGSTAMP)", ARG3, sizeof(struct vki_timeval));
   4566       break;
   4567    case VKI_SIOCGSTAMPNS:
   4568       PRE_MEM_WRITE( "ioctl(SIOCGSTAMPNS)", ARG3, sizeof(struct vki_timespec));
   4569       break;
   4570       /* SIOCOUTQ is an ioctl that, when called on a socket, returns
   4571 	 the number of bytes currently in that socket's send buffer.
   4572 	 It writes this value as an int to the memory location
   4573 	 indicated by the third argument of ioctl(2). */
   4574    case VKI_SIOCOUTQ:
   4575       PRE_MEM_WRITE( "ioctl(SIOCOUTQ)", ARG3, sizeof(int));
   4576       break;
   4577    case VKI_SIOCGRARP:           /* get RARP table entry         */
   4578    case VKI_SIOCGARP:            /* get ARP table entry          */
   4579       PRE_MEM_WRITE( "ioctl(SIOCGARP)", ARG3, sizeof(struct vki_arpreq));
   4580       break;
   4581 
   4582    case VKI_SIOCSIFFLAGS:        /* set flags                    */
   4583       PRE_MEM_RASCIIZ( "ioctl(SIOCSIFFLAGS)",
   4584                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4585       PRE_MEM_READ( "ioctl(SIOCSIFFLAGS)",
   4586                      (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
   4587                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
   4588       break;
   4589    case VKI_SIOCSIFMAP:          /* Set device parameters        */
   4590       PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMAP)",
   4591                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4592       PRE_MEM_READ( "ioctl(SIOCSIFMAP)",
   4593                      (Addr)&((struct vki_ifreq *)ARG3)->ifr_map,
   4594                      sizeof(((struct vki_ifreq *)ARG3)->ifr_map) );
   4595       break;
   4596    case VKI_SIOCSHWTSTAMP:       /* Set hardware time stamping   */
   4597       PRE_MEM_RASCIIZ( "ioctl(SIOCSHWTSTAMP)",
   4598                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4599       PRE_MEM_READ( "ioctl(SIOCSHWTSTAMP)",
   4600                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_data,
   4601                      sizeof(struct vki_hwtstamp_config) );
   4602       break;
   4603    case VKI_SIOCSIFTXQLEN:       /* Set the tx queue length      */
   4604       PRE_MEM_RASCIIZ( "ioctl(SIOCSIFTXQLEN)",
   4605                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4606       PRE_MEM_READ( "ioctl(SIOCSIFTXQLEN)",
   4607                      (Addr)&((struct vki_ifreq *)ARG3)->ifr_qlen,
   4608                      sizeof(((struct vki_ifreq *)ARG3)->ifr_qlen) );
   4609       break;
   4610    case VKI_SIOCSIFADDR:         /* set PA address               */
   4611    case VKI_SIOCSIFDSTADDR:      /* set remote PA address        */
   4612    case VKI_SIOCSIFBRDADDR:      /* set broadcast PA address     */
   4613    case VKI_SIOCSIFNETMASK:      /* set network PA mask          */
   4614       PRE_MEM_RASCIIZ( "ioctl(SIOCSIF*ADDR)",
   4615                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4616       PRE_MEM_READ( "ioctl(SIOCSIF*ADDR)",
   4617                      (Addr)&((struct vki_ifreq *)ARG3)->ifr_addr,
   4618                      sizeof(((struct vki_ifreq *)ARG3)->ifr_addr) );
   4619       break;
   4620    case VKI_SIOCSIFMETRIC:       /* set metric                   */
   4621       PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMETRIC)",
   4622                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4623       PRE_MEM_READ( "ioctl(SIOCSIFMETRIC)",
   4624                      (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
   4625                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
   4626       break;
   4627    case VKI_SIOCSIFMTU:          /* set MTU size                 */
   4628       PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMTU)",
   4629                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4630       PRE_MEM_READ( "ioctl(SIOCSIFMTU)",
   4631                      (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
   4632                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
   4633       break;
   4634    case VKI_SIOCSIFHWADDR:       /* set hardware address         */
   4635       PRE_MEM_RASCIIZ( "ioctl(SIOCSIFHWADDR)",
   4636                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4637       PRE_MEM_READ( "ioctl(SIOCSIFHWADDR)",
   4638                      (Addr)&((struct vki_ifreq *)ARG3)->ifr_hwaddr,
   4639                      sizeof(((struct vki_ifreq *)ARG3)->ifr_hwaddr) );
   4640       break;
   4641    case VKI_SIOCSMIIREG:         /* set hardware entry registers */
   4642       PRE_MEM_RASCIIZ( "ioctl(SIOCSMIIREG)",
   4643                      (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
   4644       PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
   4645                      (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
   4646                      sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
   4647       PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
   4648                      (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num,
   4649                      sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num) );
   4650       PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
   4651                      (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_in,
   4652                      sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_in) );
   4653       break;
   4654       /* Routing table calls.  */
   4655    case VKI_SIOCADDRT:           /* add routing table entry      */
   4656    case VKI_SIOCDELRT:           /* delete routing table entry   */
   4657       PRE_MEM_READ( "ioctl(SIOCADDRT/DELRT)", ARG3,
   4658 		    sizeof(struct vki_rtentry));
   4659       break;
   4660 
   4661       /* RARP cache control calls. */
   4662    case VKI_SIOCDRARP:           /* delete RARP table entry      */
   4663    case VKI_SIOCSRARP:           /* set RARP table entry         */
   4664       /* ARP cache control calls. */
   4665    case VKI_SIOCSARP:            /* set ARP table entry          */
   4666    case VKI_SIOCDARP:            /* delete ARP table entry       */
   4667       PRE_MEM_READ( "ioctl(SIOCSIFFLAGS)", ARG3, sizeof(struct vki_ifreq));
   4668       break;
   4669 
   4670    case VKI_SIOCGPGRP:
   4671       PRE_MEM_WRITE( "ioctl(SIOCGPGRP)", ARG3, sizeof(int) );
   4672       break;
   4673    case VKI_SIOCSPGRP:
   4674       PRE_MEM_READ( "ioctl(SIOCSPGRP)", ARG3, sizeof(int) );
   4675       //tst->sys_flags &= ~SfMayBlock;
   4676       break;
   4677 
   4678       /* linux/soundcard interface (OSS) */
   4679    case VKI_SNDCTL_SEQ_GETOUTCOUNT:
   4680    case VKI_SNDCTL_SEQ_GETINCOUNT:
   4681    case VKI_SNDCTL_SEQ_PERCMODE:
   4682    case VKI_SNDCTL_SEQ_TESTMIDI:
   4683    case VKI_SNDCTL_SEQ_RESETSAMPLES:
   4684    case VKI_SNDCTL_SEQ_NRSYNTHS:
   4685    case VKI_SNDCTL_SEQ_NRMIDIS:
   4686    case VKI_SNDCTL_SEQ_GETTIME:
   4687    case VKI_SNDCTL_DSP_GETBLKSIZE:
   4688    case VKI_SNDCTL_DSP_GETFMTS:
   4689    case VKI_SNDCTL_DSP_GETTRIGGER:
   4690    case VKI_SNDCTL_DSP_GETODELAY:
   4691    case VKI_SNDCTL_DSP_GETSPDIF:
   4692    case VKI_SNDCTL_DSP_GETCAPS:
   4693    case VKI_SOUND_PCM_READ_RATE:
   4694    case VKI_SOUND_PCM_READ_CHANNELS:
   4695    case VKI_SOUND_PCM_READ_BITS:
   4696    case VKI_SOUND_PCM_READ_FILTER:
   4697       PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOR, int))",
   4698 		     ARG3, sizeof(int));
   4699       break;
   4700    case VKI_SNDCTL_SEQ_CTRLRATE:
   4701    case VKI_SNDCTL_DSP_SPEED:
   4702    case VKI_SNDCTL_DSP_STEREO:
   4703    case VKI_SNDCTL_DSP_CHANNELS:
   4704    case VKI_SOUND_PCM_WRITE_FILTER:
   4705    case VKI_SNDCTL_DSP_SUBDIVIDE:
   4706    case VKI_SNDCTL_DSP_SETFRAGMENT:
   4707    case VKI_SNDCTL_DSP_SETFMT:
   4708    case VKI_SNDCTL_DSP_GETCHANNELMASK:
   4709    case VKI_SNDCTL_DSP_BIND_CHANNEL:
   4710    case VKI_SNDCTL_TMR_TIMEBASE:
   4711    case VKI_SNDCTL_TMR_TEMPO:
   4712    case VKI_SNDCTL_TMR_SOURCE:
   4713    case VKI_SNDCTL_MIDI_PRETIME:
   4714    case VKI_SNDCTL_MIDI_MPUMODE:
   4715       PRE_MEM_READ( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOWR, int))",
   4716 		     ARG3, sizeof(int));
   4717       PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOWR, int))",
   4718 		     ARG3, sizeof(int));
   4719       break;
   4720    case VKI_SNDCTL_DSP_GETOSPACE:
   4721    case VKI_SNDCTL_DSP_GETISPACE:
   4722       PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOR, audio_buf_info))",
   4723                      ARG3, sizeof(vki_audio_buf_info));
   4724       break;
   4725    case VKI_SNDCTL_DSP_NONBLOCK:
   4726       break;
   4727    case VKI_SNDCTL_DSP_SETTRIGGER:
   4728       PRE_MEM_READ( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOW, int))",
   4729 		     ARG3, sizeof(int));
   4730       break;
   4731 
   4732    case VKI_SNDCTL_DSP_POST:
   4733    case VKI_SNDCTL_DSP_RESET:
   4734    case VKI_SNDCTL_DSP_SYNC:
   4735    case VKI_SNDCTL_DSP_SETSYNCRO:
   4736    case VKI_SNDCTL_DSP_SETDUPLEX:
   4737       break;
   4738 
   4739       /* linux/soundcard interface (ALSA) */
   4740    case VKI_SNDRV_PCM_IOCTL_PAUSE:
   4741    case VKI_SNDRV_PCM_IOCTL_LINK:
   4742       /* these just take an int by value */
   4743       break;
   4744 
   4745       /* Real Time Clock (/dev/rtc) ioctls */
   4746    case VKI_RTC_UIE_ON:
   4747    case VKI_RTC_UIE_OFF:
   4748    case VKI_RTC_AIE_ON:
   4749    case VKI_RTC_AIE_OFF:
   4750    case VKI_RTC_PIE_ON:
   4751    case VKI_RTC_PIE_OFF:
   4752    case VKI_RTC_IRQP_SET:
   4753       break;
   4754    case VKI_RTC_RD_TIME:
   4755    case VKI_RTC_ALM_READ:
   4756       PRE_MEM_WRITE( "ioctl(RTC_RD_TIME/ALM_READ)",
   4757 		     ARG3, sizeof(struct vki_rtc_time));
   4758       break;
   4759    case VKI_RTC_ALM_SET:
   4760       PRE_MEM_READ( "ioctl(RTC_ALM_SET)", ARG3, sizeof(struct vki_rtc_time));
   4761       break;
   4762    case VKI_RTC_IRQP_READ:
   4763       PRE_MEM_WRITE( "ioctl(RTC_IRQP_READ)", ARG3, sizeof(unsigned long));
   4764       break;
   4765 
   4766       /* Block devices */
   4767    case VKI_BLKROSET:
   4768       PRE_MEM_READ( "ioctl(BLKROSET)", ARG3, sizeof(int));
   4769       break;
   4770    case VKI_BLKROGET:
   4771       PRE_MEM_WRITE( "ioctl(BLKROGET)", ARG3, sizeof(int));
   4772       break;
   4773    case VKI_BLKGETSIZE:
   4774       PRE_MEM_WRITE( "ioctl(BLKGETSIZE)", ARG3, sizeof(unsigned long));
   4775       break;
   4776    case VKI_BLKRASET:
   4777       break;
   4778    case VKI_BLKRAGET:
   4779       PRE_MEM_WRITE( "ioctl(BLKRAGET)", ARG3, sizeof(long));
   4780       break;
   4781    case VKI_BLKFRASET:
   4782       break;
   4783    case VKI_BLKFRAGET:
   4784       PRE_MEM_WRITE( "ioctl(BLKFRAGET)", ARG3, sizeof(long));
   4785       break;
   4786    case VKI_BLKSECTGET:
   4787       PRE_MEM_WRITE( "ioctl(BLKSECTGET)", ARG3, sizeof(unsigned short));
   4788       break;
   4789    case VKI_BLKSSZGET:
   4790       PRE_MEM_WRITE( "ioctl(BLKSSZGET)", ARG3, sizeof(int));
   4791       break;
   4792    case VKI_BLKBSZGET:
   4793       PRE_MEM_WRITE( "ioctl(BLKBSZGET)", ARG3, sizeof(int));
   4794       break;
   4795    case VKI_BLKBSZSET:
   4796       PRE_MEM_READ( "ioctl(BLKBSZSET)", ARG3, sizeof(int));
   4797       break;
   4798    case VKI_BLKGETSIZE64:
   4799       PRE_MEM_WRITE( "ioctl(BLKGETSIZE64)", ARG3, sizeof(unsigned long long));
   4800       break;
   4801 
   4802       /* Hard disks */
   4803    case VKI_HDIO_GETGEO: /* 0x0301 */
   4804       PRE_MEM_WRITE( "ioctl(HDIO_GETGEO)", ARG3, sizeof(struct vki_hd_geometry));
   4805       break;
   4806    case VKI_HDIO_GET_DMA: /* 0x030b */
   4807       PRE_MEM_WRITE( "ioctl(HDIO_GET_DMA)", ARG3, sizeof(long));
   4808       break;
   4809    case VKI_HDIO_GET_IDENTITY: /* 0x030d */
   4810       PRE_MEM_WRITE( "ioctl(HDIO_GET_IDENTITY)", ARG3,
   4811                      VKI_SIZEOF_STRUCT_HD_DRIVEID );
   4812       break;
   4813 
   4814       /* SCSI */
   4815    case VKI_SCSI_IOCTL_GET_IDLUN: /* 0x5382 */
   4816       PRE_MEM_WRITE( "ioctl(SCSI_IOCTL_GET_IDLUN)", ARG3, sizeof(struct vki_scsi_idlun));
   4817       break;
   4818    case VKI_SCSI_IOCTL_GET_BUS_NUMBER: /* 0x5386 */
   4819       PRE_MEM_WRITE( "ioctl(SCSI_IOCTL_GET_BUS_NUMBER)", ARG3, sizeof(int));
   4820       break;
   4821 
   4822       /* CD ROM stuff (??)  */
   4823    case VKI_CDROM_GET_MCN:
   4824       PRE_MEM_READ( "ioctl(CDROM_GET_MCN)", ARG3,
   4825                     sizeof(struct vki_cdrom_mcn) );
   4826       break;
   4827    case VKI_CDROM_SEND_PACKET:
   4828       PRE_MEM_READ( "ioctl(CDROM_SEND_PACKET)", ARG3,
   4829                     sizeof(struct vki_cdrom_generic_command));
   4830       break;
   4831    case VKI_CDROMSUBCHNL:
   4832       PRE_MEM_READ( "ioctl(CDROMSUBCHNL (cdsc_format, char))",
   4833 		    (Addr) &(((struct vki_cdrom_subchnl*) ARG3)->cdsc_format),
   4834 		    sizeof(((struct vki_cdrom_subchnl*) ARG3)->cdsc_format));
   4835       PRE_MEM_WRITE( "ioctl(CDROMSUBCHNL)", ARG3,
   4836 		     sizeof(struct vki_cdrom_subchnl));
   4837       break;
   4838    case VKI_CDROMREADMODE2:
   4839       PRE_MEM_READ( "ioctl(CDROMREADMODE2)", ARG3, VKI_CD_FRAMESIZE_RAW0 );
   4840       break;
   4841    case VKI_CDROMREADTOCHDR:
   4842       PRE_MEM_WRITE( "ioctl(CDROMREADTOCHDR)", ARG3,
   4843 		     sizeof(struct vki_cdrom_tochdr));
   4844       break;
   4845    case VKI_CDROMREADTOCENTRY:
   4846       PRE_MEM_READ( "ioctl(CDROMREADTOCENTRY (cdte_format, char))",
   4847 		    (Addr) &(((struct vki_cdrom_tocentry*) ARG3)->cdte_format),
   4848 		    sizeof(((struct vki_cdrom_tocentry*) ARG3)->cdte_format));
   4849       PRE_MEM_READ( "ioctl(CDROMREADTOCENTRY (cdte_track, char))",
   4850 		    (Addr) &(((struct vki_cdrom_tocentry*) ARG3)->cdte_track),
   4851 		    sizeof(((struct vki_cdrom_tocentry*) ARG3)->cdte_track));
   4852       PRE_MEM_WRITE( "ioctl(CDROMREADTOCENTRY)", ARG3,
   4853 		     sizeof(struct vki_cdrom_tocentry));
   4854       break;
   4855    case VKI_CDROMMULTISESSION: /* 0x5310 */
   4856       PRE_MEM_WRITE( "ioctl(CDROMMULTISESSION)", ARG3,
   4857 		     sizeof(struct vki_cdrom_multisession));
   4858       break;
   4859    case VKI_CDROMVOLREAD: /* 0x5313 */
   4860       PRE_MEM_WRITE( "ioctl(CDROMVOLREAD)", ARG3,
   4861 		     sizeof(struct vki_cdrom_volctrl));
   4862       break;
   4863    case VKI_CDROMREADRAW: /* 0x5314 */
   4864       PRE_MEM_READ( "ioctl(CDROMREADRAW)", ARG3, sizeof(struct vki_cdrom_msf));
   4865       PRE_MEM_WRITE( "ioctl(CDROMREADRAW)", ARG3, VKI_CD_FRAMESIZE_RAW);
   4866       break;
   4867    case VKI_CDROMREADAUDIO: /* 0x530e */
   4868       PRE_MEM_READ( "ioctl(CDROMREADAUDIO)", ARG3,
   4869 		     sizeof (struct vki_cdrom_read_audio));
   4870       if ( ARG3 ) {
   4871          /* ToDo: don't do any of the following if the structure is invalid */
   4872          struct vki_cdrom_read_audio *cra = (struct vki_cdrom_read_audio *) ARG3;
   4873 	 PRE_MEM_WRITE( "ioctl(CDROMREADAUDIO).buf",
   4874 	                (Addr)(cra->buf), cra->nframes * VKI_CD_FRAMESIZE_RAW);
   4875       }
   4876       break;
   4877    case VKI_CDROMPLAYMSF:
   4878       PRE_MEM_READ( "ioctl(CDROMPLAYMSF)", ARG3, sizeof(struct vki_cdrom_msf));
   4879       break;
   4880       /* The following two are probably bogus (should check args
   4881 	 for readability).  JRS 20021117 */
   4882    case VKI_CDROM_DRIVE_STATUS: /* 0x5326 */
   4883    case VKI_CDROM_CLEAR_OPTIONS: /* 0x5321 */
   4884       break;
   4885    case VKI_CDROM_GET_CAPABILITY: /* 0x5331 */
   4886       break;
   4887 
   4888    case VKI_FIGETBSZ:
   4889       PRE_MEM_WRITE( "ioctl(FIGETBSZ)", ARG3, sizeof(unsigned long));
   4890       break;
   4891    case VKI_FIBMAP:
   4892       PRE_MEM_READ( "ioctl(FIBMAP)", ARG3, sizeof(int));
   4893       break;
   4894 
   4895    case VKI_FBIOGET_VSCREENINFO: /* 0x4600 */
   4896       PRE_MEM_WRITE( "ioctl(FBIOGET_VSCREENINFO)", ARG3,
   4897                      sizeof(struct vki_fb_var_screeninfo));
   4898       break;
   4899    case VKI_FBIOPUT_VSCREENINFO:
   4900       PRE_MEM_READ( "ioctl(FBIOPUT_VSCREENINFO)", ARG3,
   4901                     sizeof(struct vki_fb_var_screeninfo));
   4902       break;
   4903    case VKI_FBIOGET_FSCREENINFO: /* 0x4602 */
   4904       PRE_MEM_WRITE( "ioctl(FBIOGET_FSCREENINFO)", ARG3,
   4905                      sizeof(struct vki_fb_fix_screeninfo));
   4906       break;
   4907    case VKI_FBIOPAN_DISPLAY:
   4908       PRE_MEM_READ( "ioctl(FBIOPAN_DISPLAY)", ARG3,
   4909                     sizeof(struct vki_fb_var_screeninfo));
   4910 
   4911       break;
   4912    case VKI_PPCLAIM:
   4913    case VKI_PPEXCL:
   4914    case VKI_PPYIELD:
   4915    case VKI_PPRELEASE:
   4916       break;
   4917    case VKI_PPSETMODE:
   4918       PRE_MEM_READ( "ioctl(PPSETMODE)",   ARG3, sizeof(int) );
   4919       break;
   4920    case VKI_PPGETMODE:
   4921       PRE_MEM_WRITE( "ioctl(PPGETMODE)",  ARG3, sizeof(int) );
   4922       break;
   4923    case VKI_PPSETPHASE:
   4924       PRE_MEM_READ(  "ioctl(PPSETPHASE)", ARG3, sizeof(int) );
   4925       break;
   4926    case VKI_PPGETPHASE:
   4927       PRE_MEM_WRITE( "ioctl(PPGETPHASE)", ARG3, sizeof(int) );
   4928       break;
   4929    case VKI_PPGETMODES:
   4930       PRE_MEM_WRITE( "ioctl(PPGETMODES)", ARG3, sizeof(unsigned int) );
   4931       break;
   4932    case VKI_PPSETFLAGS:
   4933       PRE_MEM_READ(  "ioctl(PPSETFLAGS)", ARG3, sizeof(int) );
   4934       break;
   4935    case VKI_PPGETFLAGS:
   4936       PRE_MEM_WRITE( "ioctl(PPGETFLAGS)", ARG3, sizeof(int) );
   4937       break;
   4938    case VKI_PPRSTATUS:
   4939       PRE_MEM_WRITE( "ioctl(PPRSTATUS)",  ARG3, sizeof(unsigned char) );
   4940       break;
   4941    case VKI_PPRDATA:
   4942       PRE_MEM_WRITE( "ioctl(PPRDATA)",    ARG3, sizeof(unsigned char) );
   4943       break;
   4944    case VKI_PPRCONTROL:
   4945       PRE_MEM_WRITE( "ioctl(PPRCONTROL)", ARG3, sizeof(unsigned char) );
   4946       break;
   4947    case VKI_PPWDATA:
   4948       PRE_MEM_READ(  "ioctl(PPWDATA)",    ARG3, sizeof(unsigned char) );
   4949       break;
   4950    case VKI_PPWCONTROL:
   4951       PRE_MEM_READ(  "ioctl(PPWCONTROL)", ARG3, sizeof(unsigned char) );
   4952       break;
   4953    case VKI_PPFCONTROL:
   4954       PRE_MEM_READ(  "ioctl(PPFCONTROL)", ARG3, 2 * sizeof(unsigned char) );
   4955       break;
   4956    case VKI_PPDATADIR:
   4957       PRE_MEM_READ(  "ioctl(PPDATADIR)",  ARG3, sizeof(int) );
   4958       break;
   4959    case VKI_PPNEGOT:
   4960       PRE_MEM_READ(  "ioctl(PPNEGOT)",    ARG3, sizeof(int) );
   4961       break;
   4962    case VKI_PPWCTLONIRQ:
   4963       PRE_MEM_READ(  "ioctl(PPWCTLONIRQ)",ARG3, sizeof(unsigned char) );
   4964       break;
   4965    case VKI_PPCLRIRQ:
   4966       PRE_MEM_WRITE( "ioctl(PPCLRIRQ)",   ARG3, sizeof(int) );
   4967       break;
   4968    case VKI_PPSETTIME:
   4969       PRE_MEM_READ(  "ioctl(PPSETTIME)",  ARG3, sizeof(struct vki_timeval) );
   4970       break;
   4971    case VKI_PPGETTIME:
   4972       PRE_MEM_WRITE( "ioctl(PPGETTIME)",  ARG3, sizeof(struct vki_timeval) );
   4973       break;
   4974 
   4975    case VKI_GIO_FONT:
   4976       PRE_MEM_WRITE( "ioctl(GIO_FONT)", ARG3, 32 * 256 );
   4977       break;
   4978    case VKI_PIO_FONT:
   4979       PRE_MEM_READ( "ioctl(PIO_FONT)", ARG3, 32 * 256 );
   4980       break;
   4981 
   4982    case VKI_GIO_FONTX:
   4983       PRE_MEM_READ( "ioctl(GIO_FONTX)", ARG3, sizeof(struct vki_consolefontdesc) );
   4984       if ( ARG3 ) {
   4985          /* ToDo: don't do any of the following if the structure is invalid */
   4986          struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)ARG3;
   4987          PRE_MEM_WRITE( "ioctl(GIO_FONTX).chardata", (Addr)cfd->chardata,
   4988                         32 * cfd->charcount );
   4989       }
   4990       break;
   4991    case VKI_PIO_FONTX:
   4992       PRE_MEM_READ( "ioctl(PIO_FONTX)", ARG3, sizeof(struct vki_consolefontdesc) );
   4993       if ( ARG3 ) {
   4994          /* ToDo: don't do any of the following if the structure is invalid */
   4995          struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)ARG3;
   4996          PRE_MEM_READ( "ioctl(PIO_FONTX).chardata", (Addr)cfd->chardata,
   4997                        32 * cfd->charcount );
   4998       }
   4999       break;
   5000 
   5001    case VKI_PIO_FONTRESET:
   5002       break;
   5003 
   5004    case VKI_GIO_CMAP:
   5005       PRE_MEM_WRITE( "ioctl(GIO_CMAP)", ARG3, 16 * 3 );
   5006       break;
   5007    case VKI_PIO_CMAP:
   5008       PRE_MEM_READ( "ioctl(PIO_CMAP)", ARG3, 16 * 3 );
   5009       break;
   5010 
   5011    case VKI_KIOCSOUND:
   5012    case VKI_KDMKTONE:
   5013       break;
   5014 
   5015    case VKI_KDGETLED:
   5016       PRE_MEM_WRITE( "ioctl(KDGETLED)", ARG3, sizeof(char) );
   5017       break;
   5018    case VKI_KDSETLED:
   5019       break;
   5020 
   5021    case VKI_KDGKBTYPE:
   5022       PRE_MEM_WRITE( "ioctl(KDGKBTYPE)", ARG3, sizeof(char) );
   5023       break;
   5024 
   5025    case VKI_KDADDIO:
   5026    case VKI_KDDELIO:
   5027    case VKI_KDENABIO:
   5028    case VKI_KDDISABIO:
   5029       break;
   5030 
   5031    case VKI_KDSETMODE:
   5032       break;
   5033    case VKI_KDGETMODE:
   5034       PRE_MEM_WRITE( "ioctl(KDGETMODE)", ARG3, sizeof(int) );
   5035       break;
   5036 
   5037    case VKI_KDMAPDISP:
   5038    case VKI_KDUNMAPDISP:
   5039       break;
   5040 
   5041    case VKI_GIO_SCRNMAP:
   5042       PRE_MEM_WRITE( "ioctl(GIO_SCRNMAP)", ARG3, VKI_E_TABSZ );
   5043       break;
   5044    case VKI_PIO_SCRNMAP:
   5045       PRE_MEM_READ( "ioctl(PIO_SCRNMAP)", ARG3, VKI_E_TABSZ  );
   5046       break;
   5047    case VKI_GIO_UNISCRNMAP:
   5048       PRE_MEM_WRITE( "ioctl(GIO_UNISCRNMAP)", ARG3,
   5049                      VKI_E_TABSZ * sizeof(unsigned short) );
   5050       break;
   5051    case VKI_PIO_UNISCRNMAP:
   5052       PRE_MEM_READ( "ioctl(PIO_UNISCRNMAP)", ARG3,
   5053                     VKI_E_TABSZ * sizeof(unsigned short) );
   5054       break;
   5055 
   5056    case VKI_GIO_UNIMAP:
   5057       if ( ARG3 ) {
   5058          struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
   5059          PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct,
   5060                        sizeof(unsigned short));
   5061          PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries,
   5062                        sizeof(struct vki_unipair *));
   5063          PRE_MEM_WRITE( "ioctl(GIO_UNIMAP).entries", (Addr)desc->entries,
   5064                         desc->entry_ct * sizeof(struct vki_unipair));
   5065       }
   5066       break;
   5067    case VKI_PIO_UNIMAP:
   5068       if ( ARG3 ) {
   5069          struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
   5070          PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct,
   5071                        sizeof(unsigned short) );
   5072          PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries,
   5073                        sizeof(struct vki_unipair *) );
   5074          PRE_MEM_READ( "ioctl(PIO_UNIMAP).entries", (Addr)desc->entries,
   5075                        desc->entry_ct * sizeof(struct vki_unipair) );
   5076       }
   5077       break;
   5078    case VKI_PIO_UNIMAPCLR:
   5079       PRE_MEM_READ( "ioctl(GIO_UNIMAP)", ARG3, sizeof(struct vki_unimapinit));
   5080       break;
   5081 
   5082    case VKI_KDGKBMODE:
   5083       PRE_MEM_WRITE( "ioctl(KDGKBMODE)", ARG3, sizeof(int) );
   5084       break;
   5085    case VKI_KDSKBMODE:
   5086       break;
   5087 
   5088    case VKI_KDGKBMETA:
   5089       PRE_MEM_WRITE( "ioctl(KDGKBMETA)", ARG3, sizeof(int) );
   5090       break;
   5091    case VKI_KDSKBMETA:
   5092       break;
   5093 
   5094    case VKI_KDGKBLED:
   5095       PRE_MEM_WRITE( "ioctl(KDGKBLED)", ARG3, sizeof(char) );
   5096       break;
   5097    case VKI_KDSKBLED:
   5098       break;
   5099 
   5100    case VKI_KDGKBENT:
   5101       PRE_MEM_READ( "ioctl(KDGKBENT).kb_table",
   5102                     (Addr)&((struct vki_kbentry *)ARG3)->kb_table,
   5103                     sizeof(((struct vki_kbentry *)ARG3)->kb_table) );
   5104       PRE_MEM_READ( "ioctl(KDGKBENT).kb_index",
   5105                     (Addr)&((struct vki_kbentry *)ARG3)->kb_index,
   5106                     sizeof(((struct vki_kbentry *)ARG3)->kb_index) );
   5107       PRE_MEM_WRITE( "ioctl(KDGKBENT).kb_value",
   5108 		     (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
   5109 		     sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
   5110       break;
   5111    case VKI_KDSKBENT:
   5112       PRE_MEM_READ( "ioctl(KDSKBENT).kb_table",
   5113                     (Addr)&((struct vki_kbentry *)ARG3)->kb_table,
   5114                     sizeof(((struct vki_kbentry *)ARG3)->kb_table) );
   5115       PRE_MEM_READ( "ioctl(KDSKBENT).kb_index",
   5116                     (Addr)&((struct vki_kbentry *)ARG3)->kb_index,
   5117                     sizeof(((struct vki_kbentry *)ARG3)->kb_index) );
   5118       PRE_MEM_READ( "ioctl(KDSKBENT).kb_value",
   5119                     (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
   5120                     sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
   5121       break;
   5122 
   5123    case VKI_KDGKBSENT:
   5124       PRE_MEM_READ( "ioctl(KDGKBSENT).kb_func",
   5125                     (Addr)&((struct vki_kbsentry *)ARG3)->kb_func,
   5126                     sizeof(((struct vki_kbsentry *)ARG3)->kb_func) );
   5127       PRE_MEM_WRITE( "ioctl(KDGKSENT).kb_string",
   5128 		     (Addr)((struct vki_kbsentry *)ARG3)->kb_string,
   5129 		     sizeof(((struct vki_kbsentry *)ARG3)->kb_string) );
   5130       break;
   5131    case VKI_KDSKBSENT:
   5132       PRE_MEM_READ( "ioctl(KDSKBSENT).kb_func",
   5133                     (Addr)&((struct vki_kbsentry *)ARG3)->kb_func,
   5134                     sizeof(((struct vki_kbsentry *)ARG3)->kb_func) );
   5135       PRE_MEM_RASCIIZ( "ioctl(KDSKBSENT).kb_string",
   5136                        (Addr)((struct vki_kbsentry *)ARG3)->kb_string );
   5137       break;
   5138 
   5139    case VKI_KDGKBDIACR:
   5140       PRE_MEM_WRITE( "ioctl(KDGKBDIACR)", ARG3, sizeof(struct vki_kbdiacrs) );
   5141       break;
   5142    case VKI_KDSKBDIACR:
   5143       PRE_MEM_READ( "ioctl(KDSKBDIACR)", ARG3, sizeof(struct vki_kbdiacrs) );
   5144       break;
   5145 
   5146    case VKI_KDGETKEYCODE:
   5147       PRE_MEM_READ( "ioctl(KDGETKEYCODE).scancode",
   5148                     (Addr)&((struct vki_kbkeycode *)ARG3)->scancode,
   5149                     sizeof(((struct vki_kbkeycode *)ARG3)->scancode) );
   5150       PRE_MEM_WRITE( "ioctl(KDGETKEYCODE).keycode",
   5151 		     (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
   5152 		     sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
   5153       break;
   5154    case VKI_KDSETKEYCODE:
   5155       PRE_MEM_READ( "ioctl(KDSETKEYCODE).scancode",
   5156                     (Addr)&((struct vki_kbkeycode *)ARG3)->scancode,
   5157                     sizeof(((struct vki_kbkeycode *)ARG3)->scancode) );
   5158       PRE_MEM_READ( "ioctl(KDSETKEYCODE).keycode",
   5159                     (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
   5160                     sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
   5161       break;
   5162 
   5163    case VKI_KDSIGACCEPT:
   5164       break;
   5165 
   5166    case VKI_KDKBDREP:
   5167       PRE_MEM_READ( "ioctl(KBKBDREP)", ARG3, sizeof(struct vki_kbd_repeat) );
   5168       break;
   5169 
   5170    case VKI_KDFONTOP:
   5171       if ( ARG3 ) {
   5172          struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3;
   5173          PRE_MEM_READ( "ioctl(KDFONTOP)", (Addr)op,
   5174                        sizeof(struct vki_console_font_op) );
   5175          switch ( op->op ) {
   5176             case VKI_KD_FONT_OP_SET:
   5177                PRE_MEM_READ( "ioctl(KDFONTOP,KD_FONT_OP_SET).data",
   5178                              (Addr)op->data,
   5179                              (op->width + 7) / 8 * 32 * op->charcount );
   5180                break;
   5181             case VKI_KD_FONT_OP_GET:
   5182                if ( op->data )
   5183                   PRE_MEM_WRITE( "ioctl(KDFONTOP,KD_FONT_OP_GET).data",
   5184                                  (Addr)op->data,
   5185                                  (op->width + 7) / 8 * 32 * op->charcount );
   5186                break;
   5187             case VKI_KD_FONT_OP_SET_DEFAULT:
   5188                if ( op->data )
   5189                   PRE_MEM_RASCIIZ( "ioctl(KDFONTOP,KD_FONT_OP_SET_DEFAULT).data",
   5190                                    (Addr)op->data );
   5191                break;
   5192             case VKI_KD_FONT_OP_COPY:
   5193                break;
   5194          }
   5195       }
   5196       break;
   5197 
   5198    case VKI_VT_OPENQRY:
   5199       PRE_MEM_WRITE( "ioctl(VT_OPENQRY)", ARG3, sizeof(int) );
   5200       break;
   5201    case VKI_VT_GETMODE:
   5202       PRE_MEM_WRITE( "ioctl(VT_GETMODE)", ARG3, sizeof(struct vki_vt_mode) );
   5203       break;
   5204    case VKI_VT_SETMODE:
   5205       PRE_MEM_READ( "ioctl(VT_SETMODE)", ARG3, sizeof(struct vki_vt_mode) );
   5206       break;
   5207    case VKI_VT_GETSTATE:
   5208       PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_active",
   5209                      (Addr) &(((struct vki_vt_stat*) ARG3)->v_active),
   5210                      sizeof(((struct vki_vt_stat*) ARG3)->v_active));
   5211       PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_state",
   5212                      (Addr) &(((struct vki_vt_stat*) ARG3)->v_state),
   5213                      sizeof(((struct vki_vt_stat*) ARG3)->v_state));
   5214       break;
   5215    case VKI_VT_RELDISP:
   5216    case VKI_VT_ACTIVATE:
   5217    case VKI_VT_WAITACTIVE:
   5218    case VKI_VT_DISALLOCATE:
   5219       break;
   5220    case VKI_VT_RESIZE:
   5221       PRE_MEM_READ( "ioctl(VT_RESIZE)", ARG3, sizeof(struct vki_vt_sizes) );
   5222       break;
   5223    case VKI_VT_RESIZEX:
   5224       PRE_MEM_READ( "ioctl(VT_RESIZEX)", ARG3, sizeof(struct vki_vt_consize) );
   5225       break;
   5226    case VKI_VT_LOCKSWITCH:
   5227    case VKI_VT_UNLOCKSWITCH:
   5228       break;
   5229 
   5230    case VKI_USBDEVFS_CONTROL:
   5231       if ( ARG3 ) {
   5232          struct vki_usbdevfs_ctrltransfer *vkuc = (struct vki_usbdevfs_ctrltransfer *)ARG3;
   5233          PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).bRequestType", (Addr)&vkuc->bRequestType, sizeof(vkuc->bRequestType));
   5234          PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).bRequest", (Addr)&vkuc->bRequest, sizeof(vkuc->bRequest));
   5235          PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wValue", (Addr)&vkuc->wValue, sizeof(vkuc->wValue));
   5236          PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wIndex", (Addr)&vkuc->wIndex, sizeof(vkuc->wIndex));
   5237          PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wLength", (Addr)&vkuc->wLength, sizeof(vkuc->wLength));
   5238          PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).timeout", (Addr)&vkuc->timeout, sizeof(vkuc->timeout));
   5239          if (vkuc->bRequestType & 0x80)
   5240             PRE_MEM_WRITE( "ioctl(USBDEVFS_CONTROL).data", (Addr)vkuc->data, vkuc->wLength);
   5241          else
   5242             PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).data", (Addr)vkuc->data, vkuc->wLength);
   5243       }
   5244       break;
   5245    case VKI_USBDEVFS_BULK:
   5246       if ( ARG3 ) {
   5247          struct vki_usbdevfs_bulktransfer *vkub = (struct vki_usbdevfs_bulktransfer *)ARG3;
   5248          PRE_MEM_READ( "ioctl(USBDEVFS_BULK)", ARG3, sizeof(struct vki_usbdevfs_bulktransfer));
   5249          if (vkub->ep & 0x80)
   5250             PRE_MEM_WRITE( "ioctl(USBDEVFS_BULK).data", (Addr)vkub->data, vkub->len);
   5251          else
   5252             PRE_MEM_READ( "ioctl(USBDEVFS_BULK).data", (Addr)vkub->data, vkub->len);
   5253       }
   5254       break;
   5255    case VKI_USBDEVFS_GETDRIVER:
   5256       if ( ARG3 ) {
   5257          struct vki_usbdevfs_getdriver *vkugd = (struct vki_usbdevfs_getdriver *) ARG3;
   5258          PRE_MEM_WRITE( "ioctl(USBDEVFS_GETDRIVER)", (Addr)&vkugd->driver, sizeof(vkugd->driver));
   5259       }
   5260       break;
   5261    case VKI_USBDEVFS_SUBMITURB:
   5262       if ( ARG3 ) {
   5263          struct vki_usbdevfs_urb *vkuu = (struct vki_usbdevfs_urb *)ARG3;
   5264 
   5265          /* Not the whole struct needs to be initialized */
   5266          PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).endpoint", (Addr)&vkuu->endpoint, sizeof(vkuu->endpoint));
   5267          PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).type", (Addr)&vkuu->type, sizeof(vkuu->type));
   5268          PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).flags", (Addr)&vkuu->flags, sizeof(vkuu->flags));
   5269          PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)&vkuu->buffer, sizeof(vkuu->buffer));
   5270          PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).signr", (Addr)&vkuu->signr, sizeof(vkuu->signr));
   5271          PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).status", (Addr)&vkuu->status, sizeof(vkuu->status));
   5272          if (vkuu->type == VKI_USBDEVFS_URB_TYPE_CONTROL) {
   5273             struct vki_usbdevfs_setuppacket *vkusp = (struct vki_usbdevfs_setuppacket *)vkuu->buffer;
   5274             PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer_length", (Addr)&vkuu->buffer_length, sizeof(vkuu->buffer_length));
   5275             PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer.setup_packet", (Addr)vkusp, sizeof(*vkusp));
   5276             if (vkusp->bRequestType & 0x80)
   5277                PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer.data", (Addr)(vkusp+1), vkuu->buffer_length - sizeof(*vkusp));
   5278             else
   5279                PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer.data", (Addr)(vkusp+1), vkuu->buffer_length - sizeof(*vkusp));
   5280             PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).actual_length", (Addr)&vkuu->actual_length, sizeof(vkuu->actual_length));
   5281          } else if (vkuu->type == VKI_USBDEVFS_URB_TYPE_ISO) {
   5282             int total_length = 0;
   5283             int i;
   5284             PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).number_of_packets", (Addr)&vkuu->number_of_packets, sizeof(vkuu->number_of_packets));
   5285             for(i=0; i<vkuu->number_of_packets; i++) {
   5286                PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).iso_frame_desc[].length", (Addr)&vkuu->iso_frame_desc[i].length, sizeof(vkuu->iso_frame_desc[i].length));
   5287                PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).iso_frame_desc[].actual_length", (Addr)&vkuu->iso_frame_desc[i].actual_length, sizeof(vkuu->iso_frame_desc[i].actual_length));
   5288                PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).iso_frame_desc[].status", (Addr)&vkuu->iso_frame_desc[i].status, sizeof(vkuu->iso_frame_desc[i].status));
   5289                total_length += vkuu->iso_frame_desc[i].length;
   5290             }
   5291             if (vkuu->endpoint & 0x80)
   5292                PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, total_length);
   5293             else
   5294                PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, total_length);
   5295             PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).error_count", (Addr)&vkuu->error_count, sizeof(vkuu->error_count));
   5296          } else {
   5297             PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer_length", (Addr)&vkuu->buffer_length, sizeof(vkuu->buffer_length));
   5298             if (vkuu->endpoint & 0x80)
   5299                PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
   5300             else
   5301                PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
   5302             PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).actual_length", (Addr)&vkuu->actual_length, sizeof(vkuu->actual_length));
   5303          }
   5304       }
   5305       break;
   5306    case VKI_USBDEVFS_DISCARDURB:
   5307       break;
   5308    case VKI_USBDEVFS_REAPURB:
   5309       if ( ARG3 ) {
   5310          PRE_MEM_WRITE( "ioctl(USBDEVFS_REAPURB)", ARG3, sizeof(struct vki_usbdevfs_urb **));
   5311       }
   5312       break;
   5313    case VKI_USBDEVFS_REAPURBNDELAY:
   5314       if ( ARG3 ) {
   5315          PRE_MEM_WRITE( "ioctl(USBDEVFS_REAPURBNDELAY)", ARG3, sizeof(struct vki_usbdevfs_urb **));
   5316       }
   5317       break;
   5318    case VKI_USBDEVFS_CONNECTINFO:
   5319       PRE_MEM_WRITE( "ioctl(USBDEVFS_CONNECTINFO)", ARG3, sizeof(struct vki_usbdevfs_connectinfo));
   5320       break;
   5321    case VKI_USBDEVFS_IOCTL:
   5322       if ( ARG3 ) {
   5323          struct vki_usbdevfs_ioctl *vkui = (struct vki_usbdevfs_ioctl *)ARG3;
   5324          UInt dir2, size2;
   5325          PRE_MEM_READ("ioctl(USBDEVFS_IOCTL)", (Addr)vkui, sizeof(struct vki_usbdevfs_ioctl));
   5326          dir2  = _VKI_IOC_DIR(vkui->ioctl_code);
   5327          size2 = _VKI_IOC_SIZE(vkui->ioctl_code);
   5328          if (size2 > 0) {
   5329             if (dir2 & _VKI_IOC_WRITE)
   5330                PRE_MEM_READ("ioctl(USBDEVFS_IOCTL).dataWrite", (Addr)vkui->data, size2);
   5331             else if (dir2 & _VKI_IOC_READ)
   5332                PRE_MEM_WRITE("ioctl(USBDEVFS_IOCTL).dataRead", (Addr)vkui->data, size2);
   5333          }
   5334       }
   5335       break;
   5336    case VKI_USBDEVFS_RESET:
   5337       break;
   5338 
   5339       /* I2C (/dev/i2c-*) ioctls */
   5340    case VKI_I2C_SLAVE:
   5341    case VKI_I2C_SLAVE_FORCE:
   5342    case VKI_I2C_TENBIT:
   5343    case VKI_I2C_PEC:
   5344       break;
   5345    case VKI_I2C_FUNCS:
   5346       PRE_MEM_WRITE( "ioctl(I2C_FUNCS)", ARG3, sizeof(unsigned long) );
   5347       break;
   5348    case VKI_I2C_RDWR:
   5349       if ( ARG3 ) {
   5350           struct vki_i2c_rdwr_ioctl_data *vkui = (struct vki_i2c_rdwr_ioctl_data *)ARG3;
   5351           UInt i;
   5352           PRE_MEM_READ("ioctl(I2C_RDWR)", (Addr)vkui, sizeof(struct vki_i2c_rdwr_ioctl_data));
   5353           for (i=0; i < vkui->nmsgs; i++) {
   5354               struct vki_i2c_msg *msg = vkui->msgs + i;
   5355               PRE_MEM_READ("ioctl(I2C_RDWR).msgs", (Addr)msg, sizeof(struct vki_i2c_msg));
   5356               if (msg->flags & VKI_I2C_M_RD)
   5357                   PRE_MEM_WRITE("ioctl(I2C_RDWR).msgs.buf", (Addr)msg->buf, msg->len);
   5358               else
   5359                   PRE_MEM_READ("ioctl(I2C_RDWR).msgs.buf", (Addr)msg->buf, msg->len);
   5360           }
   5361       }
   5362       break;
   5363 
   5364       /* Wireless extensions ioctls */
   5365    case VKI_SIOCSIWCOMMIT:
   5366    case VKI_SIOCSIWNWID:
   5367    case VKI_SIOCSIWFREQ:
   5368    case VKI_SIOCSIWMODE:
   5369    case VKI_SIOCSIWSENS:
   5370    case VKI_SIOCSIWRANGE:
   5371    case VKI_SIOCSIWPRIV:
   5372    case VKI_SIOCSIWSTATS:
   5373    case VKI_SIOCSIWSPY:
   5374    case VKI_SIOCSIWTHRSPY:
   5375    case VKI_SIOCSIWAP:
   5376    case VKI_SIOCSIWSCAN:
   5377    case VKI_SIOCSIWESSID:
   5378    case VKI_SIOCSIWRATE:
   5379    case VKI_SIOCSIWNICKN:
   5380    case VKI_SIOCSIWRTS:
   5381    case VKI_SIOCSIWFRAG:
   5382    case VKI_SIOCSIWTXPOW:
   5383    case VKI_SIOCSIWRETRY:
   5384    case VKI_SIOCSIWENCODE:
   5385    case VKI_SIOCSIWPOWER:
   5386    case VKI_SIOCSIWGENIE:
   5387    case VKI_SIOCSIWMLME:
   5388    case VKI_SIOCSIWAUTH:
   5389    case VKI_SIOCSIWENCODEEXT:
   5390    case VKI_SIOCSIWPMKSA:
   5391       break;
   5392    case VKI_SIOCGIWNAME:
   5393       if (ARG3) {
   5394          PRE_MEM_WRITE("ioctl(SIOCGIWNAME)",
   5395                        (Addr)((struct vki_iwreq *)ARG3)->u.name,
   5396                        sizeof(((struct vki_iwreq *)ARG3)->u.name));
   5397       }
   5398       break;
   5399    case VKI_SIOCGIWNWID:
   5400    case VKI_SIOCGIWSENS:
   5401    case VKI_SIOCGIWRATE:
   5402    case VKI_SIOCGIWRTS:
   5403    case VKI_SIOCGIWFRAG:
   5404    case VKI_SIOCGIWTXPOW:
   5405    case VKI_SIOCGIWRETRY:
   5406    case VKI_SIOCGIWPOWER:
   5407    case VKI_SIOCGIWAUTH:
   5408       if (ARG3) {
   5409          PRE_MEM_WRITE("ioctl(SIOCGIW[NWID|SENS|RATE|RTS|FRAG|TXPOW|"
   5410                        "RETRY|PARAM|AUTH])",
   5411                        (Addr)&((struct vki_iwreq *)ARG3)->u.nwid,
   5412                        sizeof(struct vki_iw_param));
   5413       }
   5414       break;
   5415    case VKI_SIOCGIWFREQ:
   5416       if (ARG3) {
   5417          PRE_MEM_WRITE("ioctl(SIOCGIWFREQ",
   5418                        (Addr)&((struct vki_iwreq *)ARG3)->u.freq,
   5419                        sizeof(struct vki_iw_freq));
   5420       }
   5421       break;
   5422    case VKI_SIOCGIWMODE:
   5423       if (ARG3) {
   5424          PRE_MEM_WRITE("ioctl(SIOCGIWMODE",
   5425                        (Addr)&((struct vki_iwreq *)ARG3)->u.mode,
   5426                        sizeof(__vki_u32));
   5427       }
   5428       break;
   5429    case VKI_SIOCGIWRANGE:
   5430    case VKI_SIOCGIWPRIV:
   5431    case VKI_SIOCGIWSTATS:
   5432    case VKI_SIOCGIWSPY:
   5433    case VKI_SIOCGIWTHRSPY:
   5434    case VKI_SIOCGIWAPLIST:
   5435    case VKI_SIOCGIWSCAN:
   5436    case VKI_SIOCGIWESSID:
   5437    case VKI_SIOCGIWNICKN:
   5438    case VKI_SIOCGIWENCODE:
   5439    case VKI_SIOCGIWGENIE:
   5440    case VKI_SIOCGIWENCODEEXT:
   5441       if (ARG3) {
   5442          struct vki_iw_point* point;
   5443          point = &((struct vki_iwreq *)ARG3)->u.data;
   5444          PRE_MEM_WRITE("ioctl(SIOCGIW[RANGE|PRIV|STATS|SPY|THRSPY|"
   5445                        "APLIST|SCAN|ESSID|NICKN|ENCODE|GENIE|ENCODEEXT])",
   5446                        (Addr)point->pointer, point->length);
   5447       }
   5448       break;
   5449    case VKI_SIOCGIWAP:
   5450       if (ARG3) {
   5451          PRE_MEM_WRITE("ioctl(SIOCGIWAP)",
   5452                        (Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
   5453                        sizeof(struct vki_sockaddr));
   5454       }
   5455       break;
   5456 
   5457   /* User input device creation */
   5458   case VKI_UI_SET_EVBIT:
   5459   case VKI_UI_SET_KEYBIT:
   5460   case VKI_UI_SET_RELBIT:
   5461   case VKI_UI_SET_ABSBIT:
   5462   case VKI_UI_SET_MSCBIT:
   5463   case VKI_UI_SET_LEDBIT:
   5464   case VKI_UI_SET_SNDBIT:
   5465   case VKI_UI_SET_FFBIT:
   5466   case VKI_UI_SET_SWBIT:
   5467   case VKI_UI_SET_PROPBIT:
   5468       /* These just take an int by value */
   5469       break;
   5470 
   5471 #  if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android)
   5472    /* ashmem */
   5473    case VKI_ASHMEM_GET_SIZE:
   5474    case VKI_ASHMEM_SET_SIZE:
   5475    case VKI_ASHMEM_GET_PROT_MASK:
   5476    case VKI_ASHMEM_SET_PROT_MASK:
   5477    case VKI_ASHMEM_GET_PIN_STATUS:
   5478    case VKI_ASHMEM_PURGE_ALL_CACHES:
   5479        break;
   5480    case VKI_ASHMEM_GET_NAME:
   5481        PRE_MEM_WRITE( "ioctl(ASHMEM_SET_NAME)", ARG3, VKI_ASHMEM_NAME_LEN );
   5482        break;
   5483    case VKI_ASHMEM_SET_NAME:
   5484        PRE_MEM_RASCIIZ( "ioctl(ASHMEM_SET_NAME)", ARG3);
   5485        break;
   5486    case VKI_ASHMEM_PIN:
   5487    case VKI_ASHMEM_UNPIN:
   5488        PRE_MEM_READ( "ioctl(ASHMEM_PIN|ASHMEM_UNPIN)",
   5489                      ARG3, sizeof(struct vki_ashmem_pin) );
   5490        break;
   5491 
   5492    /* binder */
   5493    case VKI_BINDER_WRITE_READ:
   5494        if (ARG3) {
   5495            struct vki_binder_write_read* bwr
   5496               = (struct vki_binder_write_read*)ARG3;
   5497 
   5498            PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_buffer",
   5499                           bwr->write_buffer);
   5500            PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_size",
   5501                           bwr->write_size);
   5502            PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_consumed",
   5503                           bwr->write_consumed);
   5504            PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_buffer",
   5505                           bwr->read_buffer);
   5506            PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_size",
   5507                           bwr->read_size);
   5508            PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_consumed",
   5509                           bwr->read_consumed);
   5510 
   5511            PRE_FIELD_WRITE("ioctl(BINDER_WRITE_READ).write_consumed",
   5512                            bwr->write_consumed);
   5513            PRE_FIELD_WRITE("ioctl(BINDER_WRITE_READ).read_consumed",
   5514                            bwr->read_consumed);
   5515 
   5516            if (bwr->read_size)
   5517                PRE_MEM_WRITE("ioctl(BINDER_WRITE_READ).read_buffer[]",
   5518                              (Addr)bwr->read_buffer, bwr->read_size);
   5519            if (bwr->write_size)
   5520                PRE_MEM_READ("ioctl(BINDER_WRITE_READ).write_buffer[]",
   5521                             (Addr)bwr->write_buffer, bwr->write_size);
   5522        }
   5523        break;
   5524 
   5525    case VKI_BINDER_SET_IDLE_TIMEOUT:
   5526    case VKI_BINDER_SET_MAX_THREADS:
   5527    case VKI_BINDER_SET_IDLE_PRIORITY:
   5528    case VKI_BINDER_SET_CONTEXT_MGR:
   5529    case VKI_BINDER_THREAD_EXIT:
   5530        break;
   5531    case VKI_BINDER_VERSION:
   5532        if (ARG3) {
   5533            struct vki_binder_version* bv = (struct vki_binder_version*)ARG3;
   5534            PRE_FIELD_WRITE("ioctl(BINDER_VERSION)", bv->protocol_version);
   5535        }
   5536        break;
   5537 
   5538 #  endif /* defined(VGPV_*_linux_android) */
   5539 
   5540    case VKI_HCIINQUIRY:
   5541       if (ARG3) {
   5542          struct vki_hci_inquiry_req* ir = (struct vki_hci_inquiry_req*)ARG3;
   5543          PRE_MEM_READ("ioctl(HCIINQUIRY)",
   5544                       (Addr)ARG3, sizeof(struct vki_hci_inquiry_req));
   5545          PRE_MEM_WRITE("ioctl(HCIINQUIRY)",
   5546                        (Addr)ARG3 + sizeof(struct vki_hci_inquiry_req),
   5547                        ir->num_rsp * sizeof(struct vki_inquiry_info));
   5548       }
   5549       break;
   5550 
   5551    /* KVM ioctls that check for a numeric value as parameter */
   5552    case VKI_KVM_GET_API_VERSION:
   5553    case VKI_KVM_CREATE_VM:
   5554    case VKI_KVM_GET_VCPU_MMAP_SIZE:
   5555    case VKI_KVM_CHECK_EXTENSION:
   5556    case VKI_KVM_CREATE_VCPU:
   5557    case VKI_KVM_RUN:
   5558       break;
   5559 
   5560    case VKI_EVIOCSSUSPENDBLOCK:
   5561       break;
   5562 
   5563    case VKI_MEDIA_IOC_DEVICE_INFO:
   5564       if (ARG3) {
   5565          PRE_MEM_WRITE("ioctl(MEDIA_IOC_DEVICE_INFO)", ARG3,
   5566                        sizeof(struct vki_media_device_info));
   5567       }
   5568       break;
   5569 
   5570    default:
   5571       /* EVIOC* are variable length and return size written on success */
   5572       switch (ARG2 & ~(_VKI_IOC_SIZEMASK << _VKI_IOC_SIZESHIFT)) {
   5573       case VKI_EVIOCGNAME(0):
   5574       case VKI_EVIOCGPHYS(0):
   5575       case VKI_EVIOCGUNIQ(0):
   5576       case VKI_EVIOCGKEY(0):
   5577       case VKI_EVIOCGLED(0):
   5578       case VKI_EVIOCGSND(0):
   5579       case VKI_EVIOCGSW(0):
   5580       case VKI_EVIOCGBIT(VKI_EV_SYN,0):
   5581       case VKI_EVIOCGBIT(VKI_EV_KEY,0):
   5582       case VKI_EVIOCGBIT(VKI_EV_REL,0):
   5583       case VKI_EVIOCGBIT(VKI_EV_ABS,0):
   5584       case VKI_EVIOCGBIT(VKI_EV_MSC,0):
   5585       case VKI_EVIOCGBIT(VKI_EV_SW,0):
   5586       case VKI_EVIOCGBIT(VKI_EV_LED,0):
   5587       case VKI_EVIOCGBIT(VKI_EV_SND,0):
   5588       case VKI_EVIOCGBIT(VKI_EV_REP,0):
   5589       case VKI_EVIOCGBIT(VKI_EV_FF,0):
   5590       case VKI_EVIOCGBIT(VKI_EV_PWR,0):
   5591       case VKI_EVIOCGBIT(VKI_EV_FF_STATUS,0):
   5592          PRE_MEM_WRITE("ioctl(EVIO*)", ARG3, _VKI_IOC_SIZE(ARG2));
   5593          break;
   5594       default:
   5595          ML_(PRE_unknown_ioctl)(tid, ARG2, ARG3);
   5596          break;
   5597       }
   5598       break;
   5599    }
   5600 }
   5601 
   5602 POST(sys_ioctl)
   5603 {
   5604    vg_assert(SUCCESS);
   5605 
   5606    /* --- BEGIN special IOCTL handlers for specific Android hardware --- */
   5607 
   5608 #  if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android)
   5609 
   5610 #  if defined(ANDROID_HARDWARE_nexus_s)
   5611 
   5612    /* BEGIN undocumented ioctls for the graphics hardware (??)
   5613       (libpvr) on Nexus S */
   5614    if (ARG2 >= 0xC01C6700 && ARG2 <= 0xC01C67FF && ARG3 >= 0x1000) {
   5615       /* What's going on here: there appear to be a bunch of ioctls of
   5616          the form 0xC01C67xx which are undocumented, and if unhandled
   5617          give rise to a vast number of false positives in Memcheck.
   5618 
   5619          The "normal" intrepretation of an ioctl of this form would be
   5620          that the 3rd arg is a pointer to an area of size 0x1C (28
   5621          bytes) which is filled in by the kernel.  Hence you might
   5622          think that "POST_MEM_WRITE(ARG3, 28)" would fix it.  But it
   5623          doesn't.
   5624 
   5625          It requires POST_MEM_WRITE(ARG3, 256) to silence them.  One
   5626          interpretation of this is that ARG3 really does point to a 28
   5627          byte struct, but inside that are pointers to other areas also
   5628          filled in by the kernel.  If these happen to be allocated
   5629          just back up the stack then the 256 byte paint might cover
   5630          them too, somewhat indiscriminately.
   5631 
   5632          By printing out ARG3 and also the 28 bytes that it points at,
   5633          it's possible to guess that the 7 word structure has this form
   5634 
   5635            0            1    2    3        4    5        6
   5636            ioctl-number 0x1C ptr1 ptr1size ptr2 ptr2size aBitMask
   5637 
   5638          Unfortunately that doesn't seem to work for some reason, so
   5639          stay with the blunt-instrument approach for the time being.
   5640       */
   5641       if (1) {
   5642          /* blunt-instrument approach */
   5643          if (0) VG_(printf)("QQQQQQQQQQ c01c quick hack actioned"
   5644                             " (%08lx, %08lx)\n", ARG2, ARG3);
   5645          POST_MEM_WRITE(ARG3, 256);
   5646       } else {
   5647          /* be a bit more sophisticated */
   5648          if (0) VG_(printf)("QQQQQQQQQQ c01c quick hack actioned"
   5649                             " (%08lx, %08lx) (fancy)\n", ARG2, ARG3);
   5650          POST_MEM_WRITE(ARG3, 28);
   5651          UInt* word = (UInt*)ARG3;
   5652          if (word && word[2] && word[3] < 0x200/*stay sane*/)
   5653             POST_MEM_WRITE(word[2], word[3]); // "ptr1"
   5654          if (word && word[4] && word[5] < 0x200/*stay sane*/)
   5655             POST_MEM_WRITE(word[4], word[5]); // "ptr2"
   5656       }
   5657       if (0) {
   5658          Int i;
   5659          VG_(printf)("QQQQQQQQQQ ");
   5660          for (i = 0; i < (0x1C/4); i++) {
   5661             VG_(printf)("%08x ", ((UInt*)(ARG3))[i]);
   5662          }
   5663          VG_(printf)("\n");
   5664       }
   5665       return;
   5666    }
   5667    /* END Nexus S specific ioctls */
   5668 
   5669 
   5670 #  elif defined(ANDROID_HARDWARE_generic) || defined(ANDROID_HARDWARE_emulator)
   5671 
   5672    /* BEGIN generic/emulator specific ioctls */
   5673    /* currently none are known */
   5674    /* END generic/emulator specific ioctls */
   5675 
   5676 
   5677 #  elif defined(ANDROID_HARDWARE_nexus_10)
   5678 
   5679    /* undocumented ioctl ids noted on the device */
   5680    if (ARG2 >= 0xc0108000 && ARG2 <= 0xc1e8820b && ARG3 != 0) {
   5681       int size = (ARG2 >> 16) & 0x3fff;
   5682       POST_MEM_WRITE(ARG3, size);
   5683    }
   5684 
   5685 #  elif defined(ANDROID_HARDWARE_nexus_7)
   5686 
   5687 #  elif defined(ANDROID_HARDWARE_nexus_4)
   5688 
   5689 #  else /* no ANDROID_HARDWARE_anything defined */
   5690 
   5691 #   warning ""
   5692 #   warning "You need to define one the CPP symbols ANDROID_HARDWARE_blah"
   5693 #   warning "at configure time, to tell Valgrind what hardware you are"
   5694 #   warning "building for.  Currently known values are"
   5695 #   warning ""
   5696 #   warning "   ANDROID_HARDWARE_nexus_s       Samsung Nexus S"
   5697 #   warning "   ANDROID_HARDWARE_nexus_10      Samsung Nexus 10"
   5698 #   warning "   ANDROID_HARDWARE_nexus_7       ASUS Nexus 7"
   5699 #   warning "   ANDROID_HARDWARE_nexus_4       LG Nexus 4"
   5700 #   warning "   ANDROID_HARDWARE_generic       Generic device (eg, Pandaboard)"
   5701 #   warning "   ANDROID_HARDWARE_emulator      x86 or arm emulator"
   5702 #   warning ""
   5703 #   warning "Make sure you exactly follow the steps in README.android."
   5704 #   warning ""
   5705 #   error "No CPP symbol ANDROID_HARDWARE_blah defined.  Giving up."
   5706 
   5707 #  endif /* cases for ANDROID_HARDWARE_blah */
   5708 
   5709 #  endif /* defined(VGPV_*_linux_android) */
   5710 
   5711    /* --- END special IOCTL handlers for specific Android hardware --- */
   5712 
   5713    /* --- normal handling --- */
   5714    switch (ARG2 /* request */) {
   5715    case VKI_TCSETS:
   5716    case VKI_TCSETSW:
   5717    case VKI_TCSETSF:
   5718       break;
   5719    case VKI_TCGETS:
   5720       POST_MEM_WRITE( ARG3, sizeof(struct vki_termios) );
   5721       break;
   5722    case VKI_TCSETA:
   5723    case VKI_TCSETAW:
   5724    case VKI_TCSETAF:
   5725       break;
   5726    case VKI_TCGETA:
   5727       POST_MEM_WRITE( ARG3, sizeof(struct vki_termio) );
   5728       break;
   5729    case VKI_TCSBRK:
   5730    case VKI_TCXONC:
   5731    case VKI_TCSBRKP:
   5732    case VKI_TCFLSH:
   5733       break;
   5734    case VKI_TIOCGWINSZ:
   5735       POST_MEM_WRITE( ARG3, sizeof(struct vki_winsize) );
   5736       break;
   5737    case VKI_TIOCSWINSZ:
   5738    case VKI_TIOCMBIS:
   5739    case VKI_TIOCMBIC:
   5740    case VKI_TIOCMSET:
   5741       break;
   5742    case VKI_TIOCMGET:
   5743       POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
   5744       break;
   5745    case VKI_TIOCLINUX:
   5746       POST_MEM_WRITE( ARG3, sizeof(char *) );
   5747       break;
   5748    case VKI_TIOCGPGRP:
   5749       /* Get process group ID for foreground processing group. */
   5750       POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
   5751       break;
   5752    case VKI_TIOCSPGRP:
   5753       /* Set a process group ID? */
   5754       POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
   5755       break;
   5756    case VKI_TIOCGPTN: /* Get Pty Number (of pty-mux device) */
   5757       POST_MEM_WRITE( ARG3, sizeof(int));
   5758       break;
   5759    case VKI_TIOCSCTTY:
   5760       break;
   5761    case VKI_TIOCSPTLCK: /* Lock/unlock Pty */
   5762       break;
   5763    case VKI_FIONBIO:
   5764       break;
   5765    case VKI_FIOASYNC:
   5766       break;
   5767    case VKI_FIONREAD:                /* identical to SIOCINQ */
   5768       POST_MEM_WRITE( ARG3, sizeof(int) );
   5769       break;
   5770    case VKI_FIOQSIZE:
   5771       POST_MEM_WRITE( ARG3, sizeof(vki_loff_t) );
   5772       break;
   5773 
   5774    case VKI_TIOCSERGETLSR:
   5775       POST_MEM_WRITE( ARG3, sizeof(int) );
   5776       break;
   5777    case VKI_TIOCGICOUNT:
   5778       POST_MEM_WRITE( ARG3, sizeof(struct vki_serial_icounter_struct) );
   5779       break;
   5780 
   5781    case VKI_SG_SET_COMMAND_Q:
   5782       break;
   5783    case VKI_SG_IO:
   5784       POST_MEM_WRITE(ARG3, sizeof(vki_sg_io_hdr_t));
   5785       break;
   5786    case VKI_SG_GET_SCSI_ID:
   5787       POST_MEM_WRITE(ARG3, sizeof(vki_sg_scsi_id_t));
   5788       break;
   5789    case VKI_SG_SET_RESERVED_SIZE:
   5790       break;
   5791    case VKI_SG_SET_TIMEOUT:
   5792       break;
   5793    case VKI_SG_GET_RESERVED_SIZE:
   5794       POST_MEM_WRITE(ARG3, sizeof(int));
   5795       break;
   5796    case VKI_SG_GET_TIMEOUT:
   5797       break;
   5798    case VKI_SG_GET_VERSION_NUM:
   5799       POST_MEM_WRITE(ARG3, sizeof(int));
   5800       break;
   5801    case VKI_SG_EMULATED_HOST:
   5802       POST_MEM_WRITE(ARG3, sizeof(int));
   5803       break;
   5804    case VKI_SG_GET_SG_TABLESIZE:
   5805       POST_MEM_WRITE(ARG3, sizeof(int));
   5806       break;
   5807 
   5808    case VKI_IIOCGETCPS:
   5809       POST_MEM_WRITE( ARG3, VKI_ISDN_MAX_CHANNELS * 2 * sizeof(unsigned long) );
   5810       break;
   5811    case VKI_IIOCNETGPN:
   5812       POST_MEM_WRITE( ARG3, sizeof(vki_isdn_net_ioctl_phone) );
   5813       break;
   5814 
   5815       /* These all use struct ifreq AFAIK */
   5816    case VKI_SIOCGIFINDEX:        /* get iface index              */
   5817       POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_ifindex,
   5818                       sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_ifindex) );
   5819       break;
   5820    case VKI_SIOCGIFFLAGS:        /* get flags                    */
   5821       POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
   5822                       sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
   5823       break;
   5824    case VKI_SIOCGIFHWADDR:       /* Get hardware address         */
   5825       POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->ifr_hwaddr,
   5826                       sizeof(((struct vki_ifreq *)ARG3)->ifr_hwaddr) );
   5827       break;
   5828    case VKI_SIOCGIFMTU:          /* get MTU size                 */
   5829       POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
   5830                       sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
   5831       break;
   5832    case VKI_SIOCGIFADDR:         /* get PA address               */
   5833    case VKI_SIOCGIFDSTADDR:      /* get remote PA address        */
   5834    case VKI_SIOCGIFBRDADDR:      /* get broadcast PA address     */
   5835    case VKI_SIOCGIFNETMASK:      /* get network PA mask          */
   5836       POST_MEM_WRITE(
   5837                 (Addr)&((struct vki_ifreq *)ARG3)->ifr_addr,
   5838                 sizeof(((struct vki_ifreq *)ARG3)->ifr_addr) );
   5839       break;
   5840    case VKI_SIOCGIFMETRIC:       /* get metric                   */
   5841       POST_MEM_WRITE(
   5842                 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
   5843                 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
   5844       break;
   5845    case VKI_SIOCGIFMAP:          /* Get device parameters        */
   5846       POST_MEM_WRITE(
   5847                 (Addr)&((struct vki_ifreq *)ARG3)->ifr_map,
   5848                 sizeof(((struct vki_ifreq *)ARG3)->ifr_map) );
   5849       break;
   5850      break;
   5851    case VKI_SIOCGIFTXQLEN:       /* Get the tx queue length      */
   5852       POST_MEM_WRITE(
   5853                 (Addr)&((struct vki_ifreq *)ARG3)->ifr_qlen,
   5854                 sizeof(((struct vki_ifreq *)ARG3)->ifr_qlen) );
   5855       break;
   5856    case VKI_SIOCGIFNAME:         /* get iface name               */
   5857       POST_MEM_WRITE(
   5858                 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_name,
   5859                 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_name) );
   5860       break;
   5861    case VKI_SIOCGMIIPHY:         /* get hardware entry           */
   5862       POST_MEM_WRITE(
   5863                 (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
   5864                 sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
   5865       break;
   5866    case VKI_SIOCGMIIREG:         /* get hardware entry registers */
   5867       POST_MEM_WRITE(
   5868                 (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_out,
   5869                 sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_out) );
   5870       break;
   5871    case VKI_SIOCGIFCONF:         /* get iface list               */
   5872       /* WAS:
   5873 	 PRE_MEM_WRITE("ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
   5874 	 KERNEL_DO_SYSCALL(tid,RES);
   5875 	 if (!VG_(is_kerror)(RES) && RES == 0)
   5876 	 POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
   5877       */
   5878       if (RES == 0 && ARG3 ) {
   5879 	 struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
   5880 	 if (ifc->vki_ifc_buf != NULL)
   5881 	    POST_MEM_WRITE( (Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
   5882       }
   5883       break;
   5884    case VKI_SIOCGSTAMP:
   5885       POST_MEM_WRITE( ARG3, sizeof(struct vki_timeval) );
   5886       break;
   5887    case VKI_SIOCGSTAMPNS:
   5888       POST_MEM_WRITE( ARG3, sizeof(struct vki_timespec) );
   5889       break;
   5890       /* SIOCOUTQ is an ioctl that, when called on a socket, returns
   5891 	 the number of bytes currently in that socket's send buffer.
   5892 	 It writes this value as an int to the memory location
   5893 	 indicated by the third argument of ioctl(2). */
   5894    case VKI_SIOCOUTQ:
   5895       POST_MEM_WRITE(ARG3, sizeof(int));
   5896       break;
   5897    case VKI_SIOCGRARP:           /* get RARP table entry         */
   5898    case VKI_SIOCGARP:            /* get ARP table entry          */
   5899       POST_MEM_WRITE(ARG3, sizeof(struct vki_arpreq));
   5900       break;
   5901 
   5902    case VKI_SIOCSIFFLAGS:        /* set flags                    */
   5903    case VKI_SIOCSIFMAP:          /* Set device parameters        */
   5904    case VKI_SIOCSHWTSTAMP:       /* Set hardware time stamping   */
   5905    case VKI_SIOCSIFTXQLEN:       /* Set the tx queue length      */
   5906    case VKI_SIOCSIFDSTADDR:      /* set remote PA address        */
   5907    case VKI_SIOCSIFBRDADDR:      /* set broadcast PA address     */
   5908    case VKI_SIOCSIFNETMASK:      /* set network PA mask          */
   5909    case VKI_SIOCSIFMETRIC:       /* set metric                   */
   5910    case VKI_SIOCSIFADDR:         /* set PA address               */
   5911    case VKI_SIOCSIFMTU:          /* set MTU size                 */
   5912    case VKI_SIOCSIFHWADDR:       /* set hardware address         */
   5913    case VKI_SIOCSMIIREG:         /* set hardware entry registers */
   5914       break;
   5915       /* Routing table calls.  */
   5916    case VKI_SIOCADDRT:           /* add routing table entry      */
   5917    case VKI_SIOCDELRT:           /* delete routing table entry   */
   5918       break;
   5919 
   5920       /* RARP cache control calls. */
   5921    case VKI_SIOCDRARP:           /* delete RARP table entry      */
   5922    case VKI_SIOCSRARP:           /* set RARP table entry         */
   5923       /* ARP cache control calls. */
   5924    case VKI_SIOCSARP:            /* set ARP table entry          */
   5925    case VKI_SIOCDARP:            /* delete ARP table entry       */
   5926       break;
   5927 
   5928    case VKI_SIOCGPGRP:
   5929       POST_MEM_WRITE(ARG3, sizeof(int));
   5930       break;
   5931    case VKI_SIOCSPGRP:
   5932       break;
   5933 
   5934       /* linux/soundcard interface (OSS) */
   5935    case VKI_SNDCTL_SEQ_GETOUTCOUNT:
   5936    case VKI_SNDCTL_SEQ_GETINCOUNT:
   5937    case VKI_SNDCTL_SEQ_PERCMODE:
   5938    case VKI_SNDCTL_SEQ_TESTMIDI:
   5939    case VKI_SNDCTL_SEQ_RESETSAMPLES:
   5940    case VKI_SNDCTL_SEQ_NRSYNTHS:
   5941    case VKI_SNDCTL_SEQ_NRMIDIS:
   5942    case VKI_SNDCTL_SEQ_GETTIME:
   5943    case VKI_SNDCTL_DSP_GETBLKSIZE:
   5944    case VKI_SNDCTL_DSP_GETFMTS:
   5945    case VKI_SNDCTL_DSP_SETFMT:
   5946    case VKI_SNDCTL_DSP_GETTRIGGER:
   5947    case VKI_SNDCTL_DSP_GETODELAY:
   5948    case VKI_SNDCTL_DSP_GETSPDIF:
   5949    case VKI_SNDCTL_DSP_GETCAPS:
   5950    case VKI_SOUND_PCM_READ_RATE:
   5951    case VKI_SOUND_PCM_READ_CHANNELS:
   5952    case VKI_SOUND_PCM_READ_BITS:
   5953    case VKI_SOUND_PCM_READ_FILTER:
   5954       POST_MEM_WRITE(ARG3, sizeof(int));
   5955       break;
   5956    case VKI_SNDCTL_SEQ_CTRLRATE:
   5957    case VKI_SNDCTL_DSP_SPEED:
   5958    case VKI_SNDCTL_DSP_STEREO:
   5959    case VKI_SNDCTL_DSP_CHANNELS:
   5960    case VKI_SOUND_PCM_WRITE_FILTER:
   5961    case VKI_SNDCTL_DSP_SUBDIVIDE:
   5962    case VKI_SNDCTL_DSP_SETFRAGMENT:
   5963    case VKI_SNDCTL_DSP_GETCHANNELMASK:
   5964    case VKI_SNDCTL_DSP_BIND_CHANNEL:
   5965    case VKI_SNDCTL_TMR_TIMEBASE:
   5966    case VKI_SNDCTL_TMR_TEMPO:
   5967    case VKI_SNDCTL_TMR_SOURCE:
   5968    case VKI_SNDCTL_MIDI_PRETIME:
   5969    case VKI_SNDCTL_MIDI_MPUMODE:
   5970       break;
   5971    case VKI_SNDCTL_DSP_GETOSPACE:
   5972    case VKI_SNDCTL_DSP_GETISPACE:
   5973       POST_MEM_WRITE(ARG3, sizeof(vki_audio_buf_info));
   5974       break;
   5975    case VKI_SNDCTL_DSP_NONBLOCK:
   5976       break;
   5977    case VKI_SNDCTL_DSP_SETTRIGGER:
   5978       break;
   5979 
   5980    case VKI_SNDCTL_DSP_POST:
   5981    case VKI_SNDCTL_DSP_RESET:
   5982    case VKI_SNDCTL_DSP_SYNC:
   5983    case VKI_SNDCTL_DSP_SETSYNCRO:
   5984    case VKI_SNDCTL_DSP_SETDUPLEX:
   5985       break;
   5986 
   5987       /* linux/soundcard interface (ALSA) */
   5988    case VKI_SNDRV_PCM_IOCTL_HW_FREE:
   5989    case VKI_SNDRV_PCM_IOCTL_HWSYNC:
   5990    case VKI_SNDRV_PCM_IOCTL_PREPARE:
   5991    case VKI_SNDRV_PCM_IOCTL_RESET:
   5992    case VKI_SNDRV_PCM_IOCTL_START:
   5993    case VKI_SNDRV_PCM_IOCTL_DROP:
   5994    case VKI_SNDRV_PCM_IOCTL_DRAIN:
   5995    case VKI_SNDRV_PCM_IOCTL_RESUME:
   5996    case VKI_SNDRV_PCM_IOCTL_XRUN:
   5997    case VKI_SNDRV_PCM_IOCTL_UNLINK:
   5998    case VKI_SNDRV_TIMER_IOCTL_START:
   5999    case VKI_SNDRV_TIMER_IOCTL_STOP:
   6000    case VKI_SNDRV_TIMER_IOCTL_CONTINUE:
   6001    case VKI_SNDRV_TIMER_IOCTL_PAUSE:
   6002 
   6003       /* SCSI no operand */
   6004    case VKI_SCSI_IOCTL_DOORLOCK:
   6005    case VKI_SCSI_IOCTL_DOORUNLOCK:
   6006       break;
   6007 
   6008       /* Real Time Clock (/dev/rtc) ioctls */
   6009    case VKI_RTC_UIE_ON:
   6010    case VKI_RTC_UIE_OFF:
   6011    case VKI_RTC_AIE_ON:
   6012    case VKI_RTC_AIE_OFF:
   6013    case VKI_RTC_PIE_ON:
   6014    case VKI_RTC_PIE_OFF:
   6015    case VKI_RTC_IRQP_SET:
   6016       break;
   6017    case VKI_RTC_RD_TIME:
   6018    case VKI_RTC_ALM_READ:
   6019       POST_MEM_WRITE(ARG3, sizeof(struct vki_rtc_time));
   6020       break;
   6021    case VKI_RTC_ALM_SET:
   6022       break;
   6023    case VKI_RTC_IRQP_READ:
   6024       POST_MEM_WRITE(ARG3, sizeof(unsigned long));
   6025       break;
   6026 
   6027       /* Block devices */
   6028    case VKI_BLKROSET:
   6029       break;
   6030    case VKI_BLKROGET:
   6031       POST_MEM_WRITE(ARG3, sizeof(int));
   6032       break;
   6033    case VKI_BLKGETSIZE:
   6034       POST_MEM_WRITE(ARG3, sizeof(unsigned long));
   6035       break;
   6036    case VKI_BLKRASET:
   6037       break;
   6038    case VKI_BLKRAGET:
   6039       POST_MEM_WRITE(ARG3, sizeof(long));
   6040       break;
   6041    case VKI_BLKFRASET:
   6042       break;
   6043    case VKI_BLKFRAGET:
   6044       POST_MEM_WRITE(ARG3, sizeof(long));
   6045       break;
   6046    case VKI_BLKSECTGET:
   6047       POST_MEM_WRITE(ARG3, sizeof(unsigned short));
   6048       break;
   6049    case VKI_BLKSSZGET:
   6050       POST_MEM_WRITE(ARG3, sizeof(int));
   6051       break;
   6052    case VKI_BLKBSZGET:
   6053       POST_MEM_WRITE(ARG3, sizeof(int));
   6054       break;
   6055    case VKI_BLKBSZSET:
   6056       break;
   6057    case VKI_BLKGETSIZE64:
   6058       POST_MEM_WRITE(ARG3, sizeof(unsigned long long));
   6059       break;
   6060 
   6061       /* Hard disks */
   6062    case VKI_HDIO_GETGEO: /* 0x0301 */
   6063       POST_MEM_WRITE(ARG3, sizeof(struct vki_hd_geometry));
   6064       break;
   6065    case VKI_HDIO_GET_DMA: /* 0x030b */
   6066       POST_MEM_WRITE(ARG3, sizeof(long));
   6067       break;
   6068    case VKI_HDIO_GET_IDENTITY: /* 0x030d */
   6069       POST_MEM_WRITE(ARG3, VKI_SIZEOF_STRUCT_HD_DRIVEID );
   6070       break;
   6071 
   6072       /* SCSI */
   6073    case VKI_SCSI_IOCTL_GET_IDLUN: /* 0x5382 */
   6074       POST_MEM_WRITE(ARG3, sizeof(struct vki_scsi_idlun));
   6075       break;
   6076    case VKI_SCSI_IOCTL_GET_BUS_NUMBER: /* 0x5386 */
   6077       POST_MEM_WRITE(ARG3, sizeof(int));
   6078       break;
   6079 
   6080       /* CD ROM stuff (??)  */
   6081    case VKI_CDROMSUBCHNL:
   6082       POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_subchnl));
   6083       break;
   6084    case VKI_CDROMREADTOCHDR:
   6085       POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_tochdr));
   6086       break;
   6087    case VKI_CDROMREADTOCENTRY:
   6088       POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_tocentry));
   6089       break;
   6090    case VKI_CDROMMULTISESSION:
   6091       POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_multisession));
   6092       break;
   6093    case VKI_CDROMVOLREAD:
   6094       POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_volctrl));
   6095       break;
   6096    case VKI_CDROMREADRAW:
   6097       POST_MEM_WRITE(ARG3, VKI_CD_FRAMESIZE_RAW);
   6098       break;
   6099    case VKI_CDROMREADAUDIO:
   6100    {
   6101       struct vki_cdrom_read_audio *cra = (struct vki_cdrom_read_audio *) ARG3;
   6102       POST_MEM_WRITE( (Addr)(cra->buf), cra->nframes * VKI_CD_FRAMESIZE_RAW);
   6103       break;
   6104    }
   6105 
   6106    case VKI_CDROMPLAYMSF:
   6107       break;
   6108       /* The following two are probably bogus (should check args
   6109 	 for readability).  JRS 20021117 */
   6110    case VKI_CDROM_DRIVE_STATUS: /* 0x5326 */
   6111    case VKI_CDROM_CLEAR_OPTIONS: /* 0x5321 */
   6112       break;
   6113    case VKI_CDROM_GET_CAPABILITY: /* 0x5331 */
   6114       break;
   6115 
   6116    case VKI_FIGETBSZ:
   6117       POST_MEM_WRITE(ARG3, sizeof(unsigned long));
   6118       break;
   6119    case VKI_FIBMAP:
   6120       POST_MEM_WRITE(ARG3, sizeof(int));
   6121       break;
   6122 
   6123    case VKI_FBIOGET_VSCREENINFO: //0x4600
   6124       POST_MEM_WRITE(ARG3, sizeof(struct vki_fb_var_screeninfo));
   6125       break;
   6126    case VKI_FBIOGET_FSCREENINFO: //0x4602
   6127       POST_MEM_WRITE(ARG3, sizeof(struct vki_fb_fix_screeninfo));
   6128       break;
   6129 
   6130    case VKI_PPCLAIM:
   6131    case VKI_PPEXCL:
   6132    case VKI_PPYIELD:
   6133    case VKI_PPRELEASE:
   6134    case VKI_PPSETMODE:
   6135    case VKI_PPSETPHASE:
   6136    case VKI_PPSETFLAGS:
   6137    case VKI_PPWDATA:
   6138    case VKI_PPWCONTROL:
   6139    case VKI_PPFCONTROL:
   6140    case VKI_PPDATADIR:
   6141    case VKI_PPNEGOT:
   6142    case VKI_PPWCTLONIRQ:
   6143    case VKI_PPSETTIME:
   6144       break;
   6145    case VKI_PPGETMODE:
   6146       POST_MEM_WRITE( ARG3, sizeof(int) );
   6147       break;
   6148    case VKI_PPGETPHASE:
   6149       POST_MEM_WRITE( ARG3, sizeof(int) );
   6150       break;
   6151    case VKI_PPGETMODES:
   6152       POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
   6153       break;
   6154    case VKI_PPGETFLAGS:
   6155       POST_MEM_WRITE( ARG3, sizeof(int) );
   6156       break;
   6157    case VKI_PPRSTATUS:
   6158       POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
   6159       break;
   6160    case VKI_PPRDATA:
   6161       POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
   6162       break;
   6163    case VKI_PPRCONTROL:
   6164       POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
   6165       break;
   6166    case VKI_PPCLRIRQ:
   6167       POST_MEM_WRITE( ARG3, sizeof(int) );
   6168       break;
   6169    case VKI_PPGETTIME:
   6170       POST_MEM_WRITE( ARG3, sizeof(struct vki_timeval) );
   6171       break;
   6172 
   6173    case VKI_GIO_FONT:
   6174       POST_MEM_WRITE( ARG3, 32 * 256 );
   6175       break;
   6176    case VKI_PIO_FONT:
   6177       break;
   6178 
   6179    case VKI_GIO_FONTX:
   6180       POST_MEM_WRITE( (Addr)((struct vki_consolefontdesc *)ARG3)->chardata,
   6181                       32 * ((struct vki_consolefontdesc *)ARG3)->charcount );
   6182       break;
   6183    case VKI_PIO_FONTX:
   6184       break;
   6185 
   6186    case VKI_PIO_FONTRESET:
   6187       break;
   6188 
   6189    case VKI_GIO_CMAP:
   6190       POST_MEM_WRITE( ARG3, 16 * 3 );
   6191       break;
   6192    case VKI_PIO_CMAP:
   6193       break;
   6194 
   6195    case VKI_KIOCSOUND:
   6196    case VKI_KDMKTONE:
   6197       break;
   6198 
   6199    case VKI_KDGETLED:
   6200       POST_MEM_WRITE( ARG3, sizeof(char) );
   6201       break;
   6202    case VKI_KDSETLED:
   6203       break;
   6204 
   6205    case VKI_KDGKBTYPE:
   6206       POST_MEM_WRITE( ARG3, sizeof(char) );
   6207       break;
   6208 
   6209    case VKI_KDADDIO:
   6210    case VKI_KDDELIO:
   6211    case VKI_KDENABIO:
   6212    case VKI_KDDISABIO:
   6213       break;
   6214 
   6215    case VKI_KDSETMODE:
   6216       break;
   6217    case VKI_KDGETMODE:
   6218       POST_MEM_WRITE( ARG3, sizeof(int) );
   6219       break;
   6220 
   6221    case VKI_KDMAPDISP:
   6222    case VKI_KDUNMAPDISP:
   6223       break;
   6224 
   6225    case VKI_GIO_SCRNMAP:
   6226       POST_MEM_WRITE( ARG3, VKI_E_TABSZ );
   6227       break;
   6228    case VKI_PIO_SCRNMAP:
   6229       break;
   6230    case VKI_GIO_UNISCRNMAP:
   6231       POST_MEM_WRITE( ARG3, VKI_E_TABSZ * sizeof(unsigned short) );
   6232       break;
   6233    case VKI_PIO_UNISCRNMAP:
   6234       break;
   6235 
   6236    case VKI_GIO_UNIMAP:
   6237       if ( ARG3 ) {
   6238          struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
   6239          POST_MEM_WRITE( (Addr)&desc->entry_ct, sizeof(desc->entry_ct));
   6240          POST_MEM_WRITE( (Addr)desc->entries,
   6241       	                 desc->entry_ct * sizeof(struct vki_unipair) );
   6242       }
   6243       break;
   6244    case VKI_PIO_UNIMAP:
   6245       break;
   6246    case VKI_PIO_UNIMAPCLR:
   6247       break;
   6248 
   6249    case VKI_KDGKBMODE:
   6250       POST_MEM_WRITE( ARG3, sizeof(int) );
   6251       break;
   6252    case VKI_KDSKBMODE:
   6253       break;
   6254 
   6255    case VKI_KDGKBMETA:
   6256       POST_MEM_WRITE( ARG3, sizeof(int) );
   6257       break;
   6258    case VKI_KDSKBMETA:
   6259       break;
   6260 
   6261    case VKI_KDGKBLED:
   6262       POST_MEM_WRITE( ARG3, sizeof(char) );
   6263       break;
   6264    case VKI_KDSKBLED:
   6265       break;
   6266 
   6267    case VKI_KDGKBENT:
   6268       POST_MEM_WRITE( (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
   6269                       sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
   6270       break;
   6271    case VKI_KDSKBENT:
   6272       break;
   6273 
   6274    case VKI_KDGKBSENT:
   6275       POST_MEM_WRITE( (Addr)((struct vki_kbsentry *)ARG3)->kb_string,
   6276                       sizeof(((struct vki_kbsentry *)ARG3)->kb_string) );
   6277       break;
   6278    case VKI_KDSKBSENT:
   6279       break;
   6280 
   6281    case VKI_KDGKBDIACR:
   6282       POST_MEM_WRITE( ARG3, sizeof(struct vki_kbdiacrs) );
   6283       break;
   6284    case VKI_KDSKBDIACR:
   6285       break;
   6286 
   6287    case VKI_KDGETKEYCODE:
   6288       POST_MEM_WRITE( (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
   6289                       sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
   6290       break;
   6291    case VKI_KDSETKEYCODE:
   6292       break;
   6293 
   6294    case VKI_KDSIGACCEPT:
   6295       break;
   6296 
   6297    case VKI_KDKBDREP:
   6298       break;
   6299 
   6300    case VKI_KDFONTOP:
   6301       if ( ARG3 ) {
   6302          struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3;
   6303          switch ( op->op ) {
   6304             case VKI_KD_FONT_OP_SET:
   6305                break;
   6306             case VKI_KD_FONT_OP_GET:
   6307                if ( op->data )
   6308                   POST_MEM_WRITE( (Addr) op->data,
   6309                                   (op->width + 7) / 8 * 32 * op->charcount );
   6310                break;
   6311             case VKI_KD_FONT_OP_SET_DEFAULT:
   6312                break;
   6313             case VKI_KD_FONT_OP_COPY:
   6314                break;
   6315          }
   6316          POST_MEM_WRITE( (Addr) op, sizeof(*op));
   6317       }
   6318       break;
   6319 
   6320    case VKI_VT_OPENQRY:
   6321       POST_MEM_WRITE( ARG3, sizeof(int) );
   6322       break;
   6323    case VKI_VT_GETMODE:
   6324       POST_MEM_WRITE( ARG3, sizeof(struct vki_vt_mode) );
   6325       break;
   6326    case VKI_VT_SETMODE:
   6327       break;
   6328    case VKI_VT_GETSTATE:
   6329       POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_active),
   6330                       sizeof(((struct vki_vt_stat*) ARG3)->v_active) );
   6331       POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_state),
   6332                       sizeof(((struct vki_vt_stat*) ARG3)->v_state) );
   6333       break;
   6334    case VKI_VT_RELDISP:
   6335    case VKI_VT_ACTIVATE:
   6336    case VKI_VT_WAITACTIVE:
   6337    case VKI_VT_DISALLOCATE:
   6338       break;
   6339    case VKI_VT_RESIZE:
   6340       break;
   6341    case VKI_VT_RESIZEX:
   6342       break;
   6343    case VKI_VT_LOCKSWITCH:
   6344    case VKI_VT_UNLOCKSWITCH:
   6345       break;
   6346 
   6347    case VKI_USBDEVFS_CONTROL:
   6348       if ( ARG3 ) {
   6349          struct vki_usbdevfs_ctrltransfer *vkuc = (struct vki_usbdevfs_ctrltransfer *)ARG3;
   6350          if (vkuc->bRequestType & 0x80)
   6351             POST_MEM_WRITE((Addr)vkuc->data, RES);
   6352       }
   6353       break;
   6354    case VKI_USBDEVFS_BULK:
   6355       if ( ARG3 ) {
   6356          struct vki_usbdevfs_bulktransfer *vkub = (struct vki_usbdevfs_bulktransfer *)ARG3;
   6357          if (vkub->ep & 0x80)
   6358             POST_MEM_WRITE((Addr)vkub->data, RES);
   6359       }
   6360       break;
   6361    case VKI_USBDEVFS_GETDRIVER:
   6362       if ( ARG3 ) {
   6363          struct vki_usbdevfs_getdriver *vkugd = (struct vki_usbdevfs_getdriver *)ARG3;
   6364          POST_MEM_WRITE((Addr)&vkugd->driver, sizeof(vkugd->driver));
   6365       }
   6366       break;
   6367    case VKI_USBDEVFS_REAPURB:
   6368    case VKI_USBDEVFS_REAPURBNDELAY:
   6369       if ( ARG3 ) {
   6370          struct vki_usbdevfs_urb **vkuu = (struct vki_usbdevfs_urb**)ARG3;
   6371          POST_MEM_WRITE((Addr)vkuu, sizeof(*vkuu));
   6372          if (!*vkuu)
   6373             break;
   6374          POST_MEM_WRITE((Addr) &((*vkuu)->status),sizeof((*vkuu)->status));
   6375          if ((*vkuu)->type == VKI_USBDEVFS_URB_TYPE_CONTROL) {
   6376             struct vki_usbdevfs_setuppacket *vkusp = (struct vki_usbdevfs_setuppacket *)(*vkuu)->buffer;
   6377             if (vkusp->bRequestType & 0x80)
   6378                POST_MEM_WRITE((Addr)(vkusp+1), (*vkuu)->buffer_length - sizeof(*vkusp));
   6379             POST_MEM_WRITE((Addr)&(*vkuu)->actual_length, sizeof((*vkuu)->actual_length));
   6380          } else if ((*vkuu)->type == VKI_USBDEVFS_URB_TYPE_ISO) {
   6381             char *bp = (*vkuu)->buffer;
   6382             int i;
   6383             for(i=0; i<(*vkuu)->number_of_packets; i++) {
   6384                POST_MEM_WRITE((Addr)&(*vkuu)->iso_frame_desc[i].actual_length, sizeof((*vkuu)->iso_frame_desc[i].actual_length));
   6385                POST_MEM_WRITE((Addr)&(*vkuu)->iso_frame_desc[i].status, sizeof((*vkuu)->iso_frame_desc[i].status));
   6386                if ((*vkuu)->endpoint & 0x80)
   6387                   POST_MEM_WRITE((Addr)bp, (*vkuu)->iso_frame_desc[i].actual_length);
   6388                bp += (*vkuu)->iso_frame_desc[i].length; // FIXME: or actual_length??
   6389             }
   6390             POST_MEM_WRITE((Addr)&(*vkuu)->error_count, sizeof((*vkuu)->error_count));
   6391          } else {
   6392             if ((*vkuu)->endpoint & 0x80)
   6393                POST_MEM_WRITE((Addr)(*vkuu)->buffer, (*vkuu)->actual_length);
   6394             POST_MEM_WRITE((Addr)&(*vkuu)->actual_length, sizeof((*vkuu)->actual_length));
   6395          }
   6396       }
   6397       break;
   6398    case VKI_USBDEVFS_CONNECTINFO:
   6399       POST_MEM_WRITE(ARG3, sizeof(struct vki_usbdevfs_connectinfo));
   6400       break;
   6401    case VKI_USBDEVFS_IOCTL:
   6402       if ( ARG3 ) {
   6403          struct vki_usbdevfs_ioctl *vkui = (struct vki_usbdevfs_ioctl *)ARG3;
   6404          UInt dir2, size2;
   6405          dir2  = _VKI_IOC_DIR(vkui->ioctl_code);
   6406          size2 = _VKI_IOC_SIZE(vkui->ioctl_code);
   6407          if (size2 > 0) {
   6408             if (dir2 & _VKI_IOC_READ)
   6409                POST_MEM_WRITE((Addr)vkui->data, size2);
   6410          }
   6411       }
   6412       break;
   6413 
   6414       /* I2C (/dev/i2c-*) ioctls */
   6415    case VKI_I2C_SLAVE:
   6416    case VKI_I2C_SLAVE_FORCE:
   6417    case VKI_I2C_TENBIT:
   6418    case VKI_I2C_PEC:
   6419       break;
   6420    case VKI_I2C_FUNCS:
   6421       POST_MEM_WRITE( ARG3, sizeof(unsigned long) );
   6422       break;
   6423    case VKI_I2C_RDWR:
   6424       if ( ARG3 ) {
   6425           struct vki_i2c_rdwr_ioctl_data *vkui = (struct vki_i2c_rdwr_ioctl_data *)ARG3;
   6426           UInt i;
   6427           for (i=0; i < vkui->nmsgs; i++) {
   6428               struct vki_i2c_msg *msg = vkui->msgs + i;
   6429               if (msg->flags & VKI_I2C_M_RD)
   6430                   POST_MEM_WRITE((Addr)msg->buf, msg->len);
   6431           }
   6432       }
   6433       break;
   6434 
   6435       /* Wireless extensions ioctls */
   6436    case VKI_SIOCSIWCOMMIT:
   6437    case VKI_SIOCSIWNWID:
   6438    case VKI_SIOCSIWFREQ:
   6439    case VKI_SIOCSIWMODE:
   6440    case VKI_SIOCSIWSENS:
   6441    case VKI_SIOCSIWRANGE:
   6442    case VKI_SIOCSIWPRIV:
   6443    case VKI_SIOCSIWSTATS:
   6444    case VKI_SIOCSIWSPY:
   6445    case VKI_SIOCSIWTHRSPY:
   6446    case VKI_SIOCSIWAP:
   6447    case VKI_SIOCSIWSCAN:
   6448    case VKI_SIOCSIWESSID:
   6449    case VKI_SIOCSIWRATE:
   6450    case VKI_SIOCSIWNICKN:
   6451    case VKI_SIOCSIWRTS:
   6452    case VKI_SIOCSIWFRAG:
   6453    case VKI_SIOCSIWTXPOW:
   6454    case VKI_SIOCSIWRETRY:
   6455    case VKI_SIOCSIWENCODE:
   6456    case VKI_SIOCSIWPOWER:
   6457    case VKI_SIOCSIWGENIE:
   6458    case VKI_SIOCSIWMLME:
   6459    case VKI_SIOCSIWAUTH:
   6460    case VKI_SIOCSIWENCODEEXT:
   6461    case VKI_SIOCSIWPMKSA:
   6462       break;
   6463    case VKI_SIOCGIWNAME:
   6464       if (ARG3) {
   6465          POST_MEM_WRITE((Addr)((struct vki_iwreq *)ARG3)->u.name,
   6466                         sizeof(((struct vki_iwreq *)ARG3)->u.name));
   6467       }
   6468       break;
   6469    case VKI_SIOCGIWNWID:
   6470    case VKI_SIOCGIWSENS:
   6471    case VKI_SIOCGIWRATE:
   6472    case VKI_SIOCGIWRTS:
   6473    case VKI_SIOCGIWFRAG:
   6474    case VKI_SIOCGIWTXPOW:
   6475    case VKI_SIOCGIWRETRY:
   6476    case VKI_SIOCGIWPOWER:
   6477    case VKI_SIOCGIWAUTH:
   6478       if (ARG3) {
   6479          POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.param,
   6480                         sizeof(struct vki_iw_param));
   6481       }
   6482       break;
   6483    case VKI_SIOCGIWFREQ:
   6484       if (ARG3) {
   6485          POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.freq,
   6486                         sizeof(struct vki_iw_freq));
   6487       }
   6488       break;
   6489    case VKI_SIOCGIWMODE:
   6490       if (ARG3) {
   6491          POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.mode,
   6492                        sizeof(__vki_u32));
   6493       }
   6494       break;
   6495    case VKI_SIOCGIWRANGE:
   6496    case VKI_SIOCGIWPRIV:
   6497    case VKI_SIOCGIWSTATS:
   6498    case VKI_SIOCGIWSPY:
   6499    case VKI_SIOCGIWTHRSPY:
   6500    case VKI_SIOCGIWAPLIST:
   6501    case VKI_SIOCGIWSCAN:
   6502    case VKI_SIOCGIWESSID:
   6503    case VKI_SIOCGIWNICKN:
   6504    case VKI_SIOCGIWENCODE:
   6505    case VKI_SIOCGIWGENIE:
   6506    case VKI_SIOCGIWENCODEEXT:
   6507       if (ARG3) {
   6508          struct vki_iw_point* point;
   6509          point = &((struct vki_iwreq *)ARG3)->u.data;
   6510          POST_MEM_WRITE((Addr)point->pointer, point->length);
   6511       }
   6512       break;
   6513    case VKI_SIOCGIWAP:
   6514       if (ARG3) {
   6515          POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
   6516                         sizeof(struct vki_sockaddr));
   6517       }
   6518       break;
   6519 
   6520 #  if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android)
   6521    /* ashmem */
   6522    case VKI_ASHMEM_GET_SIZE:
   6523    case VKI_ASHMEM_SET_SIZE:
   6524    case VKI_ASHMEM_GET_PROT_MASK:
   6525    case VKI_ASHMEM_SET_PROT_MASK:
   6526    case VKI_ASHMEM_GET_PIN_STATUS:
   6527    case VKI_ASHMEM_PURGE_ALL_CACHES:
   6528    case VKI_ASHMEM_SET_NAME:
   6529    case VKI_ASHMEM_PIN:
   6530    case VKI_ASHMEM_UNPIN:
   6531        break;
   6532    case VKI_ASHMEM_GET_NAME:
   6533        POST_MEM_WRITE( ARG3, VKI_ASHMEM_NAME_LEN );
   6534        break;
   6535 
   6536    /* binder */
   6537    case VKI_BINDER_WRITE_READ:
   6538        if (ARG3) {
   6539            struct vki_binder_write_read* bwr
   6540               = (struct vki_binder_write_read*)ARG3;
   6541            POST_FIELD_WRITE(bwr->write_consumed);
   6542            POST_FIELD_WRITE(bwr->read_consumed);
   6543 
   6544            if (bwr->read_size)
   6545                POST_MEM_WRITE((Addr)bwr->read_buffer, bwr->read_consumed);
   6546        }
   6547        break;
   6548 
   6549    case VKI_BINDER_SET_IDLE_TIMEOUT:
   6550    case VKI_BINDER_SET_MAX_THREADS:
   6551    case VKI_BINDER_SET_IDLE_PRIORITY:
   6552    case VKI_BINDER_SET_CONTEXT_MGR:
   6553    case VKI_BINDER_THREAD_EXIT:
   6554        break;
   6555    case VKI_BINDER_VERSION:
   6556        if (ARG3) {
   6557            struct vki_binder_version* bv = (struct vki_binder_version*)ARG3;
   6558            POST_FIELD_WRITE(bv->protocol_version);
   6559        }
   6560        break;
   6561 #  endif /* defined(VGPV_*_linux_android) */
   6562 
   6563    case VKI_HCIINQUIRY:
   6564       if (ARG3) {
   6565         struct vki_hci_inquiry_req* ir = (struct vki_hci_inquiry_req*)ARG3;
   6566         POST_MEM_WRITE((Addr)ARG3 + sizeof(struct vki_hci_inquiry_req),
   6567                        ir->num_rsp * sizeof(struct vki_inquiry_info));
   6568       }
   6569       break;
   6570 
   6571    /* KVM ioctls that only write the system call return value */
   6572    case VKI_KVM_GET_API_VERSION:
   6573    case VKI_KVM_CREATE_VM:
   6574    case VKI_KVM_CHECK_EXTENSION:
   6575    case VKI_KVM_GET_VCPU_MMAP_SIZE:
   6576    case VKI_KVM_S390_ENABLE_SIE:
   6577    case VKI_KVM_CREATE_VCPU:
   6578    case VKI_KVM_RUN:
   6579    case VKI_KVM_S390_INITIAL_RESET:
   6580       break;
   6581 
   6582    case VKI_EVIOCSSUSPENDBLOCK:
   6583       POST_MEM_WRITE( ARG3, sizeof(int) );
   6584       break;
   6585 
   6586    case VKI_MEDIA_IOC_DEVICE_INFO:
   6587       if (ARG3) {
   6588          POST_MEM_WRITE(ARG3, sizeof(struct vki_media_device_info));
   6589       }
   6590       break;
   6591 
   6592    default:
   6593       /* EVIOC* are variable length and return size written on success */
   6594       switch (ARG2 & ~(_VKI_IOC_SIZEMASK << _VKI_IOC_SIZESHIFT)) {
   6595       case VKI_EVIOCGNAME(0):
   6596       case VKI_EVIOCGPHYS(0):
   6597       case VKI_EVIOCGUNIQ(0):
   6598       case VKI_EVIOCGKEY(0):
   6599       case VKI_EVIOCGLED(0):
   6600       case VKI_EVIOCGSND(0):
   6601       case VKI_EVIOCGSW(0):
   6602       case VKI_EVIOCGBIT(VKI_EV_SYN,0):
   6603       case VKI_EVIOCGBIT(VKI_EV_KEY,0):
   6604       case VKI_EVIOCGBIT(VKI_EV_REL,0):
   6605       case VKI_EVIOCGBIT(VKI_EV_ABS,0):
   6606       case VKI_EVIOCGBIT(VKI_EV_MSC,0):
   6607       case VKI_EVIOCGBIT(VKI_EV_SW,0):
   6608       case VKI_EVIOCGBIT(VKI_EV_LED,0):
   6609       case VKI_EVIOCGBIT(VKI_EV_SND,0):
   6610       case VKI_EVIOCGBIT(VKI_EV_REP,0):
   6611       case VKI_EVIOCGBIT(VKI_EV_FF,0):
   6612       case VKI_EVIOCGBIT(VKI_EV_PWR,0):
   6613       case VKI_EVIOCGBIT(VKI_EV_FF_STATUS,0):
   6614          if (RES > 0)
   6615             POST_MEM_WRITE(ARG3, RES);
   6616          break;
   6617       default:
   6618          ML_(POST_unknown_ioctl)(tid, RES, ARG2, ARG3);
   6619          break;
   6620       }
   6621       break;
   6622    }
   6623 }
   6624 
   6625 /* ---------------------------------------------------------------------
   6626    socketcall wrapper helpers
   6627    ------------------------------------------------------------------ */
   6628 
   6629 void
   6630 ML_(linux_PRE_sys_getsockopt) ( ThreadId tid,
   6631                                 UWord arg0, UWord arg1, UWord arg2,
   6632                                 UWord arg3, UWord arg4 )
   6633 {
   6634    /* int getsockopt(int s, int level, int optname,
   6635                      void *optval, socklen_t *optlen); */
   6636    Addr optval_p = arg3;
   6637    Addr optlen_p = arg4;
   6638    /* vg_assert(sizeof(socklen_t) == sizeof(UInt)); */
   6639    if (optval_p != (Addr)NULL) {
   6640       ML_(buf_and_len_pre_check) ( tid, optval_p, optlen_p,
   6641                                    "socketcall.getsockopt(optval)",
   6642                                    "socketcall.getsockopt(optlen)" );
   6643       if (arg1 == VKI_SOL_SCTP &&
   6644           (arg2 == VKI_SCTP_GET_PEER_ADDRS ||
   6645            arg2 == VKI_SCTP_GET_LOCAL_ADDRS))
   6646       {
   6647          struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
   6648          int address_bytes = sizeof(struct vki_sockaddr_in6) * ga->addr_num;
   6649          PRE_MEM_WRITE( "socketcall.getsockopt(optval.addrs)",
   6650                         (Addr)ga->addrs, address_bytes );
   6651       }
   6652    }
   6653 }
   6654 
   6655 void
   6656 ML_(linux_POST_sys_getsockopt) ( ThreadId tid,
   6657                                  SysRes res,
   6658                                  UWord arg0, UWord arg1, UWord arg2,
   6659                                  UWord arg3, UWord arg4 )
   6660 {
   6661    Addr optval_p = arg3;
   6662    Addr optlen_p = arg4;
   6663    vg_assert(!sr_isError(res)); /* guaranteed by caller */
   6664    if (optval_p != (Addr)NULL) {
   6665       ML_(buf_and_len_post_check) ( tid, res, optval_p, optlen_p,
   6666                                     "socketcall.getsockopt(optlen_out)" );
   6667       if (arg1 == VKI_SOL_SCTP &&
   6668           (arg2 == VKI_SCTP_GET_PEER_ADDRS ||
   6669            arg2 == VKI_SCTP_GET_LOCAL_ADDRS))
   6670       {
   6671          struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
   6672          struct vki_sockaddr *a = ga->addrs;
   6673          int i;
   6674          for (i = 0; i < ga->addr_num; i++) {
   6675             int sl = 0;
   6676             if (a->sa_family == VKI_AF_INET)
   6677                sl = sizeof(struct vki_sockaddr_in);
   6678             else if (a->sa_family == VKI_AF_INET6)
   6679                sl = sizeof(struct vki_sockaddr_in6);
   6680             else {
   6681                VG_(message)(Vg_UserMsg, "Warning: getsockopt: unhandled "
   6682                                         "address type %d\n", a->sa_family);
   6683             }
   6684             a = (struct vki_sockaddr*)((char*)a + sl);
   6685          }
   6686          POST_MEM_WRITE( (Addr)ga->addrs, (char*)a - (char*)ga->addrs );
   6687       }
   6688    }
   6689 }
   6690 
   6691 #undef PRE
   6692 #undef POST
   6693 
   6694 #endif // defined(VGO_linux)
   6695 
   6696 /*--------------------------------------------------------------------*/
   6697 /*--- end                                                          ---*/
   6698 /*--------------------------------------------------------------------*/
   6699