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
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2000-2013 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"
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "pub_core_machine.h"      // VG_(get_SP)
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_mallocfree.h"
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_tooliface.h"
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_options.h"
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_scheduler.h"
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_signals.h"
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syscall.h"
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syswrap.h"
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "pub_core_inner.h"
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined(ENABLE_INNER_CLIENT_REQUEST)
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "pub_core_clreq.h"
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_types_n_macros.h"
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-generic.h"
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-linux.h"
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "priv_syswrap-xen.h"
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Run a thread from beginning to end and return the thread's
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// scheduler-return-code.
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic VgSchedReturnCode thread_wrapper(Word /*ThreadId*/ tidW)
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VgSchedReturnCode ret;
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId     tid = (ThreadId)tidW;
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst = VG_(get_ThreadState)(tid);
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(1, "syswrap-linux",
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "thread_wrapper(tid=%lld): entry\n",
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (ULong)tidW);
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tst->status == VgTs_Init);
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* make sure we get the CPU lock before doing anything significant */
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(acquire_BigLock)(tid, "thread_wrapper(starting new thread)");
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (0)
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("thread tid %d started: stack = %p\n",
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		  tid, &tid);
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Make sure error reporting is enabled in the new thread. */
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   tst->err_disablement_level = 0;
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_TRACK(pre_thread_first_insn, tid);
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst->os_state.lwpid = VG_(gettid)();
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Set the threadgroup for real.  This overwrites the provisional
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      value set in do_clone() syswrap-*-linux.c.  See comments in
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      do_clone for background, also #226116. */
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst->os_state.threadgroup = VG_(getpid)();
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Thread created with all signals blocked; scheduler will set the
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      appropriate mask */
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ret = VG_(scheduler)(tid);
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_exiting)(tid));
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tst->status == VgTs_Runnable);
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(1, "syswrap-linux",
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    "thread_wrapper(tid=%lld): exit, schedreturncode %s\n",
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (ULong)tidW, VG_(name_of_VgSchedReturnCode)(ret));
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Return to caller, still holding the lock. */
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return ret;
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   clone-related stuff
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Run a thread all the way to the end, then do appropriate exit actions
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (this is the last-one-out-turn-off-the-lights bit).  */
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void run_a_thread_NORETURN ( Word tidW )
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId          tid = (ThreadId)tidW;
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VgSchedReturnCode src;
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int               c;
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ThreadState*      tst;
131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef ENABLE_INNER_CLIENT_REQUEST
132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int               registered_vgstack_id;
133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(1, "syswrap-linux",
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "run_a_thread_NORETURN(tid=%lld): pre-thread_wrapper\n",
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (ULong)tidW);
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   tst = VG_(get_ThreadState)(tid);
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vg_assert(tst);
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* An thread has two stacks:
143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      * the simulated stack (used by the synthetic cpu. Guest process
144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        is using this stack).
145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      * the valgrind stack (used by the real cpu. Valgrind code is running
146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        on this stack).
147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      When Valgrind runs as an inner, it must signals that its (real) stack
148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      is the stack to use by the outer to e.g. do stacktraces.
149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   */
150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   INNER_REQUEST
151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      (registered_vgstack_id
152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       = VALGRIND_STACK_REGISTER (tst->os_state.valgrind_stack_base,
153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                  tst->os_state.valgrind_stack_init_SP));
154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Run the thread all the way through. */
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   src = thread_wrapper(tid);
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(1, "syswrap-linux",
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "run_a_thread_NORETURN(tid=%lld): post-thread_wrapper\n",
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (ULong)tidW);
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   c = VG_(count_living_threads)();
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(c >= 1); /* stay sane */
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Tell the tool this thread is exiting
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_TRACK( pre_thread_ll_exit, tid );
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If the thread is exiting with errors disabled, complain loudly;
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      doing so is bad (does the user know this has happened?)  Also,
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      in all cases, be paranoid and clear the flag anyway so that the
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      thread slot is safe in this respect if later reallocated.  This
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      should be unnecessary since the flag should be cleared when the
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      slot is reallocated, in thread_wrapper(). */
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (tst->err_disablement_level > 0) {
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(umsg)(
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         "WARNING: exiting thread has error reporting disabled.\n"
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         "WARNING: possibly as a result of some mistake in the use\n"
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         "WARNING: of the VALGRIND_DISABLE_ERROR_REPORTING macros.\n"
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      );
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(debugLog)(
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         1, "syswrap-linux",
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            "run_a_thread_NORETURN(tid=%lld): "
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            "WARNING: exiting thread has err_disablement_level = %u\n",
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            (ULong)tidW, tst->err_disablement_level
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      );
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   tst->err_disablement_level = 0;
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (c == 1) {
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(debugLog)(1, "syswrap-linux",
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       "run_a_thread_NORETURN(tid=%lld): "
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          "last one standing\n",
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          (ULong)tidW);
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* We are the last one standing.  Keep hold of the lock and
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         carry on to show final tool results, then exit the entire system.
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Use the continuation pointer set at startup in m_main. */
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ( * VG_(address_of_m_main_shutdown_actions_NORETURN) ) (tid, src);
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(debugLog)(1, "syswrap-linux",
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       "run_a_thread_NORETURN(tid=%lld): "
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          "not last one standing\n",
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          (ULong)tidW);
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* OK, thread is dead, but others still exist.  Just exit. */
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* This releases the run lock */
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(exit_thread)(tid);
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(tst->status == VgTs_Zombie);
212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vg_assert(sizeof(tst->status) == 4);
213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vg_assert(sizeof(tst->os_state.exitcode) == sizeof(Word));
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      INNER_REQUEST (VALGRIND_STACK_DEREGISTER (registered_vgstack_id));
216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* We have to use this sequence to terminate the thread to
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         prevent a subtle race.  If VG_(exit_thread)() had left the
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ThreadState as Empty, then it could have been reallocated,
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         reusing the stack while we're doing these last cleanups.
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Instead, VG_(exit_thread) leaves it as Zombie to prevent
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         reallocation.  We need to make sure we don't touch the stack
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         between marking it Empty and exiting.  Hence the
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         assembler. */
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_x86_linux)
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      asm volatile (
227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         "pushl %%ebx\n"
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movl	%1, %0\n"	/* set tst->status = VgTs_Empty */
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movl	%2, %%eax\n"    /* set %eax = __NR_exit */
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movl	%3, %%ebx\n"    /* set %ebx = tst->os_state.exitcode */
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "int	$0x80\n"	/* exit(tst->os_state.exitcode) */
232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	 "popl %%ebx\n"
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         : "=m" (tst->status)
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         : "n" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         : "eax"
236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      );
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGP_amd64_linux)
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      asm volatile (
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movl	%1, %0\n"	/* set tst->status = VgTs_Empty */
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq	%2, %%rax\n"    /* set %rax = __NR_exit */
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq	%3, %%rdi\n"    /* set %rdi = tst->os_state.exitcode */
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "syscall\n"		/* exit(tst->os_state.exitcode) */
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         : "=m" (tst->status)
244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         : "n" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         : "rax", "rdi"
246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      );
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux)
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { UInt vgts_empty = (UInt)VgTs_Empty;
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        asm volatile (
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "stw %1,%0\n\t"          /* set tst->status = VgTs_Empty */
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "li  0,%2\n\t"           /* set r0 = __NR_exit */
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "lwz 3,%3\n\t"           /* set r3 = tst->os_state.exitcode */
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "sc\n\t"                 /* exit(tst->os_state.exitcode) */
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : "=m" (tst->status)
255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          : "r" (vgts_empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          : "r0", "r3"
257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        );
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGP_arm_linux)
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      asm volatile (
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "str  %1, %0\n"      /* set tst->status = VgTs_Empty */
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "mov  r7, %2\n"      /* set %r7 = __NR_exit */
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "ldr  r0, %3\n"      /* set %r0 = tst->os_state.exitcode */
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "svc  0x00000000\n"  /* exit(tst->os_state.exitcode) */
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         : "=m" (tst->status)
266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         : "r" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         : "r0", "r7"
268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      );
269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#elif defined(VGP_arm64_linux)
270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      asm volatile (
271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         "str  %w1, %0\n"     /* set tst->status = VgTs_Empty (32-bit store) */
272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         "mov  x8,  %2\n"     /* set %r7 = __NR_exit */
273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         "ldr  x0,  %3\n"     /* set %r0 = tst->os_state.exitcode */
274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         "svc  0x00000000\n"  /* exit(tst->os_state.exitcode) */
275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         : "=m" (tst->status)
276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         : "r" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         : "r0", "r7"
278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      );
279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#elif defined(VGP_s390x_linux)
280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      asm volatile (
281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         "st   %1, %0\n"        /* set tst->status = VgTs_Empty */
282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         "lg   2, %3\n"         /* set r2 = tst->os_state.exitcode */
283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         "svc %2\n"             /* exit(tst->os_state.exitcode) */
284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         : "=m" (tst->status)
285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         : "d" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         : "2"
287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      );
288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#elif defined(VGP_mips32_linux) || defined(VGP_mips64_linux)
289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      asm volatile (
290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         "sw   %1, %0\n\t"     /* set tst->status = VgTs_Empty */
291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         "li   $2, %2\n\t"     /* set v0 = __NR_exit */
292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         "lw   $4, %3\n\t"     /* set a0 = tst->os_state.exitcode */
293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         "syscall\n\t"         /* exit(tst->os_state.exitcode) */
294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         "nop"
295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         : "=m" (tst->status)
296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         : "r" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         : "cc", "memory" , "v0", "a0"
298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      );
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# error Unknown platform
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(core_panic)("Thread exit failed?\n");
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*NOTREACHED*/
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(0);
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownWord ML_(start_thread_NORETURN) ( void* arg )
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst = (ThreadState*)arg;
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId     tid = tst->tid;
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   run_a_thread_NORETURN ( (Word)tid );
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*NOTREACHED*/
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(0);
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Allocate a stack for this thread, if it doesn't already have one.
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   They're allocated lazily, and never freed.  Returns the initial stack
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   pointer value to use, or 0 if allocation failed. */
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownAddr ML_(allocstack)(ThreadId tid)
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst = VG_(get_ThreadState)(tid);
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VgStack*     stack;
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr         initial_SP;
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Either the stack_base and stack_init_SP are both zero (in which
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case a stack hasn't been allocated) or they are both non-zero,
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      in which case it has. */
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (tst->os_state.valgrind_stack_base == 0)
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(tst->os_state.valgrind_stack_init_SP == 0);
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (tst->os_state.valgrind_stack_base != 0)
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(tst->os_state.valgrind_stack_init_SP != 0);
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* If no stack is present, allocate one. */
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (tst->os_state.valgrind_stack_base == 0) {
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      stack = VG_(am_alloc_VgStack)( &initial_SP );
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (stack) {
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         tst->os_state.valgrind_stack_base    = (Addr)stack;
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         tst->os_state.valgrind_stack_init_SP = initial_SP;
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (0)
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)( "stack for tid %d at %p; init_SP=%p\n",
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   tid,
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   (void*)tst->os_state.valgrind_stack_base,
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   (void*)tst->os_state.valgrind_stack_init_SP );
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return tst->os_state.valgrind_stack_init_SP;
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Allocate a stack for the main thread, and run it all the way to the
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   end.  Although we already have a working VgStack
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (VG_(interim_stack)) it's better to allocate a new one, so that
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   overflow detection works uniformly for all threads.
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(main_thread_wrapper_NORETURN)(ThreadId tid)
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr sp;
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(1, "syswrap-linux",
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "entering VG_(main_thread_wrapper_NORETURN)\n");
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sp = ML_(allocstack)(tid);
370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined(ENABLE_INNER_CLIENT_REQUEST)
371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   {
372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // we must register the main thread stack before the call
373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // to ML_(call_on_new_stack_0_1), otherwise the outer valgrind
374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // reports 'write error' on the non registered stack.
375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ThreadState* tst = VG_(get_ThreadState)(tid);
376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      INNER_REQUEST
377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ((void)
378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          VALGRIND_STACK_REGISTER (tst->os_state.valgrind_stack_base,
379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   tst->os_state.valgrind_stack_init_SP));
380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_ppc32_linux)
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* make a stack frame */
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sp -= 16;
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sp &= ~0xF;
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *(UWord *)sp = 0;
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGP_ppc64_linux)
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* make a stack frame */
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sp -= 112;
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sp &= ~((Addr)0xF);
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *(UWord *)sp = 0;
393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#elif defined(VGP_s390x_linux)
394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* make a stack frame */
395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   sp -= 160;
396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   sp &= ~((Addr)0xF);
397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *(UWord *)sp = 0;
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* If we can't even allocate the first thread's stack, we're hosed.
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Give up. */
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert2(sp != 0, "Cannot allocate main thread's stack.");
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* shouldn't be any other threads around yet */
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert( VG_(count_living_threads)() == 1 );
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(call_on_new_stack_0_1)(
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (Addr)sp,               /* stack */
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      0,                      /* bogus return address */
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      run_a_thread_NORETURN,  /* fn to call */
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (Word)tid               /* arg to give it */
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*NOTREACHED*/
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(0);
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Do a clone which is really a fork() */
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSysRes ML_(do_fork_clone) ( ThreadId tid, UInt flags,
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            Int* parent_tidptr, Int* child_tidptr )
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_sigset_t fork_saved_mask;
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_sigset_t mask;
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes       res;
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (flags & (VKI_CLONE_SETTLS | VKI_CLONE_FS | VKI_CLONE_VM
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                | VKI_CLONE_FILES | VKI_CLONE_VFORK))
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return VG_(mk_SysRes_Error)( VKI_EINVAL );
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Block all signals during fork, so that we can fix things up in
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      the child without being interrupted. */
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigfillset)(&mask);
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigprocmask)(VKI_SIG_SETMASK, &mask, &fork_saved_mask);
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(do_atfork_pre)(tid);
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Since this is the fork() form of clone, we don't need all that
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(clone) stuff */
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_x86_linux) \
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    || defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux) \
442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    || defined(VGP_arm_linux) || defined(VGP_mips32_linux) \
443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    || defined(VGP_mips64_linux) || defined(VGP_arm64_linux)
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = VG_(do_syscall5)( __NR_clone, flags,
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           (UWord)NULL, (UWord)parent_tidptr,
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           (UWord)NULL, (UWord)child_tidptr );
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGP_amd64_linux)
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* note that the last two arguments are the opposite way round to x86 and
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppc32 as the amd64 kernel expects the arguments in a different order */
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = VG_(do_syscall5)( __NR_clone, flags,
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           (UWord)NULL, (UWord)parent_tidptr,
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           (UWord)child_tidptr, (UWord)NULL );
453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#elif defined(VGP_s390x_linux)
454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Note that s390 has the stack first and then the flags */
455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   res = VG_(do_syscall4)( __NR_clone, (UWord) NULL, flags,
456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          (UWord)parent_tidptr, (UWord)child_tidptr);
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# error Unknown platform
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!sr_isError(res) && sr_Res(res) == 0) {
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* child */
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(do_atfork_child)(tid);
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* restore signal mask */
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(sigprocmask)(VKI_SIG_SETMASK, &fork_saved_mask, NULL);
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* If --child-silent-after-fork=yes was specified, set the
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         output file descriptors to 'impossible' values.  This is
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         noticed by send_bytes_to_logging_sink in m_libcprint.c, which
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         duly stops writing any further output. */
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_child_silent_after_fork)) {
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (!VG_(log_output_sink).is_socket)
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            VG_(log_output_sink).fd = -1;
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (!VG_(xml_output_sink).is_socket)
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            VG_(xml_output_sink).fd = -1;
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!sr_isError(res) && sr_Res(res) > 0) {
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* parent */
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(do_atfork_parent)(tid);
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_trace_syscalls))
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  VG_(printf)("   clone(fork): process %d created child %ld\n",
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      VG_(getpid)(), sr_Res(res));
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* restore signal mask */
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(sigprocmask)(VKI_SIG_SETMASK, &fork_saved_mask, NULL);
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE/POST wrappers for arch-generic, Linux-specific syscalls
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Nb: See the comment above the generic PRE/POST wrappers in
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// m_syswrap/syswrap-generic.c for notes about how they work.
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE(name)       DEFN_PRE_TEMPLATE(linux, name)
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST(name)      DEFN_POST_TEMPLATE(linux, name)
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Macros to support 64-bit syscall args split into two 32 bit values
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define LOHI64(lo,hi)   ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VG_LITTLEENDIAN)
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MERGE64(lo,hi)   ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MERGE64_FIRST(name) name##_low
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MERGE64_SECOND(name) name##_high
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VG_BIGENDIAN)
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MERGE64(hi,lo)   ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MERGE64_FIRST(name) name##_high
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MERGE64_SECOND(name) name##_low
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#error Unknown endianness
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *mount wrappers
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mount)
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Nb: depending on 'flags', the 'type' and 'data' args may be ignored.
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // We are conservative and check everything, except the memory pointed to
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // by 'data'.
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mount( %#lx(%s), %#lx(%s), %#lx(%s), %#lx, %#lx )",
531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ARG1,(HChar*)ARG1, ARG2,(HChar*)ARG2, ARG3,(HChar*)ARG3, ARG4, ARG5);
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "mount",
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char *, source, char *, target, char *, type,
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, flags, void *, data);
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1)
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "mount(source)", ARG1);
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "mount(target)", ARG2);
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "mount(type)", ARG3);
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_oldumount)
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_oldumount( %#lx )", ARG1);
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "umount", char *, path);
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "umount(path)", ARG1);
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_umount)
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_umount( %#lx, %ld )", ARG1, ARG2);
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "umount2", char *, path, int, flags);
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "umount2(path)", ARG1);
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   16- and 32-bit uid/gid wrappers
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setfsuid16)
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setfsuid16 ( %ld )", ARG1);
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "setfsuid16", vki_old_uid_t, uid);
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setfsuid)
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setfsuid ( %ld )", ARG1);
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "setfsuid", vki_uid_t, uid);
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setfsgid16)
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setfsgid16 ( %ld )", ARG1);
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "setfsgid16", vki_old_gid_t, gid);
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setfsgid)
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setfsgid ( %ld )", ARG1);
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "setfsgid", vki_gid_t, gid);
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setresuid16)
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setresuid16 ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "setresuid16",
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_old_uid_t, ruid, vki_old_uid_t, euid, vki_old_uid_t, suid);
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setresuid)
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setresuid ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "setresuid",
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_uid_t, ruid, vki_uid_t, euid, vki_uid_t, suid);
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getresuid16)
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getresuid16 ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "getresuid16",
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_old_uid_t *, ruid, vki_old_uid_t *, euid,
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_old_uid_t *, suid);
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresuid16(ruid)", ARG1, sizeof(vki_old_uid_t) );
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresuid16(euid)", ARG2, sizeof(vki_old_uid_t) );
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresuid16(suid)", ARG3, sizeof(vki_old_uid_t) );
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getresuid16)
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0) {
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG1, sizeof(vki_old_uid_t) );
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(vki_old_uid_t) );
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_old_uid_t) );
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getresuid)
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getresuid ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "getresuid",
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_uid_t *, ruid, vki_uid_t *, euid, vki_uid_t *, suid);
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresuid(ruid)", ARG1, sizeof(vki_uid_t) );
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresuid(euid)", ARG2, sizeof(vki_uid_t) );
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresuid(suid)", ARG3, sizeof(vki_uid_t) );
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getresuid)
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0) {
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG1, sizeof(vki_uid_t) );
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(vki_uid_t) );
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_uid_t) );
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setresgid16)
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setresgid16 ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "setresgid16",
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_old_gid_t, rgid,
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_old_gid_t, egid, vki_old_gid_t, sgid);
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setresgid)
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setresgid ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "setresgid",
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_gid_t, rgid, vki_gid_t, egid, vki_gid_t, sgid);
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getresgid16)
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getresgid16 ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "getresgid16",
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_old_gid_t *, rgid, vki_old_gid_t *, egid,
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_old_gid_t *, sgid);
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresgid16(rgid)", ARG1, sizeof(vki_old_gid_t) );
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresgid16(egid)", ARG2, sizeof(vki_old_gid_t) );
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresgid16(sgid)", ARG3, sizeof(vki_old_gid_t) );
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getresgid16)
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0) {
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG1, sizeof(vki_old_gid_t) );
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(vki_old_gid_t) );
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_old_gid_t) );
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getresgid)
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getresgid ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "getresgid",
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_gid_t *, rgid, vki_gid_t *, egid, vki_gid_t *, sgid);
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresgid(rgid)", ARG1, sizeof(vki_gid_t) );
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresgid(egid)", ARG2, sizeof(vki_gid_t) );
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getresgid(sgid)", ARG3, sizeof(vki_gid_t) );
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getresgid)
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0) {
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG1, sizeof(vki_gid_t) );
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(vki_gid_t) );
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_gid_t) );
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   miscellaneous wrappers
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_exit_group)
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId     t;
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst;
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("exit_group( %ld )", ARG1);
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(void, "exit_group", int, status);
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst = VG_(get_ThreadState)(tid);
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* A little complex; find all the threads with the same threadgroup
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      as this one (including this one), and mark them to exit */
705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* It is unclear how one can get a threadgroup in this process which
706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      is not the threadgroup of the calling thread:
707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      The assignments to threadgroups are:
708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        = 0; /// scheduler.c os_state_clear
709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        = getpid(); /// scheduler.c in child after fork
710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        = getpid(); /// this file, in thread_wrapper
711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        = ptst->os_state.threadgroup; /// syswrap-*-linux.c,
712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           copying the thread group of the thread doing clone
713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      So, the only case where the threadgroup might be different to the getpid
714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      value is in the child, just after fork. But then the fork syscall is
715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      still going on, the forked thread has had no chance yet to make this
716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      syscall. */
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (t = 1; t < VG_N_THREADS; t++) {
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( /* not alive */
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           VG_(threads)[t].status == VgTs_Empty
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           ||
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	   /* not our group */
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           VG_(threads)[t].os_state.threadgroup != tst->os_state.threadgroup
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         )
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Assign the exit code, VG_(nuke_all_threads_except) will assign
726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         the exitreason. */
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(threads)[t].os_state.exitcode = ARG1;
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Indicate in all other threads that the process is exiting.
731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Then wait using VG_(reap_threads) for these threads to disappear.
732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Can this give a deadlock if another thread is calling exit in parallel
734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      and would then wait for this thread to disappear ?
735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      The answer is no:
736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Other threads are either blocked in a syscall or have yielded the CPU.
737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      A thread that has yielded the CPU is trying to get the big lock in
739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(scheduler). This thread will get the CPU thanks to the call
740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      to VG_(reap_threads). The scheduler will then check for signals,
741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      kill the process if this is a fatal signal, and otherwise prepare
742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      the thread for handling this signal. After this preparation, if
743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      the thread status is VG_(is_exiting), the scheduler exits the thread.
744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      So, a thread that has yielded the CPU does not have a chance to
745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      call exit => no deadlock for this thread.
746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(nuke_all_threads_except) will send the VG_SIGVGKILL signal
748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      to all threads blocked in a syscall.
749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      The syscall will be interrupted, and the control will go to the
750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      scheduler. The scheduler will then return, as the thread is in
751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      exiting state. */
752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   VG_(nuke_all_threads_except)( tid, VgSrc_ExitProcess );
754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   VG_(reap_threads)(tid);
755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   VG_(threads)[tid].exitreason = VgSrc_ExitThread;
756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* we do assign VgSrc_ExitThread and not VgSrc_ExitProcess, as this thread
757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      is the thread calling exit_group and so its registers must be considered
758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      as not reachable. See pub_tool_machine.h VG_(apply_to_GP_regs). */
759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* We have to claim the syscall already succeeded. */
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_llseek)
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_llseek ( %ld, 0x%lx, 0x%lx, %#lx, %ld )", ARG1,ARG2,ARG3,ARG4,ARG5);
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "llseek",
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, fd, unsigned long, offset_high,
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, offset_low, vki_loff_t *, result,
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, whence);
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "llseek", tid, False))
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "llseek(result)", ARG4, sizeof(vki_loff_t));
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_llseek)
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0)
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof(vki_loff_t) );
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_adjtimex)
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_timex *tx = (struct vki_timex *)ARG1;
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_adjtimex ( %#lx )", ARG1);
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "adjtimex", struct timex *, buf);
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "adjtimex(timex->modes)", ARG1, sizeof(tx->modes));
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ADJX(bits,field) 				\
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (tx->modes & (bits))                              \
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "adjtimex(timex->"#field")",	\
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		    (Addr)&tx->field, sizeof(tx->field))
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (tx->modes & VKI_ADJ_ADJTIME) {
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!(tx->modes & VKI_ADJ_OFFSET_READONLY))
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "adjtimex(timex->offset)", (Addr)&tx->offset, sizeof(tx->offset));
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ADJX(VKI_ADJ_OFFSET, offset);
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ADJX(VKI_ADJ_FREQUENCY, freq);
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ADJX(VKI_ADJ_MAXERROR, maxerror);
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ADJX(VKI_ADJ_ESTERROR, esterror);
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ADJX(VKI_ADJ_STATUS, status);
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ADJX(VKI_ADJ_TIMECONST|VKI_ADJ_TAI, constant);
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ADJX(VKI_ADJ_TICK, tick);
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef ADJX
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "adjtimex(timex)", ARG1, sizeof(struct vki_timex));
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_adjtimex)
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG1, sizeof(struct vki_timex) );
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_clock_adjtime)
818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   struct vki_timex *tx = (struct vki_timex *)ARG2;
820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_clock_adjtime ( %ld, %#lx )", ARG1,ARG2);
821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ2(long, "clock_adjtime", vki_clockid_t, id, struct timex *, buf);
822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_READ( "clock_adjtime(timex->modes)", ARG2, sizeof(tx->modes));
823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ADJX(bits,field)                                \
825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (tx->modes & (bits))                              \
826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ( "clock_adjtime(timex->"#field")",   \
827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)&tx->field, sizeof(tx->field))
828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (tx->modes & VKI_ADJ_ADJTIME) {
830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (!(tx->modes & VKI_ADJ_OFFSET_READONLY))
831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ( "clock_adjtime(timex->offset)", (Addr)&tx->offset, sizeof(tx->offset));
832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ADJX(VKI_ADJ_OFFSET, offset);
834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ADJX(VKI_ADJ_FREQUENCY, freq);
835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ADJX(VKI_ADJ_MAXERROR, maxerror);
836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ADJX(VKI_ADJ_ESTERROR, esterror);
837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ADJX(VKI_ADJ_STATUS, status);
838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ADJX(VKI_ADJ_TIMECONST|VKI_ADJ_TAI, constant);
839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ADJX(VKI_ADJ_TICK, tick);
840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#undef ADJX
842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_WRITE( "adjtimex(timex)", ARG2, sizeof(struct vki_timex));
844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_clock_adjtime)
847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   POST_MEM_WRITE( ARG2, sizeof(struct vki_timex) );
849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_ioperm)
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_ioperm ( %ld, %ld, %ld )", ARG1, ARG2, ARG3 );
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "ioperm",
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, from, unsigned long, num, int, turn_on);
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_syslog)
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_syslog (%ld, %#lx, %ld)", ARG1,ARG2,ARG3);
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "syslog", int, type, char *, bufp, int, len);
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1) {
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // The kernel uses magic numbers here, rather than named constants,
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // therefore so do we.
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 2: case 3: case 4:
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "syslog(bufp)", ARG2, ARG3);
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_syslog)
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1) {
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 2: case 3: case 4:
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, ARG3 );
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_vhangup)
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_vhangup ( )");
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "vhangup");
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sysinfo)
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sysinfo ( %#lx )",ARG1);
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "sysinfo", struct sysinfo *, info);
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "sysinfo(info)", ARG1, sizeof(struct vki_sysinfo) );
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_sysinfo)
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG1, sizeof(struct vki_sysinfo) );
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_personality)
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_personality ( %llu )", (ULong)ARG1);
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "personality", vki_u_long, persona);
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sysctl)
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct __vki_sysctl_args *args;
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sysctl ( %#lx )", ARG1 );
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   args = (struct __vki_sysctl_args *)ARG1;
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "sysctl", struct __sysctl_args *, args);
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "sysctl(args)", ARG1, sizeof(struct __vki_sysctl_args) );
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!VG_(am_is_valid_for_client)(ARG1, sizeof(struct __vki_sysctl_args),
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          VKI_PROT_READ)) {
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EFAULT );
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("sysctl(name)", (Addr)args->name, args->nlen * sizeof(*args->name));
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (args->newval != NULL)
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("sysctl(newval)", (Addr)args->newval, args->newlen);
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (args->oldlenp != NULL) {
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("sysctl(oldlenp)", (Addr)args->oldlenp, sizeof(*args->oldlenp));
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("sysctl(oldval)", (Addr)args->oldval, *args->oldlenp);
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_sysctl)
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct __vki_sysctl_args *args;
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   args = (struct __vki_sysctl_args *)ARG1;
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (args->oldlenp != NULL) {
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE((Addr)args->oldlenp, sizeof(*args->oldlenp));
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE((Addr)args->oldval, 1 + *args->oldlenp);
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_prctl)
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "sys_prctl ( %ld, %ld, %ld, %ld, %ld )", ARG1, ARG2, ARG3, ARG4, ARG5 );
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1) {
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_SET_PDEATHSIG:
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int, signal);
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_PDEATHSIG:
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int *, signal);
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("prctl(get-death-signal)", ARG2, sizeof(Int));
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_DUMPABLE:
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ1(int, "prctl", int, option);
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_SET_DUMPABLE:
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int, dump);
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_UNALIGN:
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int *, value);
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("prctl(get-unalign)", ARG2, sizeof(Int));
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_SET_UNALIGN:
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int, value);
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_KEEPCAPS:
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ1(int, "prctl", int, option);
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_SET_KEEPCAPS:
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int, keepcaps);
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_FPEMU:
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int *, value);
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("prctl(get-fpemu)", ARG2, sizeof(Int));
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_SET_FPEMU:
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int, value);
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_FPEXC:
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int *, value);
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("prctl(get-fpexc)", ARG2, sizeof(Int));
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_SET_FPEXC:
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int, value);
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_TIMING:
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ1(int, "prctl", int, option);
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_SET_TIMING:
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int, timing);
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_SET_NAME:
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, char *, name);
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ("prctl(set-name)", ARG2);
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_NAME:
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, char *, name);
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("prctl(get-name)", ARG2, VKI_TASK_COMM_LEN);
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_ENDIAN:
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int *, value);
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("prctl(get-endian)", ARG2, sizeof(Int));
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_SET_ENDIAN:
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(int, "prctl", int, option, int, value);
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ5(long, "prctl",
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, unsigned long, arg2, unsigned long, arg3,
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned long, arg4, unsigned long, arg5);
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_prctl)
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1) {
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_PDEATHSIG:
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, sizeof(Int));
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_UNALIGN:
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, sizeof(Int));
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_FPEMU:
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, sizeof(Int));
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_FPEXC:
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, sizeof(Int));
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_NAME:
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, VKI_TASK_COMM_LEN);
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PR_GET_ENDIAN:
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, sizeof(Int));
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_PR_SET_NAME:
1033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      {
1034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         const HChar* new_name = (const HChar*) ARG2;
1035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (new_name) {    // Paranoia
1036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ThreadState* tst = VG_(get_ThreadState)(tid);
1037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            SizeT new_len = VG_(strlen)(new_name);
1038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Don't bother reusing the memory. This is a rare event. */
1040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            tst->thread_name =
1041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              VG_(arena_realloc)(VG_AR_CORE, "syswrap.prctl",
1042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 tst->thread_name, new_len + 1);
1043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            VG_(strcpy)(tst->thread_name, new_name);
1044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
1045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
1046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sendfile)
1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sendfile ( %ld, %ld, %#lx, %lu )", ARG1,ARG2,ARG3,ARG4);
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(ssize_t, "sendfile",
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, out_fd, int, in_fd, vki_off_t *, offset,
1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t, count);
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "sendfile(offset)", ARG3, sizeof(vki_off_t) );
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_sendfile)
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0 ) {
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof( vki_off_t ) );
1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sendfile64)
1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sendfile64 ( %ld, %ld, %#lx, %lu )",ARG1,ARG2,ARG3,ARG4);
1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(ssize_t, "sendfile64",
1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, out_fd, int, in_fd, vki_loff_t *, offset,
1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t, count);
1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "sendfile64(offset)", ARG3, sizeof(vki_loff_t) );
1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_sendfile64)
1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0 ) {
1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_loff_t) );
1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_futex)
1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*
1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      arg    param                              used by ops
1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1 - u32 *futex				all
1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG2 - int op
1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG3 - int val				WAIT,WAKE,FD,REQUEUE,CMP_REQUEUE
1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG4 - struct timespec *utime		WAIT:time*	REQUEUE,CMP_REQUEUE:val2
1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG5 - u32 *uaddr2			REQUEUE,CMP_REQUEUE
1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG6 - int val3				CMP_REQUEUE
1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    */
1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_futex ( %#lx, %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4,ARG5);
1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch(ARG2 & ~(VKI_FUTEX_PRIVATE_FLAG|VKI_FUTEX_CLOCK_REALTIME)) {
1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_CMP_REQUEUE:
1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAKE_OP:
1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_CMP_REQUEUE_PI:
1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ6(long, "futex",
1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_u32 *, futex, int, op, int, val,
1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    struct timespec *, utime, vki_u32 *, uaddr2, int, val3);
1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_REQUEUE:
1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAIT_REQUEUE_PI:
1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ5(long, "futex",
1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_u32 *, futex, int, op, int, val,
1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    struct timespec *, utime, vki_u32 *, uaddr2);
1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAIT_BITSET:
1112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Check that the address at least begins in client-accessible area. */
1113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (!VG_(am_is_valid_for_client)( ARG1, 1, VKI_PROT_READ )) {
1114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            SET_STATUS_Failure( VKI_EFAULT );
1115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            return;
1116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (*(vki_u32 *)ARG1 != ARG3) {
1118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         PRE_REG_READ5(long, "futex",
1119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       vki_u32 *, futex, int, op, int, val,
1120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       struct timespec *, utime, int, dummy);
1121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
1122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         PRE_REG_READ6(long, "futex",
1123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       vki_u32 *, futex, int, op, int, val,
1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       struct timespec *, utime, int, dummy, int, val3);
1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAKE_BITSET:
1128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ6(long, "futex",
1129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_u32 *, futex, int, op, int, val,
1130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, dummy, int, dummy2, int, val3);
1131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAIT:
1133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_LOCK_PI:
1134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "futex",
1135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_u32 *, futex, int, op, int, val,
1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    struct timespec *, utime);
1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAKE:
1139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_FD:
1140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_TRYLOCK_PI:
1141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "futex",
1142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_u32 *, futex, int, op, int, val);
1143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_UNLOCK_PI:
1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "futex", vki_u32 *, futex, int, op);
1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch(ARG2 & ~(VKI_FUTEX_PRIVATE_FLAG|VKI_FUTEX_CLOCK_REALTIME)) {
1153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAIT:
1154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_LOCK_PI:
1155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAIT_BITSET:
1156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAIT_REQUEUE_PI:
1157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
1158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG4 != 0)
1159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 PRE_MEM_READ( "futex(timeout)", ARG4, sizeof(struct vki_timespec) );
1160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_REQUEUE:
1163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_CMP_REQUEUE:
1164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_CMP_REQUEUE_PI:
1165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAKE_OP:
1166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
1167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "futex(futex2)", ARG5, sizeof(Int) );
1168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_FD:
1171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_TRYLOCK_PI:
1172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_UNLOCK_PI:
1173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
1174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
1175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAKE:
1177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FUTEX_WAKE_BITSET:
1178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* no additional pointers */
1179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
1182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_ENOSYS );   // some futex function we don't understand
1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_futex)
1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG1, sizeof(int) );
1190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == VKI_FUTEX_FD) {
1191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!ML_(fd_allowed)(RES, "futex", tid, True)) {
1192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(close)(RES);
1193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EMFILE );
1194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
1195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (VG_(clo_track_fds))
1196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(record_fd_open_nameless)(tid, RES);
1197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_set_robust_list)
1202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_set_robust_list ( %#lx, %ld )", ARG1,ARG2);
1204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "set_robust_list",
1205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct vki_robust_list_head *, head, vki_size_t, len);
1206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Just check the robust_list_head structure is readable - don't
1208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      try and chase the list as the kernel will only read it when
1209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      the thread exits so the current contents is irrelevant. */
1210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 != 0)
1211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("set_robust_list(head)", ARG1, ARG2);
1212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_get_robust_list)
1215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_get_robust_list ( %ld, %#lx, %ld )", ARG1,ARG2,ARG3);
1217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "get_robust_list",
1218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, pid,
1219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct vki_robust_list_head **, head_ptr,
1220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t *, len_ptr);
1221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("get_robust_list(head_ptr)",
1222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 ARG2, sizeof(struct vki_robust_list_head *));
1223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("get_robust_list(len_ptr)",
1224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 ARG3, sizeof(struct vki_size_t *));
1225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_get_robust_list)
1227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG2, sizeof(struct vki_robust_list_head *));
1229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG3, sizeof(struct vki_size_t *));
1230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_pselect6)
1233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_pselect6 ( %ld, %#lx, %#lx, %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
1236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "pselect6",
1237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, n, vki_fd_set *, readfds, vki_fd_set *, writefds,
1238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_fd_set *, exceptfds, struct vki_timeval *, timeout,
1239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, sig);
1240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // XXX: this possibly understates how much memory is read.
1241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
1242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "pselect6(readfds)",
1243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ARG2, ARG1/8 /* __FD_SETSIZE/8 */ );
1244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
1245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "pselect6(writefds)",
1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ARG3, ARG1/8 /* __FD_SETSIZE/8 */ );
1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4 != 0)
1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "pselect6(exceptfds)",
1249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ARG4, ARG1/8 /* __FD_SETSIZE/8 */ );
1250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5 != 0)
1251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "pselect6(timeout)", ARG5, sizeof(struct vki_timeval) );
1252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG6 != 0)
1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "pselect6(sig)", ARG6, sizeof(void *)+sizeof(vki_size_t) );
1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_ppoll)
1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt i;
1259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_pollfd* ufds = (struct vki_pollfd *)ARG1;
1260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_ppoll ( %#lx, %ld, %#lx, %#lx, %llu )\n", ARG1,ARG2,ARG3,ARG4,(ULong)ARG5);
1262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "ppoll",
1263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct vki_pollfd *, ufds, unsigned int, nfds,
1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct vki_timespec *, tsp, vki_sigset_t *, sigmask,
1265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t, sigsetsize);
1266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < ARG2; i++) {
1268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ppoll(ufds.fd)",
1269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)(&ufds[i].fd), sizeof(ufds[i].fd) );
1270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ppoll(ufds.events)",
1271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)(&ufds[i].events), sizeof(ufds[i].events) );
1272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_WRITE( "ppoll(ufd.revents)",
1273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)(&ufds[i].revents), sizeof(ufds[i].revents) );
1274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3)
1277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ppoll(tsp)", ARG3, sizeof(struct vki_timespec) );
1278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4)
1279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ppoll(sigmask)", ARG4, sizeof(vki_sigset_t) );
1280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_ppoll)
1283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0) {
1285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt i;
1286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      struct vki_pollfd* ufds = (struct vki_pollfd *)ARG1;
1287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (i = 0; i < ARG2; i++)
1288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 POST_MEM_WRITE( (Addr)(&ufds[i].revents), sizeof(ufds[i].revents) );
1289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
1294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   epoll_* wrappers
1295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
1296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_epoll_create)
1298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_epoll_create ( %ld )", ARG1);
1300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "epoll_create", int, size);
1301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_epoll_create)
1303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "epoll_create", tid, True)) {
1306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
1307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
1308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
1309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
1310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless) (tid, RES);
1311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_epoll_create1)
1315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_epoll_create1 ( %ld )", ARG1);
1317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "epoll_create1", int, flags);
1318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_epoll_create1)
1320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "epoll_create1", tid, True)) {
1323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
1324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
1325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
1326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
1327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless) (tid, RES);
1328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_epoll_ctl)
1332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static const HChar* epoll_ctl_s[3] = {
1334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "EPOLL_CTL_ADD",
1335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "EPOLL_CTL_DEL",
1336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "EPOLL_CTL_MOD"
1337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   };
1338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_epoll_ctl ( %ld, %s, %ld, %#lx )",
1339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ( ARG2<3 ? epoll_ctl_s[ARG2] : "?" ), ARG3, ARG4);
1340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "epoll_ctl",
1341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, epfd, int, op, int, fd, struct vki_epoll_event *, event);
1342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != VKI_EPOLL_CTL_DEL)
1343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "epoll_ctl(event)", ARG4, sizeof(struct vki_epoll_event) );
1344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_epoll_wait)
1347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_epoll_wait ( %ld, %#lx, %ld, %ld )", ARG1, ARG2, ARG3, ARG4);
1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "epoll_wait",
1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, epfd, struct vki_epoll_event *, events,
1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, maxevents, int, timeout);
1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "epoll_wait(events)", ARG2, sizeof(struct vki_epoll_event)*ARG3);
1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_epoll_wait)
1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0)
1359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(struct vki_epoll_event)*RES ) ;
1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_epoll_pwait)
1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_epoll_pwait ( %ld, %#lx, %ld, %ld, %#lx, %llu )", ARG1,ARG2,ARG3,ARG4,ARG5,(ULong)ARG6);
1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "epoll_pwait",
1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, epfd, struct vki_epoll_event *, events,
1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, maxevents, int, timeout, vki_sigset_t *, sigmask,
1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t, sigsetsize);
1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "epoll_pwait(events)", ARG2, sizeof(struct vki_epoll_event)*ARG3);
1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4)
1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "epoll_pwait(sigmask)", ARG5, sizeof(vki_sigset_t) );
1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_epoll_pwait)
1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0)
1378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(struct vki_epoll_event)*RES ) ;
1379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_eventfd)
1382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_eventfd ( %lu )", ARG1);
1384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "sys_eventfd", unsigned int, count);
1385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_eventfd)
1387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "eventfd", tid, True)) {
1389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
1390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
1391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
1392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
1393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless) (tid, RES);
1394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_eventfd2)
1398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_eventfd2 ( %lu, %ld )", ARG1,ARG2);
1400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "sys_eventfd2", unsigned int, count, int, flags);
1401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_eventfd2)
1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "eventfd2", tid, True)) {
1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
1406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless) (tid, RES);
1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fallocate)
1414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
1417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fallocate ( %ld, %ld, %lld, %lld )",
1418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, MERGE64(ARG3,ARG4), MERGE64(ARG5,ARG6));
1419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "fallocate",
1420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, int, mode,
1421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned, MERGE64_FIRST(offset), unsigned, MERGE64_SECOND(offset),
1422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned, MERGE64_FIRST(len), unsigned, MERGE64_SECOND(len));
1423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif VG_WORDSIZE == 8
1424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fallocate ( %ld, %ld, %lld, %lld )",
1425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, (Long)ARG3, (Long)ARG4);
1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "fallocate",
1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, int, mode, vki_loff_t, offset, vki_loff_t, len);
1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  error Unexpected word size
1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "fallocate", tid, False))
1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_prlimit64)
1436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_prlimit64 ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
1438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ4(long, "prlimit64",
1439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 vki_pid_t, pid, unsigned int, resource,
1440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 const struct rlimit64 *, new_rlim,
1441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 struct rlimit64 *, old_rlim);
1442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (ARG3)
1443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "rlimit64(new_rlim)", ARG3, sizeof(struct vki_rlimit64) );
1444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (ARG4)
1445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "rlimit64(old_rlim)", ARG4, sizeof(struct vki_rlimit64) );
1446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (ARG3 &&
1448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       ((struct vki_rlimit64 *)ARG3)->rlim_cur > ((struct vki_rlimit64 *)ARG3)->rlim_max) {
1449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      SET_STATUS_Failure( VKI_EINVAL );
1450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else if (ARG1 == 0 || ARG1 == VG_(getpid)()) {
1452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      switch (ARG2) {
1453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case VKI_RLIMIT_NOFILE:
1454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         SET_STATUS_Success( 0 );
1455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (ARG4) {
1456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(fd_soft_limit);
1457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(fd_hard_limit);
1458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (ARG3) {
1460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (((struct vki_rlimit64 *)ARG3)->rlim_cur > VG_(fd_hard_limit) ||
1461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                ((struct vki_rlimit64 *)ARG3)->rlim_max != VG_(fd_hard_limit)) {
1462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               SET_STATUS_Failure( VKI_EPERM );
1463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            else {
1465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               VG_(fd_soft_limit) = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
1466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case VKI_RLIMIT_DATA:
1471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         SET_STATUS_Success( 0 );
1472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (ARG4) {
1473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(client_rlimit_data).rlim_cur;
1474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(client_rlimit_data).rlim_max;
1475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (ARG3) {
1477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (((struct vki_rlimit64 *)ARG3)->rlim_cur > VG_(client_rlimit_data).rlim_max ||
1478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                ((struct vki_rlimit64 *)ARG3)->rlim_max > VG_(client_rlimit_data).rlim_max) {
1479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               SET_STATUS_Failure( VKI_EPERM );
1480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            else {
1482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               VG_(client_rlimit_data).rlim_cur = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
1483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               VG_(client_rlimit_data).rlim_max = ((struct vki_rlimit64 *)ARG3)->rlim_max;
1484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case VKI_RLIMIT_STACK:
1489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         SET_STATUS_Success( 0 );
1490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (ARG4) {
1491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(client_rlimit_stack).rlim_cur;
1492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(client_rlimit_stack).rlim_max;
1493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (ARG3) {
1495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (((struct vki_rlimit64 *)ARG3)->rlim_cur > VG_(client_rlimit_stack).rlim_max ||
1496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                ((struct vki_rlimit64 *)ARG3)->rlim_max > VG_(client_rlimit_stack).rlim_max) {
1497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               SET_STATUS_Failure( VKI_EPERM );
1498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            else {
1500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               VG_(threads)[tid].client_stack_szB = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
1501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               VG_(client_rlimit_stack).rlim_cur = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
1502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               VG_(client_rlimit_stack).rlim_max = ((struct vki_rlimit64 *)ARG3)->rlim_max;
1503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           }
1504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
1507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
1508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1510663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPOST(sys_prlimit64)
1511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (ARG4)
1513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      POST_MEM_WRITE( ARG4, sizeof(struct vki_rlimit64) );
1514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
1517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tid-related wrappers
1518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
1519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_gettid)
1521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_gettid ()");
1523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "gettid");
1524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_set_tid_address)
1527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_set_tid_address ( %#lx )", ARG1);
1529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "set_tid_address", int *, tidptr);
1530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_tkill)
1533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_tgkill ( %ld, %ld )", ARG1,ARG2);
1535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "tkill", int, tid, int, sig);
1536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(client_signal_OK)(ARG2)) {
1537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
1538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if this kill gave us a pending signal */
1542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfPollAfter;
1543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (VG_(clo_trace_signals))
1545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_DebugMsg, "tkill: sending signal %ld to pid %ld\n",
1546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		   ARG2, ARG1);
1547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* If we're sending SIGKILL, check to see if the target is one of
1549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      our threads and handle it specially. */
1550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == VKI_SIGKILL && ML_(do_sigkill)(ARG1, -1)) {
1551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Success(0);
1552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Ask to handle this syscall via the slow route, since that's the
1556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      only one that sets tst->status to VgTs_WaitSys.  If the result
1557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      of doing the syscall is an immediate run of
1558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      async_signalhandler() in m_signals, then we need the thread to
1559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      be properly tidied away.  I have the impression the previous
1560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      version of this wrapper worked on x86/amd64 only because the
1561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kernel did not immediately deliver the async signal to this
1562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      thread (on ppc it did, which broke the assertion re tst->status
1563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      at the top of async_signalhandler()). */
1564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_tkill)
1567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (VG_(clo_trace_signals))
1569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_DebugMsg, "tkill: sent signal %ld to pid %ld\n",
1570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   ARG2, ARG1);
1571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_tgkill)
1574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_tgkill ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
1576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "tgkill", int, tgid, int, tid, int, sig);
1577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(client_signal_OK)(ARG3)) {
1578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
1579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if this kill gave us a pending signal */
1583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfPollAfter;
1584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (VG_(clo_trace_signals))
1586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_DebugMsg,
1587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "tgkill: sending signal %ld to pid %ld/%ld\n",
1588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		   ARG3, ARG1, ARG2);
1589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* If we're sending SIGKILL, check to see if the target is one of
1591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      our threads and handle it specially. */
1592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 == VKI_SIGKILL && ML_(do_sigkill)(ARG2, ARG1)) {
1593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Success(0);
1594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Ask to handle this syscall via the slow route, since that's the
1598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      only one that sets tst->status to VgTs_WaitSys.  If the result
1599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      of doing the syscall is an immediate run of
1600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      async_signalhandler() in m_signals, then we need the thread to
1601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      be properly tidied away.  I have the impression the previous
1602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      version of this wrapper worked on x86/amd64 only because the
1603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kernel did not immediately deliver the async signal to this
1604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      thread (on ppc it did, which broke the assertion re tst->status
1605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      at the top of async_signalhandler()). */
1606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_tgkill)
1609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (VG_(clo_trace_signals))
1611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_DebugMsg,
1612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "tgkill: sent signal %ld to pid %ld/%ld\n",
1613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   ARG3, ARG1, ARG2);
1614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
1617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fadvise64* wrappers
1618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
1619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fadvise64)
1621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fadvise64 ( %ld, %lld, %lu, %ld )",
1623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, MERGE64(ARG2,ARG3), ARG4, ARG5);
1624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "fadvise64",
1625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, vki_u32, MERGE64_FIRST(offset), vki_u32, MERGE64_SECOND(offset),
1626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t, len, int, advice);
1627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fadvise64_64)
1630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fadvise64_64 ( %ld, %lld, %lld, %ld )",
1632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, MERGE64(ARG2,ARG3), MERGE64(ARG4,ARG5), ARG6);
1633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "fadvise64_64",
1634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, vki_u32, MERGE64_FIRST(offset), vki_u32, MERGE64_SECOND(offset),
1635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_u32, MERGE64_FIRST(len), vki_u32, MERGE64_SECOND(len), int, advice);
1636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
1639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   io_* wrappers
1640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
1641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Nb: this wrapper has to pad/unpad memory around the syscall itself,
1643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// and this allows us to control exactly the code that gets run while
1644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// the padding is in place.
1645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_io_setup)
1647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_io_setup ( %lu, %#lx )", ARG1,ARG2);
1649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "io_setup",
1650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned, nr_events, vki_aio_context_t *, ctxp);
1651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "io_setup(ctxp)", ARG2, sizeof(vki_aio_context_t) );
1652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_io_setup)
1655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SizeT size;
1657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_aio_ring *r;
1658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) +
1660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       ARG1*sizeof(struct vki_io_event));
1661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = *(struct vki_aio_ring **)ARG2;
1662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(ML_(valid_client_addr)((Addr)r, size, tid, "io_setup"));
1663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(notify_core_and_tool_of_mmap)( (Addr)r, size,
1665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      VKI_PROT_READ | VKI_PROT_WRITE,
1666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      VKI_MAP_ANONYMOUS, -1, 0 );
1667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(vki_aio_context_t) );
1669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Nb: This wrapper is "Special" because we need 'size' to do the unmap
1672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// after the syscall.  We must get 'size' from the aio_ring structure,
1673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// before the syscall, while the aio_ring structure still exists.  (And we
1674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// know that we must look at the aio_ring structure because Tom inspected the
1675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// kernel and glibc sources to see what they do, yuk.)
1676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
1677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// XXX This segment can be implicitly unmapped when aio
1678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// file-descriptors are closed...
1679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_io_destroy)
1680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SizeT size = 0;
1682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_io_destroy ( %llu )", (ULong)ARG1);
1684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "io_destroy", vki_aio_context_t, ctx);
1685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // If we are going to seg fault (due to a bogus ARG1) do it as late as
1687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // possible...
1688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG1, sizeof(struct vki_aio_ring))) {
1689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      struct vki_aio_ring *r = (struct vki_aio_ring *)ARG1;
1690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) +
1691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          r->nr*sizeof(struct vki_io_event));
1692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes( VG_(do_syscall1)(SYSNO, ARG1) );
1695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS && RES == 0) {
1697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool d = VG_(am_notify_munmap)( ARG1, size );
1698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_TRACK( die_mem_munmap, ARG1, size );
1699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (d)
1700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(discard_translations)( (Addr64)ARG1, (ULong)size,
1701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    "PRE(sys_io_destroy)" );
1702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_io_getevents)
1706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_io_getevents ( %llu, %lld, %lld, %#lx, %#lx )",
1709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (ULong)ARG1,(Long)ARG2,(Long)ARG3,ARG4,ARG5);
1710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "io_getevents",
1711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_aio_context_t, ctx_id, long, min_nr, long, nr,
1712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct io_event *, events,
1713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct timespec *, timeout);
1714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 > 0)
1715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "io_getevents(events)",
1716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     ARG4, sizeof(struct vki_io_event)*ARG3 );
1717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5 != 0)
1718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "io_getevents(timeout)",
1719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    ARG5, sizeof(struct vki_timespec));
1720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_io_getevents)
1722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int i;
1724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0) {
1726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof(struct vki_io_event)*RES );
1727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (i = 0; i < RES; i++) {
1728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         const struct vki_io_event *vev = ((struct vki_io_event *)ARG4) + i;
1729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         const struct vki_iocb *cb = (struct vki_iocb *)(Addr)vev->obj;
1730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch (cb->aio_lio_opcode) {
1732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_PREAD:
1733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (vev->result > 0)
1734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               POST_MEM_WRITE( cb->aio_buf, vev->result );
1735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_PWRITE:
1738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_FSYNC:
1741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_FDSYNC:
1744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_PREADV:
1747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	     if (vev->result > 0) {
1748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  struct vki_iovec * vec = (struct vki_iovec *)(Addr)cb->aio_buf;
1749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  Int remains = vev->result;
1750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  Int j;
1751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  for (j = 0; j < cb->aio_nbytes; j++) {
1753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       Int nReadThisBuf = vec[j].iov_len;
1754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       if (nReadThisBuf > remains) nReadThisBuf = remains;
1755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       POST_MEM_WRITE( (Addr)vec[j].iov_base, nReadThisBuf );
1756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       remains -= nReadThisBuf;
1757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       if (remains < 0) VG_(core_panic)("io_getevents(PREADV): remains < 0");
1758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  }
1759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	     }
1760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             break;
1761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_PWRITEV:
1763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             break;
1764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         default:
1766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            VG_(message)(Vg_DebugMsg,
1767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        "Warning: unhandled io_getevents opcode: %u\n",
1768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        cb->aio_lio_opcode);
1769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
1771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_io_submit)
1776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int i, j;
1778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_io_submit ( %llu, %ld, %#lx )", (ULong)ARG1,ARG2,ARG3);
1780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "io_submit",
1781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_aio_context_t, ctx_id, long, nr,
1782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct iocb **, iocbpp);
1783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "io_submit(iocbpp)", ARG3, ARG2*sizeof(struct vki_iocb *) );
1784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0) {
1785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (i = 0; i < ARG2; i++) {
1786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_iocb *cb = ((struct vki_iocb **)ARG3)[i];
1787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_iovec *iov;
1788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "io_submit(iocb)", (Addr)cb, sizeof(struct vki_iocb) );
1790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch (cb->aio_lio_opcode) {
1791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_PREAD:
1792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_WRITE( "io_submit(PREAD)", cb->aio_buf, cb->aio_nbytes );
1793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_PWRITE:
1796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_READ( "io_submit(PWRITE)", cb->aio_buf, cb->aio_nbytes );
1797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_FSYNC:
1800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_FDSYNC:
1803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_PREADV:
1806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            iov = (struct vki_iovec *)(Addr)cb->aio_buf;
1807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_READ( "io_submit(PREADV)", cb->aio_buf, cb->aio_nbytes * sizeof(struct vki_iovec) );
1808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for (j = 0; j < cb->aio_nbytes; j++)
1809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                PRE_MEM_WRITE( "io_submit(PREADV(iov[i]))", (Addr)iov[j].iov_base, iov[j].iov_len );
1810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case VKI_IOCB_CMD_PWRITEV:
1813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            iov = (struct vki_iovec *)(Addr)cb->aio_buf;
1814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_READ( "io_submit(PWRITEV)", cb->aio_buf, cb->aio_nbytes * sizeof(struct vki_iovec) );
1815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for (j = 0; j < cb->aio_nbytes; j++)
1816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                PRE_MEM_READ( "io_submit(PWRITEV(iov[i]))", (Addr)iov[j].iov_base, iov[j].iov_len );
1817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         default:
1820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            VG_(message)(Vg_DebugMsg,"Warning: unhandled io_submit opcode: %u\n",
1821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         cb->aio_lio_opcode);
1822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
1823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
1824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_io_cancel)
1829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_io_cancel ( %llu, %#lx, %#lx )", (ULong)ARG1,ARG2,ARG3);
1831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "io_cancel",
1832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_aio_context_t, ctx_id, struct iocb *, iocb,
1833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct io_event *, result);
1834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "io_cancel(iocb)", ARG2, sizeof(struct vki_iocb) );
1835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "io_cancel(result)", ARG3, sizeof(struct vki_io_event) );
1836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_io_cancel)
1838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG3, sizeof(struct vki_io_event) );
1840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
1843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *_mempolicy wrappers
1844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
1845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mbind)
1847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mbind ( %#lx, %lu, %ld, %#lx, %lu, %lu )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
1849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "mbind",
1850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, start, unsigned long, len,
1851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, policy, unsigned long *, nodemask,
1852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, maxnode, unsigned, flags);
1853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 != 0)
1854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "mbind(nodemask)", ARG4,
1855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    VG_ROUNDUP( ARG5-1, sizeof(UWord) * 8 ) / 8 );
1856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_set_mempolicy)
1859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_set_mempolicy ( %ld, %#lx, %ld )", ARG1,ARG2,ARG3);
1861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "set_mempolicy",
1862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, policy, unsigned long *, nodemask,
1863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, maxnode);
1864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "set_mempolicy(nodemask)", ARG2,
1865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 VG_ROUNDUP( ARG3-1, sizeof(UWord) * 8 ) / 8 );
1866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_get_mempolicy)
1869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_get_mempolicy ( %#lx, %#lx, %ld, %#lx, %lx )", ARG1,ARG2,ARG3,ARG4,ARG5);
1871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "get_mempolicy",
1872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int *, policy, unsigned long *, nodemask,
1873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, maxnode, unsigned long, addr,
1874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, flags);
1875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 != 0)
1876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "get_mempolicy(policy)", ARG1, sizeof(Int) );
1877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
1878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "get_mempolicy(nodemask)", ARG2,
1879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     VG_ROUNDUP( ARG3-1, sizeof(UWord) * 8 ) / 8 );
1880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_get_mempolicy)
1882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 != 0)
1884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG1, sizeof(Int) );
1885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
1886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG2, VG_ROUNDUP( ARG3-1, sizeof(UWord) * 8 ) / 8 );
1887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
1890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   fanotify_* wrappers
1891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ------------------------------------------------------------------ */
1892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_fanotify_init)
1894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_fanotify_init ( %lu, %lu )", ARG1,ARG2);
1896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ2(long, "fanotify_init",
1897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 unsigned int, flags, unsigned int, event_f_flags);
1898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_fanotify_init)
1901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
1903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (!ML_(fd_allowed)(RES, "fanotify_init", tid, True)) {
1904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(close)(RES);
1905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      SET_STATUS_Failure( VKI_EMFILE );
1906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
1907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (VG_(clo_track_fds))
1908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ML_(record_fd_open_nameless) (tid, RES);
1909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_fanotify_mark)
1913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if VG_WORDSIZE == 4
1915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT( "sys_fanotify_mark ( %ld, %lu, %llu, %ld, %#lx(%s))",
1916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          ARG1,ARG2,MERGE64(ARG3,ARG4),ARG5,ARG6,(char *)ARG6);
1917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ6(long, "sys_fanotify_mark",
1918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, fanotify_fd, unsigned int, flags,
1919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 __vki_u32, mask0, __vki_u32, mask1,
1920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, dfd, const char *, pathname);
1921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (ARG6)
1922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_RASCIIZ( "fanotify_mark(path)", ARG6);
1923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#elif VG_WORDSIZE == 8
1924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT( "sys_fanotify_mark ( %ld, %lu, %llu, %ld, %#lx(%s))",
1925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           ARG1,ARG2,(ULong)ARG3,ARG4,ARG5,(char *)ARG5);
1926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ5(long, "sys_fanotify_mark",
1927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, fanotify_fd, unsigned int, flags,
1928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 __vki_u64, mask,
1929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, dfd, const char *, pathname);
1930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (ARG5)
1931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_RASCIIZ( "fanotify_mark(path)", ARG5);
1932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
1933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  error Unexpected word size
1934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
1935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* ---------------------------------------------------------------------
1938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   inotify_* wrappers
1939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
1940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_inotify_init)
1942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_inotify_init ( )");
1944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "inotify_init");
1945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_inotify_init)
1947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "inotify_init", tid, True)) {
1950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
1951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
1952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
1953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
1954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless) (tid, RES);
1955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_inotify_init1)
1959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_inotify_init ( %ld )", ARG1);
1961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "inotify_init", int, flag);
1962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_inotify_init1)
1965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "inotify_init", tid, True)) {
1968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
1969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
1970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
1971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
1972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless) (tid, RES);
1973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_inotify_add_watch)
1977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "sys_inotify_add_watch ( %ld, %#lx, %lx )", ARG1,ARG2,ARG3);
1979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "inotify_add_watch", int, fd, char *, path, int, mask);
1980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "inotify_add_watch(path)", ARG2 );
1981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_inotify_rm_watch)
1984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "sys_inotify_rm_watch ( %ld, %lx )", ARG1,ARG2);
1986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "inotify_rm_watch", int, fd, int, wd);
1987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
1990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mq_* wrappers
1991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
1992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mq_open)
1994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mq_open( %#lx(%s), %ld, %lld, %#lx )",
1996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,(char*)ARG1,ARG2,(ULong)ARG3,ARG4);
1997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "mq_open",
1998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *, name, int, oflag, vki_mode_t, mode,
1999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct mq_attr *, attr);
2000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "mq_open(name)", ARG1 );
2001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((ARG2 & VKI_O_CREAT) != 0 && ARG4 != 0) {
2002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      const struct vki_mq_attr *attr = (struct vki_mq_attr *)ARG4;
2003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "mq_open(attr->mq_maxmsg)",
2004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&attr->mq_maxmsg, sizeof(attr->mq_maxmsg) );
2005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "mq_open(attr->mq_msgsize)",
2006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&attr->mq_msgsize, sizeof(attr->mq_msgsize) );
2007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_mq_open)
2010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
2012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "mq_open", tid, True)) {
2013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
2014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
2015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
2016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
2017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG1);
2018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mq_unlink)
2022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mq_unlink ( %#lx(%s) )", ARG1,(char*)ARG1);
2024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "mq_unlink", const char *, name);
2025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "mq_unlink(name)", ARG1 );
2026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mq_timedsend)
2029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mq_timedsend ( %ld, %#lx, %llu, %ld, %#lx )",
2032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,ARG2,(ULong)ARG3,ARG4,ARG5);
2033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "mq_timedsend",
2034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_mqd_t, mqdes, const char *, msg_ptr, vki_size_t, msg_len,
2035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, msg_prio, const struct timespec *, abs_timeout);
2036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "mq_timedsend", tid, False)) {
2037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
2038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
2039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "mq_timedsend(msg_ptr)", ARG2, ARG3 );
2040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG5 != 0)
2041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "mq_timedsend(abs_timeout)", ARG5,
2042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        sizeof(struct vki_timespec) );
2043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mq_timedreceive)
2047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mq_timedreceive( %ld, %#lx, %llu, %#lx, %#lx )",
2050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,ARG2,(ULong)ARG3,ARG4,ARG5);
2051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(ssize_t, "mq_timedreceive",
2052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_mqd_t, mqdes, char *, msg_ptr, vki_size_t, msg_len,
2053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int *, msg_prio,
2054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct timespec *, abs_timeout);
2055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "mq_timedreceive", tid, False)) {
2056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
2057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
2058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "mq_timedreceive(msg_ptr)", ARG2, ARG3 );
2059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG4 != 0)
2060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE( "mq_timedreceive(msg_prio)",
2061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        ARG4, sizeof(unsigned int) );
2062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG5 != 0)
2063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "mq_timedreceive(abs_timeout)",
2064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        ARG5, sizeof(struct vki_timespec) );
2065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_mq_timedreceive)
2068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, RES );
2070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4 != 0)
2071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof(unsigned int) );
2072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mq_notify)
2075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mq_notify( %ld, %#lx )", ARG1,ARG2 );
2077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "mq_notify",
2078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_mqd_t, mqdes, const struct sigevent *, notification);
2079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "mq_notify", tid, False))
2080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
2081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else if (ARG2 != 0)
2082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "mq_notify(notification)",
2083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    ARG2, sizeof(struct vki_sigevent) );
2084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mq_getsetattr)
2087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mq_getsetattr( %ld, %#lx, %#lx )", ARG1,ARG2,ARG3 );
2089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "mq_getsetattr",
2090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_mqd_t, mqdes, const struct mq_attr *, mqstat,
2091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct mq_attr *, omqstat);
2092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "mq_getsetattr", tid, False)) {
2093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
2094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
2095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG2 != 0) {
2096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         const struct vki_mq_attr *attr = (struct vki_mq_attr *)ARG2;
2097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "mq_getsetattr(mqstat->mq_flags)",
2098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        (Addr)&attr->mq_flags, sizeof(attr->mq_flags) );
2099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3 != 0)
2101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE( "mq_getsetattr(omqstat)", ARG3,
2102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        sizeof(struct vki_mq_attr) );
2103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_mq_getsetattr)
2106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
2108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_mq_attr) );
2109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
2112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   clock_* wrappers
2113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
2114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clock_settime)
2116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_clock_settime( %ld, %#lx )", ARG1,ARG2);
2118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "clock_settime",
2119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_clockid_t, clk_id, const struct timespec *, tp);
2120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "clock_settime(tp)", ARG2, sizeof(struct vki_timespec) );
2121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clock_gettime)
2124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_clock_gettime( %ld, %#lx )" , ARG1,ARG2);
2126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "clock_gettime",
2127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_clockid_t, clk_id, struct timespec *, tp);
2128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "clock_gettime(tp)", ARG2, sizeof(struct vki_timespec) );
2129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_clock_gettime)
2131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
2133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clock_getres)
2136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_clock_getres( %ld, %#lx )" , ARG1,ARG2);
2138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Nb: we can't use "RES" as the param name because that's a macro
2139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // defined above!
2140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "clock_getres",
2141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_clockid_t, clk_id, struct timespec *, res);
2142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
2143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "clock_getres(res)", ARG2, sizeof(struct vki_timespec) );
2144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_clock_getres)
2146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
2148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
2149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clock_nanosleep)
2152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock|SfPostOnFail;
2154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_clock_nanosleep( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
2155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int32_t, "clock_nanosleep",
2156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_clockid_t, clkid, int, flags,
2157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct timespec *, rqtp, struct timespec *, rmtp);
2158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "clock_nanosleep(rqtp)", ARG3, sizeof(struct vki_timespec) );
2159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4 != 0)
2160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "clock_nanosleep(rmtp)", ARG4, sizeof(struct vki_timespec) );
2161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_clock_nanosleep)
2163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4 != 0 && FAILURE && ERR == VKI_EINTR)
2165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof(struct vki_timespec) );
2166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
2169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   timer_* wrappers
2170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
2171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_timer_create)
2173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_timer_create( %ld, %#lx, %#lx )", ARG1,ARG2,ARG3);
2175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "timer_create",
2176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_clockid_t, clockid, struct sigevent *, evp,
2177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_timer_t *, timerid);
2178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (ARG2 != 0) {
2179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      struct vki_sigevent *evp = (struct vki_sigevent *) ARG2;
2180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ( "timer_create(evp.sigev_value)", (Addr)&evp->sigev_value,
2181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    sizeof(vki_sigval_t) );
2182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ( "timer_create(evp.sigev_signo)", (Addr)&evp->sigev_signo,
2183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    sizeof(int) );
2184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ( "timer_create(evp.sigev_notify)", (Addr)&evp->sigev_notify,
2185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    sizeof(int) );
2186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ML_(safe_to_deref)(&evp->sigev_notify, sizeof(int))
2187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          && (evp->sigev_notify & VKI_SIGEV_THREAD_ID) != 0)
2188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ( "timer_create(evp.sigev_notify_thread_id)",
2189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       (Addr)&evp->vki_sigev_notify_thread_id, sizeof(int) );
2190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
2191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "timer_create(timerid)", ARG3, sizeof(vki_timer_t) );
2192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_timer_create)
2194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG3, sizeof(vki_timer_t) );
2196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_timer_settime)
2199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_timer_settime( %lld, %ld, %#lx, %#lx )", (ULong)ARG1,ARG2,ARG3,ARG4);
2201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "timer_settime",
2202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_timer_t, timerid, int, flags,
2203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct itimerspec *, value,
2204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct itimerspec *, ovalue);
2205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "timer_settime(value)", ARG3,
2206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  sizeof(struct vki_itimerspec) );
2207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4 != 0)
2208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRE_MEM_WRITE( "timer_settime(ovalue)", ARG4,
2209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(struct vki_itimerspec) );
2210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_timer_settime)
2212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4 != 0)
2214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof(struct vki_itimerspec) );
2215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_timer_gettime)
2218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_timer_gettime( %lld, %#lx )", (ULong)ARG1,ARG2);
2220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "timer_gettime",
2221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_timer_t, timerid, struct itimerspec *, value);
2222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "timer_gettime(value)", ARG2,
2223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  sizeof(struct vki_itimerspec));
2224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_timer_gettime)
2226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_itimerspec) );
2228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_timer_getoverrun)
2231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_timer_getoverrun( %#lx )", ARG1);
2233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "timer_getoverrun", vki_timer_t, timerid);
2234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_timer_delete)
2237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_timer_delete( %#lx )", ARG1);
2239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "timer_delete", vki_timer_t, timerid);
2240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
2243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   timerfd* wrappers
2244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   See also http://lwn.net/Articles/260172/ for an overview.
2245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   See also /usr/src/linux/fs/timerfd.c for the implementation.
2246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
2247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Returns True if running on 2.6.22, else False (or False if
2249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cannot be determined). */
2250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic Bool linux_kernel_2_6_22(void)
2251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static Int result = -1;
2253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int fd, read;
2254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HChar release[64];
2255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes res;
2256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (result == -1) {
2258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = VG_(open)("/proc/sys/kernel/osrelease", 0, 0);
2259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (sr_isError(res))
2260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return False;
2261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fd = sr_Res(res);
2262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      read = VG_(read)(fd, release, sizeof(release) - 1);
2263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(read >= 0);
2264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      release[read] = 0;
2265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(fd);
2266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //VG_(printf)("kernel release = %s\n", release);
2267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      result = (VG_(strncmp)(release, "2.6.22", 6) == 0
2268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                && (release[6] < '0' || release[6] > '9'));
2269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(result == 0 || result == 1);
2271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return result == 1;
2272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_timerfd_create)
2275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (linux_kernel_2_6_22()) {
2277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* 2.6.22 kernel: timerfd system call. */
2278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_timerfd ( %ld, %ld, %#lx )", ARG1, ARG2, ARG3);
2279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "sys_timerfd",
2280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, fd, int, clockid, const struct itimerspec *, tmr);
2281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("timerfd(tmr)", ARG3,
2282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   sizeof(struct vki_itimerspec) );
2283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ((Word)ARG1 != -1L && !ML_(fd_allowed)(ARG1, "timerfd", tid, False))
2284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EBADF );
2285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
2286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* 2.6.24 and later kernels: timerfd_create system call. */
2287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_timerfd_create (%ld, %ld )", ARG1, ARG2);
2288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "timerfd_create", int, clockid, int, flags);
2289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_timerfd_create)
2292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (linux_kernel_2_6_22())
2294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
2295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* 2.6.22 kernel: timerfd system call. */
2296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!ML_(fd_allowed)(RES, "timerfd", tid, True)) {
2297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(close)(RES);
2298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EMFILE );
2299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
2300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (VG_(clo_track_fds))
2301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(record_fd_open_nameless) (tid, RES);
2302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else
2305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
2306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* 2.6.24 and later kernels: timerfd_create system call. */
2307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!ML_(fd_allowed)(RES, "timerfd_create", tid, True)) {
2308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(close)(RES);
2309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EMFILE );
2310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
2311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (VG_(clo_track_fds))
2312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(record_fd_open_nameless) (tid, RES);
2313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_timerfd_gettime)
2318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_timerfd_gettime ( %ld, %#lx )", ARG1, ARG2);
2320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "timerfd_gettime",
2321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, ufd,
2322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct vki_itimerspec*, otmr);
2323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "timerfd_gettime", tid, False))
2324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure(VKI_EBADF);
2325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else
2326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("timerfd_gettime(result)",
2327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    ARG2, sizeof(struct vki_itimerspec));
2328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_timerfd_gettime)
2330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0)
2332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, sizeof(struct vki_itimerspec));
2333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_timerfd_settime)
2336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_timerfd_settime ( %ld, %ld, %#lx, %#lx )", ARG1, ARG2, ARG3, ARG4);
2338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "timerfd_settime",
2339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, ufd,
2340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, flags,
2341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct vki_itimerspec*, utmr,
2342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct vki_itimerspec*, otmr);
2343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "timerfd_settime", tid, False))
2344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure(VKI_EBADF);
2345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else
2346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
2347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("timerfd_settime(result)",
2348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   ARG3, sizeof(struct vki_itimerspec));
2349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG4)
2350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
2351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("timerfd_settime(result)",
2352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       ARG4, sizeof(struct vki_itimerspec));
2353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_timerfd_settime)
2357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0 && ARG4 != 0)
2359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG4, sizeof(struct vki_itimerspec));
2360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
2363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   capabilities wrappers
2364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
2365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_capget)
2367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_capget ( %#lx, %#lx )", ARG1, ARG2 );
2369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "capget",
2370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_cap_user_header_t, header, vki_cap_user_data_t, data);
2371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "capget(header)", ARG1,
2372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  sizeof(struct __vki_user_cap_header_struct) );
2373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (ARG2 != (Addr)NULL)
2374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_WRITE( "capget(data)", ARG2,
2375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     sizeof(struct __vki_user_cap_data_struct) );
2376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_capget)
2378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != (Addr)NULL)
2380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(struct __vki_user_cap_data_struct) );
2381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_capset)
2384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_capset ( %#lx, %#lx )", ARG1, ARG2 );
2386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "capset",
2387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_cap_user_header_t, header,
2388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const vki_cap_user_data_t, data);
2389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "capset(header)",
2390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG1, sizeof(struct __vki_user_cap_header_struct) );
2391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "capset(data)",
2392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG2, sizeof(struct __vki_user_cap_data_struct) );
2393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
2396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   16-bit uid/gid/groups wrappers
2397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
2398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getuid16)
2400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getuid16 ( )");
2402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "getuid16");
2403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setuid16)
2406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setuid16 ( %ld )", ARG1);
2408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "setuid16", vki_old_uid_t, uid);
2409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getgid16)
2412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getgid16 ( )");
2414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "getgid16");
2415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setgid16)
2418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setgid16 ( %ld )", ARG1);
2420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "setgid16", vki_old_gid_t, gid);
2421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_geteuid16)
2424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_geteuid16 ( )");
2426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "geteuid16");
2427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getegid16)
2430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getegid16 ( )");
2432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "getegid16");
2433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setreuid16)
2436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("setreuid16 ( 0x%lx, 0x%lx )", ARG1, ARG2);
2438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "setreuid16", vki_old_uid_t, ruid, vki_old_uid_t, euid);
2439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setregid16)
2442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setregid16 ( %ld, %ld )", ARG1, ARG2);
2444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "setregid16", vki_old_gid_t, rgid, vki_old_gid_t, egid);
2445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getgroups16)
2448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getgroups16 ( %ld, %#lx )", ARG1, ARG2);
2450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "getgroups16", int, size, vki_old_gid_t *, list);
2451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 > 0)
2452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "getgroups16(list)", ARG2, ARG1 * sizeof(vki_old_gid_t) );
2453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getgroups16)
2455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
2457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 > 0 && RES > 0)
2458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, RES * sizeof(vki_old_gid_t) );
2459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setgroups16)
2462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setgroups16 ( %llu, %#lx )", (ULong)ARG1, ARG2);
2464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "setgroups16", int, size, vki_old_gid_t *, list);
2465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 > 0)
2466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "setgroups16(list)", ARG2, ARG1 * sizeof(vki_old_gid_t) );
2467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
2470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *chown16 wrappers
2471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
2472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_chown16)
2474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_chown16 ( %#lx, 0x%lx, 0x%lx )", ARG1,ARG2,ARG3);
2476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "chown16",
2477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *, path,
2478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_old_uid_t, owner, vki_old_gid_t, group);
2479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "chown16(path)", ARG1 );
2480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fchown16)
2483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fchown16 ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
2485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "fchown16",
2486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, fd, vki_old_uid_t, owner, vki_old_gid_t, group);
2487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
2490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *xattr wrappers
2491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
2492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setxattr)
2494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setxattr ( %#lx, %#lx, %#lx, %llu, %ld )",
2497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
2498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "setxattr",
2499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char *, path, char *, name,
2500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, value, vki_size_t, size, int, flags);
2501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "setxattr(path)", ARG1 );
2502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "setxattr(name)", ARG2 );
2503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "setxattr(value)", ARG3, ARG4 );
2504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_lsetxattr)
2507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_lsetxattr ( %#lx, %#lx, %#lx, %llu, %ld )",
2510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
2511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "lsetxattr",
2512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char *, path, char *, name,
2513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, value, vki_size_t, size, int, flags);
2514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "lsetxattr(path)", ARG1 );
2515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "lsetxattr(name)", ARG2 );
2516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "lsetxattr(value)", ARG3, ARG4 );
2517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fsetxattr)
2520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fsetxattr ( %ld, %#lx, %#lx, %llu, %ld )",
2523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3, (ULong)ARG4, ARG5);
2524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "fsetxattr",
2525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, char *, name, void *, value,
2526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t, size, int, flags);
2527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "fsetxattr(name)", ARG2 );
2528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "fsetxattr(value)", ARG3, ARG4 );
2529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getxattr)
2532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getxattr ( %#lx, %#lx, %#lx, %llu )", ARG1,ARG2,ARG3, (ULong)ARG4);
2535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(ssize_t, "getxattr",
2536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char *, path, char *, name, void *, value, vki_size_t, size);
2537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "getxattr(path)", ARG1 );
2538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "getxattr(name)", ARG2 );
2539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getxattr(value)", ARG3, ARG4 );
2540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getxattr)
2542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
2544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0 && ARG3 != (Addr)NULL) {
2545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, RES );
2546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_lgetxattr)
2550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_lgetxattr ( %#lx, %#lx, %#lx, %llu )", ARG1,ARG2,ARG3, (ULong)ARG4);
2553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(ssize_t, "lgetxattr",
2554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char *, path, char *, name, void *, value, vki_size_t, size);
2555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "lgetxattr(path)", ARG1 );
2556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "lgetxattr(name)", ARG2 );
2557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "lgetxattr(value)", ARG3, ARG4 );
2558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_lgetxattr)
2560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
2562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0 && ARG3 != (Addr)NULL) {
2563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, RES );
2564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fgetxattr)
2568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fgetxattr ( %ld, %#lx, %#lx, %llu )", ARG1, ARG2, ARG3, (ULong)ARG4);
2571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(ssize_t, "fgetxattr",
2572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, char *, name, void *, value, vki_size_t, size);
2573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "fgetxattr(name)", ARG2 );
2574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "fgetxattr(value)", ARG3, ARG4 );
2575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_fgetxattr)
2577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0 && ARG3 != (Addr)NULL)
2579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, RES );
2580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_listxattr)
2583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_listxattr ( %#lx, %#lx, %llu )", ARG1, ARG2, (ULong)ARG3);
2586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(ssize_t, "listxattr",
2587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char *, path, char *, list, vki_size_t, size);
2588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "listxattr(path)", ARG1 );
2589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "listxattr(list)", ARG2, ARG3 );
2590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_listxattr)
2592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0 && ARG2 != (Addr)NULL)
2594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, RES );
2595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_llistxattr)
2598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_llistxattr ( %#lx, %#lx, %llu )", ARG1, ARG2, (ULong)ARG3);
2601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(ssize_t, "llistxattr",
2602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char *, path, char *, list, vki_size_t, size);
2603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "llistxattr(path)", ARG1 );
2604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "llistxattr(list)", ARG2, ARG3 );
2605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_llistxattr)
2607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0 && ARG2 != (Addr)NULL)
2609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, RES );
2610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_flistxattr)
2613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_flistxattr ( %ld, %#lx, %llu )", ARG1, ARG2, (ULong)ARG3);
2616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(ssize_t, "flistxattr",
2617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, char *, list, vki_size_t, size);
2618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "flistxattr(list)", ARG2, ARG3 );
2619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_flistxattr)
2621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0 && ARG2 != (Addr)NULL)
2623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, RES );
2624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_removexattr)
2627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_removexattr ( %#lx, %#lx )", ARG1, ARG2);
2630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "removexattr", char *, path, char *, name);
2631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "removexattr(path)", ARG1 );
2632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "removexattr(name)", ARG2 );
2633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_lremovexattr)
2636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_lremovexattr ( %#lx, %#lx )", ARG1, ARG2);
2639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "lremovexattr", char *, path, char *, name);
2640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "lremovexattr(path)", ARG1 );
2641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "lremovexattr(name)", ARG2 );
2642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fremovexattr)
2645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fremovexattr ( %ld, %#lx )", ARG1, ARG2);
2648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "fremovexattr", int, fd, char *, name);
2649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "fremovexattr(name)", ARG2 );
2650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
2653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sched_* wrappers
2654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
2655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sched_setparam)
2657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sched_setparam ( %ld, %#lx )", ARG1, ARG2 );
2659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "sched_setparam",
2660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_pid_t, pid, struct sched_param *, p);
2661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "sched_setparam(p)", ARG2, sizeof(struct vki_sched_param) );
2662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_sched_setparam)
2664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) );
2666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sched_getparam)
2669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sched_getparam ( %ld, %#lx )", ARG1, ARG2 );
2671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "sched_getparam",
2672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_pid_t, pid, struct sched_param *, p);
2673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "sched_getparam(p)", ARG2, sizeof(struct vki_sched_param) );
2674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_sched_getparam)
2676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) );
2678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sched_getscheduler)
2681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sched_getscheduler ( %ld )", ARG1);
2683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "sched_getscheduler", vki_pid_t, pid);
2684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sched_setscheduler)
2687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sched_setscheduler ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3);
2689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "sched_setscheduler",
2690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_pid_t, pid, int, policy, struct sched_param *, p);
2691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
2692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "sched_setscheduler(p)",
2693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		    ARG3, sizeof(struct vki_sched_param));
2694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sched_yield)
2697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sched_yield()");
2700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "sys_sched_yield");
2701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sched_get_priority_max)
2704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sched_get_priority_max ( %ld )", ARG1);
2706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "sched_get_priority_max", int, policy);
2707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sched_get_priority_min)
2710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sched_get_priority_min ( %ld )", ARG1);
2712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "sched_get_priority_min", int, policy);
2713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sched_rr_get_interval)
2716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sched_rr_get_interval ( %ld, %#lx )", ARG1, ARG2);
2718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(int, "sched_rr_get_interval",
2719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_pid_t, pid,
2720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct vki_timespec *, tp);
2721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("sched_rr_get_interval(timespec)",
2722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 ARG2, sizeof(struct vki_timespec));
2723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_sched_rr_get_interval)
2726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG2, sizeof(struct vki_timespec));
2728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sched_setaffinity)
2731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sched_setaffinity ( %ld, %ld, %#lx )", ARG1, ARG2, ARG3);
2733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "sched_setaffinity",
2734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_pid_t, pid, unsigned int, len, unsigned long *, mask);
2735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "sched_setaffinity(mask)", ARG3, ARG2);
2736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sched_getaffinity)
2739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sched_getaffinity ( %ld, %ld, %#lx )", ARG1, ARG2, ARG3);
2741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "sched_getaffinity",
2742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_pid_t, pid, unsigned int, len, unsigned long *, mask);
2743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "sched_getaffinity(mask)", ARG3, ARG2);
2744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_sched_getaffinity)
2746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG3, ARG2);
2748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
2751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   miscellaneous wrappers
2752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
2753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_munlockall)
2755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_munlockall ( )");
2758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "munlockall");
2759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This has different signatures for different platforms.
2762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
2763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//  x86:   int  sys_pipe(unsigned long __user *fildes);
2764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//  AMD64: long sys_pipe(int *fildes);
2765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//  ppc32: int  sys_pipe(int __user *fildes);
2766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//  ppc64: int  sys_pipe(int __user *fildes);
2767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
2768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// The type of the argument is most important, and it is an array of 32 bit
2769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// values in all cases.  (The return type differs across platforms, but it
2770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// is not used.)  So we use 'int' as its type.  This fixed bug #113230 which
2771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// was caused by using an array of 'unsigned long's, which didn't work on
2772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// AMD64.
2773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_pipe)
2774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_pipe ( %#lx )", ARG1);
2776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(int, "pipe", int *, filedes);
2777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "pipe(filedes)", ARG1, 2*sizeof(int) );
2778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_pipe)
2780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int *p = (Int *)ARG1;
2782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(p[0], "pipe", tid, True) ||
2783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       !ML_(fd_allowed)(p[1], "pipe", tid, True)) {
2784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(p[0]);
2785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(p[1]);
2786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
2787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
2788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG1, 2*sizeof(int) );
2789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds)) {
2790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless)(tid, p[0]);
2791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless)(tid, p[1]);
2792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* pipe2 (a kernel 2.6.twentysomething invention) is like pipe, except
2797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   there's a second arg containing flags to be applied to the new file
2798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   descriptors.  It hardly seems worth the effort to factor out the
2799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   duplicated code, hence: */
2800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_pipe2)
2801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_pipe2 ( %#lx, %#lx )", ARG1, ARG2);
2803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(int, "pipe", int *, filedes, long, flags);
2804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "pipe2(filedes)", ARG1, 2*sizeof(int) );
2805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_pipe2)
2807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int *p = (Int *)ARG1;
2809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(p[0], "pipe2", tid, True) ||
2810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       !ML_(fd_allowed)(p[1], "pipe2", tid, True)) {
2811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(p[0]);
2812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(p[1]);
2813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
2814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
2815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG1, 2*sizeof(int) );
2816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds)) {
2817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless)(tid, p[0]);
2818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless)(tid, p[1]);
2819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_dup3)
2824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_dup3 ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
2826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "dup3", unsigned int, oldfd, unsigned int, newfd, int, flags);
2827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG2, "dup3", tid, True))
2828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
2829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_dup3)
2832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
2834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (VG_(clo_track_fds))
2835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(record_fd_open_named)(tid, RES);
2836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_quotactl)
2839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_quotactl (0x%lx, %#lx, 0x%lx, 0x%lx )", ARG1,ARG2,ARG3, ARG4);
2841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "quotactl",
2842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, cmd, const char *, special, vki_qid_t, id,
2843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, addr);
2844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "quotactl(special)", ARG2 );
2845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_waitid)
2848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_waitid( %ld, %ld, %#lx, %ld, %#lx )", ARG1,ARG2,ARG3,ARG4,ARG5);
2851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(int32_t, "sys_waitid",
2852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, which, vki_pid_t, pid, struct vki_siginfo *, infop,
2853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, options, struct vki_rusage *, ru);
2854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "waitid(infop)", ARG3, sizeof(struct vki_siginfo) );
2855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5 != 0)
2856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "waitid(ru)", ARG5, sizeof(struct vki_rusage) );
2857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_waitid)
2859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG3, sizeof(struct vki_siginfo) );
2861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5 != 0)
2862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG5, sizeof(struct vki_rusage) );
2863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sync_file_range)
2866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
2869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sync_file_range ( %ld, %lld, %lld, %ld )",
2870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,MERGE64(ARG2,ARG3),MERGE64(ARG4,ARG5),ARG6);
2871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "sync_file_range",
2872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd,
2873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned, MERGE64_FIRST(offset), unsigned, MERGE64_SECOND(offset),
2874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned, MERGE64_FIRST(nbytes), unsigned, MERGE64_SECOND(nbytes),
2875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, flags);
2876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif VG_WORDSIZE == 8
2877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sync_file_range ( %ld, %lld, %lld, %ld )",
2878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,(Long)ARG2,(Long)ARG3,ARG4);
2879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "sync_file_range",
2880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, vki_loff_t, offset, vki_loff_t, nbytes,
2881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, flags);
2882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
2883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  error Unexpected word size
2884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
2885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "sync_file_range", tid, False))
2886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
2887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sync_file_range2)
2890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
2893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sync_file_range2 ( %ld, %ld, %lld, %lld )",
2894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,ARG2,MERGE64(ARG3,ARG4),MERGE64(ARG5,ARG6));
2895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "sync_file_range2",
2896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, unsigned int, flags,
2897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned, MERGE64_FIRST(offset), unsigned, MERGE64_SECOND(offset),
2898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned, MERGE64_FIRST(nbytes), unsigned, MERGE64_SECOND(nbytes));
2899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif VG_WORDSIZE == 8
2900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sync_file_range2 ( %ld, %ld, %lld, %lld )",
2901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,ARG2,(Long)ARG3,(Long)ARG4);
2902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "sync_file_range2",
2903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, unsigned int, flags,
2904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_loff_t, offset, vki_loff_t, nbytes);
2905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
2906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  error Unexpected word size
2907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
2908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "sync_file_range2", tid, False))
2909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
2910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_stime)
2913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_stime ( %#lx )", ARG1);
2915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(int, "stime", vki_time_t*, t);
2916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "stime(t)", ARG1, sizeof(vki_time_t) );
2917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_perf_event_open)
2920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct vki_perf_event_attr *attr;
2922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_perf_event_open ( %#lx, %ld, %ld, %ld, %ld )",
2923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,ARG2,ARG3,ARG4,ARG5);
2924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ5(long, "perf_event_open",
2925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 struct vki_perf_event_attr *, attr,
2926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_pid_t, pid, int, cpu, int, group_fd,
2927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, flags);
2928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   attr = (struct vki_perf_event_attr *)ARG1;
2929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_MEM_READ( "perf_event_open(attr->size)",
2930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 (Addr)&attr->size, sizeof(attr->size) );
2931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_MEM_READ( "perf_event_open(attr)",
2932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 (Addr)attr, attr->size );
2933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(sys_perf_event_open)
2936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
2938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (!ML_(fd_allowed)(RES, "perf_event_open", tid, True)) {
2939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
2940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
2941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
2942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
2943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless)(tid, RES);
2944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getcpu)
2948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getcpu ( %#lx, %#lx, %#lx )" , ARG1,ARG2,ARG3);
2950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int, "getcpu",
2951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned *, cpu, unsigned *, node, struct vki_getcpu_cache *, tcache);
2952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 != 0)
2953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "getcpu(cpu)", ARG1, sizeof(unsigned) );
2954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
2955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "getcpu(node)", ARG2, sizeof(unsigned) );
2956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
2957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "getcpu(tcache)", ARG3, sizeof(struct vki_getcpu_cache) );
2958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getcpu)
2961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 != 0)
2963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG1, sizeof(unsigned) );
2964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
2965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(unsigned) );
2966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
2967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_getcpu_cache) );
2968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2970663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(sys_move_pages)
2971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
2972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("sys_move_pages ( %ld, %ld, %#lx, %#lx, %#lx, %lx )",
2973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
2974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_REG_READ6(int, "move_pages",
2975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 vki_pid_t, pid, unsigned long, nr_pages, const void **, pages,
2976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 const int *, nodes, int *, status, int, flags);
2977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_MEM_READ("move_pages(pages)", ARG3, ARG2 * sizeof(void *));
2978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (ARG4)
2979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_READ("move_pages(nodes)", ARG4, ARG2 * sizeof(int));
2980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_MEM_WRITE("move_pages(status)", ARG5, ARG2 * sizeof(int));
2981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
2982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2983663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPOST(sys_move_pages)
2984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
2985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   POST_MEM_WRITE(ARG5, ARG2 * sizeof(int));
2986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
2987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
2989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   utime wrapper
2990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
2991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_utime)
2993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_utime ( %#lx, %#lx )", ARG1,ARG2);
2996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "utime", char *, filename, struct utimbuf *, buf);
2997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "utime(filename)", ARG1 );
2998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
2999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "utime(buf)", ARG2, sizeof(struct vki_utimbuf) );
3000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
3003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   lseek wrapper
3004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
3005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_lseek)
3007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_lseek ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
3009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(vki_off_t, "lseek",
3010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, fd, vki_off_t, offset, unsigned int, whence);
3011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
3014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   readahead wrapper
3015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
3016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_readahead)
3018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
3021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_readahead ( %ld, %lld, %ld )", ARG1, MERGE64(ARG2,ARG3), ARG4);
3022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(vki_off_t, "readahead",
3023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, unsigned, MERGE64_FIRST(offset),
3024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned, MERGE64_SECOND(offset), vki_size_t, count);
3025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif VG_WORDSIZE == 8
3026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_readahead ( %ld, %lld, %ld )", ARG1, (Long)ARG2, ARG3);
3027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(vki_off_t, "readahead",
3028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, vki_loff_t, offset, vki_size_t, count);
3029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
3030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  error Unexpected word size
3031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "readahead", tid, False))
3033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
3034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
3037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sig* wrappers
3038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
3039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sigpending)
3041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "sys_sigpending ( %#lx )", ARG1 );
3043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "sigpending", vki_old_sigset_t *, set);
3044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "sigpending(set)", ARG1, sizeof(vki_old_sigset_t));
3045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_sigpending)
3047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG1, sizeof(vki_old_sigset_t) ) ;
3049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This syscall is not used on amd64/Linux -- it only provides
3052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// sys_rt_sigprocmask, which uses sigset_t rather than old_sigset_t.
3053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This wrapper is only suitable for 32-bit architectures.
3054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// (XXX: so how is it that PRE(sys_sigpending) above doesn't need
3055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// conditional compilation like this?)
3056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined(VGP_x86_linux) || defined(VGP_ppc32_linux) \
3057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    || defined(VGP_arm_linux) || defined(VGP_mips32_linux)
3058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sigprocmask)
3059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_old_sigset_t* set;
3061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_old_sigset_t* oldset;
3062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_sigset_t bigger_set;
3063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_sigset_t bigger_oldset;
3064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sigprocmask ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3);
3066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "sigprocmask",
3067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, how, vki_old_sigset_t *, set, vki_old_sigset_t *, oldset);
3068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
3069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "sigprocmask(set)", ARG2, sizeof(vki_old_sigset_t));
3070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
3071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "sigprocmask(oldset)", ARG3, sizeof(vki_old_sigset_t));
3072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Nb: We must convert the smaller vki_old_sigset_t params into bigger
3074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // vki_sigset_t params.
3075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set    = (vki_old_sigset_t*)ARG2;
3076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   oldset = (vki_old_sigset_t*)ARG3;
3077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(memset)(&bigger_set,    0, sizeof(vki_sigset_t));
3079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(memset)(&bigger_oldset, 0, sizeof(vki_sigset_t));
3080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (set)
3081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      bigger_set.sig[0] = *(vki_old_sigset_t*)set;
3082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(
3084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(do_sys_sigprocmask) ( tid, ARG1 /*how*/,
3085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                set ? &bigger_set    : NULL,
3086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             oldset ? &bigger_oldset : NULL)
3087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
3088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (oldset)
3090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *oldset = bigger_oldset.sig[0];
3091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS)
3093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfPollAfter;
3094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_sigprocmask)
3096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0 && ARG3 != 0)
3099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_old_sigset_t));
3100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3101d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root
3102d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root/* Convert from non-RT to RT sigset_t's */
3103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
3104d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Rootvoid convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigset_t *set)
3105d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root{
3106d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   VG_(sigemptyset)(set);
3107d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   set->sig[0] = *oldset;
3108d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root}
3109d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny RootPRE(sys_sigaction)
3110d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root{
3111d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   vki_sigaction_toK_t   new, *newp;
3112d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   vki_sigaction_fromK_t old, *oldp;
3113d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root
3114d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   PRINT("sys_sigaction ( %ld, %#lx, %#lx )", ARG1,ARG2,ARG3);
3115d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   PRE_REG_READ3(int, "sigaction",
3116d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root                 int, signum, const struct old_sigaction *, act,
3117d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root                 struct old_sigaction *, oldact);
3118d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root
3119d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   newp = oldp = NULL;
3120d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root
3121d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   if (ARG2 != 0) {
3122d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      struct vki_old_sigaction *sa = (struct vki_old_sigaction *)ARG2;
3123d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      PRE_MEM_READ( "sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
3124d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      PRE_MEM_READ( "sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
3125d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      PRE_MEM_READ( "sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
3126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (ML_(safe_to_deref)(sa,sizeof(sa))
3127d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root          && (sa->sa_flags & VKI_SA_RESTORER))
3128d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root         PRE_MEM_READ( "sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
3129d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   }
3130d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root
3131d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   if (ARG3 != 0) {
3132d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction));
3133d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      oldp = &old;
3134d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   }
3135d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root
3136d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   if (ARG2 != 0) {
3137d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      struct vki_old_sigaction *oldnew = (struct vki_old_sigaction *)ARG2;
3138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3139d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      new.ksa_handler = oldnew->ksa_handler;
3140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      new.sa_flags = oldnew->sa_flags;
3141d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      new.sa_restorer = oldnew->sa_restorer;
3142d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      convert_sigset_to_rt(&oldnew->sa_mask, &new.sa_mask);
3143d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      newp = &new;
3144d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   }
3145d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root
3146d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   SET_STATUS_from_SysRes( VG_(do_sys_sigaction)(ARG1, newp, oldp) );
3147d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root
3148d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   if (ARG3 != 0 && SUCCESS && RES == 0) {
3149d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      struct vki_old_sigaction *oldold = (struct vki_old_sigaction *)ARG3;
3150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3151d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      oldold->ksa_handler = oldp->ksa_handler;
3152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      oldold->sa_flags = oldp->sa_flags;
3153d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      oldold->sa_restorer = oldp->sa_restorer;
3154d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      oldold->sa_mask = oldp->sa_mask.sig[0];
3155d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   }
3156d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root}
3157d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny RootPOST(sys_sigaction)
3158d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root{
3159d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   vg_assert(SUCCESS);
3160d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   if (RES == 0 && ARG3 != 0)
3161d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root      POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
3162d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root}
3163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_signalfd)
3166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_signalfd ( %d, %#lx, %llu )", (Int)ARG1,ARG2,(ULong)ARG3);
3168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "sys_signalfd",
3169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, vki_sigset_t *, sigmask, vki_size_t, sigsetsize);
3170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "signalfd(sigmask)", ARG2, sizeof(vki_sigset_t) );
3171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((int)ARG1 != -1 && !ML_(fd_allowed)(ARG1, "signalfd", tid, False))
3172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
3173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_signalfd)
3175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "signalfd", tid, True)) {
3177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
3178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
3179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
3180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
3181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless) (tid, RES);
3182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_signalfd4)
3186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_signalfd4 ( %d, %#lx, %llu, %ld )", (Int)ARG1,ARG2,(ULong)ARG3,ARG4);
3188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "sys_signalfd4",
3189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, vki_sigset_t *, sigmask, vki_size_t, sigsetsize, int, flags);
3190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "signalfd(sigmask)", ARG2, sizeof(vki_sigset_t) );
3191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((int)ARG1 != -1 && !ML_(fd_allowed)(ARG1, "signalfd", tid, False))
3192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
3193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_signalfd4)
3195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "signalfd4", tid, True)) {
3197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
3198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
3199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
3200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
3201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless) (tid, RES);
3202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
3207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rt_sig* wrappers
3208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
3209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigaction)
3211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_rt_sigaction ( %ld, %#lx, %#lx, %ld )", ARG1,ARG2,ARG3,ARG4);
3213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "rt_sigaction",
3214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, signum, const struct sigaction *, act,
3215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct sigaction *, oldact, vki_size_t, sigsetsize);
3216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0) {
3218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vki_sigaction_toK_t *sa = (vki_sigaction_toK_t *)ARG2;
3219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "rt_sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
3220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "rt_sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
3221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "rt_sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
3222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (sa->sa_flags & VKI_SA_RESTORER)
3223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "rt_sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
3224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
3226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "rt_sigaction(oldact)", ARG3, sizeof(vki_sigaction_fromK_t));
3227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // XXX: doesn't seem right to be calling do_sys_sigaction for
3229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // sys_rt_sigaction... perhaps this function should be renamed
3230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // VG_(do_sys_rt_sigaction)()  --njn
3231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(
3233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(do_sys_sigaction)(ARG1, (const vki_sigaction_toK_t *)ARG2,
3234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            (vki_sigaction_fromK_t *)ARG3)
3235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
3236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_rt_sigaction)
3238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0 && ARG3 != 0)
3241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_sigaction_fromK_t));
3242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigprocmask)
3245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_rt_sigprocmask ( %ld, %#lx, %#lx, %llu )",ARG1,ARG2,ARG3,(ULong)ARG4);
3247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "rt_sigprocmask",
3248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, how, vki_sigset_t *, set, vki_sigset_t *, oldset,
3249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t, sigsetsize);
3250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
3251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "rt_sigprocmask(set)", ARG2, sizeof(vki_sigset_t));
3252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
3253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "rt_sigprocmask(oldset)", ARG3, sizeof(vki_sigset_t));
3254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Like the kernel, we fail if the sigsetsize is not exactly what we expect.
3256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sizeof(vki_sigset_t) != ARG4)
3257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
3258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else {
3259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
3260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  VG_(do_sys_sigprocmask) ( tid, ARG1 /*how*/,
3261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                            (vki_sigset_t*) ARG2,
3262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                            (vki_sigset_t*) ARG3 )
3263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );
3264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS)
3267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfPollAfter;
3268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_rt_sigprocmask)
3270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0 && ARG3 != 0)
3273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_sigset_t));
3274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigpending)
3277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "sys_rt_sigpending ( %#lx )", ARG1 );
3279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "rt_sigpending",
3280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_sigset_t *, set, vki_size_t, sigsetsize);
3281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "rt_sigpending(set)", ARG1, sizeof(vki_sigset_t));
3282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_rt_sigpending)
3284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG1, sizeof(vki_sigset_t) ) ;
3286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigtimedwait)
3289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_rt_sigtimedwait ( %#lx, %#lx, %#lx, %lld )",
3292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,ARG2,ARG3,(ULong)ARG4);
3293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "rt_sigtimedwait",
3294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const vki_sigset_t *, set, vki_siginfo_t *, info,
3295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct timespec *, timeout, vki_size_t, sigsetsize);
3296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 != 0)
3297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ(  "rt_sigtimedwait(set)",  ARG1, sizeof(vki_sigset_t));
3298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
3299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "rt_sigtimedwait(info)", ARG2, sizeof(vki_siginfo_t) );
3300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
3301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "rt_sigtimedwait(timeout)",
3302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    ARG3, sizeof(struct vki_timespec) );
3303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_rt_sigtimedwait)
3305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
3307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(vki_siginfo_t) );
3308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigqueueinfo)
3311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_rt_sigqueueinfo(%ld, %ld, %#lx)", ARG1, ARG2, ARG3);
3313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "rt_sigqueueinfo",
3314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, pid, int, sig, vki_siginfo_t *, uinfo);
3315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
3316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "rt_sigqueueinfo(uinfo)", ARG3, VKI_SI_MAX_SIZE );
3317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_rt_sigqueueinfo)
3319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(client_signal_OK)(ARG2))
3321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
3322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_tgsigqueueinfo)
3325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_rt_tgsigqueueinfo(%ld, %ld, %ld, %#lx)", ARG1, ARG2, ARG3, ARG4);
3327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "rt_tgsigqueueinfo",
3328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, tgid, int, pid, int, sig, vki_siginfo_t *, uinfo);
3329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
3330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "rt_tgsigqueueinfo(uinfo)", ARG4, VKI_SI_MAX_SIZE );
3331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_rt_tgsigqueueinfo)
3334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(client_signal_OK)(ARG3))
3336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
3337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// XXX: x86-specific?  The kernel prototypes for the different archs are
3340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//      hard to decipher.
3341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigsuspend)
3342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* The C library interface to sigsuspend just takes a pointer to
3344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      a signal mask but this system call has two arguments - a pointer
3345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      to the mask and the number of bytes used by it. The kernel insists
3346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      on the size being equal to sizeof(sigset_t) however and will just
3347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return EINVAL if it isn't.
3348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    */
3349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_rt_sigsuspend ( %#lx, %ld )", ARG1,ARG2 );
3351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(int, "rt_sigsuspend", vki_sigset_t *, mask, vki_size_t, size)
3352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 != (Addr)NULL) {
3353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "rt_sigsuspend(mask)", ARG1, sizeof(vki_sigset_t) );
3354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
3358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   linux msg* wrapper helpers
3359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
3360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid
3362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(linux_PRE_sys_msgsnd) ( ThreadId tid,
3363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            UWord arg0, UWord arg1, UWord arg2, UWord arg3 )
3364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg); */
3366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_msgbuf *msgp = (struct vki_msgbuf *)arg1;
3367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "msgsnd(msgp->mtype)", (Addr)&msgp->mtype, sizeof(msgp->mtype) );
3368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "msgsnd(msgp->mtext)", (Addr)&msgp->mtext, arg2 );
3369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid
3372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(linux_PRE_sys_msgrcv) ( ThreadId tid,
3373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            UWord arg0, UWord arg1, UWord arg2,
3374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            UWord arg3, UWord arg4 )
3375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz,
3377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     long msgtyp, int msgflg); */
3378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_msgbuf *msgp = (struct vki_msgbuf *)arg1;
3379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "msgrcv(msgp->mtype)", (Addr)&msgp->mtype, sizeof(msgp->mtype) );
3380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "msgrcv(msgp->mtext)", (Addr)&msgp->mtext, arg2 );
3381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid
3383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(linux_POST_sys_msgrcv) ( ThreadId tid,
3384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             UWord res,
3385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             UWord arg0, UWord arg1, UWord arg2,
3386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             UWord arg3, UWord arg4 )
3387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_msgbuf *msgp = (struct vki_msgbuf *)arg1;
3389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( (Addr)&msgp->mtype, sizeof(msgp->mtype) );
3390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( (Addr)&msgp->mtext, res );
3391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid
3394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(linux_PRE_sys_msgctl) ( ThreadId tid,
3395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            UWord arg0, UWord arg1, UWord arg2 )
3396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* int msgctl(int msqid, int cmd, struct msqid_ds *buf); */
3398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (arg1 /* cmd */) {
3399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_INFO:
3400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_MSG_INFO:
3401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_INFO|VKI_IPC_64:
3402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_MSG_INFO|VKI_IPC_64:
3403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "msgctl(IPC_INFO, buf)",
3404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     arg2, sizeof(struct vki_msginfo) );
3405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_STAT:
3407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_MSG_STAT:
3408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "msgctl(IPC_STAT, buf)",
3409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     arg2, sizeof(struct vki_msqid_ds) );
3410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_STAT|VKI_IPC_64:
3412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_MSG_STAT|VKI_IPC_64:
3413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "msgctl(IPC_STAT, arg.buf)",
3414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     arg2, sizeof(struct vki_msqid64_ds) );
3415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_SET:
3417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "msgctl(IPC_SET, arg.buf)",
3418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    arg2, sizeof(struct vki_msqid_ds) );
3419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_SET|VKI_IPC_64:
3421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "msgctl(IPC_SET, arg.buf)",
3422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    arg2, sizeof(struct vki_msqid64_ds) );
3423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid
3427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(linux_POST_sys_msgctl) ( ThreadId tid,
3428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             UWord res,
3429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             UWord arg0, UWord arg1, UWord arg2 )
3430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (arg1 /* cmd */) {
3432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IPC_INFO:
3433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSG_INFO:
3434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IPC_INFO|VKI_IPC_64:
3435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSG_INFO|VKI_IPC_64:
3436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      POST_MEM_WRITE( arg2, sizeof(struct vki_msginfo) );
3437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IPC_STAT:
3439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSG_STAT:
3440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      POST_MEM_WRITE( arg2, sizeof(struct vki_msqid_ds) );
3441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IPC_STAT|VKI_IPC_64:
3443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSG_STAT|VKI_IPC_64:
3444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      POST_MEM_WRITE( arg2, sizeof(struct vki_msqid64_ds) );
3445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* ---------------------------------------------------------------------
3450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Generic handler for sys_ipc
3451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Depending on the platform, some syscalls (e.g. semctl, semop, ...)
3452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   are either direct system calls, or are all implemented via sys_ipc.
3453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ------------------------------------------------------------------ */
3454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifdef __NR_ipc
3455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Addr deref_Addr ( ThreadId tid, Addr a, const HChar* s )
3456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Addr* a_p = (Addr*)a;
3458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
3459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return *a_p;
3460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Bool semctl_cmd_has_4args (UWord cmd)
3463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (cmd & ~VKI_IPC_64)
3465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   {
3466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IPC_INFO:
3467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEM_INFO:
3468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IPC_STAT:
3469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEM_STAT:
3470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IPC_SET:
3471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_GETALL:
3472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SETALL:
3473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return True;
3474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   default:
3475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return False;
3476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_ipc)
3480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_ipc ( %ld, %ld, %ld, %ld, %#lx, %ld )",
3482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
3483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (ARG1 /* call */) {
3485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEMOP:
3486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ5(int, "ipc",
3487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    vki_uint, call, int, first, int, second, int, third,
3488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    void *, ptr);
3489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
3490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *flags |= SfMayBlock;
3491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEMGET:
3493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ4(int, "ipc",
3494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    vki_uint, call, int, first, int, second, int, third);
3495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEMCTL:
3497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   {
3498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ5(int, "ipc",
3499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    vki_uint, call, int, first, int, second, int, third,
3500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    void *, ptr);
3501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UWord arg;
3502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (semctl_cmd_has_4args(ARG4))
3503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         arg = deref_Addr( tid, ARG5, "semctl(arg)" );
3504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
3505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         arg = 0;
3506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
3507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEMTIMEDOP:
3510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ6(int, "ipc",
3511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    vki_uint, call, int, first, int, second, int, third,
3512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    void *, ptr, long, fifth);
3513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
3514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *flags |= SfMayBlock;
3515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSGSND:
3517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ5(int, "ipc",
3518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    vki_uint, call, int, first, int, second, int, third,
3519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    void *, ptr);
3520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
3521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if ((ARG4 & VKI_IPC_NOWAIT) == 0)
3522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *flags |= SfMayBlock;
3523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSGRCV:
3525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   {
3526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ5(int, "ipc",
3527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    vki_uint, call, int, first, int, second, int, third,
3528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    void *, ptr);
3529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Addr msgp;
3530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Word msgtyp;
3531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      msgp = deref_Addr( tid, (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
3533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "msgrcv(msgp)" );
3534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      msgtyp = deref_Addr( tid,
3535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
3536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           "msgrcv(msgp)" );
3537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
3539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if ((ARG4 & VKI_IPC_NOWAIT) == 0)
3541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *flags |= SfMayBlock;
3542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSGGET:
3545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ3(int, "ipc", vki_uint, call, int, first, int, second);
3546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSGCTL:
3548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ5(int, "ipc",
3549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    vki_uint, call, int, first, int, second, int, third,
3550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    void *, ptr);
3551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
3552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SHMAT:
3554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   {
3555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ5(int, "ipc",
3556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    vki_uint, call, int, first, int, second, int, third,
3557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    void *, ptr);
3558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UWord w;
3559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
3560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
3561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w == 0)
3562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         SET_STATUS_Failure( VKI_EINVAL );
3563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
3564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ARG5 = w;
3565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SHMDT:
3568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ5(int, "ipc",
3569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    vki_uint, call, int, first, int, second, int, third,
3570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    void *, ptr);
3571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
3572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 SET_STATUS_Failure( VKI_EINVAL );
3573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SHMGET:
3575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ4(int, "ipc",
3576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    vki_uint, call, int, first, int, second, int, third);
3577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SHMCTL: /* IPCOP_shmctl */
3579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ5(int, "ipc",
3580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    vki_uint, call, int, first, int, second, int, third,
3581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    void *, ptr);
3582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
3583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   default:
3585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %ld\n", ARG1 );
3586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(core_panic)("... bye!\n");
3587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break; /*NOTREACHED*/
3588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_ipc)
3592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
3594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (ARG1 /* call */) {
3595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEMOP:
3596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEMGET:
3597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEMCTL:
3599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   {
3600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UWord arg;
3601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (semctl_cmd_has_4args(ARG4))
3602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         arg = deref_Addr( tid, ARG5, "semctl(arg)" );
3603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
3604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         arg = 0;
3605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_POST_sys_semctl)( tid, RES, ARG2, ARG3, ARG4, arg );
3606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEMTIMEDOP:
3609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSGSND:
3610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSGRCV:
3612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   {
3613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Addr msgp;
3614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Word msgtyp;
3615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      msgp = deref_Addr( tid,
3617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov			 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
3618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov			 "msgrcv(msgp)" );
3619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      msgtyp = deref_Addr( tid,
3620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov			   (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
3621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov			   "msgrcv(msgp)" );
3622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
3624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSGGET:
3627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_MSGCTL:
3629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
3630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SHMAT:
3632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   {
3633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Addr addr;
3634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* force readability. before the syscall it is
3636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       * indeed uninitialized, as can be seen in
3637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       * glibc/sysdeps/unix/sysv/linux/shmat.c */
3638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      POST_MEM_WRITE( ARG4, sizeof( Addr ) );
3639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
3641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
3642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SHMDT:
3645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
3646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SHMGET:
3648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SHMCTL:
3650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
3651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   default:
3653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(message)(Vg_DebugMsg,
3654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov		   "FATAL: unhandled syscall(ipc) %ld\n",
3655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov		   ARG1 );
3656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(core_panic)("... bye!\n");
3657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break; /*NOTREACHED*/
3658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
3661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_semget)
3663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_semget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
3665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "semget", vki_key_t, key, int, nsems, int, semflg);
3666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_semop)
3669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
3671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_semop ( %ld, %#lx, %lu )",ARG1,ARG2,ARG3);
3672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "semop",
3673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, semid, struct sembuf *, sops, unsigned, nsoops);
3674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_semop)(tid, ARG1,ARG2,ARG3);
3675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_semctl)
3678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (ARG3 & ~VKI_IPC_64) {
3680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IPC_INFO:
3681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEM_INFO:
3682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
3683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ4(long, "semctl",
3684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    int, semid, int, semnum, int, cmd, struct seminfo *, arg);
3685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IPC_STAT:
3687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SEM_STAT:
3688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IPC_SET:
3689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
3690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ4(long, "semctl",
3691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    int, semid, int, semnum, int, cmd, struct semid_ds *, arg);
3692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_GETALL:
3694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SETALL:
3695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
3696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ4(long, "semctl",
3697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    int, semid, int, semnum, int, cmd, unsigned short *, arg);
3698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   default:
3700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRINT("sys_semctl ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
3701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_REG_READ3(long, "semctl",
3702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    int, semid, int, semnum, int, cmd);
3703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifdef VGP_amd64_linux
3706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_semctl)(tid, ARG1,ARG2,ARG3|VKI_IPC_64,ARG4);
3707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
3708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_semctl)(tid, ARG1,ARG2,ARG3,ARG4);
3709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
3710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_semctl)
3713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifdef VGP_amd64_linux
3715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_POST_sys_semctl)(tid, RES,ARG1,ARG2,ARG3|VKI_IPC_64,ARG4);
3716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
3717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_POST_sys_semctl)(tid, RES,ARG1,ARG2,ARG3,ARG4);
3718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
3719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_semtimedop)
3722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
3724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_semtimedop ( %ld, %#lx, %lu, %#lx )",ARG1,ARG2,ARG3,ARG4);
3725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ4(long, "semtimedop",
3726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, semid, struct sembuf *, sops, unsigned, nsoops,
3727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 struct timespec *, timeout);
3728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_semtimedop)(tid, ARG1,ARG2,ARG3,ARG4);
3729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_msgget)
3732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_msgget ( %ld, %ld )",ARG1,ARG2);
3734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ2(long, "msgget", vki_key_t, key, int, msgflg);
3735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_msgsnd)
3738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_msgsnd ( %ld, %#lx, %ld, %ld )",ARG1,ARG2,ARG3,ARG4);
3740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ4(long, "msgsnd",
3741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz, int, msgflg);
3742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(linux_PRE_sys_msgsnd)(tid, ARG1,ARG2,ARG3,ARG4);
3743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if ((ARG4 & VKI_IPC_NOWAIT) == 0)
3744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *flags |= SfMayBlock;
3745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_msgrcv)
3748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_msgrcv ( %ld, %#lx, %ld, %ld, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5);
3750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ5(long, "msgrcv",
3751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz,
3752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 long, msgytp, int, msgflg);
3753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(linux_PRE_sys_msgrcv)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
3754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if ((ARG5 & VKI_IPC_NOWAIT) == 0)
3755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *flags |= SfMayBlock;
3756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_msgrcv)
3758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(linux_POST_sys_msgrcv)(tid, RES,ARG1,ARG2,ARG3,ARG4,ARG5);
3760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_msgctl)
3763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_msgctl ( %ld, %ld, %#lx )",ARG1,ARG2,ARG3);
3765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "msgctl",
3766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, msqid, int, cmd, struct msqid_ds *, buf);
3767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(linux_PRE_sys_msgctl)(tid, ARG1,ARG2,ARG3);
3768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_msgctl)
3771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(linux_POST_sys_msgctl)(tid, RES,ARG1,ARG2,ARG3);
3773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_shmget)
3776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_shmget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
3778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "shmget", vki_key_t, key, vki_size_t, size, int, shmflg);
3779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(wrap_sys_shmat)
3782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UWord arg2tmp;
3784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("wrap_sys_shmat ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
3785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "shmat",
3786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, shmid, const void *, shmaddr, int, shmflg);
3787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined(VGP_arm_linux)
3788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Round the attach address down to an VKI_SHMLBA boundary if the
3789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      client requested rounding.  See #222545.  This is necessary only
3790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      on arm-linux because VKI_SHMLBA is 4 * VKI_PAGE size; on all
3791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      other linux targets it is the same as the page size. */
3792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (ARG3 & VKI_SHM_RND)
3793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARG2 = VG_ROUNDDN(ARG2, VKI_SHMLBA);
3794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
3795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   arg2tmp = ML_(generic_PRE_sys_shmat)(tid, ARG1,ARG2,ARG3);
3796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (arg2tmp == 0)
3797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      SET_STATUS_Failure( VKI_EINVAL );
3798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
3799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ARG2 = arg2tmp;  // used in POST
3800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(wrap_sys_shmat)
3803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_POST_sys_shmat)(tid, RES,ARG1,ARG2,ARG3);
3805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_shmdt)
3808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_shmdt ( %#lx )",ARG1);
3810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ1(long, "shmdt", const void *, shmaddr);
3811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (!ML_(generic_PRE_sys_shmdt)(tid, ARG1))
3812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      SET_STATUS_Failure( VKI_EINVAL );
3813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_shmdt)
3816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_POST_sys_shmdt)(tid, RES,ARG1);
3818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_shmctl)
3821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_shmctl ( %ld, %ld, %#lx )",ARG1,ARG2,ARG3);
3823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "shmctl",
3824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, shmid, int, cmd, struct shmid_ds *, buf);
3825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifdef VGP_amd64_linux
3826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_shmctl)(tid, ARG1,ARG2|VKI_IPC_64,ARG3);
3827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
3828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_shmctl)(tid, ARG1,ARG2,ARG3);
3829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
3830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_shmctl)
3833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifdef VGP_amd64_linux
3835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_POST_sys_shmctl)(tid, RES,ARG1,ARG2|VKI_IPC_64,ARG3);
3836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
3837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_POST_sys_shmctl)(tid, RES,ARG1,ARG2,ARG3);
3838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
3839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* ---------------------------------------------------------------------
3843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Generic handler for sys_socketcall
3844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Depending on the platform, some socket related syscalls (e.g. socketpair,
3845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   socket, bind, ...)
3846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   are either direct system calls, or are all implemented via sys_socketcall.
3847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ------------------------------------------------------------------ */
3848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifdef __NR_socketcall
3849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_socketcall)
3850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_0  (((UWord*)ARG2)[0])
3852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_1  (((UWord*)ARG2)[1])
3853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_2  (((UWord*)ARG2)[2])
3854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_3  (((UWord*)ARG2)[3])
3855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_4  (((UWord*)ARG2)[4])
3856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_5  (((UWord*)ARG2)[5])
3857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// call PRE_MEM_READ and check for EFAULT result.
3859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define PRE_MEM_READ_ef(msg, arg, size)                         \
3860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   {                                                            \
3861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ( msg, arg, size);                            \
3862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (!ML_(valid_client_addr)(arg, size, tid, NULL)) {      \
3863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         SET_STATUS_Failure( VKI_EFAULT );                      \
3864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;                                                 \
3865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }                                                         \
3866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
3867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
3869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
3870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
3871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (ARG1 /* request */) {
3873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SOCKETPAIR:
3875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int socketpair(int d, int type, int protocol, int sv[2]); */
3876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
3877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
3878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SOCKET:
3881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int socket(int domain, int type, int protocol); */
3882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
3883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_BIND:
3886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int bind(int sockfd, struct sockaddr *my_addr,
3887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  int addrlen); */
3888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
3889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
3890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_LISTEN:
3893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int listen(int s, int backlog); */
3894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
3895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_ACCEPT:
3898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int accept(int s, struct sockaddr *addr, int *addrlen); */
3899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
3900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
3901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_ACCEPT4:
3904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
3905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.accept4(args)", ARG2, 4*sizeof(Addr) );
3906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
3907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SENDTO:
3910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int sendto(int s, const void *msg, int len,
3911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    unsigned int flags,
3912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    const struct sockaddr *to, int tolen); */
3913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
3914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
3915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ARG2_3, ARG2_4, ARG2_5 );
3916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SEND:
3919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int send(int s, const void *msg, size_t len, int flags); */
3920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
3921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
3922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_RECVFROM:
3925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int recvfrom(int s, void *buf, int len, unsigned int flags,
3926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct sockaddr *from, int *fromlen); */
3927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
3928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
3929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ARG2_3, ARG2_4, ARG2_5 );
3930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_RECV:
3933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int recv(int s, void *buf, int len, unsigned int flags); */
3934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* man 2 recv says:
3935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         The  recv call is normally used only on a connected socket
3936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         (see connect(2)) and is identical to recvfrom with a  NULL
3937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         from parameter.
3938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      */
3939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
3940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
3941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_CONNECT:
3944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int connect(int sockfd,
3945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     struct sockaddr *serv_addr, int addrlen ); */
3946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
3947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
3948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SETSOCKOPT:
3951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int setsockopt(int s, int level, int optname,
3952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        const void *optval, int optlen); */
3953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
3954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
3955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ARG2_3, ARG2_4 );
3956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_GETSOCKOPT:
3959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int getsockopt(int s, int level, int optname,
3960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        void *optval, socklen_t *optlen); */
3961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
3962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
3963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ARG2_3, ARG2_4 );
3964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_GETSOCKNAME:
3967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int getsockname(int s, struct sockaddr* name, int* namelen) */
3968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
3969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
3970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_GETPEERNAME:
3973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int getpeername(int s, struct sockaddr* name, int* namelen) */
3974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
3975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
3976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SHUTDOWN:
3979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int shutdown(int s, int how); */
3980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
3981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SENDMSG:
3984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int sendmsg(int s, const struct msghdr *msg, int flags); */
3985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
3986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_sendmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
3987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_RECVMSG:
3990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int recvmsg(int s, struct msghdr *msg, int flags); */
3991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ_ef("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
3992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_PRE_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
3993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   default:
3996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1);
3997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      SET_STATUS_Failure( VKI_EINVAL );
3998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
3999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
4000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_0
4001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_1
4002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_2
4003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_3
4004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_4
4005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_5
4006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_socketcall)
4009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_0  (((UWord*)ARG2)[0])
4011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_1  (((UWord*)ARG2)[1])
4012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_2  (((UWord*)ARG2)[2])
4013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_3  (((UWord*)ARG2)[3])
4014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_4  (((UWord*)ARG2)[4])
4015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  define ARG2_5  (((UWord*)ARG2)[5])
4016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   SysRes r;
4018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
4019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (ARG1 /* request */) {
4020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SOCKETPAIR:
4022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      r = ML_(generic_POST_sys_socketpair)(
4023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov             tid, VG_(mk_SysRes_Success)(RES),
4024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov             ARG2_0, ARG2_1, ARG2_2, ARG2_3
4025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          );
4026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      SET_STATUS_from_SysRes(r);
4027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SOCKET:
4030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
4031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      SET_STATUS_from_SysRes(r);
4032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_BIND:
4035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int bind(int sockfd, struct sockaddr *my_addr,
4036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov			int addrlen); */
4037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_LISTEN:
4040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int listen(int s, int backlog); */
4041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_ACCEPT:
4044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_ACCEPT4:
4045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int accept(int s, struct sockaddr *addr, int *addrlen); */
4046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
4047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
4048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            ARG2_0, ARG2_1, ARG2_2 );
4049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     SET_STATUS_from_SysRes(r);
4050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     break;
4051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SENDTO:
4053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SEND:
4056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_RECVFROM:
4059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
4060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           ARG2_0, ARG2_1, ARG2_2,
4061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           ARG2_3, ARG2_4, ARG2_5 );
4062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_RECV:
4065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
4066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_CONNECT:
4069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SETSOCKOPT:
4072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_GETSOCKOPT:
4075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
4076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      ARG2_0, ARG2_1,
4077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      ARG2_2, ARG2_3, ARG2_4 );
4078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_GETSOCKNAME:
4081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
4082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              ARG2_0, ARG2_1, ARG2_2 );
4083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_GETPEERNAME:
4086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
4087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              ARG2_0, ARG2_1, ARG2_2 );
4088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SHUTDOWN:
4091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_SENDMSG:
4094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_SYS_RECVMSG:
4097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(generic_POST_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1, RES );
4098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
4099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4100c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#  if defined(ANDROID_HARDWARE_nexus_10)
4101c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   /* undocumented ioctl ids noted on the device */
4102c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   case 0x4d07:
4103c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   case 0x6101:
4104c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   case 0xfa01: /* used by NFC */
4105c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   case 0xfa05: /* used by NFC */
4106c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      return;
4107c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#  elif defined(ANDROID_HARDWARE_nexus_7)
4108c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   /* undocumented ioctl ids noted on the device */
4109c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   case 0x4e04:
4110c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   case 0x7231:
4111c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   case 0x4004e901: /* used by NFC */
4112c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      return;
4113c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#  elif defined(ANDROID_HARDWARE_nexus_4)
4114c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
4115c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#  endif
4116c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
4117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   default:
4118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1);
4119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(core_panic)("... bye!\n");
4120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break; /*NOTREACHED*/
4121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
4122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_0
4123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_1
4124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_2
4125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_3
4126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_4
4127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  undef ARG2_5
4128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
4130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_socket)
4132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_socket ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
4134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "socket", int, domain, int, type, int, protocol);
4135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_socket)
4137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   SysRes r;
4139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
4140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   r = ML_(generic_POST_sys_socket)(tid, VG_(mk_SysRes_Success)(RES));
4141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   SET_STATUS_from_SysRes(r);
4142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_setsockopt)
4145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_setsockopt ( %ld, %ld, %ld, %#lx, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5);
4147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ5(long, "setsockopt",
4148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, s, int, level, int, optname,
4149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 const void *, optval, int, optlen);
4150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(linux_PRE_sys_setsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
4151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_getsockopt)
4154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_getsockopt ( %ld, %ld, %ld, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
4156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ5(long, "getsockopt",
4157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, s, int, level, int, optname,
4158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 void *, optval, int, *optlen);
4159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(linux_PRE_sys_getsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
4160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_getsockopt)
4162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
4164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(linux_POST_sys_getsockopt)(tid, VG_(mk_SysRes_Success)(RES),
4165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       ARG1,ARG2,ARG3,ARG4,ARG5);
4166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_connect)
4169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
4171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_connect ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
4172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "connect",
4173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, sockfd, struct sockaddr *, serv_addr, int, addrlen);
4174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_connect)(tid, ARG1,ARG2,ARG3);
4175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_accept)
4178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
4180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_accept ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
4181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "accept",
4182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, s, struct sockaddr *, addr, int, *addrlen);
4183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3);
4184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_accept)
4186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   SysRes r;
4188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
4189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES),
4190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         ARG1,ARG2,ARG3);
4191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   SET_STATUS_from_SysRes(r);
4192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_accept4)
4195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
4197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_accept4 ( %ld, %#lx, %ld, %ld )",ARG1,ARG2,ARG3,ARG4);
4198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ4(long, "accept4",
4199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, s, struct sockaddr *, addr, int, *addrlen, int, flags);
4200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3);
4201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_accept4)
4203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   SysRes r;
4205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
4206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES),
4207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         ARG1,ARG2,ARG3);
4208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   SET_STATUS_from_SysRes(r);
4209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_send)
4212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
4214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_send ( %ld, %#lx, %ld, %lu )",ARG1,ARG2,ARG3,ARG4);
4215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ4(long, "send",
4216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, s, const void *, msg, int, len,
4217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 unsigned int, flags);
4218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_send)( tid, ARG1, ARG2, ARG3 );
4220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_sendto)
4223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
4225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_sendto ( %ld, %#lx, %ld, %lu, %#lx, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
4226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ6(long, "sendto",
4227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, s, const void *, msg, int, len,
4228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 unsigned int, flags,
4229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 const struct sockaddr *, to, int, tolen);
4230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_sendto)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
4231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE (sys_recv)
4234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags |= SfMayBlock;
4236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  PRINT ("sys_recv ( %ld, %#lx, %ld, %lu )", ARG1, ARG2, ARG3, ARG4);
4237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  PRE_REG_READ4 (long, "recv", int, s, void *, buf, int, len,
4238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 unsigned int, flags);
4239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ML_ (generic_PRE_sys_recv) (tid, ARG1, ARG2, ARG3);
4240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST (sys_recv)
4243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ML_ (generic_POST_sys_recv) (tid, RES, ARG1, ARG2, ARG3);
4245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_recvfrom)
4248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
4250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_recvfrom ( %ld, %#lx, %ld, %lu, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
4251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ6(long, "recvfrom",
4252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, s, void *, buf, int, len, unsigned int, flags,
4253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 struct sockaddr *, from, int *, fromlen);
4254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_recvfrom)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
4255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_recvfrom)
4257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
4259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_POST_sys_recvfrom)(tid, VG_(mk_SysRes_Success)(RES),
4260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
4261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_sendmsg)
4264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
4266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_sendmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
4267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "sendmsg",
4268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, s, const struct msghdr *, msg, int, flags);
4269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_sendmsg)(tid, "msg", (struct vki_msghdr *)ARG2);
4270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_recvmsg)
4273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
4275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_recvmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
4276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "recvmsg", int, s, struct msghdr *, msg, int, flags);
4277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_recvmsg)(tid, "msg", (struct vki_msghdr *)ARG2);
4278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_recvmsg)
4280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_POST_sys_recvmsg)(tid, "msg", (struct vki_msghdr *)ARG2, RES);
4282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_shutdown)
4285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
4287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_shutdown ( %ld, %ld )",ARG1,ARG2);
4288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ2(int, "shutdown", int, s, int, how);
4289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_bind)
4292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_bind ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
4294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "bind",
4295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, sockfd, struct sockaddr *, my_addr, int, addrlen);
4296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_bind)(tid, ARG1,ARG2,ARG3);
4297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_listen)
4300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_listen ( %ld, %ld )",ARG1,ARG2);
4302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ2(long, "listen", int, s, int, backlog);
4303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_getsockname)
4306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_getsockname ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3);
4308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "getsockname",
4309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, s, struct sockaddr *, name, int *, namelen);
4310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_getsockname)(tid, ARG1,ARG2,ARG3);
4311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_getsockname)
4313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
4315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_POST_sys_getsockname)(tid, VG_(mk_SysRes_Success)(RES),
4316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          ARG1,ARG2,ARG3);
4317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_getpeername)
4320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_getpeername ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3);
4322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(long, "getpeername",
4323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, s, struct sockaddr *, name, int *, namelen);
4324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_getpeername)(tid, ARG1,ARG2,ARG3);
4325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_getpeername)
4327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
4329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_POST_sys_getpeername)(tid, VG_(mk_SysRes_Success)(RES),
4330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          ARG1,ARG2,ARG3);
4331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_socketpair)
4334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_socketpair ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
4336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ4(long, "socketpair",
4337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, d, int, type, int, protocol, int*, sv);
4338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_PRE_sys_socketpair)(tid, ARG1,ARG2,ARG3,ARG4);
4339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_socketpair)
4341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
4343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ML_(generic_POST_sys_socketpair)(tid, VG_(mk_SysRes_Success)(RES),
4344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         ARG1,ARG2,ARG3,ARG4);
4345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
4349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *at wrappers
4350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
4351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_openat)
4353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HChar  name[30];
4355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes sres;
4356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 & VKI_O_CREAT) {
4358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // 4-arg version
4359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_openat ( %ld, %#lx(%s), %ld, %ld )",ARG1,ARG2,(char*)ARG2,ARG3,ARG4);
4360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "openat",
4361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, dfd, const char *, filename, int, flags, int, mode);
4362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // 3-arg version
4364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_openat ( %ld, %#lx(%s), %ld )",ARG1,ARG2,(char*)ARG2,ARG3);
4365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "openat",
4366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, dfd, const char *, filename, int, flags);
4367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_RASCIIZ( "openat(filename)", ARG2 );
4370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* For absolute filenames, dfd is ignored.  If dfd is AT_FDCWD,
4372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      filename is relative to cwd.  */
4373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (ML_(safe_to_deref)( (void*)ARG2, 1 )
4374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       && *(Char *)ARG2 != '/'
4375346e8e970c8b76ed70a8afcf23f8532a592ff73eDmitriy Ivanov       && ((Int)ARG1) != VKI_AT_FDCWD
4376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       && !ML_(fd_allowed)(ARG1, "openat", tid, False))
4377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
4378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Handle the case where the open is of /proc/self/cmdline or
4380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /proc/<pid>/cmdline, and just give it a copy of the fd for the
4381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fake file we cooked up at startup (in m_main).  Also, seek the
4382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      cloned fd back to the start. */
4383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sprintf)(name, "/proc/%d/cmdline", VG_(getpid)());
4385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG2, 1 )
4386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       && (VG_(strcmp)((HChar *)ARG2, name) == 0
4387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           || VG_(strcmp)((HChar *)ARG2, "/proc/self/cmdline") == 0)) {
4388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      sres = VG_(dup)( VG_(cl_cmdline_fd) );
4389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes( sres );
4390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!sr_isError(sres)) {
4391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         OffT off = VG_(lseek)( sr_Res(sres), 0, VKI_SEEK_SET );
4392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (off < 0)
4393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            SET_STATUS_Failure( VKI_EMFILE );
4394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
4396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Do the same for /proc/self/auxv or /proc/<pid>/auxv case. */
4399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   VG_(sprintf)(name, "/proc/%d/auxv", VG_(getpid)());
4401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (ML_(safe_to_deref)( (void*)ARG2, 1 )
4402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       && (VG_(strcmp)((HChar *)ARG2, name) == 0
4403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           || VG_(strcmp)((HChar *)ARG2, "/proc/self/auxv") == 0)) {
4404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      sres = VG_(dup)( VG_(cl_auxv_fd) );
4405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      SET_STATUS_from_SysRes( sres );
4406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (!sr_isError(sres)) {
4407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         OffT off = VG_(lseek)( sr_Res(sres), 0, VKI_SEEK_SET );
4408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (off < 0)
4409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            SET_STATUS_Failure( VKI_EMFILE );
4410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
4412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
4413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Otherwise handle normally */
4415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
4416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_openat)
4419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
4421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "openat", tid, True)) {
4422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
4423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
4424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
4426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG2);
4427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mkdirat)
4431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
4433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mkdirat ( %ld, %#lx(%s), %ld )", ARG1,ARG2,(char*)ARG2,ARG3);
4434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "mkdirat",
4435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, const char *, pathname, int, mode);
4436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "mkdirat(pathname)", ARG2 );
4437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mknodat)
4440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRINT("sys_mknodat ( %ld, %#lx(%s), 0x%lx, 0x%lx )", ARG1,ARG2,(char*)ARG2,ARG3,ARG4 );
4442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "mknodat",
4443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, const char *, pathname, int, mode, unsigned, dev);
4444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "mknodat(pathname)", ARG2 );
4445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fchownat)
4448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fchownat ( %ld, %#lx(%s), 0x%lx, 0x%lx )", ARG1,ARG2,(char*)ARG2,ARG3,ARG4);
4450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "fchownat",
4451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, const char *, path,
4452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_uid_t, owner, vki_gid_t, group);
4453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "fchownat(path)", ARG2 );
4454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_futimesat)
4457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_futimesat ( %ld, %#lx(%s), %#lx )", ARG1,ARG2,(char*)ARG2,ARG3);
4459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "futimesat",
4460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, char *, filename, struct timeval *, tvp);
4461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
4462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "futimesat(filename)", ARG2 );
4463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
4464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "futimesat(tvp)", ARG3, 2 * sizeof(struct vki_timeval) );
4465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_utimensat)
4468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_utimensat ( %ld, %#lx(%s), %#lx, 0x%lx )", ARG1,ARG2,(char*)ARG2,ARG3,ARG4);
4470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "utimensat",
4471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, char *, filename, struct timespec *, utimes, int, flags);
4472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
4473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "utimensat(filename)", ARG2 );
4474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
4475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "utimensat(tvp)", ARG3, 2 * sizeof(struct vki_timespec) );
4476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_newfstatat)
4479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   FUSE_COMPATIBLE_MAY_BLOCK();
4481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_newfstatat ( %ld, %#lx(%s), %#lx )", ARG1,ARG2,(char*)ARG2,ARG3);
4482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "fstatat",
4483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, char *, file_name, struct stat *, buf);
4484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "fstatat(file_name)", ARG2 );
4485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "fstatat(buf)", ARG3, sizeof(struct vki_stat) );
4486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_newfstatat)
4489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG3, sizeof(struct vki_stat) );
4491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_unlinkat)
4494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
4496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_unlinkat ( %ld, %#lx(%s) )", ARG1,ARG2,(char*)ARG2);
4497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "unlinkat", int, dfd, const char *, pathname);
4498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "unlinkat(pathname)", ARG2 );
4499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_renameat)
4502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_renameat ( %ld, %#lx(%s), %ld, %#lx(%s) )", ARG1,ARG2,(char*)ARG2,ARG3,ARG4,(char*)ARG4);
4504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "renameat",
4505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, olddfd, const char *, oldpath,
4506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, newdfd, const char *, newpath);
4507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "renameat(oldpath)", ARG2 );
4508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "renameat(newpath)", ARG4 );
4509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_linkat)
4512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
4514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_linkat ( %ld, %#lx(%s), %ld, %#lx(%s), %ld )",ARG1,ARG2,(char*)ARG2,ARG3,ARG4,(char*)ARG4,ARG5);
4515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "linkat",
4516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, olddfd, const char *, oldpath,
4517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, newdfd, const char *, newpath,
4518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, flags);
4519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "linkat(oldpath)", ARG2);
4520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "linkat(newpath)", ARG4);
4521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_symlinkat)
4524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
4526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_symlinkat ( %#lx(%s), %ld, %#lx(%s) )",ARG1,(char*)ARG1,ARG2,ARG3,(char*)ARG3);
4527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "symlinkat",
4528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *, oldpath, int, newdfd, const char *, newpath);
4529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "symlinkat(oldpath)", ARG1 );
4530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "symlinkat(newpath)", ARG3 );
4531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_readlinkat)
4534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HChar name[25];
4536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Word  saved = SYSNO;
4537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_readlinkat ( %ld, %#lx(%s), %#lx, %llu )", ARG1,ARG2,(char*)ARG2,ARG3,(ULong)ARG4);
4539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "readlinkat",
4540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, const char *, path, char *, buf, int, bufsiz);
4541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "readlinkat(path)", ARG2 );
4542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "readlinkat(buf)", ARG3,ARG4 );
4543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*
4545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * Handle the case where readlinkat is looking at /proc/self/exe or
4546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * /proc/<pid>/exe.
4547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    */
4548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sprintf)(name, "/proc/%d/exe", VG_(getpid)());
4549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)((void*)ARG2, 1)
4550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       && (VG_(strcmp)((HChar *)ARG2, name) == 0
4551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           || VG_(strcmp)((HChar *)ARG2, "/proc/self/exe") == 0)) {
4552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(sprintf)(name, "/proc/self/fd/%d", VG_(cl_exec_fd));
4553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes( VG_(do_syscall4)(saved, ARG1, (UWord)name,
4554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                                      ARG3, ARG4));
4555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Normal case */
4557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes( VG_(do_syscall4)(saved, ARG1, ARG2, ARG3, ARG4));
4558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS && RES > 0)
4561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, RES );
4562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fchmodat)
4565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fchmodat ( %ld, %#lx(%s), %ld )", ARG1,ARG2,(char*)ARG2,ARG3);
4567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "fchmodat",
4568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, const char *, path, vki_mode_t, mode);
4569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "fchmodat(path)", ARG2 );
4570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_faccessat)
4573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_faccessat ( %ld, %#lx(%s), %ld )", ARG1,ARG2,(char*)ARG2,ARG3);
4575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "faccessat",
4576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, const char *, pathname, int, mode);
4577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "faccessat(pathname)", ARG2 );
4578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_name_to_handle_at)
4581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_name_to_handle_at ( %ld, %#lx(%s), %#lx, %#lx, %ld )", ARG1, ARG2, (char*)ARG2, ARG3, ARG4, ARG5);
4583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ5(int, "name_to_handle_at",
4584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, dfd, const char *, name,
4585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 struct vki_file_handle *, handle,
4586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int *, mnt_id, int, flag);
4587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_RASCIIZ( "name_to_handle_at(name)", ARG2 );
4588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (ML_(safe_to_deref)( (void*)ARG3, sizeof(struct vki_file_handle))) {
4589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      struct vki_file_handle *fh = (struct vki_file_handle *)ARG3;
4590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ( "name_to_handle_at(handle)", (Addr)&fh->handle_bytes, sizeof(fh->handle_bytes) );
4591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_WRITE( "name_to_handle_at(handle)", (Addr)fh, sizeof(struct vki_file_handle) + fh->handle_bytes );
4592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
4593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_WRITE( "name_to_handle_at(mnt_id)", ARG4, sizeof(int) );
4594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_name_to_handle_at)
4597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   struct vki_file_handle *fh = (struct vki_file_handle *)ARG3;
4599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   POST_MEM_WRITE( ARG3, sizeof(struct vki_file_handle) + fh->handle_bytes );
4600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   POST_MEM_WRITE( ARG4, sizeof(int) );
4601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPRE(sys_open_by_handle_at)
4604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *flags |= SfMayBlock;
4606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRINT("sys_open_by_handle_at ( %ld, %#lx, %ld )", ARG1, ARG2, ARG3);
4607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_REG_READ3(int, "open_by_handle_at",
4608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, mountdirfd,
4609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 struct vki_file_handle *, handle,
4610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 int, flags);
4611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_READ( "open_by_handle_at(handle)", ARG2, sizeof(struct vki_file_handle) + ((struct vki_file_handle*)ARG2)->handle_bytes );
4612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPOST(sys_open_by_handle_at)
4615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
4616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert(SUCCESS);
4617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (!ML_(fd_allowed)(RES, "open_by_handle_at", tid, True)) {
4618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(close)(RES);
4619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      SET_STATUS_Failure( VKI_EMFILE );
4620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
4621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (VG_(clo_track_fds))
4622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG2);
4623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
4624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
4625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
4627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   p{read,write}v wrappers
4628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
4629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_preadv)
4631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int i;
4633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_iovec * vec;
4634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
4635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
4636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Note that the offset argument here is in lo+hi order on both
4637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      big and little endian platforms... */
4638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_preadv ( %ld, %#lx, %llu, %lld )",ARG1,ARG2,(ULong)ARG3,LOHI64(ARG4,ARG5));
4639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(ssize_t, "preadv",
4640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, fd, const struct iovec *, vector,
4641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, count, vki_u32, offset_low,
4642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_u32, offset_high);
4643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif VG_WORDSIZE == 8
4644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_preadv ( %ld, %#lx, %llu, %lld )",ARG1,ARG2,(ULong)ARG3,(Long)ARG4);
4645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(ssize_t, "preadv",
4646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, fd, const struct iovec *, vector,
4647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, count, Word, offset);
4648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  error Unexpected word size
4650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "preadv", tid, False)) {
4652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
4653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "preadv(vector)", ARG2, ARG3 * sizeof(struct vki_iovec) );
4655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG2 != 0) {
4657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* ToDo: don't do any of the following if the vector is invalid */
4658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec = (struct vki_iovec *)ARG2;
4659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (i = 0; i < (Int)ARG3; i++)
4660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_WRITE( "preadv(vector[...])",
4661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           (Addr)vec[i].iov_base, vec[i].iov_len );
4662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_preadv)
4667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
4669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0) {
4670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int i;
4671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      struct vki_iovec * vec = (struct vki_iovec *)ARG2;
4672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int remains = RES;
4673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* RES holds the number of bytes read. */
4675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (i = 0; i < (Int)ARG3; i++) {
4676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 Int nReadThisBuf = vec[i].iov_len;
4677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 if (nReadThisBuf > remains) nReadThisBuf = remains;
4678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 POST_MEM_WRITE( (Addr)vec[i].iov_base, nReadThisBuf );
4679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 remains -= nReadThisBuf;
4680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 if (remains < 0) VG_(core_panic)("preadv: remains < 0");
4681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_pwritev)
4686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int i;
4688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_iovec * vec;
4689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
4690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
4691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Note that the offset argument here is in lo+hi order on both
4692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      big and little endian platforms... */
4693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_pwritev ( %ld, %#lx, %llu, %lld )",ARG1,ARG2,(ULong)ARG3,LOHI64(ARG4,ARG5));
4694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(ssize_t, "pwritev",
4695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, fd, const struct iovec *, vector,
4696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, count, vki_u32, offset_low,
4697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_u32, offset_high);
4698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif VG_WORDSIZE == 8
4699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_pwritev ( %ld, %#lx, %llu, %lld )",ARG1,ARG2,(ULong)ARG3,(Long)ARG4);
4700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(ssize_t, "pwritev",
4701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, fd, const struct iovec *, vector,
4702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, count, Word, offset);
4703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  error Unexpected word size
4705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "pwritev", tid, False)) {
4707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
4708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "pwritev(vector)",
4710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ARG2, ARG3 * sizeof(struct vki_iovec) );
4711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG2 != 0) {
4712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* ToDo: don't do any of the following if the vector is invalid */
4713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec = (struct vki_iovec *)ARG2;
4714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (i = 0; i < (Int)ARG3; i++)
4715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_READ( "pwritev(vector[...])",
4716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           (Addr)vec[i].iov_base, vec[i].iov_len );
4717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
4722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   process_vm_{read,write}v wrappers
4723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ------------------------------------------------------------------ */
4724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4725663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(sys_process_vm_readv)
4726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
4727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("sys_process_vm_readv ( %lu, %#lx, %lu, %#lx, %lu, %lu )",
4728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
4729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_REG_READ6(ssize_t, "process_vm_readv",
4730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 vki_pid_t, pid,
4731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 const struct iovec *, lvec,
4732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 unsigned long, liovcnt,
4733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 const struct iovec *, rvec,
4734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 unsigned long, riovcnt,
4735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 unsigned long, flags);
4736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_MEM_READ( "process_vm_readv(lvec)",
4737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 ARG2, ARG3 * sizeof(struct vki_iovec) );
4738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_MEM_READ( "process_vm_readv(rvec)",
4739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 ARG4, ARG5 * sizeof(struct vki_iovec) );
4740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (ARG2 != 0) {
4741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* TODO: Don't do any of the following if lvec is invalid */
4742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      const struct vki_iovec *vec = (const struct vki_iovec *)ARG2;
4743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt i;
4744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (i = 0; i < ARG3; i++)
4745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         PRE_MEM_WRITE( "process_vm_readv(lvec[...])",
4746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        (Addr)vec[i].iov_base, vec[i].iov_len );
4747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
4749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4750663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPOST(sys_process_vm_readv)
4751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
4752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   const struct vki_iovec *vec = (const struct vki_iovec *)ARG2;
4753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt remains = RES;
4754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt i;
4755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 0; i < ARG3; i++) {
4756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt nReadThisBuf = vec[i].iov_len <= remains ?
4757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                          vec[i].iov_len : remains;
4758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      POST_MEM_WRITE( (Addr)vec[i].iov_base, nReadThisBuf );
4759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      remains -= nReadThisBuf;
4760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
4762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4763663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(sys_process_vm_writev)
4764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
4765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("sys_process_vm_writev ( %lu, %#lx, %lu, %#lx, %lu, %lu )",
4766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
4767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_REG_READ6(ssize_t, "process_vm_writev",
4768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 vki_pid_t, pid,
4769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 const struct iovec *, lvec,
4770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 unsigned long, liovcnt,
4771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 const struct iovec *, rvec,
4772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 unsigned long, riovcnt,
4773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 unsigned long, flags);
4774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_MEM_READ( "process_vm_writev(lvec)",
4775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 ARG2, ARG3 * sizeof(struct vki_iovec) );
4776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_MEM_READ( "process_vm_writev(rvec)",
4777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 ARG4, ARG5 * sizeof(struct vki_iovec) );
4778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (ARG2 != 0) {
4779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* TODO: Don't do any of the following if lvec is invalid */
4780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      const struct vki_iovec *vec = (const struct vki_iovec *)ARG2;
4781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt i;
4782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (i = 0; i < ARG3; i++)
4783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         PRE_MEM_READ( "process_vm_writev(lvec[...])",
4784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       (Addr)vec[i].iov_base, vec[i].iov_len );
4785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
4787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ---------------------------------------------------------------------
4789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   {send,recv}mmsg wrappers
4790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ------------------------------------------------------------------ */
4791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4792663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(sys_sendmmsg)
4793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
4794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)ARG2;
4795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   HChar name[32];
4796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt i;
4797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   *flags |= SfMayBlock;
4798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("sys_sendmmsg ( %ld, %#lx, %ld, %ld )",ARG1,ARG2,ARG3,ARG4);
4799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_REG_READ4(long, "sendmmsg",
4800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 int, s, const struct mmsghdr *, mmsg, int, vlen, int, flags);
4801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 0; i < ARG3; i++) {
4802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      VG_(sprintf)(name, "mmsg[%u].msg_hdr", i);
4803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ML_(generic_PRE_sys_sendmsg)(tid, name, &mmsg[i].msg_hdr);
4804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      VG_(sprintf)(name, "sendmmsg(mmsg[%u].msg_len)", i);
4805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_WRITE( name, (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
4806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
4808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4809663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPOST(sys_sendmmsg)
4810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
4811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (RES > 0) {
4812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)ARG2;
4813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt i;
4814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (i = 0; i < RES; i++) {
4815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         POST_MEM_WRITE( (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
4816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
4817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
4819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4820663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(sys_recvmmsg)
4821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
4822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)ARG2;
4823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   HChar name[32];
4824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt i;
4825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   *flags |= SfMayBlock;
4826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("sys_recvmmsg ( %ld, %#lx, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
4827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_REG_READ5(long, "recvmmsg",
4828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 int, s, struct mmsghdr *, mmsg, int, vlen,
4829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 int, flags, struct timespec *, timeout);
4830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 0; i < ARG3; i++) {
4831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      VG_(sprintf)(name, "mmsg[%u].msg_hdr", i);
4832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ML_(generic_PRE_sys_recvmsg)(tid, name, &mmsg[i].msg_hdr);
4833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      VG_(sprintf)(name, "recvmmsg(mmsg[%u].msg_len)", i);
4834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_WRITE( name, (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
4835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (ARG5)
4837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_READ( "recvmmsg(timeout)", ARG5, sizeof(struct vki_timespec) );
4838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
4839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4840663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPOST(sys_recvmmsg)
4841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
4842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (RES > 0) {
4843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)ARG2;
4844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      HChar name[32];
4845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt i;
4846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (i = 0; i < RES; i++) {
4847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         VG_(sprintf)(name, "mmsg[%u].msg_hdr", i);
4848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ML_(generic_POST_sys_recvmsg)(tid, name, &mmsg[i].msg_hdr, mmsg[i].msg_len);
4849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         POST_MEM_WRITE( (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
4850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
4851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
4853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ---------------------------------------------------------------------
4855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   key retention service wrappers
4856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
4857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_request_key)
4859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_request_key ( %#lx(%s), %#lx(%s), %#lx(%s), %ld )",
4861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,(char*)ARG1,ARG2,(char*)ARG2,ARG3,(char*)ARG3,ARG4);
4862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "request_key",
4863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *, type, const char *, description,
4864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *, callout_info, vki_key_serial_t, keyring);
4865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "request_key(type)", ARG1);
4866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "request_key(description)", ARG2);
4867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != (UWord)NULL)
4868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "request_key(callout_info)", ARG3);
4869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_add_key)
4872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_add_key ( %#lx(%s), %#lx(%s), %#lx, %ld, %ld )",
4874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,(char*)ARG1,ARG2,(char*)ARG2,ARG3,ARG4,ARG5);
4875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "add_key",
4876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *, type, const char *, description,
4877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const void *, payload, vki_size_t, plen,
4878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_key_serial_t, keyring);
4879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "add_key(type)", ARG1);
4880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "add_key(description)", ARG2);
4881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != (UWord)NULL)
4882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "request_key(payload)", ARG3, ARG4);
4883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_keyctl)
4886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1 /* option */) {
4888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_GET_KEYRING_ID:
4889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_GET_KEYRING_ID, %ld, %ld )", ARG2,ARG3);
4890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "keyctl(KEYCTL_GET_KEYRING_ID)",
4891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, id, int, create);
4892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_JOIN_SESSION_KEYRING:
4894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_JOIN_SESSION_KEYRING, %#lx(%s) )", ARG2,(char*)ARG2);
4895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "keyctl(KEYCTL_JOIN_SESSION_KEYRING)",
4896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, const char *, name);
4897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG2 != (UWord)NULL)
4898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_RASCIIZ("keyctl(KEYCTL_JOIN_SESSION_KEYRING, name)", ARG2);
4899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_UPDATE:
4901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_UPDATE, %ld, %#lx, %ld )", ARG2,ARG3,ARG4);
4902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "keyctl(KEYCTL_UPDATE)",
4903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, key,
4904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    const void *, payload, vki_size_t, plen);
4905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3 != (UWord)NULL)
4906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ("keyctl(KEYCTL_UPDATE, payload)", ARG3, ARG4);
4907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_REVOKE:
4909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_REVOKE, %ld )", ARG2);
4910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "keyctl(KEYCTL_REVOKE)",
4911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, id);
4912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_CHOWN:
4914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_CHOWN, %ld, %ld, %ld )", ARG2,ARG3,ARG4);
4915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "keyctl(KEYCTL_CHOWN)",
4916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, id,
4917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_uid_t, uid, vki_gid_t, gid);
4918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_SETPERM:
4920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_SETPERM, %ld, %ld )", ARG2,ARG3);
4921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "keyctl(KEYCTL_SETPERM)",
4922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, id, vki_key_perm_t, perm);
4923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_DESCRIBE:
4925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_DESCRIBE, %ld, %#lx, %ld )", ARG2,ARG3,ARG4);
4926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "keyctl(KEYCTL_DESCRIBE)",
4927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, id,
4928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    char *, buffer, vki_size_t, buflen);
4929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3 != (UWord)NULL)
4930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("keyctl(KEYCTL_DESCRIBE, buffer)", ARG3, ARG4);
4931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_CLEAR:
4933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_CLEAR, %ld )", ARG2);
4934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "keyctl(KEYCTL_CLEAR)",
4935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, keyring);
4936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_LINK:
4938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_LINK, %ld, %ld )", ARG2,ARG3);
4939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "keyctl(KEYCTL_LINK)", int, option,
4940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_key_serial_t, keyring, vki_key_serial_t, key);
4941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_UNLINK:
4943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_UNLINK, %ld, %ld )", ARG2,ARG3);
4944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "keyctl(KEYCTL_UNLINK)", int, option,
4945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_key_serial_t, keyring, vki_key_serial_t, key);
4946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_SEARCH:
4948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_SEARCH, %ld, %#lx(%s), %#lx(%s), %ld )",
4949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARG2,ARG3,(char*)ARG3,ARG4,(char*)ARG4,ARG5);
4950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ5(long, "keyctl(KEYCTL_SEARCH)",
4951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, keyring,
4952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    const char *, type, const char *, description,
4953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_key_serial_t, destring);
4954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ("sys_keyctl(KEYCTL_SEARCH, type)", ARG3);
4955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ("sys_keyctl(KEYCTL_SEARCH, description)", ARG4);
4956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_READ:
4958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_READ, %ld, %#lx, %ld )", ARG2,ARG3,ARG4);
4959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "keyctl(KEYCTL_READ)",
4960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, keyring,
4961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    char *, buffer, vki_size_t, buflen);
4962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3 != (UWord)NULL)
4963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("keyctl(KEYCTL_READ, buffer)", ARG3, ARG4);
4964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_INSTANTIATE:
4966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_INSTANTIATE, %ld, %#lx, %ld, %ld )",
4967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARG2,ARG3,ARG4,ARG5);
4968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ5(long, "keyctl(KEYCTL_INSTANTIATE)",
4969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, key,
4970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    char *, payload, vki_size_t, plen,
4971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_key_serial_t, keyring);
4972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3 != (UWord)NULL)
4973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ("keyctl(KEYCTL_INSTANTIATE, payload)", ARG3, ARG4);
4974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_NEGATE:
4976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_NEGATE, %ld, %lu, %ld )", ARG2,ARG3,ARG4);
4977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "keyctl(KEYCTL_NEGATE)",
4978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, key,
4979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned, timeout, vki_key_serial_t, keyring);
4980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_SET_REQKEY_KEYRING:
4982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_SET_REQKEY_KEYRING, %ld )", ARG2);
4983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "keyctl(KEYCTL_SET_REQKEY_KEYRING)",
4984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, int, reqkey_defl);
4985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_SET_TIMEOUT:
4987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_SET_TIMEOUT, %ld, %ld )", ARG2,ARG3);
4988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "keyctl(KEYCTL_SET_TIMEOUT)",
4989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, key, unsigned, timeout);
4990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_ASSUME_AUTHORITY:
4992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( KEYCTL_ASSUME_AUTHORITY, %ld )", ARG2);
4993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "keyctl(KEYCTL_ASSUME_AUTHORITY)",
4994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, option, vki_key_serial_t, key);
4995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
4996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
4997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_keyctl ( %ld ) ", ARG1);
4998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ1(long, "keyctl", int, option);
4999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_keyctl)
5004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
5006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1 /* option */) {
5007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_DESCRIBE:
5008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KEYCTL_READ:
5009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (RES > ARG4)
5010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG3, ARG4);
5011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
5012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG3, RES);
5013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
5015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
5020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ioprio_ wrappers
5021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
5022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_ioprio_set)
5024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_ioprio_set ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
5026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int, "ioprio_set", int, which, int, who, int, ioprio);
5027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_ioprio_get)
5030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_ioprio_get ( %ld, %ld )", ARG1,ARG2);
5032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(int, "ioprio_get", int, which, int, who);
5033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
5036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _module wrappers
5037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
5038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_init_module)
5040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
5042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_init_module ( %#lx, %llu, %#lx(\"%s\") )",
5043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (ULong)ARG2, ARG3, (char*)ARG3);
5044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "init_module",
5045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, umod, unsigned long, len, const char *, uargs);
5046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "init_module(umod)", ARG1, ARG2 );
5047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "init_module(uargs)", ARG3 );
5048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_delete_module)
5051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
5053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_delete_module ( %#lx(\"%s\"), 0x%lx )", ARG1,(char*)ARG1, ARG2);
5054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "delete_module",
5055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *, name_user, unsigned int, flags);
5056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("delete_module(name_user)", ARG1);
5057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
5060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   splice wrappers
5061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
5062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_splice)
5064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
5066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_splice ( %ld, %#lx, %ld, %#lx, %ld, %ld )",
5067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
5068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_REG_READ6(vki_ssize_t, "splice",
5069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd_in, vki_loff_t *, off_in,
5070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd_out, vki_loff_t *, off_out,
5071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t, len, unsigned int, flags);
5072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "splice(fd_in)", tid, False) ||
5073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       !ML_(fd_allowed)(ARG3, "splice(fd_out)", tid, False)) {
5074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
5075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG2 != 0)
5077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "splice(off_in)", ARG2, sizeof(vki_loff_t));
5078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG4 != 0)
5079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "splice(off_out)", ARG4, sizeof(vki_loff_t));
5080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5083663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(sys_tee)
5084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
5085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   *flags |= SfMayBlock;
5086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("sys_tree ( %ld, %ld, %ld, %ld )", ARG1,ARG2,ARG3,ARG4);
5087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_REG_READ4(vki_ssize_t, "tee",
5088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 int, fd_in, int, fd_out,
5089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 vki_size_t, len, unsigned int, flags);
5090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (!ML_(fd_allowed)(ARG1, "tee(fd_in)", tid, False) ||
5091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       !ML_(fd_allowed)(ARG2, "tee(fd_out)", tid, False)) {
5092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      SET_STATUS_Failure( VKI_EBADF );
5093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
5095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5096663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(sys_vmsplice)
5097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
5098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int fdfl;
5099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   *flags |= SfMayBlock;
5100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("sys_vmsplice ( %ld, %#lx, %ld, %ld )",
5101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ARG1,ARG2,ARG3,ARG4);
5102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_REG_READ4(vki_ssize_t, "splice",
5103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 int, fd, struct vki_iovec *, iov,
5104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 unsigned long, nr_segs, unsigned int, flags);
5105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (!ML_(fd_allowed)(ARG1, "vmsplice(fd)", tid, False)) {
5106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      SET_STATUS_Failure( VKI_EBADF );
5107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else if ((fdfl = VG_(fcntl)(ARG1, VKI_F_GETFL, 0)) < 0) {
5108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      SET_STATUS_Failure( VKI_EBADF );
5109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
5110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      const struct vki_iovec *iov;
5111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_READ( "vmsplice(iov)", ARG2, sizeof(struct vki_iovec) * ARG3 );
5112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (iov = (struct vki_iovec *)ARG2;
5113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           iov < (struct vki_iovec *)ARG2 + ARG3; iov++)
5114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      {
5115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if ((fdfl & VKI_O_ACCMODE) == VKI_O_RDONLY)
5116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PRE_MEM_WRITE( "vmsplice(iov[...])", (Addr)iov->iov_base, iov->iov_len );
5117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
5118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            PRE_MEM_READ( "vmsplice(iov[...])", (Addr)iov->iov_base, iov->iov_len );
5119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
5122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5123663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPOST(sys_vmsplice)
5124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
5125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vg_assert(SUCCESS);
5126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (RES > 0) {
5127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Int fdfl = VG_(fcntl)(ARG1, VKI_F_GETFL, 0);
5128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vg_assert(fdfl >= 0);
5129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if ((fdfl & VKI_O_ACCMODE) == VKI_O_RDONLY)
5130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      {
5131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         const struct vki_iovec *iov;
5132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         for (iov = (struct vki_iovec *)ARG2;
5133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              iov < (struct vki_iovec *)ARG2 + ARG3; iov++)
5134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         {
5135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            POST_MEM_WRITE( (Addr)iov->iov_base, iov->iov_len );
5136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
5137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
5140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
5142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   oprofile-related wrappers
5143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
5144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_x86_linux)
5146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_lookup_dcookie)
5147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_lookup_dcookie (0x%llx, %#lx, %ld)",
5149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         MERGE64(ARG1,ARG2), ARG3, ARG4);
5150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "lookup_dcookie",
5151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_u32, MERGE64_FIRST(cookie), vki_u32, MERGE64_SECOND(cookie),
5152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char *, buf, vki_size_t, len);
5153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "lookup_dcookie(buf)", ARG3, ARG4);
5154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_lookup_dcookie)
5156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
5158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != (Addr)NULL)
5159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, RES);
5160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if defined(VGP_amd64_linux) || defined(VGP_s390x_linux)
5164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_lookup_dcookie)
5165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
5167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_lookup_dcookie ( %llu, %#lx, %llu )",
5168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 (ULong)ARG1, ARG2, (ULong)ARG3);
5169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int, "lookup_dcookie",
5170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long long, cookie, char *, buf, vki_size_t, len);
5171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "sys_lookup_dcookie(buf)", ARG2, ARG3 );
5173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_lookup_dcookie)
5176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
5178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != (Addr)NULL)
5179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     POST_MEM_WRITE( ARG2, RES );
5180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
5184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fcntl wrappers
5185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
5186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fcntl)
5188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG2) {
5190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // These ones ignore ARG3.
5191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETFD:
5192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETFL:
5193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETOWN:
5194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETSIG:
5195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETLEASE:
5196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_F_GETPIPE_SZ:
5197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_fcntl ( %ld, %ld )", ARG1,ARG2);
5198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "fcntl", unsigned int, fd, unsigned int, cmd);
5199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // These ones use ARG3 as "arg".
5202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_DUPFD:
5203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_DUPFD_CLOEXEC:
5204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETFD:
5205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETFL:
5206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLEASE:
5207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_NOTIFY:
5208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETOWN:
5209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETSIG:
5210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_F_SETPIPE_SZ:
5211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_fcntl[ARG3=='arg'] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
5212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
5213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd, unsigned long, arg);
5214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // These ones use ARG3 as "lock".
5217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETLK:
5218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLK:
5219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLKW:
5220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  if defined(VGP_x86_linux) || defined(VGP_mips64_linux)
5221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETLK64:
5222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLK64:
5223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLKW64:
5224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  endif
5225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_fcntl[ARG3=='lock'] ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3);
5226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
5227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd,
5228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    struct flock64 *, lock);
5229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_F_SETOWN_EX:
5232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRINT("sys_fcntl[F_SETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
5233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_REG_READ3(long, "fcntl",
5234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    unsigned int, fd, unsigned int, cmd,
5235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    struct vki_f_owner_ex *, arg);
5236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_READ("fcntl(F_SETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
5237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
5238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_F_GETOWN_EX:
5240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRINT("sys_fcntl[F_GETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
5241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_REG_READ3(long, "fcntl",
5242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    unsigned int, fd, unsigned int, cmd,
5243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    struct vki_f_owner_ex *, arg);
5244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_WRITE("fcntl(F_GETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
5245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
5246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_VERSION:
5248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_version *data = (struct vki_drm_version *)ARG3;
5250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_WRITE("ioctl(DRM_VERSION).version_major", (Addr)&data->version_major, sizeof(data->version_major));
5251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_VERSION).version_minor", (Addr)&data->version_minor, sizeof(data->version_minor));
5252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_VERSION).version_patchlevel", (Addr)&data->version_patchlevel, sizeof(data->version_patchlevel));
5253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ("ioctl(DRM_VERSION).name_len", (Addr)&data->name_len, sizeof(data->name_len));
5254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ("ioctl(DRM_VERSION).name", (Addr)&data->name, sizeof(data->name));
5255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_VERSION).name", (Addr)data->name, data->name_len);
5256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ("ioctl(DRM_VERSION).date_len", (Addr)&data->date_len, sizeof(data->date_len));
5257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ("ioctl(DRM_VERSION).date", (Addr)&data->date, sizeof(data->date));
5258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_VERSION).date", (Addr)data->date, data->date_len);
5259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ("ioctl(DRM_VERSION).desc_len", (Addr)&data->desc_len, sizeof(data->desc_len));
5260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ("ioctl(DRM_VERSION).desc", (Addr)&data->desc, sizeof(data->desc));
5261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_VERSION).desc", (Addr)data->desc, data->desc_len);
5262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_GET_UNIQUE:
5265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_unique *data = (struct vki_drm_unique *)ARG3;
5267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_GET_UNIQUE).unique_len", (Addr)&data->unique_len, sizeof(data->unique_len));
5268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_GET_UNIQUE).unique", (Addr)&data->unique, sizeof(data->unique));
5269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_WRITE("ioctl(DRM_GET_UNIQUE).unique", (Addr)data->unique, data->unique_len);
5270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_GET_MAGIC:
5273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_auth *data = (struct vki_drm_auth *)ARG3;
5275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_GET_MAGIC).magic", (Addr)&data->magic, sizeof(data->magic));
5276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_WAIT_VBLANK:
5279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         union vki_drm_wait_vblank *data = (union vki_drm_wait_vblank *)ARG3;
5281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_WAIT_VBLANK).request.type", (Addr)&data->request.type, sizeof(data->request.type));
5282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_WAIT_VBLANK).request.sequence", (Addr)&data->request.sequence, sizeof(data->request.sequence));
5283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 /* XXX: It seems request.signal isn't used */
5284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_WAIT_VBLANK).reply", (Addr)&data->reply, sizeof(data->reply));
5285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_GEM_CLOSE:
5288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_gem_close *data = (struct vki_drm_gem_close *)ARG3;
5290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_GEM_CLOSE).handle", (Addr)&data->handle, sizeof(data->handle));
5291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_GEM_FLINK:
5294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_gem_flink *data = (struct vki_drm_gem_flink *)ARG3;
5296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_GEM_FLINK).handle", (Addr)&data->handle, sizeof(data->handle));
5297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_GEM_FLINK).name", (Addr)&data->name, sizeof(data->name));
5298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_GEM_OPEN:
5301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_gem_open *data = (struct vki_drm_gem_open *)ARG3;
5303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_GEM_OPEN).name", (Addr)&data->name, sizeof(data->name));
5304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_WRITE("ioctl(DRM_GEM_OPEN).handle", (Addr)&data->handle, sizeof(data->handle));
5305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_WRITE("ioctl(DRM_GEM_OPEN).size", (Addr)&data->size, sizeof(data->size));
5306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GETPARAM:
5309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vki_drm_i915_getparam_t *data = (vki_drm_i915_getparam_t *)ARG3;
5311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GETPARAM).param", (Addr)&data->param, sizeof(data->param));
5312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_WRITE("ioctl(DRM_I915_GETPARAM).value", (Addr)data->value, sizeof(int));
5313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_BUSY:
5316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_busy *data = (struct vki_drm_i915_gem_busy *)ARG3;
5318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_BUSY).handle", (Addr)&data->handle, sizeof(data->handle));
5319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_BUSY).busy", (Addr)&data->busy, sizeof(data->busy));
5320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_CREATE:
5323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_create *data = (struct vki_drm_i915_gem_create *)ARG3;
5325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_CREATE).size", (Addr)&data->size, sizeof(data->size));
5326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_CREATE).handle", (Addr)&data->handle, sizeof(data->handle));
5327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_PREAD:
5330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_pread *data = (struct vki_drm_i915_gem_pread *)ARG3;
5332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).handle", (Addr)&data->handle, sizeof(data->handle));
5333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).offset", (Addr)&data->offset, sizeof(data->offset));
5334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).size", (Addr)&data->size, sizeof(data->size));
5335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).data_ptr", (Addr)&data->data_ptr, sizeof(data->data_ptr));
5336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_PREAD).data_ptr", (Addr)data->data_ptr, data->size);
5337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_PWRITE:
5340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_pwrite *data = (struct vki_drm_i915_gem_pwrite *)ARG3;
5342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).handle", (Addr)&data->handle, sizeof(data->handle));
5343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).offset", (Addr)&data->offset, sizeof(data->offset));
5344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).size", (Addr)&data->size, sizeof(data->size));
5345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).data_ptr", (Addr)&data->data_ptr, sizeof(data->data_ptr));
5346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 /* PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).data_ptr", (Addr)data->data_ptr, data->size);
5347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	  * NB: the buffer is allowed to contain any amount of uninitialized data (e.g.
5348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	  * interleaved vertex attributes may have a wide stride with uninitialized data between
5349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	  * consecutive vertices) */
5350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_MMAP_GTT:
5353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_mmap_gtt *data = (struct vki_drm_i915_gem_mmap_gtt *)ARG3;
5355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_MMAP_GTT).handle", (Addr)&data->handle, sizeof(data->handle));
5356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_MMAP_GTT).offset", (Addr)&data->offset, sizeof(data->offset));
5357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_SET_DOMAIN:
5360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_set_domain *data = (struct vki_drm_i915_gem_set_domain *)ARG3;
5362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_DOMAIN).handle", (Addr)&data->handle, sizeof(data->handle));
5363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_DOMAIN).read_domains", (Addr)&data->read_domains, sizeof(data->read_domains));
5364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_DOMAIN).write_domain", (Addr)&data->write_domain, sizeof(data->write_domain));
5365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_SET_TILING:
5368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_set_tiling *data = (struct vki_drm_i915_gem_set_tiling *)ARG3;
5370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_TILING).handle", (Addr)&data->handle, sizeof(data->handle));
5371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_TILING).tiling_mode", (Addr)&data->tiling_mode, sizeof(data->tiling_mode));
5372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_TILING).stride", (Addr)&data->stride, sizeof(data->stride));
5373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_SET_TILING).swizzle_mode", (Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
5374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_GET_TILING:
5377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_get_tiling *data = (struct vki_drm_i915_gem_get_tiling *)ARG3;
5379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_READ("ioctl(DRM_I915_GEM_GET_TILING).handle", (Addr)&data->handle, sizeof(data->handle));
5380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_TILING).tiling_mode", (Addr)&data->tiling_mode, sizeof(data->tiling_mode));
5381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_TILING).swizzle_mode", (Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
5382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_GET_APERTURE:
5385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_get_aperture *data = (struct vki_drm_i915_gem_get_aperture *)ARG3;
5387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_APERTURE).aper_size", (Addr)&data->aper_size, sizeof(data->aper_size));
5388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_APERTURE).aper_available_size", (Addr)&data->aper_available_size, sizeof(data->aper_available_size));
5389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
5393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_fcntl[UNKNOWN] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
5394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      I_die_here;
5395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  if defined(VGP_x86_linux)
5399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64)
5400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  else
5401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == VKI_F_SETLKW)
5402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  endif
5403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfMayBlock;
5404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_fcntl)
5407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
5409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == VKI_F_DUPFD) {
5410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!ML_(fd_allowed)(RES, "fcntl(DUPFD)", tid, True)) {
5411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(close)(RES);
5412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EMFILE );
5413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
5414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (VG_(clo_track_fds))
5415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(record_fd_open_named)(tid, RES);
5416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else if (ARG2 == VKI_F_DUPFD_CLOEXEC) {
5419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!ML_(fd_allowed)(RES, "fcntl(DUPFD_CLOEXEC)", tid, True)) {
5420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(close)(RES);
5421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EMFILE );
5422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
5423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (VG_(clo_track_fds))
5424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(record_fd_open_named)(tid, RES);
5425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else if (ARG2 == VKI_F_GETOWN_EX) {
5427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      POST_MEM_WRITE(ARG3, sizeof(struct vki_f_owner_ex));
5428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// XXX: wrapper only suitable for 32-bit systems
5432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fcntl64)
5433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG2) {
5435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // These ones ignore ARG3.
5436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETFD:
5437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETFL:
5438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETOWN:
5439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETOWN:
5440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETSIG:
5441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETSIG:
5442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETLEASE:
5443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_fcntl64 ( %ld, %ld )", ARG1,ARG2);
5444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "fcntl64", unsigned int, fd, unsigned int, cmd);
5445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // These ones use ARG3 as "arg".
5448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_DUPFD:
5449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_DUPFD_CLOEXEC:
5450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETFD:
5451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETFL:
5452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLEASE:
5453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_NOTIFY:
5454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_fcntl64[ARG3=='arg'] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
5455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl64",
5456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd, unsigned long, arg);
5457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // These ones use ARG3 as "lock".
5460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETLK:
5461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLK:
5462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLKW:
5463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  if defined(VGP_x86_linux)
5464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETLK64:
5465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLK64:
5466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLKW64:
5467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  endif
5468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_fcntl64[ARG3=='lock'] ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3);
5469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl64",
5470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd,
5471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    struct flock64 *, lock);
5472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_F_SETOWN_EX:
5475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRINT("sys_fcntl[F_SETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
5476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_REG_READ3(long, "fcntl",
5477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    unsigned int, fd, unsigned int, cmd,
5478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    struct vki_f_owner_ex *, arg);
5479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_READ("fcntl(F_SETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
5480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
5481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_F_GETOWN_EX:
5483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRINT("sys_fcntl[F_GETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
5484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_REG_READ3(long, "fcntl",
5485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    unsigned int, fd, unsigned int, cmd,
5486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    struct vki_f_owner_ex *, arg);
5487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_WRITE("fcntl(F_GETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
5488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
5489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  if defined(VGP_x86_linux)
5492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64)
5493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  else
5494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == VKI_F_SETLKW)
5495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  endif
5496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfMayBlock;
5497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_fcntl64)
5500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
5502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == VKI_F_DUPFD) {
5503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!ML_(fd_allowed)(RES, "fcntl64(DUPFD)", tid, True)) {
5504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(close)(RES);
5505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EMFILE );
5506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
5507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (VG_(clo_track_fds))
5508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(record_fd_open_named)(tid, RES);
5509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else if (ARG2 == VKI_F_DUPFD_CLOEXEC) {
5512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!ML_(fd_allowed)(RES, "fcntl64(DUPFD_CLOEXEC)", tid, True)) {
5513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(close)(RES);
5514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EMFILE );
5515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
5516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (VG_(clo_track_fds))
5517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(record_fd_open_named)(tid, RES);
5518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else if (ARG2 == VKI_F_GETOWN_EX) {
5520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      POST_MEM_WRITE(ARG3, sizeof(struct vki_f_owner_ex));
5521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
5525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ioctl wrappers
5526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
5527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_ioctl)
5529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
5531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // We first handle the ones that don't use ARG3 (even as a
5533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // scalar/non-pointer argument).
5534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG2 /* request */) {
5535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* asm-generic/ioctls.h */
5537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_FIOCLEX:
5538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_FIONCLEX:
5539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* linux/soundcard interface (ALSA) */
5541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_HW_FREE:
5542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_HWSYNC:
5543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_PREPARE:
5544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_RESET:
5545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_START:
5546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_DROP:
5547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_DRAIN:
5548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_RESUME:
5549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_XRUN:
5550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_UNLINK:
5551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_TIMER_IOCTL_START:
5552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_TIMER_IOCTL_STOP:
5553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_TIMER_IOCTL_CONTINUE:
5554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_TIMER_IOCTL_PAUSE:
5555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* SCSI no operand */
5557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_SCSI_IOCTL_DOORLOCK:
5558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_SCSI_IOCTL_DOORUNLOCK:
5559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* KVM ioctls that dont check for a numeric value as parameter */
5561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_S390_ENABLE_SIE:
5562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_KVM_CREATE_IRQCHIP:
5563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_S390_INITIAL_RESET:
5564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* vhost without parameter */
5566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_VHOST_SET_OWNER:
5567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_VHOST_RESET_OWNER:
5568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* User input device creation */
5570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_UI_DEV_CREATE:
5571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_UI_DEV_DESTROY:
5572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* InfiniBand */
5574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IB_USER_MAD_ENABLE_PKEY:
5575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_ioctl ( %ld, 0x%lx )",ARG1,ARG2);
5576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "ioctl",
5577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, request);
5578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
5579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_VERSION:
5581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_version *data = (struct vki_drm_version *)ARG3;
5583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 POST_MEM_WRITE((Addr)&data->version_major, sizeof(data->version_major));
5584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->version_minor, sizeof(data->version_minor));
5585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->version_patchlevel, sizeof(data->version_patchlevel));
5586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->name_len, sizeof(data->name_len));
5587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)data->name, data->name_len);
5588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->date_len, sizeof(data->date_len));
5589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)data->date, data->date_len);
5590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->desc_len, sizeof(data->desc_len));
5591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)data->desc, data->desc_len);
5592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_GET_UNIQUE:
5595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_unique *data = (struct vki_drm_unique *)ARG3;
5597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 POST_MEM_WRITE((Addr)data->unique, sizeof(data->unique_len));
5598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_GET_MAGIC:
5601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_auth *data = (struct vki_drm_auth *)ARG3;
5603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->magic, sizeof(data->magic));
5604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_WAIT_VBLANK:
5607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         union vki_drm_wait_vblank *data = (union vki_drm_wait_vblank *)ARG3;
5609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->reply, sizeof(data->reply));
5610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_GEM_FLINK:
5613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_gem_flink *data = (struct vki_drm_gem_flink *)ARG3;
5615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->name, sizeof(data->name));
5616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_GEM_OPEN:
5619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_gem_open *data = (struct vki_drm_gem_open *)ARG3;
5621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 POST_MEM_WRITE((Addr)&data->handle, sizeof(data->handle));
5622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 POST_MEM_WRITE((Addr)&data->size, sizeof(data->size));
5623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GETPARAM:
5626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vki_drm_i915_getparam_t *data = (vki_drm_i915_getparam_t *)ARG3;
5628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 POST_MEM_WRITE((Addr)data->value, sizeof(int));
5629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_BUSY:
5632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_busy *data = (struct vki_drm_i915_gem_busy *)ARG3;
5634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->busy, sizeof(data->busy));
5635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_CREATE:
5638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_create *data = (struct vki_drm_i915_gem_create *)ARG3;
5640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 POST_MEM_WRITE((Addr)&data->handle, sizeof(data->handle));
5641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_PREAD:
5644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_pread *data = (struct vki_drm_i915_gem_pread *)ARG3;
5646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 POST_MEM_WRITE((Addr)data->data_ptr, data->size);
5647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_MMAP_GTT:
5650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_mmap_gtt *data = (struct vki_drm_i915_gem_mmap_gtt *)ARG3;
5652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->offset, sizeof(data->offset));
5653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_SET_TILING:
5656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_set_tiling *data = (struct vki_drm_i915_gem_set_tiling *)ARG3;
5658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->tiling_mode, sizeof(data->tiling_mode));
5659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->stride, sizeof(data->stride));
5660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
5661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_GET_TILING:
5664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_get_tiling *data = (struct vki_drm_i915_gem_get_tiling *)ARG3;
5666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	 POST_MEM_WRITE((Addr)&data->tiling_mode, sizeof(data->tiling_mode));
5667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
5668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_DRM_IOCTL_I915_GEM_GET_APERTURE:
5671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (ARG3) {
5672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_drm_i915_gem_get_aperture *data = (struct vki_drm_i915_gem_get_aperture *)ARG3;
5673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->aper_size, sizeof(data->aper_size));
5674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         POST_MEM_WRITE((Addr)&data->aper_available_size, sizeof(data->aper_available_size));
5675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
5677fe1fa7caae1b429af737fa4f946a7fc85827f2cdBen Cheng
5678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
5679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_ioctl ( %ld, 0x%lx, 0x%lx )",ARG1,ARG2,ARG3);
5680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "ioctl",
5681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, request, unsigned long, arg);
5682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5685c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
5686c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#  if defined(ANDROID_HARDWARE_nexus_10)
5687c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
5688c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   /* undocumented ioctl ids noted on the device */
5689c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   if (ARG2 >= 0xc0108000 && ARG2 <= 0xc1e8820b && ARG3 != 0) {
5690c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov       int size = (ARG2 >> 16) & 0x3fff;
5691c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov       PRE_MEM_WRITE("ioctl(GL_UNDOCUMENTED)", (Addr)ARG3,  size);
5692c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov       return;
5693c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   }
5694c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
5695c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#  endif
5696c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
5697c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
5698c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#  if defined(ANDROID_HARDWARE_nexus_10)
5699c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
5700c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   /* undocumented ioctl ids noted on the device */
5701c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   if (ARG2 >= 0xc0108000 && ARG2 <= 0xc1e8820b && ARG3 != 0) {
5702c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov       int size = (ARG2 >> 16) & 0x3fff;
5703c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov       PRE_MEM_WRITE("ioctl(GL_UNDOCUMENTED)", (Addr)ARG3,  size);
5704c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov       return;
5705c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   }
5706c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
5707c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#  endif
5708c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
5709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // We now handle those that do look at ARG3 (and unknown ones fall into
5710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // this category).  Nb: some of these may well belong in the
5711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // doesn't-use-ARG3 switch above.
5712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG2 /* request */) {
5713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETS:
5714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETSW:
5715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETSF:
5716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TCSET{S,SW,SF})", ARG3, sizeof(struct vki_termios) );
5717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCGETS:
5719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TCGETS)", ARG3, sizeof(struct vki_termios) );
5720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETA:
5722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETAW:
5723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETAF:
5724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TCSET{A,AW,AF})", ARG3, sizeof(struct vki_termio) );
5725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCGETA:
5727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TCGETA)", ARG3, sizeof(struct vki_termio) );
5728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSBRK:
5730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCXONC:
5731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSBRKP:
5732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCFLSH:
5733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* These just take an int by value */
5734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGWINSZ:
5736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TIOCGWINSZ)", ARG3, sizeof(struct vki_winsize) );
5737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSWINSZ:
5739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TIOCSWINSZ)",  ARG3, sizeof(struct vki_winsize) );
5740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMBIS:
5742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TIOCMBIS)",    ARG3, sizeof(unsigned int) );
5743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMBIC:
5745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TIOCMBIC)",    ARG3, sizeof(unsigned int) );
5746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMSET:
5748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TIOCMSET)",    ARG3, sizeof(unsigned int) );
5749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMGET:
5751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TIOCMGET)",   ARG3, sizeof(unsigned int) );
5752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCLINUX:
5754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TIOCLINUX)",   ARG3, sizeof(char *) );
5755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (*(char *)ARG3 == 11) {
5756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 PRE_MEM_READ( "ioctl(TIOCLINUX, 11)", ARG3, 2 * sizeof(char *) );
5757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGPGRP:
5760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Get process group ID for foreground processing group. */
5761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
5762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSPGRP:
5764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Set a process group ID? */
5765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
5766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGPTN: /* Get Pty Number (of pty-mux device) */
5768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TIOCGPTN)", ARG3, sizeof(int) );
5769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSCTTY:
5771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Just takes an int value.  */
5772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSPTLCK: /* Lock/unlock Pty */
5774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TIOCSPTLCK)", ARG3, sizeof(int) );
5775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIONBIO:
5777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(FIONBIO)",    ARG3, sizeof(int) );
5778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIOASYNC:
5780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(FIOASYNC)",   ARG3, sizeof(int) );
5781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIONREAD:                /* identical to SIOCINQ */
5783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(FIONREAD)",  ARG3, sizeof(int) );
5784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_FIOQSIZE:
5786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ioctl(FIOQSIZE)",  ARG3, sizeof(vki_loff_t) );
5787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
5788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSERGETLSR:
5790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TIOCSERGETLSR)", ARG3, sizeof(int) );
5791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGICOUNT:
5793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TIOCGICOUNT)", ARG3,
5794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(struct vki_serial_icounter_struct) );
5795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_SET_COMMAND_Q:
5798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SG_SET_COMMAND_Q)", ARG3, sizeof(int) );
5799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_IO:
5801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SG_IO)", ARG3, sizeof(vki_sg_io_hdr_t) );
5802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_GET_SCSI_ID:
5804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SG_GET_SCSI_ID)", ARG3, sizeof(vki_sg_scsi_id_t) );
5805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_SET_RESERVED_SIZE:
5807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SG_SET_RESERVED_SIZE)", ARG3, sizeof(int) );
5808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_SET_TIMEOUT:
5810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SG_SET_TIMEOUT)", ARG3, sizeof(int) );
5811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_GET_RESERVED_SIZE:
5813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SG_GET_RESERVED_SIZE)", ARG3, sizeof(int) );
5814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_GET_TIMEOUT:
5816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_GET_VERSION_NUM:
5818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE(  "ioctl(SG_GET_VERSION_NUM)",  ARG3, sizeof(int) );
5819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_EMULATED_HOST: /* 0x2203 */
5821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SG_EMULATED_HOST)",    ARG3, sizeof(int) );
5822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_GET_SG_TABLESIZE: /* 0x227f */
5824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SG_GET_SG_TABLESIZE)", ARG3, sizeof(int) );
5825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IIOCGETCPS:
5828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(IIOCGETCPS)", ARG3,
5829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     VKI_ISDN_MAX_CHANNELS * 2 * sizeof(unsigned long) );
5830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IIOCNETGPN:
5832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(IIOCNETGPN)",
5833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     (Addr)&((vki_isdn_net_ioctl_phone *)ARG3)->name,
5834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof(((vki_isdn_net_ioctl_phone *)ARG3)->name) );
5835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(IIOCNETGPN)", ARG3,
5836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof(vki_isdn_net_ioctl_phone) );
5837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* These all use struct ifreq AFAIK */
5840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFINDEX:        /* get iface index              */
5841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFINDEX)",
5842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFINDEX)", ARG3, sizeof(struct vki_ifreq));
5844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFFLAGS:        /* get flags                    */
5846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFFLAGS)",
5847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFFLAGS)", ARG3, sizeof(struct vki_ifreq));
5849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFHWADDR:       /* Get hardware address         */
5851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFHWADDR)",
5852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFHWADDR)", ARG3, sizeof(struct vki_ifreq));
5854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFMTU:          /* get MTU size                 */
5856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMTU)",
5857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFMTU)", ARG3, sizeof(struct vki_ifreq));
5859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFADDR:         /* get PA address               */
5861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFADDR)",
5862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFADDR)", ARG3, sizeof(struct vki_ifreq));
5864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFNETMASK:      /* get network PA mask          */
5866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFNETMASK)",
5867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFNETMASK)", ARG3, sizeof(struct vki_ifreq));
5869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFMETRIC:       /* get metric                   */
5871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMETRIC)",
5872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFMETRIC)", ARG3, sizeof(struct vki_ifreq));
5874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFMAP:          /* Get device parameters        */
5876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMAP)",
5877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFMAP)", ARG3, sizeof(struct vki_ifreq));
5879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFTXQLEN:       /* Get the tx queue length      */
5881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFTXQLEN)",
5882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFTXQLEN)", ARG3, sizeof(struct vki_ifreq));
5884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFDSTADDR:      /* get remote PA address        */
5886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFDSTADDR)",
5887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFDSTADDR)", ARG3, sizeof(struct vki_ifreq));
5889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFBRDADDR:      /* get broadcast PA address     */
5891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFBRDADDR)",
5892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFBRDADDR)", ARG3, sizeof(struct vki_ifreq));
5894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFNAME:         /* get iface name               */
5896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCGIFNAME)",
5897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_ifindex,
5898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_ifindex) );
5899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFNAME)", ARG3, sizeof(struct vki_ifreq));
5900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGMIIPHY:         /* get hardware entry           */
5902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMIIPHY)",
5903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFMIIPHY)", ARG3, sizeof(struct vki_ifreq));
5905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGMIIREG:         /* get hardware entry registers */
5907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMIIREG)",
5908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCGIFMIIREG)",
5910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
5911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
5912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCGIFMIIREG)",
5913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num,
5914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num) );
5915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFMIIREG)", ARG3,
5916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof(struct vki_ifreq));
5917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFCONF:         /* get iface list               */
5919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* WAS:
5920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 PRE_MEM_WRITE( "ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
5921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 KERNEL_DO_SYSCALL(tid,RES);
5922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 if (!VG_(is_kerror)(RES) && RES == 0)
5923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
5924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      */
5925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
5926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_ifconf *)ARG3)->ifc_len,
5927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_ifconf *)ARG3)->ifc_len));
5928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
5929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_ifconf *)ARG3)->vki_ifc_buf,
5930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_ifconf *)ARG3)->vki_ifc_buf));
5931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
5932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 // TODO len must be readable and writable
5933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 // buf pointer only needs to be readable
5934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
5935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 PRE_MEM_WRITE( "ioctl(SIOCGIFCONF).ifc_buf",
5936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown			(Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
5937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGSTAMP:
5940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGSTAMP)", ARG3, sizeof(struct vki_timeval));
5941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGSTAMPNS:
5943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGSTAMPNS)", ARG3, sizeof(struct vki_timespec));
5944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* SIOCOUTQ is an ioctl that, when called on a socket, returns
5946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 the number of bytes currently in that socket's send buffer.
5947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 It writes this value as an int to the memory location
5948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 indicated by the third argument of ioctl(2). */
5949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCOUTQ:
5950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCOUTQ)", ARG3, sizeof(int));
5951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGRARP:           /* get RARP table entry         */
5953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGARP:            /* get ARP table entry          */
5954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGARP)", ARG3, sizeof(struct vki_arpreq));
5955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFFLAGS:        /* set flags                    */
5958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFFLAGS)",
5959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIFFLAGS)",
5961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
5962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
5963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFMAP:          /* Set device parameters        */
5965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMAP)",
5966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIFMAP)",
5968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_map,
5969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->ifr_map) );
5970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_SIOCSHWTSTAMP:       /* Set hardware time stamping   */
5972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_RASCIIZ( "ioctl(SIOCSHWTSTAMP)",
5973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_READ( "ioctl(SIOCSHWTSTAMP)",
5975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_data,
5976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     sizeof(struct vki_hwtstamp_config) );
5977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
5978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFTXQLEN:       /* Set the tx queue length      */
5979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFTXQLEN)",
5980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIFTXQLEN)",
5982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_qlen,
5983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->ifr_qlen) );
5984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFADDR:         /* set PA address               */
5986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFDSTADDR:      /* set remote PA address        */
5987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFBRDADDR:      /* set broadcast PA address     */
5988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFNETMASK:      /* set network PA mask          */
5989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSIF*ADDR)",
5990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIF*ADDR)",
5992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_addr,
5993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->ifr_addr) );
5994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFMETRIC:       /* set metric                   */
5996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMETRIC)",
5997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIFMETRIC)",
5999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
6000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
6001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFMTU:          /* set MTU size                 */
6003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMTU)",
6004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIFMTU)",
6006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
6007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
6008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFHWADDR:       /* set hardware address         */
6010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFHWADDR)",
6011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIFHWADDR)",
6013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_hwaddr,
6014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->ifr_hwaddr) );
6015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSMIIREG:         /* set hardware entry registers */
6017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSMIIREG)",
6018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
6020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
6021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
6022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
6023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num,
6024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num) );
6025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
6026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_in,
6027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_in) );
6028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Routing table calls.  */
6030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCADDRT:           /* add routing table entry      */
6031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCDELRT:           /* delete routing table entry   */
6032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCADDRT/DELRT)", ARG3,
6033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		    sizeof(struct vki_rtentry));
6034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* tun/tap related ioctls */
6037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_TUNSETIFF:
6038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_RASCIIZ( "ioctl(TUNSETIFF)",
6039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ( "ioctl(TUNSETIFF)",
6041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
6042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
6043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_WRITE( "ioctl(TUNSETIFF)", ARG3,
6044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov		     sizeof(struct vki_ifreq));
6045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
6046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_TUNSETOFFLOAD:
6047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
6048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_TUNGETIFF:
6049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_WRITE( "ioctl(TUNGETIFF)", ARG3,
6050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov		     sizeof(struct vki_ifreq));
6051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
6052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* RARP cache control calls. */
6054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCDRARP:           /* delete RARP table entry      */
6055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSRARP:           /* set RARP table entry         */
6056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* ARP cache control calls. */
6057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSARP:            /* set ARP table entry          */
6058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCDARP:            /* delete ARP table entry       */
6059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIFFLAGS)", ARG3, sizeof(struct vki_ifreq));
6060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGPGRP:
6063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGPGRP)", ARG3, sizeof(int) );
6064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSPGRP:
6066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSPGRP)", ARG3, sizeof(int) );
6067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //tst->sys_flags &= ~SfMayBlock;
6068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* linux/soundcard interface (OSS) */
6071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_GETOUTCOUNT:
6072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_GETINCOUNT:
6073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_PERCMODE:
6074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_TESTMIDI:
6075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_RESETSAMPLES:
6076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_NRSYNTHS:
6077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_NRMIDIS:
6078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_GETTIME:
6079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETBLKSIZE:
6080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETFMTS:
6081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETTRIGGER:
6082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETODELAY:
6083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETSPDIF:
6084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETCAPS:
6085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SOUND_PCM_READ_RATE:
6086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SOUND_PCM_READ_CHANNELS:
6087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SOUND_PCM_READ_BITS:
6088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SOUND_PCM_READ_FILTER:
6089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOR, int))",
6090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ARG3, sizeof(int));
6091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_CTRLRATE:
6093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SPEED:
6094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_STEREO:
6095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_CHANNELS:
6096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SOUND_PCM_WRITE_FILTER:
6097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SUBDIVIDE:
6098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SETFRAGMENT:
6099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SETFMT:
6100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETCHANNELMASK:
6101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_BIND_CHANNEL:
6102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_TMR_TIMEBASE:
6103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_TMR_TEMPO:
6104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_TMR_SOURCE:
6105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_MIDI_PRETIME:
6106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_MIDI_MPUMODE:
6107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOWR, int))",
6108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ARG3, sizeof(int));
6109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOWR, int))",
6110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ARG3, sizeof(int));
6111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETOSPACE:
6113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETISPACE:
6114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOR, audio_buf_info))",
6115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     ARG3, sizeof(vki_audio_buf_info));
6116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_NONBLOCK:
6118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SETTRIGGER:
6120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOW, int))",
6121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ARG3, sizeof(int));
6122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_POST:
6125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_RESET:
6126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SYNC:
6127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SETSYNCRO:
6128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SETDUPLEX:
6129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* linux/soundcard interface (ALSA) */
6132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_PAUSE:
6133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_LINK:
6134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* these just take an int by value */
6135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Real Time Clock (/dev/rtc) ioctls */
6138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_UIE_ON:
6139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_UIE_OFF:
6140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_AIE_ON:
6141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_AIE_OFF:
6142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_PIE_ON:
6143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_PIE_OFF:
6144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_IRQP_SET:
6145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_RD_TIME:
6147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_ALM_READ:
6148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(RTC_RD_TIME/ALM_READ)",
6149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ARG3, sizeof(struct vki_rtc_time));
6150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_ALM_SET:
6152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(RTC_ALM_SET)", ARG3, sizeof(struct vki_rtc_time));
6153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_IRQP_READ:
6155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(RTC_IRQP_READ)", ARG3, sizeof(unsigned long));
6156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Block devices */
6159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKROSET:
6160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(BLKROSET)", ARG3, sizeof(int));
6161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKROGET:
6163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(BLKROGET)", ARG3, sizeof(int));
6164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKGETSIZE:
6166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(BLKGETSIZE)", ARG3, sizeof(unsigned long));
6167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKRASET:
6169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKRAGET:
6171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(BLKRAGET)", ARG3, sizeof(long));
6172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKFRASET:
6174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKFRAGET:
6176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(BLKFRAGET)", ARG3, sizeof(long));
6177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKSECTGET:
6179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(BLKSECTGET)", ARG3, sizeof(unsigned short));
6180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKSSZGET:
6182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(BLKSSZGET)", ARG3, sizeof(int));
6183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKBSZGET:
6185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(BLKBSZGET)", ARG3, sizeof(int));
6186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKBSZSET:
6188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(BLKBSZSET)", ARG3, sizeof(int));
6189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKGETSIZE64:
6191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(BLKGETSIZE64)", ARG3, sizeof(unsigned long long));
6192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_BLKPBSZGET:
6194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_WRITE( "ioctl(BLKPBSZGET)", ARG3, sizeof(int));
6195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
6196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Hard disks */
6198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_HDIO_GETGEO: /* 0x0301 */
6199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(HDIO_GETGEO)", ARG3, sizeof(struct vki_hd_geometry));
6200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_HDIO_GET_DMA: /* 0x030b */
6202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(HDIO_GET_DMA)", ARG3, sizeof(long));
6203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_HDIO_GET_IDENTITY: /* 0x030d */
6205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(HDIO_GET_IDENTITY)", ARG3,
6206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     VKI_SIZEOF_STRUCT_HD_DRIVEID );
6207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* SCSI */
6210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_SCSI_IOCTL_GET_IDLUN: /* 0x5382 */
6211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_WRITE( "ioctl(SCSI_IOCTL_GET_IDLUN)", ARG3, sizeof(struct vki_scsi_idlun));
6212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
6213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_SCSI_IOCTL_GET_BUS_NUMBER: /* 0x5386 */
6214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_WRITE( "ioctl(SCSI_IOCTL_GET_BUS_NUMBER)", ARG3, sizeof(int));
6215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
6216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
6217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* CD ROM stuff (??)  */
6218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROM_GET_MCN:
6219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(CDROM_GET_MCN)", ARG3,
6220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(struct vki_cdrom_mcn) );
6221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROM_SEND_PACKET:
6223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(CDROM_SEND_PACKET)", ARG3,
6224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(struct vki_cdrom_generic_command));
6225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMSUBCHNL:
6227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(CDROMSUBCHNL (cdsc_format, char))",
6228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		    (Addr) &(((struct vki_cdrom_subchnl*) ARG3)->cdsc_format),
6229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		    sizeof(((struct vki_cdrom_subchnl*) ARG3)->cdsc_format));
6230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(CDROMSUBCHNL)", ARG3,
6231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof(struct vki_cdrom_subchnl));
6232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMREADMODE2:
6234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(CDROMREADMODE2)", ARG3, VKI_CD_FRAMESIZE_RAW0 );
6235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMREADTOCHDR:
6237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(CDROMREADTOCHDR)", ARG3,
6238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof(struct vki_cdrom_tochdr));
6239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMREADTOCENTRY:
6241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(CDROMREADTOCENTRY (cdte_format, char))",
6242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		    (Addr) &(((struct vki_cdrom_tocentry*) ARG3)->cdte_format),
6243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		    sizeof(((struct vki_cdrom_tocentry*) ARG3)->cdte_format));
6244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(CDROMREADTOCENTRY (cdte_track, char))",
6245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		    (Addr) &(((struct vki_cdrom_tocentry*) ARG3)->cdte_track),
6246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		    sizeof(((struct vki_cdrom_tocentry*) ARG3)->cdte_track));
6247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(CDROMREADTOCENTRY)", ARG3,
6248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof(struct vki_cdrom_tocentry));
6249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMMULTISESSION: /* 0x5310 */
6251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(CDROMMULTISESSION)", ARG3,
6252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof(struct vki_cdrom_multisession));
6253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMVOLREAD: /* 0x5313 */
6255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(CDROMVOLREAD)", ARG3,
6256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof(struct vki_cdrom_volctrl));
6257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMREADRAW: /* 0x5314 */
6259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(CDROMREADRAW)", ARG3, sizeof(struct vki_cdrom_msf));
6260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(CDROMREADRAW)", ARG3, VKI_CD_FRAMESIZE_RAW);
6261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMREADAUDIO: /* 0x530e */
6263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(CDROMREADAUDIO)", ARG3,
6264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof (struct vki_cdrom_read_audio));
6265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* ToDo: don't do any of the following if the structure is invalid */
6267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_cdrom_read_audio *cra = (struct vki_cdrom_read_audio *) ARG3;
6268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 PRE_MEM_WRITE( "ioctl(CDROMREADAUDIO).buf",
6269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	                (Addr)(cra->buf), cra->nframes * VKI_CD_FRAMESIZE_RAW);
6270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMPLAYMSF:
6273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(CDROMPLAYMSF)", ARG3, sizeof(struct vki_cdrom_msf));
6274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* The following two are probably bogus (should check args
6276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 for readability).  JRS 20021117 */
6277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROM_DRIVE_STATUS: /* 0x5326 */
6278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROM_CLEAR_OPTIONS: /* 0x5321 */
6279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_CDROM_GET_CAPABILITY: /* 0x5331 */
6281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
6282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIGETBSZ:
6284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(FIGETBSZ)", ARG3, sizeof(unsigned long));
6285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIBMAP:
6287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(FIBMAP)", ARG3, sizeof(int));
6288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FBIOGET_VSCREENINFO: /* 0x4600 */
6291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(FBIOGET_VSCREENINFO)", ARG3,
6292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(struct vki_fb_var_screeninfo));
6293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_FBIOPUT_VSCREENINFO:
6295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ioctl(FBIOPUT_VSCREENINFO)", ARG3,
6296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    sizeof(struct vki_fb_var_screeninfo));
6297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
6298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FBIOGET_FSCREENINFO: /* 0x4602 */
6299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(FBIOGET_FSCREENINFO)", ARG3,
6300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(struct vki_fb_fix_screeninfo));
6301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_FBIOPAN_DISPLAY:
6303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ioctl(FBIOPAN_DISPLAY)", ARG3,
6304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    sizeof(struct vki_fb_var_screeninfo));
6305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
6307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPCLAIM:
6308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPEXCL:
6309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPYIELD:
6310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPRELEASE:
6311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPSETMODE:
6313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(PPSETMODE)",   ARG3, sizeof(int) );
6314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPGETMODE:
6316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(PPGETMODE)",  ARG3, sizeof(int) );
6317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPSETPHASE:
6319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ(  "ioctl(PPSETPHASE)", ARG3, sizeof(int) );
6320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPGETPHASE:
6322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(PPGETPHASE)", ARG3, sizeof(int) );
6323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPGETMODES:
6325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(PPGETMODES)", ARG3, sizeof(unsigned int) );
6326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPSETFLAGS:
6328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ(  "ioctl(PPSETFLAGS)", ARG3, sizeof(int) );
6329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPGETFLAGS:
6331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(PPGETFLAGS)", ARG3, sizeof(int) );
6332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPRSTATUS:
6334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(PPRSTATUS)",  ARG3, sizeof(unsigned char) );
6335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPRDATA:
6337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(PPRDATA)",    ARG3, sizeof(unsigned char) );
6338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPRCONTROL:
6340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(PPRCONTROL)", ARG3, sizeof(unsigned char) );
6341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPWDATA:
6343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ(  "ioctl(PPWDATA)",    ARG3, sizeof(unsigned char) );
6344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPWCONTROL:
6346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ(  "ioctl(PPWCONTROL)", ARG3, sizeof(unsigned char) );
6347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPFCONTROL:
6349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ(  "ioctl(PPFCONTROL)", ARG3, 2 * sizeof(unsigned char) );
6350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPDATADIR:
6352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ(  "ioctl(PPDATADIR)",  ARG3, sizeof(int) );
6353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPNEGOT:
6355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ(  "ioctl(PPNEGOT)",    ARG3, sizeof(int) );
6356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPWCTLONIRQ:
6358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ(  "ioctl(PPWCTLONIRQ)",ARG3, sizeof(unsigned char) );
6359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPCLRIRQ:
6361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(PPCLRIRQ)",   ARG3, sizeof(int) );
6362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPSETTIME:
6364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ(  "ioctl(PPSETTIME)",  ARG3, sizeof(struct vki_timeval) );
6365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPGETTIME:
6367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(PPGETTIME)",  ARG3, sizeof(struct vki_timeval) );
6368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_FONT:
6371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(GIO_FONT)", ARG3, 32 * 256 );
6372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_FONT:
6374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(PIO_FONT)", ARG3, 32 * 256 );
6375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_FONTX:
6378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(GIO_FONTX)", ARG3, sizeof(struct vki_consolefontdesc) );
6379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* ToDo: don't do any of the following if the structure is invalid */
6381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)ARG3;
6382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE( "ioctl(GIO_FONTX).chardata", (Addr)cfd->chardata,
6383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        32 * cfd->charcount );
6384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_FONTX:
6387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(PIO_FONTX)", ARG3, sizeof(struct vki_consolefontdesc) );
6388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* ToDo: don't do any of the following if the structure is invalid */
6390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)ARG3;
6391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(PIO_FONTX).chardata", (Addr)cfd->chardata,
6392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       32 * cfd->charcount );
6393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_FONTRESET:
6397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_CMAP:
6400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(GIO_CMAP)", ARG3, 16 * 3 );
6401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_CMAP:
6403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(PIO_CMAP)", ARG3, 16 * 3 );
6404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KIOCSOUND:
6407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDMKTONE:
6408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGETLED:
6411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(KDGETLED)", ARG3, sizeof(char) );
6412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSETLED:
6414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBTYPE:
6417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(KDGKBTYPE)", ARG3, sizeof(char) );
6418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDADDIO:
6421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDDELIO:
6422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDENABIO:
6423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDDISABIO:
6424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSETMODE:
6427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGETMODE:
6429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(KDGETMODE)", ARG3, sizeof(int) );
6430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDMAPDISP:
6433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDUNMAPDISP:
6434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_SCRNMAP:
6437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(GIO_SCRNMAP)", ARG3, VKI_E_TABSZ );
6438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_SCRNMAP:
6440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(PIO_SCRNMAP)", ARG3, VKI_E_TABSZ  );
6441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_UNISCRNMAP:
6443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(GIO_UNISCRNMAP)", ARG3,
6444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     VKI_E_TABSZ * sizeof(unsigned short) );
6445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_UNISCRNMAP:
6447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(PIO_UNISCRNMAP)", ARG3,
6448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    VKI_E_TABSZ * sizeof(unsigned short) );
6449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_UNIMAP:
6452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
6454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct,
6455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       sizeof(unsigned short));
6456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries,
6457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       sizeof(struct vki_unipair *));
6458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE( "ioctl(GIO_UNIMAP).entries", (Addr)desc->entries,
6459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        desc->entry_ct * sizeof(struct vki_unipair));
6460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_UNIMAP:
6463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
6465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct,
6466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       sizeof(unsigned short) );
6467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries,
6468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       sizeof(struct vki_unipair *) );
6469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(PIO_UNIMAP).entries", (Addr)desc->entries,
6470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       desc->entry_ct * sizeof(struct vki_unipair) );
6471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_UNIMAPCLR:
6474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(GIO_UNIMAP)", ARG3, sizeof(struct vki_unimapinit));
6475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBMODE:
6478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(KDGKBMODE)", ARG3, sizeof(int) );
6479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBMODE:
6481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBMETA:
6484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(KDGKBMETA)", ARG3, sizeof(int) );
6485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBMETA:
6487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBLED:
6490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(KDGKBLED)", ARG3, sizeof(char) );
6491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBLED:
6493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBENT:
6496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KDGKBENT).kb_table",
6497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_kbentry *)ARG3)->kb_table,
6498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_kbentry *)ARG3)->kb_table) );
6499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KDGKBENT).kb_index",
6500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_kbentry *)ARG3)->kb_index,
6501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_kbentry *)ARG3)->kb_index) );
6502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(KDGKBENT).kb_value",
6503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
6504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
6505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBENT:
6507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KDSKBENT).kb_table",
6508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_kbentry *)ARG3)->kb_table,
6509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_kbentry *)ARG3)->kb_table) );
6510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KDSKBENT).kb_index",
6511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_kbentry *)ARG3)->kb_index,
6512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_kbentry *)ARG3)->kb_index) );
6513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KDSKBENT).kb_value",
6514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
6515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
6516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBSENT:
6519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KDGKBSENT).kb_func",
6520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_kbsentry *)ARG3)->kb_func,
6521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_kbsentry *)ARG3)->kb_func) );
6522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(KDGKSENT).kb_string",
6523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     (Addr)((struct vki_kbsentry *)ARG3)->kb_string,
6524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof(((struct vki_kbsentry *)ARG3)->kb_string) );
6525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBSENT:
6527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KDSKBSENT).kb_func",
6528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_kbsentry *)ARG3)->kb_func,
6529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_kbsentry *)ARG3)->kb_func) );
6530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(KDSKBSENT).kb_string",
6531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Addr)((struct vki_kbsentry *)ARG3)->kb_string );
6532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBDIACR:
6535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(KDGKBDIACR)", ARG3, sizeof(struct vki_kbdiacrs) );
6536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBDIACR:
6538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KDSKBDIACR)", ARG3, sizeof(struct vki_kbdiacrs) );
6539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGETKEYCODE:
6542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KDGETKEYCODE).scancode",
6543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_kbkeycode *)ARG3)->scancode,
6544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_kbkeycode *)ARG3)->scancode) );
6545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(KDGETKEYCODE).keycode",
6546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
6547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
6548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSETKEYCODE:
6550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KDSETKEYCODE).scancode",
6551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_kbkeycode *)ARG3)->scancode,
6552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_kbkeycode *)ARG3)->scancode) );
6553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KDSETKEYCODE).keycode",
6554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
6555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
6556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSIGACCEPT:
6559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDKBDREP:
6562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(KBKBDREP)", ARG3, sizeof(struct vki_kbd_repeat) );
6563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDFONTOP:
6566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3;
6568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(KDFONTOP)", (Addr)op,
6569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       sizeof(struct vki_console_font_op) );
6570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch ( op->op ) {
6571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case VKI_KD_FONT_OP_SET:
6572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               PRE_MEM_READ( "ioctl(KDFONTOP,KD_FONT_OP_SET).data",
6573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             (Addr)op->data,
6574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             (op->width + 7) / 8 * 32 * op->charcount );
6575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               break;
6576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case VKI_KD_FONT_OP_GET:
6577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if ( op->data )
6578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  PRE_MEM_WRITE( "ioctl(KDFONTOP,KD_FONT_OP_GET).data",
6579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 (Addr)op->data,
6580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 (op->width + 7) / 8 * 32 * op->charcount );
6581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               break;
6582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case VKI_KD_FONT_OP_SET_DEFAULT:
6583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if ( op->data )
6584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  PRE_MEM_RASCIIZ( "ioctl(KDFONTOP,KD_FONT_OP_SET_DEFAULT).data",
6585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   (Addr)op->data );
6586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               break;
6587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case VKI_KD_FONT_OP_COPY:
6588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               break;
6589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
6590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_OPENQRY:
6594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(VT_OPENQRY)", ARG3, sizeof(int) );
6595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_GETMODE:
6597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(VT_GETMODE)", ARG3, sizeof(struct vki_vt_mode) );
6598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_SETMODE:
6600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(VT_SETMODE)", ARG3, sizeof(struct vki_vt_mode) );
6601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_GETSTATE:
6603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_active",
6604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr) &(((struct vki_vt_stat*) ARG3)->v_active),
6605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_vt_stat*) ARG3)->v_active));
6606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_state",
6607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr) &(((struct vki_vt_stat*) ARG3)->v_state),
6608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_vt_stat*) ARG3)->v_state));
6609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_RELDISP:
6611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_ACTIVATE:
6612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_WAITACTIVE:
6613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_DISALLOCATE:
6614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_RESIZE:
6616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(VT_RESIZE)", ARG3, sizeof(struct vki_vt_sizes) );
6617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_RESIZEX:
6619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(VT_RESIZEX)", ARG3, sizeof(struct vki_vt_consize) );
6620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_LOCKSWITCH:
6622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_UNLOCKSWITCH:
6623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_CONTROL:
6626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_usbdevfs_ctrltransfer *vkuc = (struct vki_usbdevfs_ctrltransfer *)ARG3;
6628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).bRequestType", (Addr)&vkuc->bRequestType, sizeof(vkuc->bRequestType));
6629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).bRequest", (Addr)&vkuc->bRequest, sizeof(vkuc->bRequest));
6630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wValue", (Addr)&vkuc->wValue, sizeof(vkuc->wValue));
6631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wIndex", (Addr)&vkuc->wIndex, sizeof(vkuc->wIndex));
6632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wLength", (Addr)&vkuc->wLength, sizeof(vkuc->wLength));
6633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).timeout", (Addr)&vkuc->timeout, sizeof(vkuc->timeout));
6634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (vkuc->bRequestType & 0x80)
6635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_WRITE( "ioctl(USBDEVFS_CONTROL).data", (Addr)vkuc->data, vkuc->wLength);
6636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else
6637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).data", (Addr)vkuc->data, vkuc->wLength);
6638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_BULK:
6641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_usbdevfs_bulktransfer *vkub = (struct vki_usbdevfs_bulktransfer *)ARG3;
6643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_BULK)", ARG3, sizeof(struct vki_usbdevfs_bulktransfer));
6644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (vkub->ep & 0x80)
6645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_WRITE( "ioctl(USBDEVFS_BULK).data", (Addr)vkub->data, vkub->len);
6646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else
6647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_READ( "ioctl(USBDEVFS_BULK).data", (Addr)vkub->data, vkub->len);
6648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
6650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_GETDRIVER:
6651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_usbdevfs_getdriver *vkugd = (struct vki_usbdevfs_getdriver *) ARG3;
6653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE( "ioctl(USBDEVFS_GETDRIVER)", (Addr)&vkugd->driver, sizeof(vkugd->driver));
6654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
6656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_SUBMITURB:
6657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_usbdevfs_urb *vkuu = (struct vki_usbdevfs_urb *)ARG3;
6659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Not the whole struct needs to be initialized */
6661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).endpoint", (Addr)&vkuu->endpoint, sizeof(vkuu->endpoint));
6662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).type", (Addr)&vkuu->type, sizeof(vkuu->type));
6663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).flags", (Addr)&vkuu->flags, sizeof(vkuu->flags));
6664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)&vkuu->buffer, sizeof(vkuu->buffer));
6665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).signr", (Addr)&vkuu->signr, sizeof(vkuu->signr));
6666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).status", (Addr)&vkuu->status, sizeof(vkuu->status));
6667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (vkuu->type == VKI_USBDEVFS_URB_TYPE_CONTROL) {
6668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            struct vki_usbdevfs_setuppacket *vkusp = (struct vki_usbdevfs_setuppacket *)vkuu->buffer;
6669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer_length", (Addr)&vkuu->buffer_length, sizeof(vkuu->buffer_length));
6670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer.setup_packet", (Addr)vkusp, sizeof(*vkusp));
6671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (vkusp->bRequestType & 0x80)
6672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer.data", (Addr)(vkusp+1), vkuu->buffer_length - sizeof(*vkusp));
6673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else
6674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer.data", (Addr)(vkusp+1), vkuu->buffer_length - sizeof(*vkusp));
6675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).actual_length", (Addr)&vkuu->actual_length, sizeof(vkuu->actual_length));
6676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else if (vkuu->type == VKI_USBDEVFS_URB_TYPE_ISO) {
6677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            int total_length = 0;
6678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            int i;
6679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).number_of_packets", (Addr)&vkuu->number_of_packets, sizeof(vkuu->number_of_packets));
6680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for(i=0; i<vkuu->number_of_packets; i++) {
6681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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));
6682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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));
6683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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));
6684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               total_length += vkuu->iso_frame_desc[i].length;
6685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
6686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (vkuu->endpoint & 0x80)
6687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, total_length);
6688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else
6689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, total_length);
6690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).error_count", (Addr)&vkuu->error_count, sizeof(vkuu->error_count));
6691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
6692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer_length", (Addr)&vkuu->buffer_length, sizeof(vkuu->buffer_length));
6693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (vkuu->endpoint & 0x80)
6694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
6695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else
6696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
6697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).actual_length", (Addr)&vkuu->actual_length, sizeof(vkuu->actual_length));
6698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
6699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
6701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_DISCARDURB:
6702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_REAPURB:
6704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE( "ioctl(USBDEVFS_REAPURB)", ARG3, sizeof(struct vki_usbdevfs_urb **));
6706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
6708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_REAPURBNDELAY:
6709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE( "ioctl(USBDEVFS_REAPURBNDELAY)", ARG3, sizeof(struct vki_usbdevfs_urb **));
6711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
6713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_CONNECTINFO:
6714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(USBDEVFS_CONNECTINFO)", ARG3, sizeof(struct vki_usbdevfs_connectinfo));
6715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_IOCTL:
6717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
6718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_usbdevfs_ioctl *vkui = (struct vki_usbdevfs_ioctl *)ARG3;
6719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         UInt dir2, size2;
6720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ("ioctl(USBDEVFS_IOCTL)", (Addr)vkui, sizeof(struct vki_usbdevfs_ioctl));
6721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dir2  = _VKI_IOC_DIR(vkui->ioctl_code);
6722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         size2 = _VKI_IOC_SIZE(vkui->ioctl_code);
6723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (size2 > 0) {
6724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (dir2 & _VKI_IOC_WRITE)
6725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               PRE_MEM_READ("ioctl(USBDEVFS_IOCTL).dataWrite", (Addr)vkui->data, size2);
6726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else if (dir2 & _VKI_IOC_READ)
6727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               PRE_MEM_WRITE("ioctl(USBDEVFS_IOCTL).dataRead", (Addr)vkui->data, size2);
6728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
6729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_USBDEVFS_RESET:
6732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
6733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* I2C (/dev/i2c-*) ioctls */
6735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_I2C_SLAVE:
6736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_I2C_SLAVE_FORCE:
6737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_I2C_TENBIT:
6738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_I2C_PEC:
6739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_I2C_FUNCS:
6741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(I2C_FUNCS)", ARG3, sizeof(unsigned long) );
6742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_I2C_RDWR:
6744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if ( ARG3 ) {
6745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          struct vki_i2c_rdwr_ioctl_data *vkui = (struct vki_i2c_rdwr_ioctl_data *)ARG3;
6746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          UInt i;
6747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          PRE_MEM_READ("ioctl(I2C_RDWR)", (Addr)vkui, sizeof(struct vki_i2c_rdwr_ioctl_data));
6748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          for (i=0; i < vkui->nmsgs; i++) {
6749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              struct vki_i2c_msg *msg = vkui->msgs + i;
6750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              PRE_MEM_READ("ioctl(I2C_RDWR).msgs", (Addr)msg, sizeof(struct vki_i2c_msg));
6751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              if (msg->flags & VKI_I2C_M_RD)
6752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  PRE_MEM_WRITE("ioctl(I2C_RDWR).msgs.buf", (Addr)msg->buf, msg->len);
6753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              else
6754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  PRE_MEM_READ("ioctl(I2C_RDWR).msgs.buf", (Addr)msg->buf, msg->len);
6755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          }
6756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
6757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
6758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Wireless extensions ioctls */
6760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWCOMMIT:
6761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWNWID:
6762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWFREQ:
6763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWMODE:
6764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWSENS:
6765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWRANGE:
6766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWPRIV:
6767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWSTATS:
6768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWSPY:
6769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWTHRSPY:
6770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWAP:
6771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWSCAN:
6772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWESSID:
6773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWRATE:
6774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWNICKN:
6775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWRTS:
6776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWFRAG:
6777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWTXPOW:
6778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWRETRY:
6779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWENCODE:
6780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWPOWER:
6781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWGENIE:
6782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWMLME:
6783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWAUTH:
6784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWENCODEEXT:
6785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWPMKSA:
6786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWNAME:
6788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
6789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("ioctl(SIOCGIWNAME)",
6790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Addr)((struct vki_iwreq *)ARG3)->u.name,
6791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       sizeof(((struct vki_iwreq *)ARG3)->u.name));
6792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWNWID:
6795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWSENS:
6796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWRATE:
6797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWRTS:
6798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWFRAG:
6799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWTXPOW:
6800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWRETRY:
6801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWPOWER:
6802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWAUTH:
6803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
6804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("ioctl(SIOCGIW[NWID|SENS|RATE|RTS|FRAG|TXPOW|"
6805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       "RETRY|PARAM|AUTH])",
6806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Addr)&((struct vki_iwreq *)ARG3)->u.nwid,
6807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       sizeof(struct vki_iw_param));
6808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWFREQ:
6811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
6812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("ioctl(SIOCGIWFREQ",
6813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Addr)&((struct vki_iwreq *)ARG3)->u.freq,
6814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       sizeof(struct vki_iw_freq));
6815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWMODE:
6818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
6819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("ioctl(SIOCGIWMODE",
6820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Addr)&((struct vki_iwreq *)ARG3)->u.mode,
6821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       sizeof(__vki_u32));
6822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWRANGE:
6825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWPRIV:
6826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWSTATS:
6827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWSPY:
6828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWTHRSPY:
6829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWAPLIST:
6830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWSCAN:
6831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWESSID:
6832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWNICKN:
6833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWENCODE:
6834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWGENIE:
6835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWENCODEEXT:
6836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
6837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_iw_point* point;
6838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         point = &((struct vki_iwreq *)ARG3)->u.data;
6839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("ioctl(SIOCGIW[RANGE|PRIV|STATS|SPY|THRSPY|"
6840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       "APLIST|SCAN|ESSID|NICKN|ENCODE|GENIE|ENCODEEXT])",
6841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Addr)point->pointer, point->length);
6842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWAP:
6845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
6846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("ioctl(SIOCGIWAP)",
6847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
6848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       sizeof(struct vki_sockaddr));
6849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
6851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  /* User input device creation */
6853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  case VKI_UI_SET_EVBIT:
6854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  case VKI_UI_SET_KEYBIT:
6855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  case VKI_UI_SET_RELBIT:
6856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  case VKI_UI_SET_ABSBIT:
6857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  case VKI_UI_SET_MSCBIT:
6858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  case VKI_UI_SET_LEDBIT:
6859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  case VKI_UI_SET_SNDBIT:
6860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  case VKI_UI_SET_FFBIT:
6861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  case VKI_UI_SET_SWBIT:
6862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  case VKI_UI_SET_PROPBIT:
6863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* These just take an int by value */
6864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
6865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
6866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android) \
6867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      || defined(VGPV_mips32_linux_android)
6868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* ashmem */
6869571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_GET_SIZE:
6870571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_SET_SIZE:
6871571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_GET_PROT_MASK:
6872571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_SET_PROT_MASK:
6873571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_GET_PIN_STATUS:
6874571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_PURGE_ALL_CACHES:
6875571b08386a993913ca8db340d7c706ab94041eceJeff Brown       break;
6876571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_GET_NAME:
6877571b08386a993913ca8db340d7c706ab94041eceJeff Brown       PRE_MEM_WRITE( "ioctl(ASHMEM_SET_NAME)", ARG3, VKI_ASHMEM_NAME_LEN );
6878571b08386a993913ca8db340d7c706ab94041eceJeff Brown       break;
6879571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_SET_NAME:
6880571b08386a993913ca8db340d7c706ab94041eceJeff Brown       PRE_MEM_RASCIIZ( "ioctl(ASHMEM_SET_NAME)", ARG3);
6881571b08386a993913ca8db340d7c706ab94041eceJeff Brown       break;
6882571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_PIN:
6883571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_UNPIN:
6884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       PRE_MEM_READ( "ioctl(ASHMEM_PIN|ASHMEM_UNPIN)",
6885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     ARG3, sizeof(struct vki_ashmem_pin) );
6886571b08386a993913ca8db340d7c706ab94041eceJeff Brown       break;
68870e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov
6888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* binder */
68890e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_WRITE_READ:
68900e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       if (ARG3) {
6891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           struct vki_binder_write_read* bwr
6892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              = (struct vki_binder_write_read*)ARG3;
68930e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov
68940e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_buffer",
68950e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov                          bwr->write_buffer);
68960e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_size",
68970e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov                          bwr->write_size);
68980e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_consumed",
68990e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov                          bwr->write_consumed);
69000e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_buffer",
69010e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov                          bwr->read_buffer);
69020e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_size",
69030e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov                          bwr->read_size);
69040e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_consumed",
69050e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov                          bwr->read_consumed);
69060e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov
69070e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           PRE_FIELD_WRITE("ioctl(BINDER_WRITE_READ).write_consumed",
69080e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov                           bwr->write_consumed);
69090e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           PRE_FIELD_WRITE("ioctl(BINDER_WRITE_READ).read_consumed",
69100e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov                           bwr->read_consumed);
69110e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov
69120e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           if (bwr->read_size)
69130e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov               PRE_MEM_WRITE("ioctl(BINDER_WRITE_READ).read_buffer[]",
69140e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov                             (Addr)bwr->read_buffer, bwr->read_size);
69150e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           if (bwr->write_size)
69160e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov               PRE_MEM_READ("ioctl(BINDER_WRITE_READ).write_buffer[]",
69170e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov                            (Addr)bwr->write_buffer, bwr->write_size);
69180e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       }
69190e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       break;
69200e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov
69210e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_SET_IDLE_TIMEOUT:
69220e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_SET_MAX_THREADS:
69230e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_SET_IDLE_PRIORITY:
69240e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_SET_CONTEXT_MGR:
69250e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_THREAD_EXIT:
69260e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       break;
69270e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_VERSION:
69280e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       if (ARG3) {
69290e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           struct vki_binder_version* bv = (struct vki_binder_version*)ARG3;
69300e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           PRE_FIELD_WRITE("ioctl(BINDER_VERSION)", bv->protocol_version);
69310e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       }
69320e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       break;
6933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  endif /* defined(VGPV_*_linux_android) */
6934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
6935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_HCIINQUIRY:
6936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (ARG3) {
6937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct vki_hci_inquiry_req* ir = (struct vki_hci_inquiry_req*)ARG3;
6938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         PRE_MEM_READ("ioctl(HCIINQUIRY)",
6939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      (Addr)ARG3, sizeof(struct vki_hci_inquiry_req));
6940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         PRE_MEM_WRITE("ioctl(HCIINQUIRY)",
6941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       (Addr)ARG3 + sizeof(struct vki_hci_inquiry_req),
6942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       ir->num_rsp * sizeof(struct vki_inquiry_info));
6943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
6944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
6945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* KVM ioctls that check for a numeric value as parameter */
6947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_GET_API_VERSION:
6948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_CREATE_VM:
6949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_GET_VCPU_MMAP_SIZE:
6950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_CHECK_EXTENSION:
6951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_CREATE_VCPU:
6952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_RUN:
6953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
6954571b08386a993913ca8db340d7c706ab94041eceJeff Brown
6955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifdef ENABLE_XEN
6956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_XEN_IOCTL_PRIVCMD_HYPERCALL: {
6957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      SyscallArgs harrghs;
6958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      struct vki_xen_privcmd_hypercall *args =
6959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         (struct vki_xen_privcmd_hypercall *)(ARG3);
6960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (!args)
6962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
6963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(memset)(&harrghs, 0, sizeof(harrghs));
6965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.sysno = args->op;
6966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg1 = args->arg[0];
6967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg2 = args->arg[1];
6968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg3 = args->arg[2];
6969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg4 = args->arg[3];
6970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg5 = args->arg[4];
6971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg6 = harrghs.arg7 = harrghs.arg8 = 0;
6972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      WRAPPER_PRE_NAME(xen, hypercall) (tid, layout, &harrghs, status, flags);
6974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* HACK. arg8 is used to return the number of hypercall
6976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       * arguments actually consumed! */
6977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PRE_MEM_READ("hypercall", ARG3, sizeof(args->op) +
6978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                   ( sizeof(args->arg[0]) * harrghs.arg8 ) );
6979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6980fe1fa7caae1b429af737fa4f946a7fc85827f2cdBen Cheng      break;
6981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
6982fe1fa7caae1b429af737fa4f946a7fc85827f2cdBen Cheng
6983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_XEN_IOCTL_PRIVCMD_MMAP: {
6984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       struct vki_xen_privcmd_mmap *args =
6985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           (struct vki_xen_privcmd_mmap *)(ARG3);
6986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAP(num)",
6987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)&args->num, sizeof(args->num));
6988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAP(dom)",
6989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)&args->dom, sizeof(args->dom));
6990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAP(entry)",
6991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)args->entry, sizeof(*(args->entry)) * args->num);
6992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
6993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
6994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH: {
6995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       struct vki_xen_privcmd_mmapbatch *args =
6996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           (struct vki_xen_privcmd_mmapbatch *)(ARG3);
6997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH(num)",
6998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)&args->num, sizeof(args->num));
6999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH(dom)",
7000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)&args->dom, sizeof(args->dom));
7001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH(addr)",
7002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)&args->addr, sizeof(args->addr));
7003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH(arr)",
7004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)args->arr, sizeof(*(args->arr)) * args->num);
700509529052b5d43a42bd0862262cbd4ee9e41ae4feBen Cheng      break;
7006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
7007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2: {
7008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       struct vki_xen_privcmd_mmapbatch_v2 *args =
7009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           (struct vki_xen_privcmd_mmapbatch_v2 *)(ARG3);
7010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(num)",
7011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)&args->num, sizeof(args->num));
7012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(dom)",
7013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)&args->dom, sizeof(args->dom));
7014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(addr)",
7015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)&args->addr, sizeof(args->addr));
7016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(arr)",
7017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Addr)args->arr, sizeof(*(args->arr)) * args->num);
7018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
7019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
7020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
702109529052b5d43a42bd0862262cbd4ee9e41ae4feBen Cheng
7022c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   case VKI_EVIOCSSUSPENDBLOCK:
7023c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      break;
7024c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
7025c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   case VKI_MEDIA_IOC_DEVICE_INFO:
7026c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      if (ARG3) {
7027c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov         PRE_MEM_WRITE("ioctl(MEDIA_IOC_DEVICE_INFO)", ARG3,
7028c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov                       sizeof(struct vki_media_device_info));
7029c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      }
7030c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      break;
7031c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
7032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
7033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* EVIOC* are variable length and return size written on success */
7034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (ARG2 & ~(_VKI_IOC_SIZEMASK << _VKI_IOC_SIZESHIFT)) {
7035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGNAME(0):
7036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGPHYS(0):
7037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGUNIQ(0):
7038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGKEY(0):
7039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGLED(0):
7040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGSND(0):
7041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGSW(0):
7042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_SYN,0):
7043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_KEY,0):
7044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_REL,0):
7045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_ABS,0):
7046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_MSC,0):
7047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_SW,0):
7048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_LED,0):
7049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_SND,0):
7050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_REP,0):
7051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_FF,0):
7052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_PWR,0):
7053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_FF_STATUS,0):
7054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("ioctl(EVIO*)", ARG3, _VKI_IOC_SIZE(ARG2));
7055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
7057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(PRE_unknown_ioctl)(tid, ARG2, ARG3);
7058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_ioctl)
7065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
7067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* --- BEGIN special IOCTL handlers for specific Android hardware --- */
7069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android) \
7071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      || defined(VGPV_mips32_linux_android)
7072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  if defined(ANDROID_HARDWARE_nexus_s)
7074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* BEGIN undocumented ioctls for the graphics hardware (??)
7076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      (libpvr) on Nexus S */
7077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (ARG2 >= 0xC01C6700 && ARG2 <= 0xC01C67FF && ARG3 >= 0x1000) {
7078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* What's going on here: there appear to be a bunch of ioctls of
7079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         the form 0xC01C67xx which are undocumented, and if unhandled
7080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         give rise to a vast number of false positives in Memcheck.
7081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         The "normal" intrepretation of an ioctl of this form would be
7083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         that the 3rd arg is a pointer to an area of size 0x1C (28
7084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         bytes) which is filled in by the kernel.  Hence you might
7085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         think that "POST_MEM_WRITE(ARG3, 28)" would fix it.  But it
7086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         doesn't.
7087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         It requires POST_MEM_WRITE(ARG3, 256) to silence them.  One
7089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         interpretation of this is that ARG3 really does point to a 28
7090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         byte struct, but inside that are pointers to other areas also
7091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         filled in by the kernel.  If these happen to be allocated
7092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         just back up the stack then the 256 byte paint might cover
7093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         them too, somewhat indiscriminately.
7094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         By printing out ARG3 and also the 28 bytes that it points at,
7096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         it's possible to guess that the 7 word structure has this form
7097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           0            1    2    3        4    5        6
7099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           ioctl-number 0x1C ptr1 ptr1size ptr2 ptr2size aBitMask
7100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         Unfortunately that doesn't seem to work for some reason, so
7102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         stay with the blunt-instrument approach for the time being.
7103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      */
7104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (1) {
7105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* blunt-instrument approach */
7106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (0) VG_(printf)("QQQQQQQQQQ c01c quick hack actioned"
7107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            " (%08lx, %08lx)\n", ARG2, ARG3);
7108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         POST_MEM_WRITE(ARG3, 256);
7109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
7110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* be a bit more sophisticated */
7111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (0) VG_(printf)("QQQQQQQQQQ c01c quick hack actioned"
7112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            " (%08lx, %08lx) (fancy)\n", ARG2, ARG3);
7113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         POST_MEM_WRITE(ARG3, 28);
7114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         UInt* word = (UInt*)ARG3;
7115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (word && word[2] && word[3] < 0x200/*stay sane*/)
7116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            POST_MEM_WRITE(word[2], word[3]); // "ptr1"
7117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (word && word[4] && word[5] < 0x200/*stay sane*/)
7118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            POST_MEM_WRITE(word[4], word[5]); // "ptr2"
7119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
7120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (0) {
7121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         Int i;
7122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(printf)("QQQQQQQQQQ ");
7123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         for (i = 0; i < (0x1C/4); i++) {
7124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            VG_(printf)("%08x ", ((UInt*)(ARG3))[i]);
7125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
7126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(printf)("\n");
7127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
7128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
7129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* END Nexus S specific ioctls */
7131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  elif defined(ANDROID_HARDWARE_generic) || defined(ANDROID_HARDWARE_emulator)
7134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* BEGIN generic/emulator specific ioctls */
7136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* currently none are known */
7137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* END generic/emulator specific ioctls */
7138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7140c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#  elif defined(ANDROID_HARDWARE_nexus_10)
7141c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
7142c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   /* undocumented ioctl ids noted on the device */
7143c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   if (ARG2 >= 0xc0108000 && ARG2 <= 0xc1e8820b && ARG3 != 0) {
7144c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      int size = (ARG2 >> 16) & 0x3fff;
7145c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      POST_MEM_WRITE(ARG3, size);
7146c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   }
7147c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
7148c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#  elif defined(ANDROID_HARDWARE_nexus_7)
7149c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
7150c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#  elif defined(ANDROID_HARDWARE_nexus_4)
7151c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
7152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  else /* no ANDROID_HARDWARE_anything defined */
7153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#   warning ""
7155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#   warning "You need to define one the CPP symbols ANDROID_HARDWARE_blah"
7156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#   warning "at configure time, to tell Valgrind what hardware you are"
7157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#   warning "building for.  Currently known values are"
7158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#   warning ""
7159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#   warning "   ANDROID_HARDWARE_nexus_s       Samsung Nexus S"
7160c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#   warning "   ANDROID_HARDWARE_nexus_10      Samsung Nexus 10"
7161c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#   warning "   ANDROID_HARDWARE_nexus_7       ASUS Nexus 7"
7162c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov#   warning "   ANDROID_HARDWARE_nexus_4       LG Nexus 4"
7163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#   warning "   ANDROID_HARDWARE_generic       Generic device (eg, Pandaboard)"
7164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#   warning "   ANDROID_HARDWARE_emulator      x86 or arm emulator"
7165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#   warning ""
7166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#   warning "Make sure you exactly follow the steps in README.android."
7167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#   warning ""
7168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#   error "No CPP symbol ANDROID_HARDWARE_blah defined.  Giving up."
7169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  endif /* cases for ANDROID_HARDWARE_blah */
7171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  endif /* defined(VGPV_*_linux_android) */
7173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* --- END special IOCTL handlers for specific Android hardware --- */
7175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* --- normal handling --- */
7177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG2 /* request */) {
7178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETS:
7179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETSW:
7180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETSF:
7181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_IB_USER_MAD_ENABLE_PKEY:
7182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCGETS:
7184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_termios) );
7185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETA:
7187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETAW:
7188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSETAF:
7189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCGETA:
7191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_termio) );
7192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSBRK:
7194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCXONC:
7195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCSBRKP:
7196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TCFLSH:
7197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGWINSZ:
7199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_winsize) );
7200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSWINSZ:
7202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMBIS:
7203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMBIC:
7204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMSET:
7205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMGET:
7207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
7208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCLINUX:
7210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(char *) );
7211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGPGRP:
7213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Get process group ID for foreground processing group. */
7214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
7215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSPGRP:
7217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Set a process group ID? */
7218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
7219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGPTN: /* Get Pty Number (of pty-mux device) */
7221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int));
7222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSCTTY:
7224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSPTLCK: /* Lock/unlock Pty */
7226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIONBIO:
7228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_FIONCLEX:
7230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
7231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_FIOCLEX:
7232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
7233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIOASYNC:
7234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIONREAD:                /* identical to SIOCINQ */
7236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
7237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_FIOQSIZE:
7239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG3, sizeof(vki_loff_t) );
7240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
7241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSERGETLSR:
7243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
7244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGICOUNT:
7246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_serial_icounter_struct) );
7247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_SET_COMMAND_Q:
7250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_IO:
7252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(vki_sg_io_hdr_t));
7253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_GET_SCSI_ID:
7255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(vki_sg_scsi_id_t));
7256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_SET_RESERVED_SIZE:
7258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_SET_TIMEOUT:
7260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_GET_RESERVED_SIZE:
7262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
7263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_GET_TIMEOUT:
7265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_GET_VERSION_NUM:
7267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
7268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_EMULATED_HOST:
7270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
7271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SG_GET_SG_TABLESIZE:
7273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
7274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IIOCGETCPS:
7277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, VKI_ISDN_MAX_CHANNELS * 2 * sizeof(unsigned long) );
7278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IIOCNETGPN:
7280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_isdn_net_ioctl_phone) );
7281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* These all use struct ifreq AFAIK */
7284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFINDEX:        /* get iface index              */
7285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_ifindex,
7286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_ifindex) );
7287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFFLAGS:        /* get flags                    */
7289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
7290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
7291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFHWADDR:       /* Get hardware address         */
7293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->ifr_hwaddr,
7294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(((struct vki_ifreq *)ARG3)->ifr_hwaddr) );
7295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFMTU:          /* get MTU size                 */
7297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
7298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
7299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFADDR:         /* get PA address               */
7301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFDSTADDR:      /* get remote PA address        */
7302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFBRDADDR:      /* get broadcast PA address     */
7303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFNETMASK:      /* get network PA mask          */
7304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(
7305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                (Addr)&((struct vki_ifreq *)ARG3)->ifr_addr,
7306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                sizeof(((struct vki_ifreq *)ARG3)->ifr_addr) );
7307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFMETRIC:       /* get metric                   */
7309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(
7310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
7311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
7312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFMAP:          /* Get device parameters        */
7314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(
7315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                (Addr)&((struct vki_ifreq *)ARG3)->ifr_map,
7316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                sizeof(((struct vki_ifreq *)ARG3)->ifr_map) );
7317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
7319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFTXQLEN:       /* Get the tx queue length      */
7320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(
7321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                (Addr)&((struct vki_ifreq *)ARG3)->ifr_qlen,
7322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                sizeof(((struct vki_ifreq *)ARG3)->ifr_qlen) );
7323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFNAME:         /* get iface name               */
7325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(
7326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_name,
7327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_name) );
7328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGMIIPHY:         /* get hardware entry           */
7330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(
7331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
7332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
7333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGMIIREG:         /* get hardware entry registers */
7335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(
7336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_out,
7337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_out) );
7338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* tun/tap related ioctls */
7341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_TUNSETIFF:
7342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_name,
7343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_name) );
7344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
7345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_TUNGETIFF:
7346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_name,
7347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_name) );
7348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
7349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
7350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
7351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFCONF:         /* get iface list               */
7353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* WAS:
7354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 PRE_MEM_WRITE("ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
7355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 KERNEL_DO_SYSCALL(tid,RES);
7356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 if (!VG_(is_kerror)(RES) && RES == 0)
7357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
7358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      */
7359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (RES == 0 && ARG3 ) {
7360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
7361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 if (ifc->vki_ifc_buf != NULL)
7362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    POST_MEM_WRITE( (Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
7363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGSTAMP:
7366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_timeval) );
7367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGSTAMPNS:
7369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_timespec) );
7370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* SIOCOUTQ is an ioctl that, when called on a socket, returns
7372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 the number of bytes currently in that socket's send buffer.
7373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 It writes this value as an int to the memory location
7374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 indicated by the third argument of ioctl(2). */
7375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCOUTQ:
7376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
7377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGRARP:           /* get RARP table entry         */
7379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGARP:            /* get ARP table entry          */
7380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(struct vki_arpreq));
7381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFFLAGS:        /* set flags                    */
7384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFMAP:          /* Set device parameters        */
7385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_SIOCSHWTSTAMP:       /* Set hardware time stamping   */
7386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFTXQLEN:       /* Set the tx queue length      */
7387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFDSTADDR:      /* set remote PA address        */
7388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFBRDADDR:      /* set broadcast PA address     */
7389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFNETMASK:      /* set network PA mask          */
7390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFMETRIC:       /* set metric                   */
7391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFADDR:         /* set PA address               */
7392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFMTU:          /* set MTU size                 */
7393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFHWADDR:       /* set hardware address         */
7394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSMIIREG:         /* set hardware entry registers */
7395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Routing table calls.  */
7397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCADDRT:           /* add routing table entry      */
7398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCDELRT:           /* delete routing table entry   */
7399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* RARP cache control calls. */
7402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCDRARP:           /* delete RARP table entry      */
7403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSRARP:           /* set RARP table entry         */
7404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* ARP cache control calls. */
7405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSARP:            /* set ARP table entry          */
7406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCDARP:            /* delete ARP table entry       */
7407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGPGRP:
7410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
7411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSPGRP:
7413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* linux/soundcard interface (OSS) */
7416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_GETOUTCOUNT:
7417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_GETINCOUNT:
7418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_PERCMODE:
7419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_TESTMIDI:
7420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_RESETSAMPLES:
7421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_NRSYNTHS:
7422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_NRMIDIS:
7423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_GETTIME:
7424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETBLKSIZE:
7425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETFMTS:
7426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SETFMT:
7427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETTRIGGER:
7428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETODELAY:
7429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETSPDIF:
7430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETCAPS:
7431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SOUND_PCM_READ_RATE:
7432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SOUND_PCM_READ_CHANNELS:
7433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SOUND_PCM_READ_BITS:
7434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SOUND_PCM_READ_FILTER:
7435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
7436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_SEQ_CTRLRATE:
7438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SPEED:
7439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_STEREO:
7440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_CHANNELS:
7441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SOUND_PCM_WRITE_FILTER:
7442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SUBDIVIDE:
7443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SETFRAGMENT:
7444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETCHANNELMASK:
7445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_BIND_CHANNEL:
7446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_TMR_TIMEBASE:
7447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_TMR_TEMPO:
7448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_TMR_SOURCE:
7449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_MIDI_PRETIME:
7450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_MIDI_MPUMODE:
7451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETOSPACE:
7453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_GETISPACE:
7454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(vki_audio_buf_info));
7455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_NONBLOCK:
7457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SETTRIGGER:
7459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_POST:
7462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_RESET:
7463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SYNC:
7464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SETSYNCRO:
7465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDCTL_DSP_SETDUPLEX:
7466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* linux/soundcard interface (ALSA) */
7469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_HW_FREE:
7470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_HWSYNC:
7471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_PREPARE:
7472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_RESET:
7473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_START:
7474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_DROP:
7475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_DRAIN:
7476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_RESUME:
7477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_XRUN:
7478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_PCM_IOCTL_UNLINK:
7479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_TIMER_IOCTL_START:
7480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_TIMER_IOCTL_STOP:
7481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_TIMER_IOCTL_CONTINUE:
7482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SNDRV_TIMER_IOCTL_PAUSE:
7483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* SCSI no operand */
7485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_SCSI_IOCTL_DOORLOCK:
7486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_SCSI_IOCTL_DOORUNLOCK:
7487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Real Time Clock (/dev/rtc) ioctls */
7490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_UIE_ON:
7491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_UIE_OFF:
7492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_AIE_ON:
7493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_AIE_OFF:
7494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_PIE_ON:
7495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_PIE_OFF:
7496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_IRQP_SET:
7497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_RD_TIME:
7499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_ALM_READ:
7500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(struct vki_rtc_time));
7501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_ALM_SET:
7503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_RTC_IRQP_READ:
7505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(unsigned long));
7506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Block devices */
7509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKROSET:
7510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKROGET:
7512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
7513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKGETSIZE:
7515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(unsigned long));
7516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKRASET:
7518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKRAGET:
7520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(long));
7521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKFRASET:
7523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKFRAGET:
7525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(long));
7526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKSECTGET:
7528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(unsigned short));
7529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKSSZGET:
7531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
7532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKBSZGET:
7534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
7535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKBSZSET:
7537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_BLKGETSIZE64:
7539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(unsigned long long));
7540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_BLKPBSZGET:
7542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      POST_MEM_WRITE(ARG3, sizeof(int));
7543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
7544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Hard disks */
7546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_HDIO_GETGEO: /* 0x0301 */
7547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(struct vki_hd_geometry));
7548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_HDIO_GET_DMA: /* 0x030b */
7550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(long));
7551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_HDIO_GET_IDENTITY: /* 0x030d */
7553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, VKI_SIZEOF_STRUCT_HD_DRIVEID );
7554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* SCSI */
7557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_SCSI_IOCTL_GET_IDLUN: /* 0x5382 */
7558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      POST_MEM_WRITE(ARG3, sizeof(struct vki_scsi_idlun));
7559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
7560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_SCSI_IOCTL_GET_BUS_NUMBER: /* 0x5386 */
7561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      POST_MEM_WRITE(ARG3, sizeof(int));
7562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
7563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* CD ROM stuff (??)  */
7565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMSUBCHNL:
7566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_subchnl));
7567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMREADTOCHDR:
7569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_tochdr));
7570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMREADTOCENTRY:
7572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_tocentry));
7573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMMULTISESSION:
7575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_multisession));
7576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMVOLREAD:
7578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_volctrl));
7579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMREADRAW:
7581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, VKI_CD_FRAMESIZE_RAW);
7582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMREADAUDIO:
7584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
7585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      struct vki_cdrom_read_audio *cra = (struct vki_cdrom_read_audio *) ARG3;
7586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr)(cra->buf), cra->nframes * VKI_CD_FRAMESIZE_RAW);
7587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROMPLAYMSF:
7591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* The following two are probably bogus (should check args
7593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 for readability).  JRS 20021117 */
7594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROM_DRIVE_STATUS: /* 0x5326 */
7595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CDROM_CLEAR_OPTIONS: /* 0x5321 */
7596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_CDROM_GET_CAPABILITY: /* 0x5331 */
7598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
7599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIGETBSZ:
7601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(unsigned long));
7602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIBMAP:
7604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
7605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FBIOGET_VSCREENINFO: //0x4600
7608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(struct vki_fb_var_screeninfo));
7609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FBIOGET_FSCREENINFO: //0x4602
7611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(struct vki_fb_fix_screeninfo));
7612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPCLAIM:
7615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPEXCL:
7616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPYIELD:
7617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPRELEASE:
7618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPSETMODE:
7619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPSETPHASE:
7620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPSETFLAGS:
7621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPWDATA:
7622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPWCONTROL:
7623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPFCONTROL:
7624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPDATADIR:
7625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPNEGOT:
7626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPWCTLONIRQ:
7627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPSETTIME:
7628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPGETMODE:
7630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
7631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPGETPHASE:
7633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
7634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPGETMODES:
7636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
7637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPGETFLAGS:
7639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
7640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPRSTATUS:
7642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
7643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPRDATA:
7645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
7646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPRCONTROL:
7648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
7649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPCLRIRQ:
7651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
7652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PPGETTIME:
7654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_timeval) );
7655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_FONT:
7658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, 32 * 256 );
7659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_FONT:
7661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_FONTX:
7664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr)((struct vki_consolefontdesc *)ARG3)->chardata,
7665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      32 * ((struct vki_consolefontdesc *)ARG3)->charcount );
7666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_FONTX:
7668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_FONTRESET:
7671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_CMAP:
7674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, 16 * 3 );
7675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_CMAP:
7677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KIOCSOUND:
7680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDMKTONE:
7681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGETLED:
7684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(char) );
7685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSETLED:
7687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBTYPE:
7690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(char) );
7691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDADDIO:
7694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDDELIO:
7695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDENABIO:
7696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDDISABIO:
7697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSETMODE:
7700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGETMODE:
7702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
7703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDMAPDISP:
7706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDUNMAPDISP:
7707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_SCRNMAP:
7710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, VKI_E_TABSZ );
7711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_SCRNMAP:
7713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_UNISCRNMAP:
7715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, VKI_E_TABSZ * sizeof(unsigned short) );
7716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_UNISCRNMAP:
7718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GIO_UNIMAP:
7721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
7722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
7723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE( (Addr)&desc->entry_ct, sizeof(desc->entry_ct));
7724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE( (Addr)desc->entries,
7725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      	                 desc->entry_ct * sizeof(struct vki_unipair) );
7726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_UNIMAP:
7729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PIO_UNIMAPCLR:
7731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBMODE:
7734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
7735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBMODE:
7737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBMETA:
7740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
7741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBMETA:
7743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBLED:
7746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(char) );
7747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBLED:
7749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBENT:
7752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
7753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
7754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBENT:
7756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBSENT:
7759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr)((struct vki_kbsentry *)ARG3)->kb_string,
7760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(((struct vki_kbsentry *)ARG3)->kb_string) );
7761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBSENT:
7763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGKBDIACR:
7766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_kbdiacrs) );
7767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSKBDIACR:
7769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDGETKEYCODE:
7772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
7773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
7774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSETKEYCODE:
7776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDSIGACCEPT:
7779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDKBDREP:
7782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_KDFONTOP:
7785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
7786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3;
7787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch ( op->op ) {
7788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case VKI_KD_FONT_OP_SET:
7789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               break;
7790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case VKI_KD_FONT_OP_GET:
7791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if ( op->data )
7792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  POST_MEM_WRITE( (Addr) op->data,
7793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  (op->width + 7) / 8 * 32 * op->charcount );
7794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               break;
7795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case VKI_KD_FONT_OP_SET_DEFAULT:
7796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               break;
7797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case VKI_KD_FONT_OP_COPY:
7798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               break;
7799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
7800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE( (Addr) op, sizeof(*op));
7801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_OPENQRY:
7805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
7806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_GETMODE:
7808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_vt_mode) );
7809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_SETMODE:
7811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_GETSTATE:
7813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_active),
7814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(((struct vki_vt_stat*) ARG3)->v_active) );
7815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_state),
7816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(((struct vki_vt_stat*) ARG3)->v_state) );
7817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_RELDISP:
7819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_ACTIVATE:
7820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_WAITACTIVE:
7821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_DISALLOCATE:
7822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_RESIZE:
7824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_RESIZEX:
7826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_LOCKSWITCH:
7828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_VT_UNLOCKSWITCH:
7829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_CONTROL:
7832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
7833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_usbdevfs_ctrltransfer *vkuc = (struct vki_usbdevfs_ctrltransfer *)ARG3;
7834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (vkuc->bRequestType & 0x80)
7835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            POST_MEM_WRITE((Addr)vkuc->data, RES);
7836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
7838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_BULK:
7839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
7840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_usbdevfs_bulktransfer *vkub = (struct vki_usbdevfs_bulktransfer *)ARG3;
7841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (vkub->ep & 0x80)
7842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            POST_MEM_WRITE((Addr)vkub->data, RES);
7843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
7845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_GETDRIVER:
7846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
7847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_usbdevfs_getdriver *vkugd = (struct vki_usbdevfs_getdriver *)ARG3;
7848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE((Addr)&vkugd->driver, sizeof(vkugd->driver));
7849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
7851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_REAPURB:
7852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_REAPURBNDELAY:
7853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
7854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_usbdevfs_urb **vkuu = (struct vki_usbdevfs_urb**)ARG3;
7855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE((Addr)vkuu, sizeof(*vkuu));
7856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (!*vkuu)
7857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
7858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE((Addr) &((*vkuu)->status),sizeof((*vkuu)->status));
7859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if ((*vkuu)->type == VKI_USBDEVFS_URB_TYPE_CONTROL) {
7860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            struct vki_usbdevfs_setuppacket *vkusp = (struct vki_usbdevfs_setuppacket *)(*vkuu)->buffer;
7861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (vkusp->bRequestType & 0x80)
7862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               POST_MEM_WRITE((Addr)(vkusp+1), (*vkuu)->buffer_length - sizeof(*vkusp));
7863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            POST_MEM_WRITE((Addr)&(*vkuu)->actual_length, sizeof((*vkuu)->actual_length));
7864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else if ((*vkuu)->type == VKI_USBDEVFS_URB_TYPE_ISO) {
7865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            char *bp = (*vkuu)->buffer;
7866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            int i;
7867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for(i=0; i<(*vkuu)->number_of_packets; i++) {
7868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               POST_MEM_WRITE((Addr)&(*vkuu)->iso_frame_desc[i].actual_length, sizeof((*vkuu)->iso_frame_desc[i].actual_length));
7869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               POST_MEM_WRITE((Addr)&(*vkuu)->iso_frame_desc[i].status, sizeof((*vkuu)->iso_frame_desc[i].status));
7870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if ((*vkuu)->endpoint & 0x80)
7871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  POST_MEM_WRITE((Addr)bp, (*vkuu)->iso_frame_desc[i].actual_length);
7872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               bp += (*vkuu)->iso_frame_desc[i].length; // FIXME: or actual_length??
7873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
7874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            POST_MEM_WRITE((Addr)&(*vkuu)->error_count, sizeof((*vkuu)->error_count));
7875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
7876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if ((*vkuu)->endpoint & 0x80)
7877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               POST_MEM_WRITE((Addr)(*vkuu)->buffer, (*vkuu)->actual_length);
7878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            POST_MEM_WRITE((Addr)&(*vkuu)->actual_length, sizeof((*vkuu)->actual_length));
7879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
7880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
7882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_CONNECTINFO:
7883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(struct vki_usbdevfs_connectinfo));
7884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_USBDEVFS_IOCTL:
7886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
7887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_usbdevfs_ioctl *vkui = (struct vki_usbdevfs_ioctl *)ARG3;
7888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         UInt dir2, size2;
7889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dir2  = _VKI_IOC_DIR(vkui->ioctl_code);
7890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         size2 = _VKI_IOC_SIZE(vkui->ioctl_code);
7891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (size2 > 0) {
7892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (dir2 & _VKI_IOC_READ)
7893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               POST_MEM_WRITE((Addr)vkui->data, size2);
7894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
7895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* I2C (/dev/i2c-*) ioctls */
7899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_I2C_SLAVE:
7900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_I2C_SLAVE_FORCE:
7901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_I2C_TENBIT:
7902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_I2C_PEC:
7903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_I2C_FUNCS:
7905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(unsigned long) );
7906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_I2C_RDWR:
7908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if ( ARG3 ) {
7909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          struct vki_i2c_rdwr_ioctl_data *vkui = (struct vki_i2c_rdwr_ioctl_data *)ARG3;
7910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          UInt i;
7911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          for (i=0; i < vkui->nmsgs; i++) {
7912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              struct vki_i2c_msg *msg = vkui->msgs + i;
7913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              if (msg->flags & VKI_I2C_M_RD)
7914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  POST_MEM_WRITE((Addr)msg->buf, msg->len);
7915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          }
7916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
7917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
7918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Wireless extensions ioctls */
7920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWCOMMIT:
7921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWNWID:
7922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWFREQ:
7923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWMODE:
7924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWSENS:
7925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWRANGE:
7926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWPRIV:
7927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWSTATS:
7928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWSPY:
7929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWTHRSPY:
7930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWAP:
7931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWSCAN:
7932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWESSID:
7933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWRATE:
7934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWNICKN:
7935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWRTS:
7936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWFRAG:
7937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWTXPOW:
7938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWRETRY:
7939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWENCODE:
7940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWPOWER:
7941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWGENIE:
7942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWMLME:
7943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWAUTH:
7944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWENCODEEXT:
7945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIWPMKSA:
7946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWNAME:
7948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
7949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE((Addr)((struct vki_iwreq *)ARG3)->u.name,
7950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        sizeof(((struct vki_iwreq *)ARG3)->u.name));
7951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWNWID:
7954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWSENS:
7955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWRATE:
7956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWRTS:
7957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWFRAG:
7958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWTXPOW:
7959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWRETRY:
7960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWPOWER:
7961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWAUTH:
7962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
7963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.param,
7964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        sizeof(struct vki_iw_param));
7965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWFREQ:
7968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
7969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.freq,
7970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        sizeof(struct vki_iw_freq));
7971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWMODE:
7974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
7975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.mode,
7976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       sizeof(__vki_u32));
7977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWRANGE:
7980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWPRIV:
7981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWSTATS:
7982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWSPY:
7983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWTHRSPY:
7984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWAPLIST:
7985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWSCAN:
7986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWESSID:
7987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWNICKN:
7988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWENCODE:
7989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWGENIE:
7990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWENCODEEXT:
7991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
7992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_iw_point* point;
7993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         point = &((struct vki_iwreq *)ARG3)->u.data;
7994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE((Addr)point->pointer, point->length);
7995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
7997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIWAP:
7998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
7999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
8000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        sizeof(struct vki_sockaddr));
8001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
8002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
8003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#  if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android) \
8005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      || defined(VGPV_mips32_linux_android)
8006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* ashmem */
8007571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_GET_SIZE:
8008571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_SET_SIZE:
8009571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_GET_PROT_MASK:
8010571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_SET_PROT_MASK:
8011571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_GET_PIN_STATUS:
8012571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_PURGE_ALL_CACHES:
8013571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_SET_NAME:
8014571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_PIN:
8015571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_UNPIN:
8016571b08386a993913ca8db340d7c706ab94041eceJeff Brown       break;
8017571b08386a993913ca8db340d7c706ab94041eceJeff Brown   case VKI_ASHMEM_GET_NAME:
8018571b08386a993913ca8db340d7c706ab94041eceJeff Brown       POST_MEM_WRITE( ARG3, VKI_ASHMEM_NAME_LEN );
8019571b08386a993913ca8db340d7c706ab94041eceJeff Brown       break;
80200e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov
8021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* binder */
80220e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_WRITE_READ:
80230e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       if (ARG3) {
8024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           struct vki_binder_write_read* bwr
8025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              = (struct vki_binder_write_read*)ARG3;
80260e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           POST_FIELD_WRITE(bwr->write_consumed);
80270e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           POST_FIELD_WRITE(bwr->read_consumed);
80280e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov
80290e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           if (bwr->read_size)
80300e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov               POST_MEM_WRITE((Addr)bwr->read_buffer, bwr->read_consumed);
80310e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       }
80320e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       break;
80330e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov
80340e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_SET_IDLE_TIMEOUT:
80350e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_SET_MAX_THREADS:
80360e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_SET_IDLE_PRIORITY:
80370e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_SET_CONTEXT_MGR:
80380e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_THREAD_EXIT:
80390e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       break;
80400e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov   case VKI_BINDER_VERSION:
80410e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       if (ARG3) {
80420e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           struct vki_binder_version* bv = (struct vki_binder_version*)ARG3;
80430e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov           POST_FIELD_WRITE(bv->protocol_version);
80440e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       }
80450e8e68d030e5aceb4d720dad38a6fd468183ff68Evgeniy Stepanov       break;
8046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  endif /* defined(VGPV_*_linux_android) */
8047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_HCIINQUIRY:
8049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (ARG3) {
8050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        struct vki_hci_inquiry_req* ir = (struct vki_hci_inquiry_req*)ARG3;
8051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        POST_MEM_WRITE((Addr)ARG3 + sizeof(struct vki_hci_inquiry_req),
8052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       ir->num_rsp * sizeof(struct vki_inquiry_info));
8053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
8054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
8055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* KVM ioctls that only write the system call return value */
8057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_GET_API_VERSION:
8058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_CREATE_VM:
8059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_CHECK_EXTENSION:
8060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_GET_VCPU_MMAP_SIZE:
8061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_S390_ENABLE_SIE:
8062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_CREATE_VCPU:
8063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_KVM_CREATE_IRQCHIP:
8064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_RUN:
8065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_KVM_S390_INITIAL_RESET:
8066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
8067571b08386a993913ca8db340d7c706ab94041eceJeff Brown
8068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifdef ENABLE_XEN
8069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_XEN_IOCTL_PRIVCMD_HYPERCALL: {
8070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      SyscallArgs harrghs;
8071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      struct vki_xen_privcmd_hypercall *args =
8072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         (struct vki_xen_privcmd_hypercall *)(ARG3);
8073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (!args)
8075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
8076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(memset)(&harrghs, 0, sizeof(harrghs));
8078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.sysno = args->op;
8079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg1 = args->arg[0];
8080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg2 = args->arg[1];
8081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg3 = args->arg[2];
8082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg4 = args->arg[3];
8083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg5 = args->arg[4];
8084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      harrghs.arg6 = harrghs.arg7 = harrghs.arg8 = 0;
8085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      WRAPPER_POST_NAME(xen, hypercall) (tid, &harrghs, status);
8087fe1fa7caae1b429af737fa4f946a7fc85827f2cdBen Cheng      break;
8088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   };
8089fe1fa7caae1b429af737fa4f946a7fc85827f2cdBen Cheng
8090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_XEN_IOCTL_PRIVCMD_MMAP:
8091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
8092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH: {
8093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       struct vki_xen_privcmd_mmapbatch *args =
8094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           (struct vki_xen_privcmd_mmapbatch *)(ARG3);
8095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       POST_MEM_WRITE((Addr)args->arr, sizeof(*(args->arr)) * args->num);
8096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
8097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
8098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2: {
8099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       struct vki_xen_privcmd_mmapbatch_v2 *args =
8100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           (struct vki_xen_privcmd_mmapbatch_v2 *)(ARG3);
8101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       POST_MEM_WRITE((Addr)args->err, sizeof(*(args->err)) * args->num);
810209529052b5d43a42bd0862262cbd4ee9e41ae4feBen Cheng      }
810309529052b5d43a42bd0862262cbd4ee9e41ae4feBen Cheng      break;
8104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
810509529052b5d43a42bd0862262cbd4ee9e41ae4feBen Cheng
8106c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   case VKI_EVIOCSSUSPENDBLOCK:
8107c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      POST_MEM_WRITE( ARG3, sizeof(int) );
8108c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      break;
8109c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
8110c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov   case VKI_MEDIA_IOC_DEVICE_INFO:
8111c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      if (ARG3) {
8112c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov         POST_MEM_WRITE(ARG3, sizeof(struct vki_media_device_info));
8113c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      }
8114c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov      break;
8115c54f8dd583082adb3c6f21d350ffb78e2ad6f152Dmitriy Ivanov
8116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
8117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* EVIOC* are variable length and return size written on success */
8118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (ARG2 & ~(_VKI_IOC_SIZEMASK << _VKI_IOC_SIZESHIFT)) {
8119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGNAME(0):
8120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGPHYS(0):
8121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGUNIQ(0):
8122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGKEY(0):
8123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGLED(0):
8124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGSND(0):
8125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGSW(0):
8126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_SYN,0):
8127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_KEY,0):
8128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_REL,0):
8129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_ABS,0):
8130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_MSC,0):
8131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_SW,0):
8132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_LED,0):
8133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_SND,0):
8134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_REP,0):
8135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_FF,0):
8136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_PWR,0):
8137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_EVIOCGBIT(VKI_EV_FF_STATUS,0):
8138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (RES > 0)
8139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            POST_MEM_WRITE(ARG3, RES);
8140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
8141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
8142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(POST_unknown_ioctl)(tid, RES, ARG2, ARG3);
8143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
8144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
8145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
8146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
8147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
8148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
8150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   socketcall wrapper helpers
8151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
8152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid
8154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(linux_PRE_sys_getsockopt) ( ThreadId tid,
8155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                UWord arg0, UWord arg1, UWord arg2,
8156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                UWord arg3, UWord arg4 )
8157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
8158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* int getsockopt(int s, int level, int optname,
8159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     void *optval, socklen_t *optlen); */
8160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr optval_p = arg3;
8161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr optlen_p = arg4;
8162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* vg_assert(sizeof(socklen_t) == sizeof(UInt)); */
8163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (optval_p != (Addr)NULL) {
8164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(buf_and_len_pre_check) ( tid, optval_p, optlen_p,
8165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   "socketcall.getsockopt(optval)",
8166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   "socketcall.getsockopt(optlen)" );
8167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (arg1 == VKI_SOL_SCTP &&
8168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (arg2 == VKI_SCTP_GET_PEER_ADDRS ||
8169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           arg2 == VKI_SCTP_GET_LOCAL_ADDRS))
8170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
8171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
8172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         int address_bytes = sizeof(struct vki_sockaddr_in6) * ga->addr_num;
8173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE( "socketcall.getsockopt(optval.addrs)",
8174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        (Addr)ga->addrs, address_bytes );
8175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
8176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
8177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
8178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid
8180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(linux_POST_sys_getsockopt) ( ThreadId tid,
8181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 SysRes res,
8182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 UWord arg0, UWord arg1, UWord arg2,
8183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 UWord arg3, UWord arg4 )
8184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
8185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr optval_p = arg3;
8186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr optlen_p = arg4;
8187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(!sr_isError(res)); /* guaranteed by caller */
8188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (optval_p != (Addr)NULL) {
8189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(buf_and_len_post_check) ( tid, res, optval_p, optlen_p,
8190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    "socketcall.getsockopt(optlen_out)" );
8191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (arg1 == VKI_SOL_SCTP &&
8192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (arg2 == VKI_SCTP_GET_PEER_ADDRS ||
8193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           arg2 == VKI_SCTP_GET_LOCAL_ADDRS))
8194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
8195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
8196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_sockaddr *a = ga->addrs;
8197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         int i;
8198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (i = 0; i < ga->addr_num; i++) {
8199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            int sl = 0;
8200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (a->sa_family == VKI_AF_INET)
8201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               sl = sizeof(struct vki_sockaddr_in);
8202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else if (a->sa_family == VKI_AF_INET6)
8203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               sl = sizeof(struct vki_sockaddr_in6);
8204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else {
8205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               VG_(message)(Vg_UserMsg, "Warning: getsockopt: unhandled "
8206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                        "address type %d\n", a->sa_family);
8207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
8208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            a = (struct vki_sockaddr*)((char*)a + sl);
8209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
8210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE( (Addr)ga->addrs, (char*)a - (char*)ga->addrs );
8211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
8212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
8213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
8214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
8216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovML_(linux_PRE_sys_setsockopt) ( ThreadId tid,
8217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                UWord arg0, UWord arg1, UWord arg2,
8218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                UWord arg3, UWord arg4 )
8219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
8220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* int setsockopt(int s, int level, int optname,
8221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     const void *optval, socklen_t optlen); */
8222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Addr optval_p = arg3;
8223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (optval_p != (Addr)NULL) {
8224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /*
8225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       * OK, let's handle at least some setsockopt levels and options
8226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       * ourselves, so we don't get false claims of references to
8227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       * uninitialized memory (such as padding in structures) and *do*
8228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       * check what pointers in the argument point to.
8229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       */
8230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (arg1 == VKI_SOL_SOCKET && arg2 == VKI_SO_ATTACH_FILTER)
8231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      {
8232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct vki_sock_fprog *fp = (struct vki_sock_fprog *)optval_p;
8233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /*
8235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          * struct sock_fprog has a 16-bit count of instructions,
8236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          * followed by a pointer to an array of those instructions.
8237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          * There's padding between those two elements.
8238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          *
8239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          * So that we don't bogusly complain about the padding bytes,
8240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          * we just report that we read len and and filter.
8241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          *
8242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          * We then make sure that what filter points to is valid.
8243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          */
8244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ( "setsockopt(SOL_SOCKET, SO_ATTACH_FILTER, &optval.len)",
8245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       (Addr)&fp->len, sizeof(fp->len) );
8246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ( "setsockopt(SOL_SOCKET, SO_ATTACH_FILTER, &optval.filter)",
8247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       (Addr)&fp->filter, sizeof(fp->filter) );
8248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* len * sizeof (*filter) */
8250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (fp->filter != NULL)
8251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         {
8252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            PRE_MEM_READ( "setsockopt(SOL_SOCKET, SO_ATTACH_FILTER, optval.filter)",
8253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          (Addr)(fp->filter),
8254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          fp->len * sizeof(*fp->filter) );
8255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
8256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
8257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
8258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      {
8259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         PRE_MEM_READ( "socketcall.setsockopt(optval)",
8260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       arg3, /* optval */
8261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       arg4  /* optlen */ );
8262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
8263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
8264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
8265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* ---------------------------------------------------------------------
8267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ptrace wrapper helpers
8268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ------------------------------------------------------------------ */
8269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
8271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovML_(linux_PRE_getregset) ( ThreadId tid, long arg3, long arg4 )
8272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
8273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   struct vki_iovec *iov = (struct vki_iovec *) arg4;
8274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_READ("ptrace(getregset iovec->iov_base)",
8276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov		(unsigned long) &iov->iov_base, sizeof(iov->iov_base));
8277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_READ("ptrace(getregset iovec->iov_len)",
8278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov		(unsigned long) &iov->iov_len, sizeof(iov->iov_len));
8279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_WRITE("ptrace(getregset *(iovec->iov_base))",
8280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov		 (unsigned long) iov->iov_base, iov->iov_len);
8281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
8282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
8284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovML_(linux_PRE_setregset) ( ThreadId tid, long arg3, long arg4 )
8285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
8286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   struct vki_iovec *iov = (struct vki_iovec *) arg4;
8287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_READ("ptrace(setregset iovec->iov_base)",
8289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov		(unsigned long) &iov->iov_base, sizeof(iov->iov_base));
8290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_READ("ptrace(setregset iovec->iov_len)",
8291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov		(unsigned long) &iov->iov_len, sizeof(iov->iov_len));
8292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PRE_MEM_READ("ptrace(setregset *(iovec->iov_base))",
8293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov		(unsigned long) iov->iov_base, iov->iov_len);
8294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
8295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
8297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovML_(linux_POST_getregset) ( ThreadId tid, long arg3, long arg4 )
8298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
8299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   struct vki_iovec *iov = (struct vki_iovec *) arg4;
8300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* XXX: The actual amount of data written by the kernel might be
8302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      less than iov_len, depending on the regset (arg3). */
8303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   POST_MEM_WRITE((unsigned long) iov->iov_base, iov->iov_len);
8304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
8305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef PRE
8307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef POST
8308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGO_linux)
8310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
8312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                                          ---*/
8313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
8314