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