blob: f2ebc161f159372707698a2f87f7b99057f428b9 [file] [log] [blame]
nethercotefd453532004-11-17 17:21:12 +00001
2/*--------------------------------------------------------------------*/
njnc1b01812005-06-17 22:19:06 +00003/*--- Linux-specific syscalls, etc. syswrap-linux.c ---*/
nethercotefd453532004-11-17 17:21:12 +00004/*--------------------------------------------------------------------*/
5
6/*
njnb9c427c2004-12-01 14:14:42 +00007 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
nethercotefd453532004-11-17 17:21:12 +00009
sewardjb3a1e4b2015-08-21 11:32:26 +000010 Copyright (C) 2000-2015 Nicholas Nethercote
njn2bc10122005-05-08 02:10:27 +000011 njn@valgrind.org
nethercotefd453532004-11-17 17:21:12 +000012
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 02111-1307, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29*/
30
njn8b68b642009-06-24 00:37:09 +000031#if defined(VGO_linux)
32
njnc7561b92005-06-19 01:24:32 +000033#include "pub_core_basics.h"
sewardj4cfea4f2006-10-14 19:26:10 +000034#include "pub_core_vki.h"
35#include "pub_core_vkiscnums.h"
njnc7561b92005-06-19 01:24:32 +000036#include "pub_core_threadstate.h"
sewardj55f9d1a2005-04-25 11:11:44 +000037#include "pub_core_aspacemgr.h"
sewardj45f4e7c2005-09-27 19:20:21 +000038#include "pub_core_debuginfo.h" // VG_(di_notify_*)
39#include "pub_core_transtab.h" // VG_(discard_translations)
sewardj14c7cc52007-02-25 15:08:24 +000040#include "pub_core_xarray.h"
tom363ec762006-03-21 10:58:35 +000041#include "pub_core_clientstate.h"
njn7b85dd52005-06-12 17:26:29 +000042#include "pub_core_debuglog.h"
sewardjbc22cf72005-06-08 00:02:49 +000043#include "pub_core_libcbase.h"
njn132bfcc2005-06-04 19:16:06 +000044#include "pub_core_libcassert.h"
njneb8896b2005-06-04 20:03:55 +000045#include "pub_core_libcfile.h"
njn36a20fa2005-06-03 03:08:39 +000046#include "pub_core_libcprint.h"
njn7b85dd52005-06-12 17:26:29 +000047#include "pub_core_libcproc.h"
njne1486662005-11-10 02:48:04 +000048#include "pub_core_libcsignal.h"
petarj36c2b8c2012-07-03 21:02:42 +000049#include "pub_core_machine.h" // VG_(get_SP)
njnaf1d7df2005-06-11 01:31:52 +000050#include "pub_core_mallocfree.h"
njn43b9a8a2005-05-10 04:37:01 +000051#include "pub_core_tooliface.h"
sewardja8d8e232005-06-07 20:04:56 +000052#include "pub_core_options.h"
njnc7561b92005-06-19 01:24:32 +000053#include "pub_core_scheduler.h"
njncd405ea2005-08-31 02:44:31 +000054#include "pub_core_signals.h"
njn9abd6082005-06-17 21:31:45 +000055#include "pub_core_syscall.h"
njna3afdfb2005-11-09 04:49:28 +000056#include "pub_core_syswrap.h"
florianc91f5842013-09-15 10:42:26 +000057#include "pub_core_inner.h"
philippe277eaff2012-03-03 12:01:48 +000058#if defined(ENABLE_INNER_CLIENT_REQUEST)
florian1a046d52013-09-16 20:56:35 +000059#include "pub_core_clreq.h"
philippe277eaff2012-03-03 12:01:48 +000060#endif
sewardja8d8e232005-06-07 20:04:56 +000061
62#include "priv_types_n_macros.h"
njnc1b01812005-06-17 22:19:06 +000063#include "priv_syswrap-generic.h"
64#include "priv_syswrap-linux.h"
Elliott Hughesa0664b92017-04-18 17:46:52 -070065#include "priv_syswrap-main.h"
bart0ab84fe2012-09-09 18:30:17 +000066#include "priv_syswrap-xen.h"
njna3afdfb2005-11-09 04:49:28 +000067
njn7b85dd52005-06-12 17:26:29 +000068// Run a thread from beginning to end and return the thread's
69// scheduler-return-code.
njne1486662005-11-10 02:48:04 +000070static VgSchedReturnCode thread_wrapper(Word /*ThreadId*/ tidW)
njn7b85dd52005-06-12 17:26:29 +000071{
njn7b85dd52005-06-12 17:26:29 +000072 VgSchedReturnCode ret;
73 ThreadId tid = (ThreadId)tidW;
74 ThreadState* tst = VG_(get_ThreadState)(tid);
75
sewardjd98f68d2005-11-09 14:09:14 +000076 VG_(debugLog)(1, "syswrap-linux",
florianb26101c2015-08-08 21:45:33 +000077 "thread_wrapper(tid=%u): entry\n",
78 tid);
tom60a4b0b2005-10-12 10:45:27 +000079
njn7b85dd52005-06-12 17:26:29 +000080 vg_assert(tst->status == VgTs_Init);
81
82 /* make sure we get the CPU lock before doing anything significant */
sewardjad0a3a82006-12-17 18:58:55 +000083 VG_(acquire_BigLock)(tid, "thread_wrapper(starting new thread)");
njn7b85dd52005-06-12 17:26:29 +000084
85 if (0)
florianb26101c2015-08-08 21:45:33 +000086 VG_(printf)("thread tid %u started: stack = %p\n",
87 tid, (void *)&tid);
njn7b85dd52005-06-12 17:26:29 +000088
sewardjdc873c02011-07-24 16:02:33 +000089 /* Make sure error reporting is enabled in the new thread. */
90 tst->err_disablement_level = 0;
91
sewardj7a387ea2007-11-25 14:06:06 +000092 VG_TRACK(pre_thread_first_insn, tid);
93
njn7b85dd52005-06-12 17:26:29 +000094 tst->os_state.lwpid = VG_(gettid)();
sewardjce215632010-02-22 11:03:10 +000095 /* Set the threadgroup for real. This overwrites the provisional
96 value set in do_clone() syswrap-*-linux.c. See comments in
97 do_clone for background, also #226116. */
njn7b85dd52005-06-12 17:26:29 +000098 tst->os_state.threadgroup = VG_(getpid)();
99
100 /* Thread created with all signals blocked; scheduler will set the
101 appropriate mask */
102
103 ret = VG_(scheduler)(tid);
104
105 vg_assert(VG_(is_exiting)(tid));
106
107 vg_assert(tst->status == VgTs_Runnable);
108 vg_assert(VG_(is_running_thread)(tid));
109
sewardjd98f68d2005-11-09 14:09:14 +0000110 VG_(debugLog)(1, "syswrap-linux",
florianb26101c2015-08-08 21:45:33 +0000111 "thread_wrapper(tid=%u): exit, schedreturncode %s\n",
112 tid, VG_(name_of_VgSchedReturnCode)(ret));
njn7b85dd52005-06-12 17:26:29 +0000113
114 /* Return to caller, still holding the lock. */
115 return ret;
116}
117
118
nethercotefd453532004-11-17 17:21:12 +0000119/* ---------------------------------------------------------------------
njna3afdfb2005-11-09 04:49:28 +0000120 clone-related stuff
121 ------------------------------------------------------------------ */
122
123/* Run a thread all the way to the end, then do appropriate exit actions
124 (this is the last-one-out-turn-off-the-lights bit). */
njne1486662005-11-10 02:48:04 +0000125static void run_a_thread_NORETURN ( Word tidW )
njna3afdfb2005-11-09 04:49:28 +0000126{
127 ThreadId tid = (ThreadId)tidW;
128 VgSchedReturnCode src;
129 Int c;
sewardjdc873c02011-07-24 16:02:33 +0000130 ThreadState* tst;
philippe277eaff2012-03-03 12:01:48 +0000131#ifdef ENABLE_INNER_CLIENT_REQUEST
132 Int registered_vgstack_id;
133#endif
njna3afdfb2005-11-09 04:49:28 +0000134
sewardjd98f68d2005-11-09 14:09:14 +0000135 VG_(debugLog)(1, "syswrap-linux",
florianb26101c2015-08-08 21:45:33 +0000136 "run_a_thread_NORETURN(tid=%u): pre-thread_wrapper\n",
137 tid);
njna3afdfb2005-11-09 04:49:28 +0000138
sewardjdc873c02011-07-24 16:02:33 +0000139 tst = VG_(get_ThreadState)(tid);
140 vg_assert(tst);
141
philippe277eaff2012-03-03 12:01:48 +0000142 /* An thread has two stacks:
143 * the simulated stack (used by the synthetic cpu. Guest process
144 is using this stack).
145 * the valgrind stack (used by the real cpu. Valgrind code is running
146 on this stack).
147 When Valgrind runs as an inner, it must signals that its (real) stack
148 is the stack to use by the outer to e.g. do stacktraces.
149 */
150 INNER_REQUEST
151 (registered_vgstack_id
152 = VALGRIND_STACK_REGISTER (tst->os_state.valgrind_stack_base,
153 tst->os_state.valgrind_stack_init_SP));
154
njna3afdfb2005-11-09 04:49:28 +0000155 /* Run the thread all the way through. */
njne1486662005-11-10 02:48:04 +0000156 src = thread_wrapper(tid);
njna3afdfb2005-11-09 04:49:28 +0000157
sewardjd98f68d2005-11-09 14:09:14 +0000158 VG_(debugLog)(1, "syswrap-linux",
florianb26101c2015-08-08 21:45:33 +0000159 "run_a_thread_NORETURN(tid=%u): post-thread_wrapper\n",
160 tid);
njna3afdfb2005-11-09 04:49:28 +0000161
162 c = VG_(count_living_threads)();
163 vg_assert(c >= 1); /* stay sane */
164
sewardjadb102f2007-11-09 23:21:44 +0000165 // Tell the tool this thread is exiting
166 VG_TRACK( pre_thread_ll_exit, tid );
167
sewardjdc873c02011-07-24 16:02:33 +0000168 /* If the thread is exiting with errors disabled, complain loudly;
169 doing so is bad (does the user know this has happened?) Also,
170 in all cases, be paranoid and clear the flag anyway so that the
171 thread slot is safe in this respect if later reallocated. This
172 should be unnecessary since the flag should be cleared when the
173 slot is reallocated, in thread_wrapper(). */
174 if (tst->err_disablement_level > 0) {
175 VG_(umsg)(
176 "WARNING: exiting thread has error reporting disabled.\n"
177 "WARNING: possibly as a result of some mistake in the use\n"
178 "WARNING: of the VALGRIND_DISABLE_ERROR_REPORTING macros.\n"
179 );
180 VG_(debugLog)(
181 1, "syswrap-linux",
florianb26101c2015-08-08 21:45:33 +0000182 "run_a_thread_NORETURN(tid=%u): "
sewardjdc873c02011-07-24 16:02:33 +0000183 "WARNING: exiting thread has err_disablement_level = %u\n",
florianb26101c2015-08-08 21:45:33 +0000184 tid, tst->err_disablement_level
sewardjdc873c02011-07-24 16:02:33 +0000185 );
186 }
187 tst->err_disablement_level = 0;
188
njna3afdfb2005-11-09 04:49:28 +0000189 if (c == 1) {
190
sewardjd98f68d2005-11-09 14:09:14 +0000191 VG_(debugLog)(1, "syswrap-linux",
florianb26101c2015-08-08 21:45:33 +0000192 "run_a_thread_NORETURN(tid=%u): "
njna3afdfb2005-11-09 04:49:28 +0000193 "last one standing\n",
florianb26101c2015-08-08 21:45:33 +0000194 tid);
njna3afdfb2005-11-09 04:49:28 +0000195
196 /* We are the last one standing. Keep hold of the lock and
197 carry on to show final tool results, then exit the entire system.
198 Use the continuation pointer set at startup in m_main. */
199 ( * VG_(address_of_m_main_shutdown_actions_NORETURN) ) (tid, src);
njna3afdfb2005-11-09 04:49:28 +0000200 } else {
201
sewardjd98f68d2005-11-09 14:09:14 +0000202 VG_(debugLog)(1, "syswrap-linux",
florianb26101c2015-08-08 21:45:33 +0000203 "run_a_thread_NORETURN(tid=%u): "
njna3afdfb2005-11-09 04:49:28 +0000204 "not last one standing\n",
florianb26101c2015-08-08 21:45:33 +0000205 tid);
njna3afdfb2005-11-09 04:49:28 +0000206
207 /* OK, thread is dead, but others still exist. Just exit. */
njna3afdfb2005-11-09 04:49:28 +0000208
209 /* This releases the run lock */
210 VG_(exit_thread)(tid);
211 vg_assert(tst->status == VgTs_Zombie);
sewardjf0c12502014-01-12 12:54:00 +0000212 vg_assert(sizeof(tst->status) == 4);
213 vg_assert(sizeof(tst->os_state.exitcode) == sizeof(Word));
njna3afdfb2005-11-09 04:49:28 +0000214
philippe277eaff2012-03-03 12:01:48 +0000215 INNER_REQUEST (VALGRIND_STACK_DEREGISTER (registered_vgstack_id));
216
njna3afdfb2005-11-09 04:49:28 +0000217 /* We have to use this sequence to terminate the thread to
218 prevent a subtle race. If VG_(exit_thread)() had left the
219 ThreadState as Empty, then it could have been reallocated,
220 reusing the stack while we're doing these last cleanups.
221 Instead, VG_(exit_thread) leaves it as Zombie to prevent
222 reallocation. We need to make sure we don't touch the stack
223 between marking it Empty and exiting. Hence the
224 assembler. */
225#if defined(VGP_x86_linux)
226 asm volatile (
philippe5d5dd8e2012-08-05 00:08:25 +0000227 "pushl %%ebx\n"
njna3afdfb2005-11-09 04:49:28 +0000228 "movl %1, %0\n" /* set tst->status = VgTs_Empty */
229 "movl %2, %%eax\n" /* set %eax = __NR_exit */
230 "movl %3, %%ebx\n" /* set %ebx = tst->os_state.exitcode */
231 "int $0x80\n" /* exit(tst->os_state.exitcode) */
philippe5d5dd8e2012-08-05 00:08:25 +0000232 "popl %%ebx\n"
njna3afdfb2005-11-09 04:49:28 +0000233 : "=m" (tst->status)
sewardjf72a28d2011-09-26 17:50:46 +0000234 : "n" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
philippe5d5dd8e2012-08-05 00:08:25 +0000235 : "eax"
sewardjf72a28d2011-09-26 17:50:46 +0000236 );
njna3afdfb2005-11-09 04:49:28 +0000237#elif defined(VGP_amd64_linux)
238 asm volatile (
239 "movl %1, %0\n" /* set tst->status = VgTs_Empty */
240 "movq %2, %%rax\n" /* set %rax = __NR_exit */
241 "movq %3, %%rdi\n" /* set %rdi = tst->os_state.exitcode */
242 "syscall\n" /* exit(tst->os_state.exitcode) */
243 : "=m" (tst->status)
sewardjf72a28d2011-09-26 17:50:46 +0000244 : "n" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
245 : "rax", "rdi"
246 );
carllcae0cc22014-08-07 23:17:29 +0000247#elif defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \
248 || defined(VGP_ppc64le_linux)
njna3afdfb2005-11-09 04:49:28 +0000249 { UInt vgts_empty = (UInt)VgTs_Empty;
250 asm volatile (
251 "stw %1,%0\n\t" /* set tst->status = VgTs_Empty */
252 "li 0,%2\n\t" /* set r0 = __NR_exit */
253 "lwz 3,%3\n\t" /* set r3 = tst->os_state.exitcode */
254 "sc\n\t" /* exit(tst->os_state.exitcode) */
255 : "=m" (tst->status)
sewardjf72a28d2011-09-26 17:50:46 +0000256 : "r" (vgts_empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
257 : "r0", "r3"
258 );
njna3afdfb2005-11-09 04:49:28 +0000259 }
sewardj59570ff2010-01-01 11:59:33 +0000260#elif defined(VGP_arm_linux)
261 asm volatile (
262 "str %1, %0\n" /* set tst->status = VgTs_Empty */
263 "mov r7, %2\n" /* set %r7 = __NR_exit */
264 "ldr r0, %3\n" /* set %r0 = tst->os_state.exitcode */
265 "svc 0x00000000\n" /* exit(tst->os_state.exitcode) */
266 : "=m" (tst->status)
sewardjf72a28d2011-09-26 17:50:46 +0000267 : "r" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
268 : "r0", "r7"
269 );
sewardjf0c12502014-01-12 12:54:00 +0000270#elif defined(VGP_arm64_linux)
271 asm volatile (
272 "str %w1, %0\n" /* set tst->status = VgTs_Empty (32-bit store) */
Chih-Hung Hsiehd5b74212016-09-14 15:54:30 -0700273 "mov x8, %2\n" /* set %x8 = __NR_exit */
274 "ldr x0, %3\n" /* set %x0 = tst->os_state.exitcode */
sewardjf0c12502014-01-12 12:54:00 +0000275 "svc 0x00000000\n" /* exit(tst->os_state.exitcode) */
276 : "=m" (tst->status)
277 : "r" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
Chih-Hung Hsiehd5b74212016-09-14 15:54:30 -0700278 : "x0", "x8"
sewardjf0c12502014-01-12 12:54:00 +0000279 );
sewardjb5b87402011-03-07 16:05:35 +0000280#elif defined(VGP_s390x_linux)
281 asm volatile (
282 "st %1, %0\n" /* set tst->status = VgTs_Empty */
283 "lg 2, %3\n" /* set r2 = tst->os_state.exitcode */
284 "svc %2\n" /* exit(tst->os_state.exitcode) */
285 : "=m" (tst->status)
286 : "d" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
sewardjf72a28d2011-09-26 17:50:46 +0000287 : "2"
288 );
petarj4df0bfc2013-02-27 23:17:33 +0000289#elif defined(VGP_mips32_linux) || defined(VGP_mips64_linux)
sewardj5db15402012-06-07 09:13:21 +0000290 asm volatile (
291 "sw %1, %0\n\t" /* set tst->status = VgTs_Empty */
sewardjf0c12502014-01-12 12:54:00 +0000292 "li $2, %2\n\t" /* set v0 = __NR_exit */
sewardj5db15402012-06-07 09:13:21 +0000293 "lw $4, %3\n\t" /* set a0 = tst->os_state.exitcode */
294 "syscall\n\t" /* exit(tst->os_state.exitcode) */
295 "nop"
296 : "=m" (tst->status)
297 : "r" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
298 : "cc", "memory" , "v0", "a0"
299 );
sewardj112711a2015-04-10 12:30:09 +0000300#elif defined(VGP_tilegx_linux)
301 asm volatile (
302 "st4 %0, %1\n" /* set tst->status = VgTs_Empty */
303 "moveli r10, %2\n" /* set r10 = __NR_exit */
304 "move r0, %3\n" /* set r0 = tst->os_state.exitcode */
305 "swint1\n" /* exit(tst->os_state.exitcode) */
306 : "=m" (tst->status)
307 : "r" (VgTs_Empty), "n" (__NR_exit), "r" (tst->os_state.exitcode)
308 : "r0", "r1", "r2", "r3", "r4", "r5");
njna3afdfb2005-11-09 04:49:28 +0000309#else
310# error Unknown platform
311#endif
312
313 VG_(core_panic)("Thread exit failed?\n");
314 }
315
316 /*NOTREACHED*/
317 vg_assert(0);
318}
319
njnffd9c1d2005-11-10 04:02:19 +0000320Word ML_(start_thread_NORETURN) ( void* arg )
njna3afdfb2005-11-09 04:49:28 +0000321{
322 ThreadState* tst = (ThreadState*)arg;
323 ThreadId tid = tst->tid;
324
njne1486662005-11-10 02:48:04 +0000325 run_a_thread_NORETURN ( (Word)tid );
njna3afdfb2005-11-09 04:49:28 +0000326 /*NOTREACHED*/
327 vg_assert(0);
328}
329
330/* Allocate a stack for this thread, if it doesn't already have one.
331 They're allocated lazily, and never freed. Returns the initial stack
332 pointer value to use, or 0 if allocation failed. */
333Addr ML_(allocstack)(ThreadId tid)
334{
335 ThreadState* tst = VG_(get_ThreadState)(tid);
336 VgStack* stack;
337 Addr initial_SP;
338
339 /* Either the stack_base and stack_init_SP are both zero (in which
340 case a stack hasn't been allocated) or they are both non-zero,
341 in which case it has. */
342
343 if (tst->os_state.valgrind_stack_base == 0)
344 vg_assert(tst->os_state.valgrind_stack_init_SP == 0);
345
346 if (tst->os_state.valgrind_stack_base != 0)
347 vg_assert(tst->os_state.valgrind_stack_init_SP != 0);
348
349 /* If no stack is present, allocate one. */
350
351 if (tst->os_state.valgrind_stack_base == 0) {
352 stack = VG_(am_alloc_VgStack)( &initial_SP );
353 if (stack) {
354 tst->os_state.valgrind_stack_base = (Addr)stack;
355 tst->os_state.valgrind_stack_init_SP = initial_SP;
356 }
357 }
358
359 if (0)
florianb26101c2015-08-08 21:45:33 +0000360 VG_(printf)( "stack for tid %u at %p; init_SP=%p\n",
njna3afdfb2005-11-09 04:49:28 +0000361 tid,
362 (void*)tst->os_state.valgrind_stack_base,
363 (void*)tst->os_state.valgrind_stack_init_SP );
364
365 return tst->os_state.valgrind_stack_init_SP;
366}
367
368/* Allocate a stack for the main thread, and run it all the way to the
369 end. Although we already have a working VgStack
370 (VG_(interim_stack)) it's better to allocate a new one, so that
371 overflow detection works uniformly for all threads.
372*/
373void VG_(main_thread_wrapper_NORETURN)(ThreadId tid)
374{
375 Addr sp;
376 VG_(debugLog)(1, "syswrap-linux",
377 "entering VG_(main_thread_wrapper_NORETURN)\n");
378
379 sp = ML_(allocstack)(tid);
philippe277eaff2012-03-03 12:01:48 +0000380#if defined(ENABLE_INNER_CLIENT_REQUEST)
381 {
382 // we must register the main thread stack before the call
383 // to ML_(call_on_new_stack_0_1), otherwise the outer valgrind
384 // reports 'write error' on the non registered stack.
385 ThreadState* tst = VG_(get_ThreadState)(tid);
386 INNER_REQUEST
387 ((void)
388 VALGRIND_STACK_REGISTER (tst->os_state.valgrind_stack_base,
389 tst->os_state.valgrind_stack_init_SP));
390 }
391#endif
njna3afdfb2005-11-09 04:49:28 +0000392
393#if defined(VGP_ppc32_linux)
394 /* make a stack frame */
395 sp -= 16;
396 sp &= ~0xF;
397 *(UWord *)sp = 0;
carllcae0cc22014-08-07 23:17:29 +0000398#elif defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
cerion21082042005-12-06 19:07:08 +0000399 /* make a stack frame */
400 sp -= 112;
401 sp &= ~((Addr)0xF);
402 *(UWord *)sp = 0;
sewardjb5b87402011-03-07 16:05:35 +0000403#elif defined(VGP_s390x_linux)
404 /* make a stack frame */
405 sp -= 160;
406 sp &= ~((Addr)0xF);
407 *(UWord *)sp = 0;
njna3afdfb2005-11-09 04:49:28 +0000408#endif
409
410 /* If we can't even allocate the first thread's stack, we're hosed.
411 Give up. */
412 vg_assert2(sp != 0, "Cannot allocate main thread's stack.");
413
414 /* shouldn't be any other threads around yet */
415 vg_assert( VG_(count_living_threads)() == 1 );
416
417 ML_(call_on_new_stack_0_1)(
njne1486662005-11-10 02:48:04 +0000418 (Addr)sp, /* stack */
419 0, /* bogus return address */
420 run_a_thread_NORETURN, /* fn to call */
421 (Word)tid /* arg to give it */
njna3afdfb2005-11-09 04:49:28 +0000422 );
423
424 /*NOTREACHED*/
425 vg_assert(0);
426}
427
428
njne1486662005-11-10 02:48:04 +0000429/* Do a clone which is really a fork() */
430SysRes ML_(do_fork_clone) ( ThreadId tid, UInt flags,
431 Int* parent_tidptr, Int* child_tidptr )
432{
433 vki_sigset_t fork_saved_mask;
434 vki_sigset_t mask;
435 SysRes res;
436
437 if (flags & (VKI_CLONE_SETTLS | VKI_CLONE_FS | VKI_CLONE_VM
438 | VKI_CLONE_FILES | VKI_CLONE_VFORK))
439 return VG_(mk_SysRes_Error)( VKI_EINVAL );
440
441 /* Block all signals during fork, so that we can fix things up in
442 the child without being interrupted. */
443 VG_(sigfillset)(&mask);
444 VG_(sigprocmask)(VKI_SIG_SETMASK, &mask, &fork_saved_mask);
445
njne9ba34a2008-10-13 04:19:15 +0000446 VG_(do_atfork_pre)(tid);
447
njne1486662005-11-10 02:48:04 +0000448 /* Since this is the fork() form of clone, we don't need all that
449 VG_(clone) stuff */
sewardj59570ff2010-01-01 11:59:33 +0000450#if defined(VGP_x86_linux) \
carllcae0cc22014-08-07 23:17:29 +0000451 || defined(VGP_ppc32_linux) \
452 || defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux) \
petarj4df0bfc2013-02-27 23:17:33 +0000453 || defined(VGP_arm_linux) || defined(VGP_mips32_linux) \
sewardjf0c12502014-01-12 12:54:00 +0000454 || defined(VGP_mips64_linux) || defined(VGP_arm64_linux)
njne1486662005-11-10 02:48:04 +0000455 res = VG_(do_syscall5)( __NR_clone, flags,
456 (UWord)NULL, (UWord)parent_tidptr,
457 (UWord)NULL, (UWord)child_tidptr );
sewardj112711a2015-04-10 12:30:09 +0000458#elif defined(VGP_amd64_linux) || defined(VGP_tilegx_linux)
njne1486662005-11-10 02:48:04 +0000459 /* note that the last two arguments are the opposite way round to x86 and
460 ppc32 as the amd64 kernel expects the arguments in a different order */
461 res = VG_(do_syscall5)( __NR_clone, flags,
462 (UWord)NULL, (UWord)parent_tidptr,
463 (UWord)child_tidptr, (UWord)NULL );
sewardjb5b87402011-03-07 16:05:35 +0000464#elif defined(VGP_s390x_linux)
465 /* Note that s390 has the stack first and then the flags */
466 res = VG_(do_syscall4)( __NR_clone, (UWord) NULL, flags,
467 (UWord)parent_tidptr, (UWord)child_tidptr);
njne1486662005-11-10 02:48:04 +0000468#else
469# error Unknown platform
470#endif
471
njncda2f0f2009-05-18 02:12:08 +0000472 if (!sr_isError(res) && sr_Res(res) == 0) {
njne1486662005-11-10 02:48:04 +0000473 /* child */
474 VG_(do_atfork_child)(tid);
475
476 /* restore signal mask */
477 VG_(sigprocmask)(VKI_SIG_SETMASK, &fork_saved_mask, NULL);
sewardj6e31f802007-11-17 22:29:25 +0000478
479 /* If --child-silent-after-fork=yes was specified, set the
sewardj738856f2009-07-15 14:48:32 +0000480 output file descriptors to 'impossible' values. This is
sewardj6e31f802007-11-17 22:29:25 +0000481 noticed by send_bytes_to_logging_sink in m_libcprint.c, which
sewardj738856f2009-07-15 14:48:32 +0000482 duly stops writing any further output. */
483 if (VG_(clo_child_silent_after_fork)) {
484 if (!VG_(log_output_sink).is_socket)
485 VG_(log_output_sink).fd = -1;
486 if (!VG_(xml_output_sink).is_socket)
487 VG_(xml_output_sink).fd = -1;
488 }
njne1486662005-11-10 02:48:04 +0000489 }
490 else
njncda2f0f2009-05-18 02:12:08 +0000491 if (!sr_isError(res) && sr_Res(res) > 0) {
njne1486662005-11-10 02:48:04 +0000492 /* parent */
njne9ba34a2008-10-13 04:19:15 +0000493 VG_(do_atfork_parent)(tid);
494
njne1486662005-11-10 02:48:04 +0000495 if (VG_(clo_trace_syscalls))
florianb26101c2015-08-08 21:45:33 +0000496 VG_(printf)(" clone(fork): process %d created child %lu\n",
njncda2f0f2009-05-18 02:12:08 +0000497 VG_(getpid)(), sr_Res(res));
njne1486662005-11-10 02:48:04 +0000498
499 /* restore signal mask */
500 VG_(sigprocmask)(VKI_SIG_SETMASK, &fork_saved_mask, NULL);
501 }
502
503 return res;
504}
505
506
njna3afdfb2005-11-09 04:49:28 +0000507/* ---------------------------------------------------------------------
nethercotefd453532004-11-17 17:21:12 +0000508 PRE/POST wrappers for arch-generic, Linux-specific syscalls
509 ------------------------------------------------------------------ */
510
511// Nb: See the comment above the generic PRE/POST wrappers in
njnc1b01812005-06-17 22:19:06 +0000512// m_syswrap/syswrap-generic.c for notes about how they work.
nethercotefd453532004-11-17 17:21:12 +0000513
sewardja8d8e232005-06-07 20:04:56 +0000514#define PRE(name) DEFN_PRE_TEMPLATE(linux, name)
515#define POST(name) DEFN_POST_TEMPLATE(linux, name)
nethercotefd453532004-11-17 17:21:12 +0000516
tomca787242009-11-25 11:24:00 +0000517// Macros to support 64-bit syscall args split into two 32 bit values
tom41f4c852009-12-02 16:19:12 +0000518#define LOHI64(lo,hi) ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
tomca787242009-11-25 11:24:00 +0000519#if defined(VG_LITTLEENDIAN)
520#define MERGE64(lo,hi) ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
521#define MERGE64_FIRST(name) name##_low
522#define MERGE64_SECOND(name) name##_high
523#elif defined(VG_BIGENDIAN)
524#define MERGE64(hi,lo) ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
525#define MERGE64_FIRST(name) name##_high
526#define MERGE64_SECOND(name) name##_low
527#else
528#error Unknown endianness
529#endif
tom20d35722005-07-27 22:57:18 +0000530
njn73975482005-08-30 02:45:44 +0000531/* ---------------------------------------------------------------------
532 *mount wrappers
533 ------------------------------------------------------------------ */
sewardjb5f6f512005-03-10 23:59:00 +0000534
sewardja8d8e232005-06-07 20:04:56 +0000535PRE(sys_mount)
nethercotefd453532004-11-17 17:21:12 +0000536{
537 // Nb: depending on 'flags', the 'type' and 'data' args may be ignored.
538 // We are conservative and check everything, except the memory pointed to
539 // by 'data'.
sewardja8d8e232005-06-07 20:04:56 +0000540 *flags |= SfMayBlock;
njnb81078b2009-07-15 06:39:15 +0000541 PRINT("sys_mount( %#lx(%s), %#lx(%s), %#lx(%s), %#lx, %#lx )",
florian1636d332012-11-15 04:27:04 +0000542 ARG1,(HChar*)ARG1, ARG2,(HChar*)ARG2, ARG3,(HChar*)ARG3, ARG4, ARG5);
nethercotefd453532004-11-17 17:21:12 +0000543 PRE_REG_READ5(long, "mount",
544 char *, source, char *, target, char *, type,
545 unsigned long, flags, void *, data);
bart69ad7d82010-06-29 06:16:52 +0000546 if (ARG1)
547 PRE_MEM_RASCIIZ( "mount(source)", ARG1);
njn22cfccb2004-11-27 16:10:23 +0000548 PRE_MEM_RASCIIZ( "mount(target)", ARG2);
549 PRE_MEM_RASCIIZ( "mount(type)", ARG3);
nethercotefd453532004-11-17 17:21:12 +0000550}
551
sewardja8d8e232005-06-07 20:04:56 +0000552PRE(sys_oldumount)
nethercotefd453532004-11-17 17:21:12 +0000553{
barta0b6b2c2008-07-07 06:49:24 +0000554 PRINT("sys_oldumount( %#lx )", ARG1);
nethercotefd453532004-11-17 17:21:12 +0000555 PRE_REG_READ1(long, "umount", char *, path);
njn22cfccb2004-11-27 16:10:23 +0000556 PRE_MEM_RASCIIZ( "umount(path)", ARG1);
nethercotefd453532004-11-17 17:21:12 +0000557}
558
sewardja8d8e232005-06-07 20:04:56 +0000559PRE(sys_umount)
nethercotefd453532004-11-17 17:21:12 +0000560{
florianb26101c2015-08-08 21:45:33 +0000561 PRINT("sys_umount( %#lx, %ld )", ARG1, SARG2);
nethercotefd453532004-11-17 17:21:12 +0000562 PRE_REG_READ2(long, "umount2", char *, path, int, flags);
njn22cfccb2004-11-27 16:10:23 +0000563 PRE_MEM_RASCIIZ( "umount2(path)", ARG1);
nethercotefd453532004-11-17 17:21:12 +0000564}
565
sewardj8a3377f2014-09-08 11:19:48 +0000566/* Not actually wrapped by GLibc but does things with the system
567 * mounts so it is put here.
568 */
569PRE(sys_pivot_root)
570{
571 PRINT("sys_pivot_root ( %s %s )", (HChar*)ARG1, (HChar*)ARG2);
572 PRE_REG_READ2(int, "pivot_root", char *, new_root, char *, old_root);
573 PRE_MEM_RASCIIZ( "pivot_root(new_root)", ARG1);
574 PRE_MEM_RASCIIZ( "pivot_root(old_root)", ARG2);
575}
576
577
njn73975482005-08-30 02:45:44 +0000578/* ---------------------------------------------------------------------
579 16- and 32-bit uid/gid wrappers
580 ------------------------------------------------------------------ */
sewardj696c5512005-06-08 23:38:32 +0000581
582PRE(sys_setfsuid16)
583{
florianb26101c2015-08-08 21:45:33 +0000584 PRINT("sys_setfsuid16 ( %lu )", ARG1);
sewardj696c5512005-06-08 23:38:32 +0000585 PRE_REG_READ1(long, "setfsuid16", vki_old_uid_t, uid);
586}
587
sewardje6d5e722005-06-10 10:27:55 +0000588PRE(sys_setfsuid)
589{
florianb26101c2015-08-08 21:45:33 +0000590 PRINT("sys_setfsuid ( %lu )", ARG1);
sewardje6d5e722005-06-10 10:27:55 +0000591 PRE_REG_READ1(long, "setfsuid", vki_uid_t, uid);
592}
sewardj696c5512005-06-08 23:38:32 +0000593
594PRE(sys_setfsgid16)
595{
florianb26101c2015-08-08 21:45:33 +0000596 PRINT("sys_setfsgid16 ( %lu )", ARG1);
sewardj696c5512005-06-08 23:38:32 +0000597 PRE_REG_READ1(long, "setfsgid16", vki_old_gid_t, gid);
598}
599
sewardje6d5e722005-06-10 10:27:55 +0000600PRE(sys_setfsgid)
601{
florianb26101c2015-08-08 21:45:33 +0000602 PRINT("sys_setfsgid ( %lu )", ARG1);
sewardje6d5e722005-06-10 10:27:55 +0000603 PRE_REG_READ1(long, "setfsgid", vki_gid_t, gid);
604}
605
606PRE(sys_setresuid16)
607{
florianb26101c2015-08-08 21:45:33 +0000608 PRINT("sys_setresuid16 ( %lu, %lu, %lu )", ARG1, ARG2, ARG3);
sewardje6d5e722005-06-10 10:27:55 +0000609 PRE_REG_READ3(long, "setresuid16",
610 vki_old_uid_t, ruid, vki_old_uid_t, euid, vki_old_uid_t, suid);
611}
612
613PRE(sys_setresuid)
614{
florianb26101c2015-08-08 21:45:33 +0000615 PRINT("sys_setresuid ( %lu, %lu, %lu )", ARG1, ARG2, ARG3);
sewardje6d5e722005-06-10 10:27:55 +0000616 PRE_REG_READ3(long, "setresuid",
617 vki_uid_t, ruid, vki_uid_t, euid, vki_uid_t, suid);
618}
619
620PRE(sys_getresuid16)
621{
barta0b6b2c2008-07-07 06:49:24 +0000622 PRINT("sys_getresuid16 ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
sewardje6d5e722005-06-10 10:27:55 +0000623 PRE_REG_READ3(long, "getresuid16",
624 vki_old_uid_t *, ruid, vki_old_uid_t *, euid,
625 vki_old_uid_t *, suid);
626 PRE_MEM_WRITE( "getresuid16(ruid)", ARG1, sizeof(vki_old_uid_t) );
627 PRE_MEM_WRITE( "getresuid16(euid)", ARG2, sizeof(vki_old_uid_t) );
628 PRE_MEM_WRITE( "getresuid16(suid)", ARG3, sizeof(vki_old_uid_t) );
629}
630POST(sys_getresuid16)
631{
632 vg_assert(SUCCESS);
633 if (RES == 0) {
634 POST_MEM_WRITE( ARG1, sizeof(vki_old_uid_t) );
635 POST_MEM_WRITE( ARG2, sizeof(vki_old_uid_t) );
636 POST_MEM_WRITE( ARG3, sizeof(vki_old_uid_t) );
637 }
638}
sewardj78b50e42005-06-08 01:47:28 +0000639
640PRE(sys_getresuid)
641{
barta0b6b2c2008-07-07 06:49:24 +0000642 PRINT("sys_getresuid ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
sewardj78b50e42005-06-08 01:47:28 +0000643 PRE_REG_READ3(long, "getresuid",
644 vki_uid_t *, ruid, vki_uid_t *, euid, vki_uid_t *, suid);
645 PRE_MEM_WRITE( "getresuid(ruid)", ARG1, sizeof(vki_uid_t) );
646 PRE_MEM_WRITE( "getresuid(euid)", ARG2, sizeof(vki_uid_t) );
647 PRE_MEM_WRITE( "getresuid(suid)", ARG3, sizeof(vki_uid_t) );
648}
sewardj78b50e42005-06-08 01:47:28 +0000649POST(sys_getresuid)
650{
651 vg_assert(SUCCESS);
652 if (RES == 0) {
653 POST_MEM_WRITE( ARG1, sizeof(vki_uid_t) );
654 POST_MEM_WRITE( ARG2, sizeof(vki_uid_t) );
655 POST_MEM_WRITE( ARG3, sizeof(vki_uid_t) );
656 }
657}
658
sewardje6d5e722005-06-10 10:27:55 +0000659PRE(sys_setresgid16)
660{
florianb26101c2015-08-08 21:45:33 +0000661 PRINT("sys_setresgid16 ( %lu, %lu, %lu )", ARG1, ARG2, ARG3);
sewardje6d5e722005-06-10 10:27:55 +0000662 PRE_REG_READ3(long, "setresgid16",
663 vki_old_gid_t, rgid,
664 vki_old_gid_t, egid, vki_old_gid_t, sgid);
665}
666
667PRE(sys_setresgid)
668{
florianb26101c2015-08-08 21:45:33 +0000669 PRINT("sys_setresgid ( %lu, %lu, %lu )", ARG1, ARG2, ARG3);
sewardje6d5e722005-06-10 10:27:55 +0000670 PRE_REG_READ3(long, "setresgid",
671 vki_gid_t, rgid, vki_gid_t, egid, vki_gid_t, sgid);
672}
673
674PRE(sys_getresgid16)
675{
barta0b6b2c2008-07-07 06:49:24 +0000676 PRINT("sys_getresgid16 ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
sewardje6d5e722005-06-10 10:27:55 +0000677 PRE_REG_READ3(long, "getresgid16",
678 vki_old_gid_t *, rgid, vki_old_gid_t *, egid,
679 vki_old_gid_t *, sgid);
680 PRE_MEM_WRITE( "getresgid16(rgid)", ARG1, sizeof(vki_old_gid_t) );
681 PRE_MEM_WRITE( "getresgid16(egid)", ARG2, sizeof(vki_old_gid_t) );
682 PRE_MEM_WRITE( "getresgid16(sgid)", ARG3, sizeof(vki_old_gid_t) );
683}
684POST(sys_getresgid16)
685{
686 vg_assert(SUCCESS);
687 if (RES == 0) {
688 POST_MEM_WRITE( ARG1, sizeof(vki_old_gid_t) );
689 POST_MEM_WRITE( ARG2, sizeof(vki_old_gid_t) );
690 POST_MEM_WRITE( ARG3, sizeof(vki_old_gid_t) );
691 }
692}
sewardj78b50e42005-06-08 01:47:28 +0000693
694PRE(sys_getresgid)
695{
barta0b6b2c2008-07-07 06:49:24 +0000696 PRINT("sys_getresgid ( %#lx, %#lx, %#lx )", ARG1,ARG2,ARG3);
sewardj78b50e42005-06-08 01:47:28 +0000697 PRE_REG_READ3(long, "getresgid",
698 vki_gid_t *, rgid, vki_gid_t *, egid, vki_gid_t *, sgid);
699 PRE_MEM_WRITE( "getresgid(rgid)", ARG1, sizeof(vki_gid_t) );
700 PRE_MEM_WRITE( "getresgid(egid)", ARG2, sizeof(vki_gid_t) );
701 PRE_MEM_WRITE( "getresgid(sgid)", ARG3, sizeof(vki_gid_t) );
702}
sewardj78b50e42005-06-08 01:47:28 +0000703POST(sys_getresgid)
704{
705 vg_assert(SUCCESS);
706 if (RES == 0) {
707 POST_MEM_WRITE( ARG1, sizeof(vki_gid_t) );
708 POST_MEM_WRITE( ARG2, sizeof(vki_gid_t) );
709 POST_MEM_WRITE( ARG3, sizeof(vki_gid_t) );
710 }
711}
712
njn73975482005-08-30 02:45:44 +0000713/* ---------------------------------------------------------------------
714 miscellaneous wrappers
715 ------------------------------------------------------------------ */
716
717PRE(sys_exit_group)
718{
719 ThreadId t;
720 ThreadState* tst;
721
florianb26101c2015-08-08 21:45:33 +0000722 PRINT("exit_group( %ld )", SARG1);
njnaab814e2009-03-03 05:39:23 +0000723 PRE_REG_READ1(void, "exit_group", int, status);
njn73975482005-08-30 02:45:44 +0000724
725 tst = VG_(get_ThreadState)(tid);
njn73975482005-08-30 02:45:44 +0000726 /* A little complex; find all the threads with the same threadgroup
727 as this one (including this one), and mark them to exit */
philippeb8ba0312013-10-21 19:57:08 +0000728 /* It is unclear how one can get a threadgroup in this process which
729 is not the threadgroup of the calling thread:
730 The assignments to threadgroups are:
731 = 0; /// scheduler.c os_state_clear
732 = getpid(); /// scheduler.c in child after fork
733 = getpid(); /// this file, in thread_wrapper
734 = ptst->os_state.threadgroup; /// syswrap-*-linux.c,
735 copying the thread group of the thread doing clone
736 So, the only case where the threadgroup might be different to the getpid
737 value is in the child, just after fork. But then the fork syscall is
738 still going on, the forked thread has had no chance yet to make this
739 syscall. */
njn73975482005-08-30 02:45:44 +0000740 for (t = 1; t < VG_N_THREADS; t++) {
741 if ( /* not alive */
742 VG_(threads)[t].status == VgTs_Empty
743 ||
744 /* not our group */
745 VG_(threads)[t].os_state.threadgroup != tst->os_state.threadgroup
746 )
747 continue;
philippeb8ba0312013-10-21 19:57:08 +0000748 /* Assign the exit code, VG_(nuke_all_threads_except) will assign
749 the exitreason. */
njn73975482005-08-30 02:45:44 +0000750 VG_(threads)[t].os_state.exitcode = ARG1;
njn73975482005-08-30 02:45:44 +0000751 }
752
philippeb8ba0312013-10-21 19:57:08 +0000753 /* Indicate in all other threads that the process is exiting.
754 Then wait using VG_(reap_threads) for these threads to disappear.
755
756 Can this give a deadlock if another thread is calling exit in parallel
757 and would then wait for this thread to disappear ?
758 The answer is no:
759 Other threads are either blocked in a syscall or have yielded the CPU.
760
761 A thread that has yielded the CPU is trying to get the big lock in
762 VG_(scheduler). This thread will get the CPU thanks to the call
763 to VG_(reap_threads). The scheduler will then check for signals,
764 kill the process if this is a fatal signal, and otherwise prepare
765 the thread for handling this signal. After this preparation, if
766 the thread status is VG_(is_exiting), the scheduler exits the thread.
767 So, a thread that has yielded the CPU does not have a chance to
768 call exit => no deadlock for this thread.
769
770 VG_(nuke_all_threads_except) will send the VG_SIGVGKILL signal
771 to all threads blocked in a syscall.
772 The syscall will be interrupted, and the control will go to the
773 scheduler. The scheduler will then return, as the thread is in
774 exiting state. */
775
776 VG_(nuke_all_threads_except)( tid, VgSrc_ExitProcess );
777 VG_(reap_threads)(tid);
778 VG_(threads)[tid].exitreason = VgSrc_ExitThread;
779 /* we do assign VgSrc_ExitThread and not VgSrc_ExitProcess, as this thread
780 is the thread calling exit_group and so its registers must be considered
781 as not reachable. See pub_tool_machine.h VG_(apply_to_GP_regs). */
782
njn73975482005-08-30 02:45:44 +0000783 /* We have to claim the syscall already succeeded. */
784 SET_STATUS_Success(0);
785}
786
787PRE(sys_llseek)
788{
florianb26101c2015-08-08 21:45:33 +0000789 PRINT("sys_llseek ( %lu, 0x%lx, 0x%lx, %#lx, %lu )", ARG1,ARG2,ARG3,ARG4,ARG5);
njn73975482005-08-30 02:45:44 +0000790 PRE_REG_READ5(long, "llseek",
791 unsigned int, fd, unsigned long, offset_high,
792 unsigned long, offset_low, vki_loff_t *, result,
793 unsigned int, whence);
tom3e24fd82008-01-08 13:54:43 +0000794 if (!ML_(fd_allowed)(ARG1, "llseek", tid, False))
795 SET_STATUS_Failure( VKI_EBADF );
796 else
797 PRE_MEM_WRITE( "llseek(result)", ARG4, sizeof(vki_loff_t));
njn73975482005-08-30 02:45:44 +0000798}
799POST(sys_llseek)
800{
801 vg_assert(SUCCESS);
802 if (RES == 0)
803 POST_MEM_WRITE( ARG4, sizeof(vki_loff_t) );
804}
805
tom9ceaa972009-11-24 16:38:21 +0000806PRE(sys_adjtimex)
807{
808 struct vki_timex *tx = (struct vki_timex *)ARG1;
809 PRINT("sys_adjtimex ( %#lx )", ARG1);
810 PRE_REG_READ1(long, "adjtimex", struct timex *, buf);
Elliott Hughesa0664b92017-04-18 17:46:52 -0700811
812 if (ML_(safe_to_deref) (tx, sizeof(struct vki_timex))) {
813 PRE_MEM_READ( "adjtimex(timex->modes)", ARG1, sizeof(tx->modes));
tom9ceaa972009-11-24 16:38:21 +0000814
tome1c1a242009-12-21 11:29:54 +0000815#define ADJX(bits,field) \
Elliott Hughesa0664b92017-04-18 17:46:52 -0700816 if (tx->modes & (bits)) \
817 PRE_MEM_READ( "adjtimex(timex->"#field")", \
818 (Addr)&tx->field, sizeof(tx->field))
tom9ceaa972009-11-24 16:38:21 +0000819
Elliott Hughesa0664b92017-04-18 17:46:52 -0700820 if (tx->modes & VKI_ADJ_ADJTIME) {
821 if (!(tx->modes & VKI_ADJ_OFFSET_READONLY))
822 PRE_MEM_READ( "adjtimex(timex->offset)", (Addr)&tx->offset, sizeof(tx->offset));
823 } else {
824 ADJX(VKI_ADJ_OFFSET, offset);
825 ADJX(VKI_ADJ_FREQUENCY, freq);
826 ADJX(VKI_ADJ_MAXERROR, maxerror);
827 ADJX(VKI_ADJ_ESTERROR, esterror);
828 ADJX(VKI_ADJ_STATUS, status);
829 ADJX(VKI_ADJ_TIMECONST|VKI_ADJ_TAI, constant);
830 ADJX(VKI_ADJ_TICK, tick);
831 }
tom9ceaa972009-11-24 16:38:21 +0000832#undef ADJX
Elliott Hughesa0664b92017-04-18 17:46:52 -0700833 }
tom9ceaa972009-11-24 16:38:21 +0000834
835 PRE_MEM_WRITE( "adjtimex(timex)", ARG1, sizeof(struct vki_timex));
836}
837
838POST(sys_adjtimex)
839{
840 POST_MEM_WRITE( ARG1, sizeof(struct vki_timex) );
841}
njn73975482005-08-30 02:45:44 +0000842
tomddc4a182014-01-30 22:33:02 +0000843PRE(sys_clock_adjtime)
844{
845 struct vki_timex *tx = (struct vki_timex *)ARG2;
florianb26101c2015-08-08 21:45:33 +0000846 PRINT("sys_clock_adjtime ( %ld, %#lx )", SARG1,ARG2);
tomddc4a182014-01-30 22:33:02 +0000847 PRE_REG_READ2(long, "clock_adjtime", vki_clockid_t, id, struct timex *, buf);
848 PRE_MEM_READ( "clock_adjtime(timex->modes)", ARG2, sizeof(tx->modes));
849
850#define ADJX(bits,field) \
851 if (tx->modes & (bits)) \
852 PRE_MEM_READ( "clock_adjtime(timex->"#field")", \
853 (Addr)&tx->field, sizeof(tx->field))
854
855 if (tx->modes & VKI_ADJ_ADJTIME) {
856 if (!(tx->modes & VKI_ADJ_OFFSET_READONLY))
857 PRE_MEM_READ( "clock_adjtime(timex->offset)", (Addr)&tx->offset, sizeof(tx->offset));
858 } else {
859 ADJX(VKI_ADJ_OFFSET, offset);
860 ADJX(VKI_ADJ_FREQUENCY, freq);
861 ADJX(VKI_ADJ_MAXERROR, maxerror);
862 ADJX(VKI_ADJ_ESTERROR, esterror);
863 ADJX(VKI_ADJ_STATUS, status);
864 ADJX(VKI_ADJ_TIMECONST|VKI_ADJ_TAI, constant);
865 ADJX(VKI_ADJ_TICK, tick);
866 }
867#undef ADJX
868
869 PRE_MEM_WRITE( "adjtimex(timex)", ARG2, sizeof(struct vki_timex));
870}
871
872POST(sys_clock_adjtime)
873{
874 POST_MEM_WRITE( ARG2, sizeof(struct vki_timex) );
875}
876
sewardj696c5512005-06-08 23:38:32 +0000877PRE(sys_ioperm)
878{
florianb26101c2015-08-08 21:45:33 +0000879 PRINT("sys_ioperm ( %lu, %lu, %ld )", ARG1, ARG2, SARG3 );
sewardj696c5512005-06-08 23:38:32 +0000880 PRE_REG_READ3(long, "ioperm",
881 unsigned long, from, unsigned long, num, int, turn_on);
882}
883
884PRE(sys_syslog)
885{
886 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +0000887 PRINT("sys_syslog (%ld, %#lx, %ld)", SARG1, ARG2, SARG3);
sewardj696c5512005-06-08 23:38:32 +0000888 PRE_REG_READ3(long, "syslog", int, type, char *, bufp, int, len);
889 switch (ARG1) {
890 // The kernel uses magic numbers here, rather than named constants,
891 // therefore so do we.
892 case 2: case 3: case 4:
893 PRE_MEM_WRITE( "syslog(bufp)", ARG2, ARG3);
894 break;
895 default:
896 break;
897 }
898}
sewardj696c5512005-06-08 23:38:32 +0000899POST(sys_syslog)
900{
901 switch (ARG1) {
902 case 2: case 3: case 4:
903 POST_MEM_WRITE( ARG2, ARG3 );
904 break;
905 default:
906 break;
907 }
908}
909
910PRE(sys_vhangup)
911{
912 PRINT("sys_vhangup ( )");
913 PRE_REG_READ0(long, "vhangup");
914}
915
916PRE(sys_sysinfo)
917{
barta0b6b2c2008-07-07 06:49:24 +0000918 PRINT("sys_sysinfo ( %#lx )",ARG1);
sewardj696c5512005-06-08 23:38:32 +0000919 PRE_REG_READ1(long, "sysinfo", struct sysinfo *, info);
920 PRE_MEM_WRITE( "sysinfo(info)", ARG1, sizeof(struct vki_sysinfo) );
921}
sewardj696c5512005-06-08 23:38:32 +0000922POST(sys_sysinfo)
923{
924 POST_MEM_WRITE( ARG1, sizeof(struct vki_sysinfo) );
925}
926
927PRE(sys_personality)
928{
929 PRINT("sys_personality ( %llu )", (ULong)ARG1);
930 PRE_REG_READ1(long, "personality", vki_u_long, persona);
931}
nethercotefd453532004-11-17 17:21:12 +0000932
sewardja8d8e232005-06-07 20:04:56 +0000933PRE(sys_sysctl)
nethercotefd453532004-11-17 17:21:12 +0000934{
sewardje6d5e722005-06-10 10:27:55 +0000935 struct __vki_sysctl_args *args;
barta0b6b2c2008-07-07 06:49:24 +0000936 PRINT("sys_sysctl ( %#lx )", ARG1 );
sewardje6d5e722005-06-10 10:27:55 +0000937 args = (struct __vki_sysctl_args *)ARG1;
938 PRE_REG_READ1(long, "sysctl", struct __sysctl_args *, args);
njn22cfccb2004-11-27 16:10:23 +0000939 PRE_MEM_WRITE( "sysctl(args)", ARG1, sizeof(struct __vki_sysctl_args) );
sewardj45f4e7c2005-09-27 19:20:21 +0000940 if (!VG_(am_is_valid_for_client)(ARG1, sizeof(struct __vki_sysctl_args),
941 VKI_PROT_READ)) {
sewardja8d8e232005-06-07 20:04:56 +0000942 SET_STATUS_Failure( VKI_EFAULT );
sewardjb5f6f512005-03-10 23:59:00 +0000943 return;
944 }
945
sewardje6d5e722005-06-10 10:27:55 +0000946 PRE_MEM_READ("sysctl(name)", (Addr)args->name, args->nlen * sizeof(*args->name));
947 if (args->newval != NULL)
948 PRE_MEM_READ("sysctl(newval)", (Addr)args->newval, args->newlen);
949 if (args->oldlenp != NULL) {
950 PRE_MEM_READ("sysctl(oldlenp)", (Addr)args->oldlenp, sizeof(*args->oldlenp));
951 PRE_MEM_WRITE("sysctl(oldval)", (Addr)args->oldval, *args->oldlenp);
sewardjb5f6f512005-03-10 23:59:00 +0000952 }
nethercotefd453532004-11-17 17:21:12 +0000953}
nethercotefd453532004-11-17 17:21:12 +0000954POST(sys_sysctl)
955{
sewardje6d5e722005-06-10 10:27:55 +0000956 struct __vki_sysctl_args *args;
957 args = (struct __vki_sysctl_args *)ARG1;
958 if (args->oldlenp != NULL) {
959 POST_MEM_WRITE((Addr)args->oldlenp, sizeof(*args->oldlenp));
960 POST_MEM_WRITE((Addr)args->oldval, 1 + *args->oldlenp);
sewardjb5f6f512005-03-10 23:59:00 +0000961 }
nethercotefd453532004-11-17 17:21:12 +0000962}
963
sewardje6d5e722005-06-10 10:27:55 +0000964PRE(sys_prctl)
965{
966 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +0000967 PRINT( "sys_prctl ( %ld, %ld, %ld, %ld, %ld )", SARG1, SARG2, SARG3, SARG4, SARG5 );
toma39ebc82006-12-18 15:22:46 +0000968 switch (ARG1) {
969 case VKI_PR_SET_PDEATHSIG:
970 PRE_REG_READ2(int, "prctl", int, option, int, signal);
971 break;
972 case VKI_PR_GET_PDEATHSIG:
973 PRE_REG_READ2(int, "prctl", int, option, int *, signal);
974 PRE_MEM_WRITE("prctl(get-death-signal)", ARG2, sizeof(Int));
975 break;
976 case VKI_PR_GET_DUMPABLE:
977 PRE_REG_READ1(int, "prctl", int, option);
978 break;
979 case VKI_PR_SET_DUMPABLE:
980 PRE_REG_READ2(int, "prctl", int, option, int, dump);
981 break;
982 case VKI_PR_GET_UNALIGN:
983 PRE_REG_READ2(int, "prctl", int, option, int *, value);
984 PRE_MEM_WRITE("prctl(get-unalign)", ARG2, sizeof(Int));
985 break;
986 case VKI_PR_SET_UNALIGN:
987 PRE_REG_READ2(int, "prctl", int, option, int, value);
988 break;
989 case VKI_PR_GET_KEEPCAPS:
990 PRE_REG_READ1(int, "prctl", int, option);
991 break;
992 case VKI_PR_SET_KEEPCAPS:
993 PRE_REG_READ2(int, "prctl", int, option, int, keepcaps);
994 break;
995 case VKI_PR_GET_FPEMU:
996 PRE_REG_READ2(int, "prctl", int, option, int *, value);
997 PRE_MEM_WRITE("prctl(get-fpemu)", ARG2, sizeof(Int));
998 break;
999 case VKI_PR_SET_FPEMU:
1000 PRE_REG_READ2(int, "prctl", int, option, int, value);
1001 break;
1002 case VKI_PR_GET_FPEXC:
1003 PRE_REG_READ2(int, "prctl", int, option, int *, value);
1004 PRE_MEM_WRITE("prctl(get-fpexc)", ARG2, sizeof(Int));
1005 break;
1006 case VKI_PR_SET_FPEXC:
1007 PRE_REG_READ2(int, "prctl", int, option, int, value);
1008 break;
1009 case VKI_PR_GET_TIMING:
1010 PRE_REG_READ1(int, "prctl", int, option);
1011 break;
1012 case VKI_PR_SET_TIMING:
1013 PRE_REG_READ2(int, "prctl", int, option, int, timing);
1014 break;
1015 case VKI_PR_SET_NAME:
1016 PRE_REG_READ2(int, "prctl", int, option, char *, name);
1017 PRE_MEM_RASCIIZ("prctl(set-name)", ARG2);
1018 break;
1019 case VKI_PR_GET_NAME:
1020 PRE_REG_READ2(int, "prctl", int, option, char *, name);
1021 PRE_MEM_WRITE("prctl(get-name)", ARG2, VKI_TASK_COMM_LEN);
1022 break;
1023 case VKI_PR_GET_ENDIAN:
1024 PRE_REG_READ2(int, "prctl", int, option, int *, value);
1025 PRE_MEM_WRITE("prctl(get-endian)", ARG2, sizeof(Int));
1026 break;
1027 case VKI_PR_SET_ENDIAN:
1028 PRE_REG_READ2(int, "prctl", int, option, int, value);
1029 break;
sewardj79896d22015-02-18 15:46:19 +00001030 case VKI_PR_SET_PTRACER:
1031 PRE_REG_READ2(int, "prctl", int, option, int, ptracer_process_ID);
1032 break;
sewardjb97e44b2015-03-10 11:05:10 +00001033 case VKI_PR_SET_SECCOMP:
1034 /* This is a bit feeble in that it uses |option| before checking
1035 it, but at least both sides of the conditional check it. */
1036 if (ARG2 == VKI_SECCOMP_MODE_FILTER) {
1037 PRE_REG_READ3(int, "prctl", int, option, int, mode, char*, filter);
1038 if (ARG3) {
1039 /* Should check that ARG3 points at a valid struct sock_fprog.
1040 Sounds complex; hence be lame. */
1041 PRE_MEM_READ( "prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, filter)",
1042 ARG3, 1 );
1043 }
1044 } else {
1045 PRE_REG_READ2(int, "prctl", int, option, int, mode);
1046 }
1047 break;
toma39ebc82006-12-18 15:22:46 +00001048 default:
1049 PRE_REG_READ5(long, "prctl",
1050 int, option, unsigned long, arg2, unsigned long, arg3,
1051 unsigned long, arg4, unsigned long, arg5);
1052 break;
1053 }
1054}
1055POST(sys_prctl)
1056{
1057 switch (ARG1) {
1058 case VKI_PR_GET_PDEATHSIG:
1059 POST_MEM_WRITE(ARG2, sizeof(Int));
1060 break;
1061 case VKI_PR_GET_UNALIGN:
1062 POST_MEM_WRITE(ARG2, sizeof(Int));
1063 break;
1064 case VKI_PR_GET_FPEMU:
1065 POST_MEM_WRITE(ARG2, sizeof(Int));
1066 break;
1067 case VKI_PR_GET_FPEXC:
1068 POST_MEM_WRITE(ARG2, sizeof(Int));
1069 break;
1070 case VKI_PR_GET_NAME:
1071 POST_MEM_WRITE(ARG2, VKI_TASK_COMM_LEN);
1072 break;
1073 case VKI_PR_GET_ENDIAN:
1074 POST_MEM_WRITE(ARG2, sizeof(Int));
1075 break;
florian49789512013-09-16 17:08:50 +00001076 case VKI_PR_SET_NAME:
1077 {
1078 const HChar* new_name = (const HChar*) ARG2;
1079 if (new_name) { // Paranoia
1080 ThreadState* tst = VG_(get_ThreadState)(tid);
florianb8911212013-09-18 14:00:10 +00001081 SizeT new_len = VG_(strlen)(new_name);
florian49789512013-09-16 17:08:50 +00001082
1083 /* Don't bother reusing the memory. This is a rare event. */
1084 tst->thread_name =
florian77eb20b2014-09-11 21:19:17 +00001085 VG_(realloc)("syswrap.prctl", tst->thread_name, new_len + 1);
florianb8911212013-09-18 14:00:10 +00001086 VG_(strcpy)(tst->thread_name, new_name);
florian49789512013-09-16 17:08:50 +00001087 }
1088 }
1089 break;
toma39ebc82006-12-18 15:22:46 +00001090 }
sewardje6d5e722005-06-10 10:27:55 +00001091}
1092
1093PRE(sys_sendfile)
1094{
1095 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00001096 PRINT("sys_sendfile ( %ld, %ld, %#lx, %lu )", SARG1,SARG2,ARG3,ARG4);
sewardje6d5e722005-06-10 10:27:55 +00001097 PRE_REG_READ4(ssize_t, "sendfile",
1098 int, out_fd, int, in_fd, vki_off_t *, offset,
1099 vki_size_t, count);
1100 if (ARG3 != 0)
1101 PRE_MEM_WRITE( "sendfile(offset)", ARG3, sizeof(vki_off_t) );
1102}
1103POST(sys_sendfile)
1104{
1105 if (ARG3 != 0 ) {
1106 POST_MEM_WRITE( ARG3, sizeof( vki_off_t ) );
1107 }
1108}
1109
1110PRE(sys_sendfile64)
1111{
1112 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00001113 PRINT("sendfile64 ( %ld, %ld, %#lx, %lu )",SARG1,SARG2,ARG3,ARG4);
sewardje6d5e722005-06-10 10:27:55 +00001114 PRE_REG_READ4(ssize_t, "sendfile64",
1115 int, out_fd, int, in_fd, vki_loff_t *, offset,
1116 vki_size_t, count);
1117 if (ARG3 != 0)
1118 PRE_MEM_WRITE( "sendfile64(offset)", ARG3, sizeof(vki_loff_t) );
1119}
1120POST(sys_sendfile64)
1121{
1122 if (ARG3 != 0 ) {
1123 POST_MEM_WRITE( ARG3, sizeof(vki_loff_t) );
1124 }
1125}
sewardjbc22cf72005-06-08 00:02:49 +00001126
1127PRE(sys_futex)
1128{
1129 /*
1130 arg param used by ops
1131
1132 ARG1 - u32 *futex all
1133 ARG2 - int op
1134 ARG3 - int val WAIT,WAKE,FD,REQUEUE,CMP_REQUEUE
1135 ARG4 - struct timespec *utime WAIT:time* REQUEUE,CMP_REQUEUE:val2
1136 ARG5 - u32 *uaddr2 REQUEUE,CMP_REQUEUE
1137 ARG6 - int val3 CMP_REQUEUE
1138 */
florianb26101c2015-08-08 21:45:33 +00001139 PRINT("sys_futex ( %#lx, %ld, %ld, %#lx, %#lx )", ARG1,SARG2,SARG3,ARG4,ARG5);
tomaedcc7a2009-07-29 11:09:01 +00001140 switch(ARG2 & ~(VKI_FUTEX_PRIVATE_FLAG|VKI_FUTEX_CLOCK_REALTIME)) {
tomf26b6bf2006-06-07 17:47:51 +00001141 case VKI_FUTEX_CMP_REQUEUE:
tomaedcc7a2009-07-29 11:09:01 +00001142 case VKI_FUTEX_WAKE_OP:
1143 case VKI_FUTEX_CMP_REQUEUE_PI:
tomf26b6bf2006-06-07 17:47:51 +00001144 PRE_REG_READ6(long, "futex",
1145 vki_u32 *, futex, int, op, int, val,
1146 struct timespec *, utime, vki_u32 *, uaddr2, int, val3);
1147 break;
1148 case VKI_FUTEX_REQUEUE:
tomaedcc7a2009-07-29 11:09:01 +00001149 case VKI_FUTEX_WAIT_REQUEUE_PI:
tomf26b6bf2006-06-07 17:47:51 +00001150 PRE_REG_READ5(long, "futex",
1151 vki_u32 *, futex, int, op, int, val,
1152 struct timespec *, utime, vki_u32 *, uaddr2);
1153 break;
tomaedcc7a2009-07-29 11:09:01 +00001154 case VKI_FUTEX_WAIT_BITSET:
petarj8b73c6e2012-07-23 00:11:10 +00001155 /* Check that the address at least begins in client-accessible area. */
1156 if (!VG_(am_is_valid_for_client)( ARG1, 1, VKI_PROT_READ )) {
1157 SET_STATUS_Failure( VKI_EFAULT );
1158 return;
1159 }
1160 if (*(vki_u32 *)ARG1 != ARG3) {
Elliott Hughesa0664b92017-04-18 17:46:52 -07001161 PRE_REG_READ4(long, "futex",
petarj8b73c6e2012-07-23 00:11:10 +00001162 vki_u32 *, futex, int, op, int, val,
Elliott Hughesa0664b92017-04-18 17:46:52 -07001163 struct timespec *, utime);
petarj8b73c6e2012-07-23 00:11:10 +00001164 } else {
Elliott Hughesa0664b92017-04-18 17:46:52 -07001165 /* Note argument 5 is unused, but argument 6 is used.
1166 So we cannot just PRE_REG_READ6. Read argument 6 separately. */
1167 PRE_REG_READ4(long, "futex",
petarj8b73c6e2012-07-23 00:11:10 +00001168 vki_u32 *, futex, int, op, int, val,
Elliott Hughesa0664b92017-04-18 17:46:52 -07001169 struct timespec *, utime);
1170 if (VG_(tdict).track_pre_reg_read)
1171 PRA6("futex",int,val3);
petarj8b73c6e2012-07-23 00:11:10 +00001172 }
tomaedcc7a2009-07-29 11:09:01 +00001173 break;
1174 case VKI_FUTEX_WAKE_BITSET:
1175 PRE_REG_READ6(long, "futex",
1176 vki_u32 *, futex, int, op, int, val,
1177 int, dummy, int, dummy2, int, val3);
1178 break;
tomf26b6bf2006-06-07 17:47:51 +00001179 case VKI_FUTEX_WAIT:
tomaedcc7a2009-07-29 11:09:01 +00001180 case VKI_FUTEX_LOCK_PI:
tomf26b6bf2006-06-07 17:47:51 +00001181 PRE_REG_READ4(long, "futex",
1182 vki_u32 *, futex, int, op, int, val,
1183 struct timespec *, utime);
1184 break;
1185 case VKI_FUTEX_WAKE:
1186 case VKI_FUTEX_FD:
tomaedcc7a2009-07-29 11:09:01 +00001187 case VKI_FUTEX_TRYLOCK_PI:
tomf26b6bf2006-06-07 17:47:51 +00001188 PRE_REG_READ3(long, "futex",
1189 vki_u32 *, futex, int, op, int, val);
1190 break;
tomaedcc7a2009-07-29 11:09:01 +00001191 case VKI_FUTEX_UNLOCK_PI:
tomf26b6bf2006-06-07 17:47:51 +00001192 default:
1193 PRE_REG_READ2(long, "futex", vki_u32 *, futex, int, op);
1194 break;
1195 }
sewardjbc22cf72005-06-08 00:02:49 +00001196
sewardjbc22cf72005-06-08 00:02:49 +00001197 *flags |= SfMayBlock;
1198
tomaedcc7a2009-07-29 11:09:01 +00001199 switch(ARG2 & ~(VKI_FUTEX_PRIVATE_FLAG|VKI_FUTEX_CLOCK_REALTIME)) {
sewardjbc22cf72005-06-08 00:02:49 +00001200 case VKI_FUTEX_WAIT:
tomaedcc7a2009-07-29 11:09:01 +00001201 case VKI_FUTEX_LOCK_PI:
1202 case VKI_FUTEX_WAIT_BITSET:
1203 case VKI_FUTEX_WAIT_REQUEUE_PI:
tom7a75b362010-02-16 15:05:55 +00001204 PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
sewardjbc22cf72005-06-08 00:02:49 +00001205 if (ARG4 != 0)
1206 PRE_MEM_READ( "futex(timeout)", ARG4, sizeof(struct vki_timespec) );
1207 break;
1208
1209 case VKI_FUTEX_REQUEUE:
1210 case VKI_FUTEX_CMP_REQUEUE:
tomaedcc7a2009-07-29 11:09:01 +00001211 case VKI_FUTEX_CMP_REQUEUE_PI:
1212 case VKI_FUTEX_WAKE_OP:
tom7a75b362010-02-16 15:05:55 +00001213 PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
sewardjbc22cf72005-06-08 00:02:49 +00001214 PRE_MEM_READ( "futex(futex2)", ARG5, sizeof(Int) );
1215 break;
1216
sewardjbc22cf72005-06-08 00:02:49 +00001217 case VKI_FUTEX_FD:
tomaedcc7a2009-07-29 11:09:01 +00001218 case VKI_FUTEX_TRYLOCK_PI:
1219 case VKI_FUTEX_UNLOCK_PI:
tom7a75b362010-02-16 15:05:55 +00001220 PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
1221 break;
1222
1223 case VKI_FUTEX_WAKE:
1224 case VKI_FUTEX_WAKE_BITSET:
sewardjbc22cf72005-06-08 00:02:49 +00001225 /* no additional pointers */
1226 break;
1227
1228 default:
1229 SET_STATUS_Failure( VKI_ENOSYS ); // some futex function we don't understand
1230 break;
1231 }
1232}
sewardjbc22cf72005-06-08 00:02:49 +00001233POST(sys_futex)
1234{
1235 vg_assert(SUCCESS);
1236 POST_MEM_WRITE( ARG1, sizeof(int) );
1237 if (ARG2 == VKI_FUTEX_FD) {
sewardj7eb7c582005-06-23 01:02:53 +00001238 if (!ML_(fd_allowed)(RES, "futex", tid, True)) {
sewardjbc22cf72005-06-08 00:02:49 +00001239 VG_(close)(RES);
1240 SET_STATUS_Failure( VKI_EMFILE );
1241 } else {
1242 if (VG_(clo_track_fds))
njnf845f8f2005-06-23 02:26:47 +00001243 ML_(record_fd_open_nameless)(tid, RES);
sewardjbc22cf72005-06-08 00:02:49 +00001244 }
1245 }
1246}
1247
tom05b1f9a2006-05-17 14:24:12 +00001248PRE(sys_set_robust_list)
1249{
florianb26101c2015-08-08 21:45:33 +00001250 PRINT("sys_set_robust_list ( %#lx, %lu )", ARG1,ARG2);
tom05b1f9a2006-05-17 14:24:12 +00001251 PRE_REG_READ2(long, "set_robust_list",
1252 struct vki_robust_list_head *, head, vki_size_t, len);
1253
1254 /* Just check the robust_list_head structure is readable - don't
1255 try and chase the list as the kernel will only read it when
1256 the thread exits so the current contents is irrelevant. */
1257 if (ARG1 != 0)
1258 PRE_MEM_READ("set_robust_list(head)", ARG1, ARG2);
1259}
1260
1261PRE(sys_get_robust_list)
1262{
florianb26101c2015-08-08 21:45:33 +00001263 PRINT("sys_get_robust_list ( %ld, %#lx, %#lx )", SARG1,ARG2,ARG3);
tom05b1f9a2006-05-17 14:24:12 +00001264 PRE_REG_READ3(long, "get_robust_list",
1265 int, pid,
1266 struct vki_robust_list_head **, head_ptr,
1267 vki_size_t *, len_ptr);
1268 PRE_MEM_WRITE("get_robust_list(head_ptr)",
1269 ARG2, sizeof(struct vki_robust_list_head *));
1270 PRE_MEM_WRITE("get_robust_list(len_ptr)",
1271 ARG3, sizeof(struct vki_size_t *));
1272}
1273POST(sys_get_robust_list)
1274{
1275 POST_MEM_WRITE(ARG2, sizeof(struct vki_robust_list_head *));
1276 POST_MEM_WRITE(ARG3, sizeof(struct vki_size_t *));
1277}
1278
Elliott Hughesa0664b92017-04-18 17:46:52 -07001279struct pselect_sized_sigset {
1280 const vki_sigset_t *ss;
1281 vki_size_t ss_len;
1282};
1283struct pselect_adjusted_sigset {
1284 struct pselect_sized_sigset ss; /* The actual syscall arg */
1285 vki_sigset_t adjusted_ss;
1286};
1287
tom363ec762006-03-21 10:58:35 +00001288PRE(sys_pselect6)
1289{
Elliott Hughesa0664b92017-04-18 17:46:52 -07001290 *flags |= SfMayBlock | SfPostOnFail;
florianb26101c2015-08-08 21:45:33 +00001291 PRINT("sys_pselect6 ( %ld, %#lx, %#lx, %#lx, %#lx, %#lx )",
1292 SARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
tom363ec762006-03-21 10:58:35 +00001293 PRE_REG_READ6(long, "pselect6",
1294 int, n, vki_fd_set *, readfds, vki_fd_set *, writefds,
1295 vki_fd_set *, exceptfds, struct vki_timeval *, timeout,
1296 void *, sig);
1297 // XXX: this possibly understates how much memory is read.
1298 if (ARG2 != 0)
1299 PRE_MEM_READ( "pselect6(readfds)",
1300 ARG2, ARG1/8 /* __FD_SETSIZE/8 */ );
1301 if (ARG3 != 0)
1302 PRE_MEM_READ( "pselect6(writefds)",
1303 ARG3, ARG1/8 /* __FD_SETSIZE/8 */ );
1304 if (ARG4 != 0)
1305 PRE_MEM_READ( "pselect6(exceptfds)",
1306 ARG4, ARG1/8 /* __FD_SETSIZE/8 */ );
1307 if (ARG5 != 0)
1308 PRE_MEM_READ( "pselect6(timeout)", ARG5, sizeof(struct vki_timeval) );
Elliott Hughesa0664b92017-04-18 17:46:52 -07001309 if (ARG6 != 0) {
1310 const struct pselect_sized_sigset *pss =
1311 (struct pselect_sized_sigset *)ARG6;
1312 PRE_MEM_READ( "pselect6(sig)", ARG6, sizeof(*pss) );
1313 if (!ML_(safe_to_deref)(pss, sizeof(*pss))) {
1314 ARG6 = 1; /* Something recognisable to POST() hook. */
1315 } else {
1316 struct pselect_adjusted_sigset *pas;
1317 pas = VG_(malloc)("syswrap.pselect6.1", sizeof(*pas));
1318 ARG6 = (Addr)pas;
1319 pas->ss.ss = (void *)1;
1320 pas->ss.ss_len = pss->ss_len;
1321 if (pss->ss_len == sizeof(*pss->ss)) {
1322 if (pss->ss == NULL) {
1323 pas->ss.ss = NULL;
1324 } else {
1325 PRE_MEM_READ("pselect6(sig->ss)", (Addr)pss->ss, pss->ss_len);
1326 if (ML_(safe_to_deref)(pss->ss, sizeof(*pss->ss))) {
1327 pas->adjusted_ss = *pss->ss;
1328 pas->ss.ss = &pas->adjusted_ss;
1329 VG_(sanitize_client_sigmask)(&pas->adjusted_ss);
1330 }
1331 }
1332 }
1333 }
1334 }
1335}
1336POST(sys_pselect6)
1337{
1338 if (ARG6 != 0 && ARG6 != 1) {
1339 VG_(free)((struct pselect_adjusted_sigset *)ARG6);
1340 }
tom363ec762006-03-21 10:58:35 +00001341}
1342
1343PRE(sys_ppoll)
1344{
1345 UInt i;
1346 struct vki_pollfd* ufds = (struct vki_pollfd *)ARG1;
Elliott Hughesa0664b92017-04-18 17:46:52 -07001347 *flags |= SfMayBlock | SfPostOnFail;
florianb26101c2015-08-08 21:45:33 +00001348 PRINT("sys_ppoll ( %#lx, %lu, %#lx, %#lx, %lu )\n", ARG1,ARG2,ARG3,ARG4,ARG5);
tom363ec762006-03-21 10:58:35 +00001349 PRE_REG_READ5(long, "ppoll",
1350 struct vki_pollfd *, ufds, unsigned int, nfds,
1351 struct vki_timespec *, tsp, vki_sigset_t *, sigmask,
1352 vki_size_t, sigsetsize);
1353
1354 for (i = 0; i < ARG2; i++) {
1355 PRE_MEM_READ( "ppoll(ufds.fd)",
1356 (Addr)(&ufds[i].fd), sizeof(ufds[i].fd) );
1357 PRE_MEM_READ( "ppoll(ufds.events)",
1358 (Addr)(&ufds[i].events), sizeof(ufds[i].events) );
mjwb444fbc2014-08-26 22:15:58 +00001359 PRE_MEM_WRITE( "ppoll(ufds.revents)",
tom363ec762006-03-21 10:58:35 +00001360 (Addr)(&ufds[i].revents), sizeof(ufds[i].revents) );
1361 }
1362
1363 if (ARG3)
1364 PRE_MEM_READ( "ppoll(tsp)", ARG3, sizeof(struct vki_timespec) );
Elliott Hughesa0664b92017-04-18 17:46:52 -07001365 if (ARG4 != 0 && sizeof(vki_sigset_t) == ARG5) {
1366 const vki_sigset_t *guest_sigmask = (vki_sigset_t *)ARG4;
1367 PRE_MEM_READ( "ppoll(sigmask)", ARG4, ARG5);
1368 if (!ML_(safe_to_deref)(guest_sigmask, sizeof(*guest_sigmask))) {
1369 ARG4 = 1; /* Something recognisable to POST() hook. */
1370 } else {
1371 vki_sigset_t *vg_sigmask =
1372 VG_(malloc)("syswrap.ppoll.1", sizeof(*vg_sigmask));
1373 ARG4 = (Addr)vg_sigmask;
1374 *vg_sigmask = *guest_sigmask;
1375 VG_(sanitize_client_sigmask)(vg_sigmask);
1376 }
1377 }
tom363ec762006-03-21 10:58:35 +00001378}
1379
1380POST(sys_ppoll)
1381{
Elliott Hughesa0664b92017-04-18 17:46:52 -07001382 vg_assert(SUCCESS || FAILURE);
1383 if (SUCCESS && (RES >= 0)) {
tom363ec762006-03-21 10:58:35 +00001384 UInt i;
1385 struct vki_pollfd* ufds = (struct vki_pollfd *)ARG1;
1386 for (i = 0; i < ARG2; i++)
1387 POST_MEM_WRITE( (Addr)(&ufds[i].revents), sizeof(ufds[i].revents) );
1388 }
Elliott Hughesa0664b92017-04-18 17:46:52 -07001389 if (ARG4 != 0 && ARG5 == sizeof(vki_sigset_t) && ARG4 != 1) {
1390 VG_(free)((vki_sigset_t *) ARG4);
1391 }
tom363ec762006-03-21 10:58:35 +00001392}
1393
njn5c691752005-08-31 03:00:40 +00001394
njn73975482005-08-30 02:45:44 +00001395/* ---------------------------------------------------------------------
1396 epoll_* wrappers
1397 ------------------------------------------------------------------ */
1398
sewardje6d5e722005-06-10 10:27:55 +00001399PRE(sys_epoll_create)
1400{
florianb26101c2015-08-08 21:45:33 +00001401 PRINT("sys_epoll_create ( %ld )", SARG1);
sewardje6d5e722005-06-10 10:27:55 +00001402 PRE_REG_READ1(long, "epoll_create", int, size);
1403}
1404POST(sys_epoll_create)
1405{
1406 vg_assert(SUCCESS);
sewardj7eb7c582005-06-23 01:02:53 +00001407 if (!ML_(fd_allowed)(RES, "epoll_create", tid, True)) {
sewardje6d5e722005-06-10 10:27:55 +00001408 VG_(close)(RES);
1409 SET_STATUS_Failure( VKI_EMFILE );
1410 } else {
1411 if (VG_(clo_track_fds))
njnf845f8f2005-06-23 02:26:47 +00001412 ML_(record_fd_open_nameless) (tid, RES);
sewardje6d5e722005-06-10 10:27:55 +00001413 }
1414}
1415
njn72715882009-07-10 12:02:03 +00001416PRE(sys_epoll_create1)
1417{
florianb26101c2015-08-08 21:45:33 +00001418 PRINT("sys_epoll_create1 ( %ld )", SARG1);
njn72715882009-07-10 12:02:03 +00001419 PRE_REG_READ1(long, "epoll_create1", int, flags);
1420}
1421POST(sys_epoll_create1)
1422{
1423 vg_assert(SUCCESS);
1424 if (!ML_(fd_allowed)(RES, "epoll_create1", tid, True)) {
1425 VG_(close)(RES);
1426 SET_STATUS_Failure( VKI_EMFILE );
1427 } else {
1428 if (VG_(clo_track_fds))
1429 ML_(record_fd_open_nameless) (tid, RES);
1430 }
1431}
1432
sewardje6d5e722005-06-10 10:27:55 +00001433PRE(sys_epoll_ctl)
1434{
1435 static const HChar* epoll_ctl_s[3] = {
1436 "EPOLL_CTL_ADD",
1437 "EPOLL_CTL_DEL",
1438 "EPOLL_CTL_MOD"
1439 };
barta0b6b2c2008-07-07 06:49:24 +00001440 PRINT("sys_epoll_ctl ( %ld, %s, %ld, %#lx )",
florianb26101c2015-08-08 21:45:33 +00001441 SARG1, ( ARG2<3 ? epoll_ctl_s[ARG2] : "?" ), SARG3, ARG4);
sewardje6d5e722005-06-10 10:27:55 +00001442 PRE_REG_READ4(long, "epoll_ctl",
njn40e73582005-06-24 21:41:28 +00001443 int, epfd, int, op, int, fd, struct vki_epoll_event *, event);
1444 if (ARG2 != VKI_EPOLL_CTL_DEL)
1445 PRE_MEM_READ( "epoll_ctl(event)", ARG4, sizeof(struct vki_epoll_event) );
sewardje6d5e722005-06-10 10:27:55 +00001446}
1447
1448PRE(sys_epoll_wait)
1449{
1450 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00001451 PRINT("sys_epoll_wait ( %ld, %#lx, %ld, %ld )", SARG1, ARG2, SARG3, SARG4);
sewardje6d5e722005-06-10 10:27:55 +00001452 PRE_REG_READ4(long, "epoll_wait",
njn40e73582005-06-24 21:41:28 +00001453 int, epfd, struct vki_epoll_event *, events,
sewardje6d5e722005-06-10 10:27:55 +00001454 int, maxevents, int, timeout);
njn40e73582005-06-24 21:41:28 +00001455 PRE_MEM_WRITE( "epoll_wait(events)", ARG2, sizeof(struct vki_epoll_event)*ARG3);
sewardje6d5e722005-06-10 10:27:55 +00001456}
1457POST(sys_epoll_wait)
1458{
1459 vg_assert(SUCCESS);
1460 if (RES > 0)
njn40e73582005-06-24 21:41:28 +00001461 POST_MEM_WRITE( ARG2, sizeof(struct vki_epoll_event)*RES ) ;
sewardje6d5e722005-06-10 10:27:55 +00001462}
sewardj8c257322005-06-08 01:01:48 +00001463
bartf5ceec82008-04-26 07:45:10 +00001464PRE(sys_epoll_pwait)
1465{
1466 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00001467 PRINT("sys_epoll_pwait ( %ld, %#lx, %ld, %ld, %#lx, %lu )",
1468 SARG1, ARG2, SARG3, SARG4, ARG5, ARG6);
bartf5ceec82008-04-26 07:45:10 +00001469 PRE_REG_READ6(long, "epoll_pwait",
1470 int, epfd, struct vki_epoll_event *, events,
1471 int, maxevents, int, timeout, vki_sigset_t *, sigmask,
1472 vki_size_t, sigsetsize);
1473 PRE_MEM_WRITE( "epoll_pwait(events)", ARG2, sizeof(struct vki_epoll_event)*ARG3);
1474 if (ARG4)
1475 PRE_MEM_READ( "epoll_pwait(sigmask)", ARG5, sizeof(vki_sigset_t) );
1476}
1477POST(sys_epoll_pwait)
1478{
1479 vg_assert(SUCCESS);
1480 if (RES > 0)
1481 POST_MEM_WRITE( ARG2, sizeof(struct vki_epoll_event)*RES ) ;
1482}
1483
1484PRE(sys_eventfd)
1485{
barta0b6b2c2008-07-07 06:49:24 +00001486 PRINT("sys_eventfd ( %lu )", ARG1);
bartf5ceec82008-04-26 07:45:10 +00001487 PRE_REG_READ1(long, "sys_eventfd", unsigned int, count);
1488}
1489POST(sys_eventfd)
1490{
1491 if (!ML_(fd_allowed)(RES, "eventfd", tid, True)) {
1492 VG_(close)(RES);
1493 SET_STATUS_Failure( VKI_EMFILE );
1494 } else {
1495 if (VG_(clo_track_fds))
1496 ML_(record_fd_open_nameless) (tid, RES);
1497 }
1498}
1499
tom84eb41f2008-12-10 09:28:56 +00001500PRE(sys_eventfd2)
1501{
florianb26101c2015-08-08 21:45:33 +00001502 PRINT("sys_eventfd2 ( %lu, %ld )", ARG1, SARG2);
tom84eb41f2008-12-10 09:28:56 +00001503 PRE_REG_READ2(long, "sys_eventfd2", unsigned int, count, int, flags);
1504}
1505POST(sys_eventfd2)
1506{
1507 if (!ML_(fd_allowed)(RES, "eventfd2", tid, True)) {
1508 VG_(close)(RES);
1509 SET_STATUS_Failure( VKI_EMFILE );
1510 } else {
1511 if (VG_(clo_track_fds))
1512 ML_(record_fd_open_nameless) (tid, RES);
1513 }
1514}
1515
njn0bd71772009-07-15 03:08:35 +00001516PRE(sys_fallocate)
1517{
1518 *flags |= SfMayBlock;
tomd709b1d2009-11-25 11:51:05 +00001519#if VG_WORDSIZE == 4
1520 PRINT("sys_fallocate ( %ld, %ld, %lld, %lld )",
florianb26101c2015-08-08 21:45:33 +00001521 SARG1, SARG2, (Long)MERGE64(ARG3,ARG4), (Long)MERGE64(ARG5,ARG6));
tomd709b1d2009-11-25 11:51:05 +00001522 PRE_REG_READ6(long, "fallocate",
1523 int, fd, int, mode,
1524 unsigned, MERGE64_FIRST(offset), unsigned, MERGE64_SECOND(offset),
1525 unsigned, MERGE64_FIRST(len), unsigned, MERGE64_SECOND(len));
1526#elif VG_WORDSIZE == 8
florianb26101c2015-08-08 21:45:33 +00001527 PRINT("sys_fallocate ( %ld, %ld, %ld, %ld )",
1528 SARG1, SARG2, SARG3, SARG4);
njn0bd71772009-07-15 03:08:35 +00001529 PRE_REG_READ4(long, "fallocate",
1530 int, fd, int, mode, vki_loff_t, offset, vki_loff_t, len);
tomd709b1d2009-11-25 11:51:05 +00001531#else
1532# error Unexpected word size
1533#endif
tom93106a12009-07-15 07:47:49 +00001534 if (!ML_(fd_allowed)(ARG1, "fallocate", tid, False))
1535 SET_STATUS_Failure( VKI_EBADF );
njn0bd71772009-07-15 03:08:35 +00001536}
1537
tom46d02ab2011-06-08 09:55:54 +00001538PRE(sys_prlimit64)
1539{
florianb26101c2015-08-08 21:45:33 +00001540 PRINT("sys_prlimit64 ( %ld, %lu, %#lx, %#lx )", SARG1,ARG2,ARG3,ARG4);
tom46d02ab2011-06-08 09:55:54 +00001541 PRE_REG_READ4(long, "prlimit64",
1542 vki_pid_t, pid, unsigned int, resource,
1543 const struct rlimit64 *, new_rlim,
1544 struct rlimit64 *, old_rlim);
1545 if (ARG3)
1546 PRE_MEM_READ( "rlimit64(new_rlim)", ARG3, sizeof(struct vki_rlimit64) );
1547 if (ARG4)
1548 PRE_MEM_WRITE( "rlimit64(old_rlim)", ARG4, sizeof(struct vki_rlimit64) );
tomaba260b2012-03-01 13:42:18 +00001549
1550 if (ARG3 &&
1551 ((struct vki_rlimit64 *)ARG3)->rlim_cur > ((struct vki_rlimit64 *)ARG3)->rlim_max) {
1552 SET_STATUS_Failure( VKI_EINVAL );
1553 }
1554 else if (ARG1 == 0 || ARG1 == VG_(getpid)()) {
1555 switch (ARG2) {
1556 case VKI_RLIMIT_NOFILE:
1557 SET_STATUS_Success( 0 );
1558 if (ARG4) {
1559 ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(fd_soft_limit);
1560 ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(fd_hard_limit);
1561 }
1562 if (ARG3) {
1563 if (((struct vki_rlimit64 *)ARG3)->rlim_cur > VG_(fd_hard_limit) ||
1564 ((struct vki_rlimit64 *)ARG3)->rlim_max != VG_(fd_hard_limit)) {
1565 SET_STATUS_Failure( VKI_EPERM );
1566 }
1567 else {
1568 VG_(fd_soft_limit) = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
1569 }
1570 }
1571 break;
1572
1573 case VKI_RLIMIT_DATA:
1574 SET_STATUS_Success( 0 );
1575 if (ARG4) {
1576 ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(client_rlimit_data).rlim_cur;
1577 ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(client_rlimit_data).rlim_max;
1578 }
1579 if (ARG3) {
1580 if (((struct vki_rlimit64 *)ARG3)->rlim_cur > VG_(client_rlimit_data).rlim_max ||
1581 ((struct vki_rlimit64 *)ARG3)->rlim_max > VG_(client_rlimit_data).rlim_max) {
1582 SET_STATUS_Failure( VKI_EPERM );
1583 }
1584 else {
1585 VG_(client_rlimit_data).rlim_cur = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
1586 VG_(client_rlimit_data).rlim_max = ((struct vki_rlimit64 *)ARG3)->rlim_max;
1587 }
1588 }
1589 break;
1590
1591 case VKI_RLIMIT_STACK:
1592 SET_STATUS_Success( 0 );
1593 if (ARG4) {
1594 ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(client_rlimit_stack).rlim_cur;
1595 ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(client_rlimit_stack).rlim_max;
1596 }
1597 if (ARG3) {
1598 if (((struct vki_rlimit64 *)ARG3)->rlim_cur > VG_(client_rlimit_stack).rlim_max ||
1599 ((struct vki_rlimit64 *)ARG3)->rlim_max > VG_(client_rlimit_stack).rlim_max) {
1600 SET_STATUS_Failure( VKI_EPERM );
1601 }
1602 else {
1603 VG_(threads)[tid].client_stack_szB = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
1604 VG_(client_rlimit_stack).rlim_cur = ((struct vki_rlimit64 *)ARG3)->rlim_cur;
1605 VG_(client_rlimit_stack).rlim_max = ((struct vki_rlimit64 *)ARG3)->rlim_max;
1606 }
1607 }
1608 break;
1609 }
1610 }
tom46d02ab2011-06-08 09:55:54 +00001611}
1612
1613POST(sys_prlimit64)
1614{
tomaba260b2012-03-01 13:42:18 +00001615 if (ARG4)
tom46d02ab2011-06-08 09:55:54 +00001616 POST_MEM_WRITE( ARG4, sizeof(struct vki_rlimit64) );
tom46d02ab2011-06-08 09:55:54 +00001617}
1618
njn73975482005-08-30 02:45:44 +00001619/* ---------------------------------------------------------------------
1620 tid-related wrappers
1621 ------------------------------------------------------------------ */
1622
sewardj8c257322005-06-08 01:01:48 +00001623PRE(sys_gettid)
1624{
1625 PRINT("sys_gettid ()");
1626 PRE_REG_READ0(long, "gettid");
1627}
1628
njn73975482005-08-30 02:45:44 +00001629PRE(sys_set_tid_address)
1630{
barta0b6b2c2008-07-07 06:49:24 +00001631 PRINT("sys_set_tid_address ( %#lx )", ARG1);
njn73975482005-08-30 02:45:44 +00001632 PRE_REG_READ1(long, "set_tid_address", int *, tidptr);
1633}
1634
tomc8cfca62006-02-15 10:34:50 +00001635PRE(sys_tkill)
1636{
florianb26101c2015-08-08 21:45:33 +00001637 PRINT("sys_tgkill ( %ld, %ld )", SARG1, SARG2);
tomc8cfca62006-02-15 10:34:50 +00001638 PRE_REG_READ2(long, "tkill", int, tid, int, sig);
1639 if (!ML_(client_signal_OK)(ARG2)) {
1640 SET_STATUS_Failure( VKI_EINVAL );
1641 return;
1642 }
1643
1644 /* Check to see if this kill gave us a pending signal */
1645 *flags |= SfPollAfter;
1646
1647 if (VG_(clo_trace_signals))
sewardj738856f2009-07-15 14:48:32 +00001648 VG_(message)(Vg_DebugMsg, "tkill: sending signal %ld to pid %ld\n",
florianb26101c2015-08-08 21:45:33 +00001649 SARG2, SARG1);
tomc8cfca62006-02-15 10:34:50 +00001650
1651 /* If we're sending SIGKILL, check to see if the target is one of
1652 our threads and handle it specially. */
1653 if (ARG2 == VKI_SIGKILL && ML_(do_sigkill)(ARG1, -1)) {
1654 SET_STATUS_Success(0);
1655 return;
1656 }
1657
1658 /* Ask to handle this syscall via the slow route, since that's the
1659 only one that sets tst->status to VgTs_WaitSys. If the result
1660 of doing the syscall is an immediate run of
1661 async_signalhandler() in m_signals, then we need the thread to
1662 be properly tidied away. I have the impression the previous
1663 version of this wrapper worked on x86/amd64 only because the
1664 kernel did not immediately deliver the async signal to this
1665 thread (on ppc it did, which broke the assertion re tst->status
1666 at the top of async_signalhandler()). */
1667 *flags |= SfMayBlock;
1668}
1669POST(sys_tkill)
1670{
1671 if (VG_(clo_trace_signals))
sewardj738856f2009-07-15 14:48:32 +00001672 VG_(message)(Vg_DebugMsg, "tkill: sent signal %ld to pid %ld\n",
florianb26101c2015-08-08 21:45:33 +00001673 SARG2, SARG1);
tomc8cfca62006-02-15 10:34:50 +00001674}
sewardjbc22cf72005-06-08 00:02:49 +00001675
1676PRE(sys_tgkill)
1677{
florianb26101c2015-08-08 21:45:33 +00001678 PRINT("sys_tgkill ( %ld, %ld, %ld )", SARG1, SARG2, SARG3);
sewardjbc22cf72005-06-08 00:02:49 +00001679 PRE_REG_READ3(long, "tgkill", int, tgid, int, tid, int, sig);
sewardj7eb7c582005-06-23 01:02:53 +00001680 if (!ML_(client_signal_OK)(ARG3)) {
sewardjbc22cf72005-06-08 00:02:49 +00001681 SET_STATUS_Failure( VKI_EINVAL );
1682 return;
1683 }
1684
sewardjbc22cf72005-06-08 00:02:49 +00001685 /* Check to see if this kill gave us a pending signal */
1686 *flags |= SfPollAfter;
sewardjd6e91bc2005-11-17 14:26:52 +00001687
1688 if (VG_(clo_trace_signals))
sewardj738856f2009-07-15 14:48:32 +00001689 VG_(message)(Vg_DebugMsg,
1690 "tgkill: sending signal %ld to pid %ld/%ld\n",
florianb26101c2015-08-08 21:45:33 +00001691 SARG3, SARG1, SARG2);
sewardjd6e91bc2005-11-17 14:26:52 +00001692
1693 /* If we're sending SIGKILL, check to see if the target is one of
1694 our threads and handle it specially. */
1695 if (ARG3 == VKI_SIGKILL && ML_(do_sigkill)(ARG2, ARG1)) {
1696 SET_STATUS_Success(0);
1697 return;
1698 }
1699
1700 /* Ask to handle this syscall via the slow route, since that's the
1701 only one that sets tst->status to VgTs_WaitSys. If the result
1702 of doing the syscall is an immediate run of
1703 async_signalhandler() in m_signals, then we need the thread to
1704 be properly tidied away. I have the impression the previous
1705 version of this wrapper worked on x86/amd64 only because the
1706 kernel did not immediately deliver the async signal to this
1707 thread (on ppc it did, which broke the assertion re tst->status
1708 at the top of async_signalhandler()). */
1709 *flags |= SfMayBlock;
sewardjbc22cf72005-06-08 00:02:49 +00001710}
sewardjbc22cf72005-06-08 00:02:49 +00001711POST(sys_tgkill)
1712{
1713 if (VG_(clo_trace_signals))
sewardj738856f2009-07-15 14:48:32 +00001714 VG_(message)(Vg_DebugMsg,
1715 "tgkill: sent signal %ld to pid %ld/%ld\n",
florianb26101c2015-08-08 21:45:33 +00001716 SARG3, SARG1, SARG2);
sewardjbc22cf72005-06-08 00:02:49 +00001717}
1718
njn73975482005-08-30 02:45:44 +00001719/* ---------------------------------------------------------------------
1720 fadvise64* wrappers
1721 ------------------------------------------------------------------ */
1722
tom72440832005-06-15 10:31:10 +00001723PRE(sys_fadvise64)
1724{
florianb26101c2015-08-08 21:45:33 +00001725 PRINT("sys_fadvise64 ( %ld, %llu, %lu, %ld )",
1726 SARG1, MERGE64(ARG2,ARG3), ARG4, SARG5);
tom20d35722005-07-27 22:57:18 +00001727 PRE_REG_READ5(long, "fadvise64",
tomca787242009-11-25 11:24:00 +00001728 int, fd, vki_u32, MERGE64_FIRST(offset), vki_u32, MERGE64_SECOND(offset),
tom20d35722005-07-27 22:57:18 +00001729 vki_size_t, len, int, advice);
tom72440832005-06-15 10:31:10 +00001730}
1731
1732PRE(sys_fadvise64_64)
1733{
florianb26101c2015-08-08 21:45:33 +00001734 PRINT("sys_fadvise64_64 ( %ld, %llu, %llu, %ld )",
1735 SARG1, MERGE64(ARG2,ARG3), MERGE64(ARG4,ARG5), SARG6);
tom20d35722005-07-27 22:57:18 +00001736 PRE_REG_READ6(long, "fadvise64_64",
tomca787242009-11-25 11:24:00 +00001737 int, fd, vki_u32, MERGE64_FIRST(offset), vki_u32, MERGE64_SECOND(offset),
1738 vki_u32, MERGE64_FIRST(len), vki_u32, MERGE64_SECOND(len), int, advice);
tom72440832005-06-15 10:31:10 +00001739}
sewardje6d5e722005-06-10 10:27:55 +00001740
njn73975482005-08-30 02:45:44 +00001741/* ---------------------------------------------------------------------
1742 io_* wrappers
1743 ------------------------------------------------------------------ */
1744
sewardje6d5e722005-06-10 10:27:55 +00001745// Nb: this wrapper has to pad/unpad memory around the syscall itself,
1746// and this allows us to control exactly the code that gets run while
1747// the padding is in place.
sewardj45f4e7c2005-09-27 19:20:21 +00001748
sewardje6d5e722005-06-10 10:27:55 +00001749PRE(sys_io_setup)
1750{
barta0b6b2c2008-07-07 06:49:24 +00001751 PRINT("sys_io_setup ( %lu, %#lx )", ARG1,ARG2);
sewardje6d5e722005-06-10 10:27:55 +00001752 PRE_REG_READ2(long, "io_setup",
1753 unsigned, nr_events, vki_aio_context_t *, ctxp);
1754 PRE_MEM_WRITE( "io_setup(ctxp)", ARG2, sizeof(vki_aio_context_t) );
sewardj45f4e7c2005-09-27 19:20:21 +00001755}
1756
1757POST(sys_io_setup)
1758{
1759 SizeT size;
1760 struct vki_aio_ring *r;
1761
sewardje6d5e722005-06-10 10:27:55 +00001762 size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) +
1763 ARG1*sizeof(struct vki_io_event));
sewardj45f4e7c2005-09-27 19:20:21 +00001764 r = *(struct vki_aio_ring **)ARG2;
1765 vg_assert(ML_(valid_client_addr)((Addr)r, size, tid, "io_setup"));
sewardje6d5e722005-06-10 10:27:55 +00001766
njndd372582009-05-10 22:42:19 +00001767 ML_(notify_core_and_tool_of_mmap)( (Addr)r, size,
1768 VKI_PROT_READ | VKI_PROT_WRITE,
1769 VKI_MAP_ANONYMOUS, -1, 0 );
sewardje6d5e722005-06-10 10:27:55 +00001770
sewardj45f4e7c2005-09-27 19:20:21 +00001771 POST_MEM_WRITE( ARG2, sizeof(vki_aio_context_t) );
sewardje6d5e722005-06-10 10:27:55 +00001772}
1773
1774// Nb: This wrapper is "Special" because we need 'size' to do the unmap
1775// after the syscall. We must get 'size' from the aio_ring structure,
1776// before the syscall, while the aio_ring structure still exists. (And we
1777// know that we must look at the aio_ring structure because Tom inspected the
1778// kernel and glibc sources to see what they do, yuk.)
1779//
1780// XXX This segment can be implicitly unmapped when aio
1781// file-descriptors are closed...
1782PRE(sys_io_destroy)
sewardj45f4e7c2005-09-27 19:20:21 +00001783{
sewardj5abf0f12007-11-17 01:49:06 +00001784 SizeT size = 0;
sewardje6d5e722005-06-10 10:27:55 +00001785
1786 PRINT("sys_io_destroy ( %llu )", (ULong)ARG1);
1787 PRE_REG_READ1(long, "io_destroy", vki_aio_context_t, ctx);
1788
1789 // If we are going to seg fault (due to a bogus ARG1) do it as late as
1790 // possible...
sewardj5abf0f12007-11-17 01:49:06 +00001791 if (ML_(safe_to_deref)( (void*)ARG1, sizeof(struct vki_aio_ring))) {
1792 struct vki_aio_ring *r = (struct vki_aio_ring *)ARG1;
1793 size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) +
1794 r->nr*sizeof(struct vki_io_event));
1795 }
sewardje6d5e722005-06-10 10:27:55 +00001796
1797 SET_STATUS_from_SysRes( VG_(do_syscall1)(SYSNO, ARG1) );
1798
sewardj45f4e7c2005-09-27 19:20:21 +00001799 if (SUCCESS && RES == 0) {
1800 Bool d = VG_(am_notify_munmap)( ARG1, size );
sewardje6d5e722005-06-10 10:27:55 +00001801 VG_TRACK( die_mem_munmap, ARG1, size );
sewardj45f4e7c2005-09-27 19:20:21 +00001802 if (d)
florianddd61ff2015-01-04 17:20:45 +00001803 VG_(discard_translations)( (Addr)ARG1, (ULong)size,
sewardj45f4e7c2005-09-27 19:20:21 +00001804 "PRE(sys_io_destroy)" );
sewardje6d5e722005-06-10 10:27:55 +00001805 }
1806}
1807
1808PRE(sys_io_getevents)
1809{
1810 *flags |= SfMayBlock;
barta0b6b2c2008-07-07 06:49:24 +00001811 PRINT("sys_io_getevents ( %llu, %lld, %lld, %#lx, %#lx )",
sewardje6d5e722005-06-10 10:27:55 +00001812 (ULong)ARG1,(Long)ARG2,(Long)ARG3,ARG4,ARG5);
1813 PRE_REG_READ5(long, "io_getevents",
1814 vki_aio_context_t, ctx_id, long, min_nr, long, nr,
1815 struct io_event *, events,
1816 struct timespec *, timeout);
1817 if (ARG3 > 0)
1818 PRE_MEM_WRITE( "io_getevents(events)",
1819 ARG4, sizeof(struct vki_io_event)*ARG3 );
1820 if (ARG5 != 0)
1821 PRE_MEM_READ( "io_getevents(timeout)",
1822 ARG5, sizeof(struct vki_timespec));
1823}
1824POST(sys_io_getevents)
1825{
1826 Int i;
1827 vg_assert(SUCCESS);
1828 if (RES > 0) {
1829 POST_MEM_WRITE( ARG4, sizeof(struct vki_io_event)*RES );
1830 for (i = 0; i < RES; i++) {
1831 const struct vki_io_event *vev = ((struct vki_io_event *)ARG4) + i;
1832 const struct vki_iocb *cb = (struct vki_iocb *)(Addr)vev->obj;
1833
1834 switch (cb->aio_lio_opcode) {
1835 case VKI_IOCB_CMD_PREAD:
1836 if (vev->result > 0)
1837 POST_MEM_WRITE( cb->aio_buf, vev->result );
1838 break;
tom9c85af72009-10-28 16:03:29 +00001839
sewardje6d5e722005-06-10 10:27:55 +00001840 case VKI_IOCB_CMD_PWRITE:
1841 break;
tom9c85af72009-10-28 16:03:29 +00001842
1843 case VKI_IOCB_CMD_FSYNC:
1844 break;
1845
1846 case VKI_IOCB_CMD_FDSYNC:
1847 break;
1848
1849 case VKI_IOCB_CMD_PREADV:
1850 if (vev->result > 0) {
1851 struct vki_iovec * vec = (struct vki_iovec *)(Addr)cb->aio_buf;
1852 Int remains = vev->result;
1853 Int j;
1854
1855 for (j = 0; j < cb->aio_nbytes; j++) {
1856 Int nReadThisBuf = vec[j].iov_len;
1857 if (nReadThisBuf > remains) nReadThisBuf = remains;
1858 POST_MEM_WRITE( (Addr)vec[j].iov_base, nReadThisBuf );
1859 remains -= nReadThisBuf;
1860 if (remains < 0) VG_(core_panic)("io_getevents(PREADV): remains < 0");
1861 }
1862 }
1863 break;
1864
1865 case VKI_IOCB_CMD_PWRITEV:
1866 break;
1867
sewardje6d5e722005-06-10 10:27:55 +00001868 default:
1869 VG_(message)(Vg_DebugMsg,
1870 "Warning: unhandled io_getevents opcode: %u\n",
1871 cb->aio_lio_opcode);
1872 break;
1873 }
1874 }
1875 }
1876}
1877
1878PRE(sys_io_submit)
1879{
tom9c85af72009-10-28 16:03:29 +00001880 Int i, j;
sewardje6d5e722005-06-10 10:27:55 +00001881
florianb26101c2015-08-08 21:45:33 +00001882 PRINT("sys_io_submit ( %lu, %ld, %#lx )", ARG1, SARG2, ARG3);
sewardje6d5e722005-06-10 10:27:55 +00001883 PRE_REG_READ3(long, "io_submit",
1884 vki_aio_context_t, ctx_id, long, nr,
1885 struct iocb **, iocbpp);
1886 PRE_MEM_READ( "io_submit(iocbpp)", ARG3, ARG2*sizeof(struct vki_iocb *) );
1887 if (ARG3 != 0) {
1888 for (i = 0; i < ARG2; i++) {
1889 struct vki_iocb *cb = ((struct vki_iocb **)ARG3)[i];
tom9c85af72009-10-28 16:03:29 +00001890 struct vki_iovec *iov;
1891
sewardje6d5e722005-06-10 10:27:55 +00001892 PRE_MEM_READ( "io_submit(iocb)", (Addr)cb, sizeof(struct vki_iocb) );
1893 switch (cb->aio_lio_opcode) {
1894 case VKI_IOCB_CMD_PREAD:
1895 PRE_MEM_WRITE( "io_submit(PREAD)", cb->aio_buf, cb->aio_nbytes );
1896 break;
1897
1898 case VKI_IOCB_CMD_PWRITE:
1899 PRE_MEM_READ( "io_submit(PWRITE)", cb->aio_buf, cb->aio_nbytes );
1900 break;
tom9c85af72009-10-28 16:03:29 +00001901
1902 case VKI_IOCB_CMD_FSYNC:
1903 break;
1904
1905 case VKI_IOCB_CMD_FDSYNC:
1906 break;
1907
1908 case VKI_IOCB_CMD_PREADV:
1909 iov = (struct vki_iovec *)(Addr)cb->aio_buf;
1910 PRE_MEM_READ( "io_submit(PREADV)", cb->aio_buf, cb->aio_nbytes * sizeof(struct vki_iovec) );
1911 for (j = 0; j < cb->aio_nbytes; j++)
1912 PRE_MEM_WRITE( "io_submit(PREADV(iov[i]))", (Addr)iov[j].iov_base, iov[j].iov_len );
1913 break;
1914
1915 case VKI_IOCB_CMD_PWRITEV:
1916 iov = (struct vki_iovec *)(Addr)cb->aio_buf;
1917 PRE_MEM_READ( "io_submit(PWRITEV)", cb->aio_buf, cb->aio_nbytes * sizeof(struct vki_iovec) );
1918 for (j = 0; j < cb->aio_nbytes; j++)
1919 PRE_MEM_READ( "io_submit(PWRITEV(iov[i]))", (Addr)iov[j].iov_base, iov[j].iov_len );
1920 break;
1921
sewardje6d5e722005-06-10 10:27:55 +00001922 default:
1923 VG_(message)(Vg_DebugMsg,"Warning: unhandled io_submit opcode: %u\n",
1924 cb->aio_lio_opcode);
1925 break;
1926 }
1927 }
1928 }
1929}
1930
1931PRE(sys_io_cancel)
1932{
barta0b6b2c2008-07-07 06:49:24 +00001933 PRINT("sys_io_cancel ( %llu, %#lx, %#lx )", (ULong)ARG1,ARG2,ARG3);
sewardje6d5e722005-06-10 10:27:55 +00001934 PRE_REG_READ3(long, "io_cancel",
1935 vki_aio_context_t, ctx_id, struct iocb *, iocb,
1936 struct io_event *, result);
1937 PRE_MEM_READ( "io_cancel(iocb)", ARG2, sizeof(struct vki_iocb) );
1938 PRE_MEM_WRITE( "io_cancel(result)", ARG3, sizeof(struct vki_io_event) );
1939}
sewardje6d5e722005-06-10 10:27:55 +00001940POST(sys_io_cancel)
1941{
1942 POST_MEM_WRITE( ARG3, sizeof(struct vki_io_event) );
1943}
1944
njn73975482005-08-30 02:45:44 +00001945/* ---------------------------------------------------------------------
1946 *_mempolicy wrappers
1947 ------------------------------------------------------------------ */
1948
tom70a5cb02005-10-20 17:00:23 +00001949PRE(sys_mbind)
1950{
florianb26101c2015-08-08 21:45:33 +00001951 PRINT("sys_mbind ( %#lx, %lu, %lu, %#lx, %lu, %lu )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
tom70a5cb02005-10-20 17:00:23 +00001952 PRE_REG_READ6(long, "mbind",
1953 unsigned long, start, unsigned long, len,
1954 unsigned long, policy, unsigned long *, nodemask,
1955 unsigned long, maxnode, unsigned, flags);
1956 if (ARG1 != 0)
1957 PRE_MEM_READ( "mbind(nodemask)", ARG4,
tome581bad2011-08-15 07:52:26 +00001958 VG_ROUNDUP( ARG5-1, sizeof(UWord) * 8 ) / 8 );
tom70a5cb02005-10-20 17:00:23 +00001959}
1960
tom2af58f22005-07-22 15:04:14 +00001961PRE(sys_set_mempolicy)
1962{
florianb26101c2015-08-08 21:45:33 +00001963 PRINT("sys_set_mempolicy ( %ld, %#lx, %lu )", SARG1, ARG2, ARG3);
tom2af58f22005-07-22 15:04:14 +00001964 PRE_REG_READ3(long, "set_mempolicy",
1965 int, policy, unsigned long *, nodemask,
1966 unsigned long, maxnode);
1967 PRE_MEM_READ( "set_mempolicy(nodemask)", ARG2,
tome581bad2011-08-15 07:52:26 +00001968 VG_ROUNDUP( ARG3-1, sizeof(UWord) * 8 ) / 8 );
tom2af58f22005-07-22 15:04:14 +00001969}
1970
1971PRE(sys_get_mempolicy)
1972{
florianb26101c2015-08-08 21:45:33 +00001973 PRINT("sys_get_mempolicy ( %#lx, %#lx, %lu, %#lx, %lx )", ARG1,ARG2,ARG3,ARG4,ARG5);
tom2af58f22005-07-22 15:04:14 +00001974 PRE_REG_READ5(long, "get_mempolicy",
1975 int *, policy, unsigned long *, nodemask,
1976 unsigned long, maxnode, unsigned long, addr,
1977 unsigned long, flags);
1978 if (ARG1 != 0)
1979 PRE_MEM_WRITE( "get_mempolicy(policy)", ARG1, sizeof(Int) );
1980 if (ARG2 != 0)
1981 PRE_MEM_WRITE( "get_mempolicy(nodemask)", ARG2,
tome581bad2011-08-15 07:52:26 +00001982 VG_ROUNDUP( ARG3-1, sizeof(UWord) * 8 ) / 8 );
tom2af58f22005-07-22 15:04:14 +00001983}
1984POST(sys_get_mempolicy)
1985{
1986 if (ARG1 != 0)
1987 POST_MEM_WRITE( ARG1, sizeof(Int) );
1988 if (ARG2 != 0)
tome581bad2011-08-15 07:52:26 +00001989 POST_MEM_WRITE( ARG2, VG_ROUNDUP( ARG3-1, sizeof(UWord) * 8 ) / 8 );
tom2af58f22005-07-22 15:04:14 +00001990}
1991
njn73975482005-08-30 02:45:44 +00001992/* ---------------------------------------------------------------------
tomcec24b52013-07-17 13:58:59 +00001993 fanotify_* wrappers
1994 ------------------------------------------------------------------ */
1995
1996PRE(sys_fanotify_init)
1997{
1998 PRINT("sys_fanotify_init ( %lu, %lu )", ARG1,ARG2);
1999 PRE_REG_READ2(long, "fanotify_init",
2000 unsigned int, flags, unsigned int, event_f_flags);
2001}
2002
2003POST(sys_fanotify_init)
2004{
2005 vg_assert(SUCCESS);
2006 if (!ML_(fd_allowed)(RES, "fanotify_init", tid, True)) {
2007 VG_(close)(RES);
2008 SET_STATUS_Failure( VKI_EMFILE );
2009 } else {
2010 if (VG_(clo_track_fds))
2011 ML_(record_fd_open_nameless) (tid, RES);
2012 }
2013}
2014
2015PRE(sys_fanotify_mark)
2016{
2017#if VG_WORDSIZE == 4
2018 PRINT( "sys_fanotify_mark ( %ld, %lu, %llu, %ld, %#lx(%s))",
florianb26101c2015-08-08 21:45:33 +00002019 SARG1, ARG2, MERGE64(ARG3,ARG4), SARG5, ARG6, (HChar *)ARG6);
tomcec24b52013-07-17 13:58:59 +00002020 PRE_REG_READ6(long, "sys_fanotify_mark",
2021 int, fanotify_fd, unsigned int, flags,
2022 __vki_u32, mask0, __vki_u32, mask1,
2023 int, dfd, const char *, pathname);
2024 if (ARG6)
2025 PRE_MEM_RASCIIZ( "fanotify_mark(path)", ARG6);
2026#elif VG_WORDSIZE == 8
florianb26101c2015-08-08 21:45:33 +00002027 PRINT( "sys_fanotify_mark ( %ld, %lu, %lu, %ld, %#lx(%s))",
2028 SARG1, ARG2, ARG3, SARG4, ARG5, (HChar *)ARG5);
tomcec24b52013-07-17 13:58:59 +00002029 PRE_REG_READ5(long, "sys_fanotify_mark",
2030 int, fanotify_fd, unsigned int, flags,
2031 __vki_u64, mask,
2032 int, dfd, const char *, pathname);
2033 if (ARG5)
2034 PRE_MEM_RASCIIZ( "fanotify_mark(path)", ARG5);
2035#else
2036# error Unexpected word size
2037#endif
2038}
2039
2040/* ---------------------------------------------------------------------
njn73975482005-08-30 02:45:44 +00002041 inotify_* wrappers
2042 ------------------------------------------------------------------ */
2043
tom0bcaf2a2005-07-25 15:21:41 +00002044PRE(sys_inotify_init)
2045{
2046 PRINT("sys_inotify_init ( )");
2047 PRE_REG_READ0(long, "inotify_init");
2048}
2049POST(sys_inotify_init)
2050{
2051 vg_assert(SUCCESS);
2052 if (!ML_(fd_allowed)(RES, "inotify_init", tid, True)) {
2053 VG_(close)(RES);
2054 SET_STATUS_Failure( VKI_EMFILE );
2055 } else {
2056 if (VG_(clo_track_fds))
2057 ML_(record_fd_open_nameless) (tid, RES);
2058 }
2059}
2060
tom7bb1b1c2009-10-27 14:17:27 +00002061PRE(sys_inotify_init1)
2062{
florianb26101c2015-08-08 21:45:33 +00002063 PRINT("sys_inotify_init ( %ld )", SARG1);
tom7bb1b1c2009-10-27 14:17:27 +00002064 PRE_REG_READ1(long, "inotify_init", int, flag);
2065}
2066
2067POST(sys_inotify_init1)
2068{
2069 vg_assert(SUCCESS);
2070 if (!ML_(fd_allowed)(RES, "inotify_init", tid, True)) {
2071 VG_(close)(RES);
2072 SET_STATUS_Failure( VKI_EMFILE );
2073 } else {
2074 if (VG_(clo_track_fds))
2075 ML_(record_fd_open_nameless) (tid, RES);
2076 }
2077}
2078
tom0bcaf2a2005-07-25 15:21:41 +00002079PRE(sys_inotify_add_watch)
2080{
florianb26101c2015-08-08 21:45:33 +00002081 PRINT( "sys_inotify_add_watch ( %ld, %#lx, %lx )", SARG1, ARG2, ARG3);
tom0bcaf2a2005-07-25 15:21:41 +00002082 PRE_REG_READ3(long, "inotify_add_watch", int, fd, char *, path, int, mask);
2083 PRE_MEM_RASCIIZ( "inotify_add_watch(path)", ARG2 );
2084}
2085
2086PRE(sys_inotify_rm_watch)
2087{
florianb26101c2015-08-08 21:45:33 +00002088 PRINT( "sys_inotify_rm_watch ( %ld, %lx )", SARG1, ARG2);
tom0bcaf2a2005-07-25 15:21:41 +00002089 PRE_REG_READ2(long, "inotify_rm_watch", int, fd, int, wd);
2090}
2091
njn73975482005-08-30 02:45:44 +00002092/* ---------------------------------------------------------------------
2093 mq_* wrappers
2094 ------------------------------------------------------------------ */
2095
njn4279a882005-08-26 03:43:28 +00002096PRE(sys_mq_open)
2097{
florianb26101c2015-08-08 21:45:33 +00002098 PRINT("sys_mq_open( %#lx(%s), %ld, %lu, %#lx )",
2099 ARG1, (HChar*)ARG1, SARG2, ARG3, ARG4);
njn4279a882005-08-26 03:43:28 +00002100 PRE_REG_READ4(long, "mq_open",
2101 const char *, name, int, oflag, vki_mode_t, mode,
2102 struct mq_attr *, attr);
2103 PRE_MEM_RASCIIZ( "mq_open(name)", ARG1 );
2104 if ((ARG2 & VKI_O_CREAT) != 0 && ARG4 != 0) {
2105 const struct vki_mq_attr *attr = (struct vki_mq_attr *)ARG4;
2106 PRE_MEM_READ( "mq_open(attr->mq_maxmsg)",
2107 (Addr)&attr->mq_maxmsg, sizeof(attr->mq_maxmsg) );
2108 PRE_MEM_READ( "mq_open(attr->mq_msgsize)",
2109 (Addr)&attr->mq_msgsize, sizeof(attr->mq_msgsize) );
2110 }
2111}
njn4279a882005-08-26 03:43:28 +00002112POST(sys_mq_open)
2113{
2114 vg_assert(SUCCESS);
2115 if (!ML_(fd_allowed)(RES, "mq_open", tid, True)) {
2116 VG_(close)(RES);
2117 SET_STATUS_Failure( VKI_EMFILE );
2118 } else {
2119 if (VG_(clo_track_fds))
florian1636d332012-11-15 04:27:04 +00002120 ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG1);
njn4279a882005-08-26 03:43:28 +00002121 }
2122}
2123
2124PRE(sys_mq_unlink)
2125{
barta0b6b2c2008-07-07 06:49:24 +00002126 PRINT("sys_mq_unlink ( %#lx(%s) )", ARG1,(char*)ARG1);
njn4279a882005-08-26 03:43:28 +00002127 PRE_REG_READ1(long, "mq_unlink", const char *, name);
2128 PRE_MEM_RASCIIZ( "mq_unlink(name)", ARG1 );
2129}
2130
2131PRE(sys_mq_timedsend)
2132{
2133 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00002134 PRINT("sys_mq_timedsend ( %ld, %#lx, %lu, %lu, %#lx )",
2135 SARG1,ARG2,ARG3,ARG4,ARG5);
njn4279a882005-08-26 03:43:28 +00002136 PRE_REG_READ5(long, "mq_timedsend",
2137 vki_mqd_t, mqdes, const char *, msg_ptr, vki_size_t, msg_len,
2138 unsigned int, msg_prio, const struct timespec *, abs_timeout);
2139 if (!ML_(fd_allowed)(ARG1, "mq_timedsend", tid, False)) {
2140 SET_STATUS_Failure( VKI_EBADF );
2141 } else {
2142 PRE_MEM_READ( "mq_timedsend(msg_ptr)", ARG2, ARG3 );
2143 if (ARG5 != 0)
2144 PRE_MEM_READ( "mq_timedsend(abs_timeout)", ARG5,
2145 sizeof(struct vki_timespec) );
2146 }
2147}
2148
2149PRE(sys_mq_timedreceive)
2150{
2151 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00002152 PRINT("sys_mq_timedreceive( %ld, %#lx, %lu, %#lx, %#lx )",
2153 SARG1,ARG2,ARG3,ARG4,ARG5);
njn4279a882005-08-26 03:43:28 +00002154 PRE_REG_READ5(ssize_t, "mq_timedreceive",
2155 vki_mqd_t, mqdes, char *, msg_ptr, vki_size_t, msg_len,
2156 unsigned int *, msg_prio,
2157 const struct timespec *, abs_timeout);
2158 if (!ML_(fd_allowed)(ARG1, "mq_timedreceive", tid, False)) {
2159 SET_STATUS_Failure( VKI_EBADF );
2160 } else {
2161 PRE_MEM_WRITE( "mq_timedreceive(msg_ptr)", ARG2, ARG3 );
2162 if (ARG4 != 0)
2163 PRE_MEM_WRITE( "mq_timedreceive(msg_prio)",
2164 ARG4, sizeof(unsigned int) );
2165 if (ARG5 != 0)
2166 PRE_MEM_READ( "mq_timedreceive(abs_timeout)",
2167 ARG5, sizeof(struct vki_timespec) );
2168 }
2169}
njn4279a882005-08-26 03:43:28 +00002170POST(sys_mq_timedreceive)
2171{
tom44e534d2010-05-24 13:40:10 +00002172 POST_MEM_WRITE( ARG2, RES );
njn4279a882005-08-26 03:43:28 +00002173 if (ARG4 != 0)
2174 POST_MEM_WRITE( ARG4, sizeof(unsigned int) );
2175}
2176
2177PRE(sys_mq_notify)
2178{
florianb26101c2015-08-08 21:45:33 +00002179 PRINT("sys_mq_notify( %ld, %#lx )", SARG1, ARG2 );
njn4279a882005-08-26 03:43:28 +00002180 PRE_REG_READ2(long, "mq_notify",
2181 vki_mqd_t, mqdes, const struct sigevent *, notification);
2182 if (!ML_(fd_allowed)(ARG1, "mq_notify", tid, False))
2183 SET_STATUS_Failure( VKI_EBADF );
2184 else if (ARG2 != 0)
2185 PRE_MEM_READ( "mq_notify(notification)",
2186 ARG2, sizeof(struct vki_sigevent) );
2187}
2188
2189PRE(sys_mq_getsetattr)
2190{
florianb26101c2015-08-08 21:45:33 +00002191 PRINT("sys_mq_getsetattr( %ld, %#lx, %#lx )", SARG1,ARG2,ARG3 );
njn4279a882005-08-26 03:43:28 +00002192 PRE_REG_READ3(long, "mq_getsetattr",
2193 vki_mqd_t, mqdes, const struct mq_attr *, mqstat,
2194 struct mq_attr *, omqstat);
2195 if (!ML_(fd_allowed)(ARG1, "mq_getsetattr", tid, False)) {
2196 SET_STATUS_Failure( VKI_EBADF );
2197 } else {
2198 if (ARG2 != 0) {
2199 const struct vki_mq_attr *attr = (struct vki_mq_attr *)ARG2;
2200 PRE_MEM_READ( "mq_getsetattr(mqstat->mq_flags)",
2201 (Addr)&attr->mq_flags, sizeof(attr->mq_flags) );
2202 }
2203 if (ARG3 != 0)
2204 PRE_MEM_WRITE( "mq_getsetattr(omqstat)", ARG3,
2205 sizeof(struct vki_mq_attr) );
2206 }
2207}
njn4279a882005-08-26 03:43:28 +00002208POST(sys_mq_getsetattr)
2209{
2210 if (ARG3 != 0)
2211 POST_MEM_WRITE( ARG3, sizeof(struct vki_mq_attr) );
2212}
2213
njn73975482005-08-30 02:45:44 +00002214/* ---------------------------------------------------------------------
2215 clock_* wrappers
2216 ------------------------------------------------------------------ */
2217
njn1588bc02005-08-26 03:49:43 +00002218PRE(sys_clock_settime)
2219{
florianb26101c2015-08-08 21:45:33 +00002220 PRINT("sys_clock_settime( %ld, %#lx )", SARG1, ARG2);
njn1588bc02005-08-26 03:49:43 +00002221 PRE_REG_READ2(long, "clock_settime",
2222 vki_clockid_t, clk_id, const struct timespec *, tp);
2223 PRE_MEM_READ( "clock_settime(tp)", ARG2, sizeof(struct vki_timespec) );
2224}
2225
2226PRE(sys_clock_gettime)
2227{
florianb26101c2015-08-08 21:45:33 +00002228 PRINT("sys_clock_gettime( %ld, %#lx )" , SARG1, ARG2);
njn1588bc02005-08-26 03:49:43 +00002229 PRE_REG_READ2(long, "clock_gettime",
2230 vki_clockid_t, clk_id, struct timespec *, tp);
2231 PRE_MEM_WRITE( "clock_gettime(tp)", ARG2, sizeof(struct vki_timespec) );
2232}
2233POST(sys_clock_gettime)
2234{
2235 POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
2236}
2237
2238PRE(sys_clock_getres)
2239{
florianb26101c2015-08-08 21:45:33 +00002240 PRINT("sys_clock_getres( %ld, %#lx )" , SARG1, ARG2);
njn1588bc02005-08-26 03:49:43 +00002241 // Nb: we can't use "RES" as the param name because that's a macro
2242 // defined above!
2243 PRE_REG_READ2(long, "clock_getres",
2244 vki_clockid_t, clk_id, struct timespec *, res);
2245 if (ARG2 != 0)
2246 PRE_MEM_WRITE( "clock_getres(res)", ARG2, sizeof(struct vki_timespec) );
2247}
2248POST(sys_clock_getres)
2249{
2250 if (ARG2 != 0)
2251 POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
2252}
2253
2254PRE(sys_clock_nanosleep)
2255{
2256 *flags |= SfMayBlock|SfPostOnFail;
florianb26101c2015-08-08 21:45:33 +00002257 PRINT("sys_clock_nanosleep( %ld, %ld, %#lx, %#lx )",
2258 SARG1, SARG2, ARG3, ARG4);
njn1588bc02005-08-26 03:49:43 +00002259 PRE_REG_READ4(int32_t, "clock_nanosleep",
2260 vki_clockid_t, clkid, int, flags,
2261 const struct timespec *, rqtp, struct timespec *, rmtp);
2262 PRE_MEM_READ( "clock_nanosleep(rqtp)", ARG3, sizeof(struct vki_timespec) );
2263 if (ARG4 != 0)
2264 PRE_MEM_WRITE( "clock_nanosleep(rmtp)", ARG4, sizeof(struct vki_timespec) );
2265}
2266POST(sys_clock_nanosleep)
2267{
sewardjef1cf8b2006-10-17 01:47:30 +00002268 if (ARG4 != 0 && FAILURE && ERR == VKI_EINTR)
njn1588bc02005-08-26 03:49:43 +00002269 POST_MEM_WRITE( ARG4, sizeof(struct vki_timespec) );
2270}
2271
njn73975482005-08-30 02:45:44 +00002272/* ---------------------------------------------------------------------
2273 timer_* wrappers
2274 ------------------------------------------------------------------ */
2275
njn424c0562005-08-26 03:54:30 +00002276PRE(sys_timer_create)
2277{
florianb26101c2015-08-08 21:45:33 +00002278 PRINT("sys_timer_create( %ld, %#lx, %#lx )", SARG1, ARG2, ARG3);
njn424c0562005-08-26 03:54:30 +00002279 PRE_REG_READ3(long, "timer_create",
2280 vki_clockid_t, clockid, struct sigevent *, evp,
2281 vki_timer_t *, timerid);
mjw40bb7832014-02-24 10:38:45 +00002282 if (ARG2 != 0) {
2283 struct vki_sigevent *evp = (struct vki_sigevent *) ARG2;
2284 PRE_MEM_READ( "timer_create(evp.sigev_value)", (Addr)&evp->sigev_value,
2285 sizeof(vki_sigval_t) );
2286 PRE_MEM_READ( "timer_create(evp.sigev_signo)", (Addr)&evp->sigev_signo,
2287 sizeof(int) );
2288 PRE_MEM_READ( "timer_create(evp.sigev_notify)", (Addr)&evp->sigev_notify,
2289 sizeof(int) );
mjw812e2f92014-02-24 15:09:21 +00002290 if (ML_(safe_to_deref)(&evp->sigev_notify, sizeof(int))
2291 && (evp->sigev_notify & VKI_SIGEV_THREAD_ID) != 0)
mjw40bb7832014-02-24 10:38:45 +00002292 PRE_MEM_READ( "timer_create(evp.sigev_notify_thread_id)",
2293 (Addr)&evp->vki_sigev_notify_thread_id, sizeof(int) );
2294 }
njn424c0562005-08-26 03:54:30 +00002295 PRE_MEM_WRITE( "timer_create(timerid)", ARG3, sizeof(vki_timer_t) );
2296}
2297POST(sys_timer_create)
2298{
2299 POST_MEM_WRITE( ARG3, sizeof(vki_timer_t) );
2300}
2301
2302PRE(sys_timer_settime)
2303{
florianb26101c2015-08-08 21:45:33 +00002304 PRINT("sys_timer_settime( %ld, %ld, %#lx, %#lx )", SARG1,SARG2,ARG3,ARG4);
njn424c0562005-08-26 03:54:30 +00002305 PRE_REG_READ4(long, "timer_settime",
2306 vki_timer_t, timerid, int, flags,
2307 const struct itimerspec *, value,
2308 struct itimerspec *, ovalue);
2309 PRE_MEM_READ( "timer_settime(value)", ARG3,
2310 sizeof(struct vki_itimerspec) );
2311 if (ARG4 != 0)
2312 PRE_MEM_WRITE( "timer_settime(ovalue)", ARG4,
2313 sizeof(struct vki_itimerspec) );
2314}
2315POST(sys_timer_settime)
2316{
2317 if (ARG4 != 0)
2318 POST_MEM_WRITE( ARG4, sizeof(struct vki_itimerspec) );
2319}
2320
2321PRE(sys_timer_gettime)
2322{
florianb26101c2015-08-08 21:45:33 +00002323 PRINT("sys_timer_gettime( %ld, %#lx )", SARG1, ARG2);
njn424c0562005-08-26 03:54:30 +00002324 PRE_REG_READ2(long, "timer_gettime",
2325 vki_timer_t, timerid, struct itimerspec *, value);
2326 PRE_MEM_WRITE( "timer_gettime(value)", ARG2,
2327 sizeof(struct vki_itimerspec));
2328}
2329POST(sys_timer_gettime)
2330{
2331 POST_MEM_WRITE( ARG2, sizeof(struct vki_itimerspec) );
2332}
2333
2334PRE(sys_timer_getoverrun)
2335{
barta0b6b2c2008-07-07 06:49:24 +00002336 PRINT("sys_timer_getoverrun( %#lx )", ARG1);
njn424c0562005-08-26 03:54:30 +00002337 PRE_REG_READ1(long, "timer_getoverrun", vki_timer_t, timerid);
2338}
2339
2340PRE(sys_timer_delete)
2341{
barta0b6b2c2008-07-07 06:49:24 +00002342 PRINT("sys_timer_delete( %#lx )", ARG1);
njn424c0562005-08-26 03:54:30 +00002343 PRE_REG_READ1(long, "timer_delete", vki_timer_t, timerid);
2344}
2345
bart5fc7da22008-04-27 12:56:06 +00002346/* ---------------------------------------------------------------------
2347 timerfd* wrappers
2348 See also http://lwn.net/Articles/260172/ for an overview.
2349 See also /usr/src/linux/fs/timerfd.c for the implementation.
2350 ------------------------------------------------------------------ */
2351
sewardj212d6c92008-05-28 11:06:08 +00002352/* Returns True if running on 2.6.22, else False (or False if
2353 cannot be determined). */
2354static Bool linux_kernel_2_6_22(void)
bartf5ceec82008-04-26 07:45:10 +00002355{
sewardj212d6c92008-05-28 11:06:08 +00002356 static Int result = -1;
2357 Int fd, read;
florianf44ff622014-12-20 16:52:08 +00002358 HChar release[64]; // large enough
sewardj212d6c92008-05-28 11:06:08 +00002359 SysRes res;
bart5fc7da22008-04-27 12:56:06 +00002360
sewardj212d6c92008-05-28 11:06:08 +00002361 if (result == -1) {
2362 res = VG_(open)("/proc/sys/kernel/osrelease", 0, 0);
njncda2f0f2009-05-18 02:12:08 +00002363 if (sr_isError(res))
sewardj212d6c92008-05-28 11:06:08 +00002364 return False;
njncda2f0f2009-05-18 02:12:08 +00002365 fd = sr_Res(res);
sewardj212d6c92008-05-28 11:06:08 +00002366 read = VG_(read)(fd, release, sizeof(release) - 1);
florianf44ff622014-12-20 16:52:08 +00002367 if (read < 0)
2368 return False;
sewardj212d6c92008-05-28 11:06:08 +00002369 release[read] = 0;
2370 VG_(close)(fd);
2371 //VG_(printf)("kernel release = %s\n", release);
florianf44ff622014-12-20 16:52:08 +00002372 result = VG_(strncmp)(release, "2.6.22", 6) == 0
2373 && ! VG_(isdigit)(release[6]);
sewardj212d6c92008-05-28 11:06:08 +00002374 }
2375 vg_assert(result == 0 || result == 1);
2376 return result == 1;
bartf5ceec82008-04-26 07:45:10 +00002377}
bart5fc7da22008-04-27 12:56:06 +00002378
2379PRE(sys_timerfd_create)
bartf5ceec82008-04-26 07:45:10 +00002380{
sewardj212d6c92008-05-28 11:06:08 +00002381 if (linux_kernel_2_6_22()) {
bart5fc7da22008-04-27 12:56:06 +00002382 /* 2.6.22 kernel: timerfd system call. */
florianb26101c2015-08-08 21:45:33 +00002383 PRINT("sys_timerfd ( %ld, %ld, %#lx )", SARG1, SARG2, ARG3);
bart5fc7da22008-04-27 12:56:06 +00002384 PRE_REG_READ3(long, "sys_timerfd",
2385 int, fd, int, clockid, const struct itimerspec *, tmr);
2386 PRE_MEM_READ("timerfd(tmr)", ARG3,
2387 sizeof(struct vki_itimerspec) );
sewardj212d6c92008-05-28 11:06:08 +00002388 if ((Word)ARG1 != -1L && !ML_(fd_allowed)(ARG1, "timerfd", tid, False))
bart5fc7da22008-04-27 12:56:06 +00002389 SET_STATUS_Failure( VKI_EBADF );
sewardj212d6c92008-05-28 11:06:08 +00002390 } else {
bart5fc7da22008-04-27 12:56:06 +00002391 /* 2.6.24 and later kernels: timerfd_create system call. */
florianb26101c2015-08-08 21:45:33 +00002392 PRINT("sys_timerfd_create (%ld, %ld )", SARG1, SARG2);
sewardj212d6c92008-05-28 11:06:08 +00002393 PRE_REG_READ2(long, "timerfd_create", int, clockid, int, flags);
2394 }
bart5fc7da22008-04-27 12:56:06 +00002395}
2396POST(sys_timerfd_create)
2397{
2398 if (linux_kernel_2_6_22())
2399 {
2400 /* 2.6.22 kernel: timerfd system call. */
2401 if (!ML_(fd_allowed)(RES, "timerfd", tid, True)) {
2402 VG_(close)(RES);
2403 SET_STATUS_Failure( VKI_EMFILE );
2404 } else {
2405 if (VG_(clo_track_fds))
2406 ML_(record_fd_open_nameless) (tid, RES);
2407 }
bartf5ceec82008-04-26 07:45:10 +00002408 }
bart5fc7da22008-04-27 12:56:06 +00002409 else
2410 {
2411 /* 2.6.24 and later kernels: timerfd_create system call. */
2412 if (!ML_(fd_allowed)(RES, "timerfd_create", tid, True)) {
2413 VG_(close)(RES);
2414 SET_STATUS_Failure( VKI_EMFILE );
2415 } else {
2416 if (VG_(clo_track_fds))
2417 ML_(record_fd_open_nameless) (tid, RES);
2418 }
2419 }
2420}
2421
2422PRE(sys_timerfd_gettime)
2423{
florianb26101c2015-08-08 21:45:33 +00002424 PRINT("sys_timerfd_gettime ( %ld, %#lx )", SARG1, ARG2);
bart5fc7da22008-04-27 12:56:06 +00002425 PRE_REG_READ2(long, "timerfd_gettime",
2426 int, ufd,
2427 struct vki_itimerspec*, otmr);
2428 if (!ML_(fd_allowed)(ARG1, "timerfd_gettime", tid, False))
2429 SET_STATUS_Failure(VKI_EBADF);
2430 else
2431 PRE_MEM_WRITE("timerfd_gettime(result)",
2432 ARG2, sizeof(struct vki_itimerspec));
2433}
2434POST(sys_timerfd_gettime)
2435{
2436 if (RES == 0)
2437 POST_MEM_WRITE(ARG2, sizeof(struct vki_itimerspec));
2438}
2439
2440PRE(sys_timerfd_settime)
2441{
florianb26101c2015-08-08 21:45:33 +00002442 PRINT("sys_timerfd_settime ( %ld, %ld, %#lx, %#lx )",
2443 SARG1, SARG2, ARG3, ARG4);
bart5fc7da22008-04-27 12:56:06 +00002444 PRE_REG_READ4(long, "timerfd_settime",
2445 int, ufd,
2446 int, flags,
2447 const struct vki_itimerspec*, utmr,
2448 struct vki_itimerspec*, otmr);
2449 if (!ML_(fd_allowed)(ARG1, "timerfd_settime", tid, False))
2450 SET_STATUS_Failure(VKI_EBADF);
2451 else
2452 {
2453 PRE_MEM_READ("timerfd_settime(result)",
2454 ARG3, sizeof(struct vki_itimerspec));
2455 if (ARG4)
2456 {
2457 PRE_MEM_WRITE("timerfd_settime(result)",
2458 ARG4, sizeof(struct vki_itimerspec));
2459 }
2460 }
2461}
2462POST(sys_timerfd_settime)
2463{
2464 if (RES == 0 && ARG4 != 0)
2465 POST_MEM_WRITE(ARG4, sizeof(struct vki_itimerspec));
bartf5ceec82008-04-26 07:45:10 +00002466}
2467
njn73975482005-08-30 02:45:44 +00002468/* ---------------------------------------------------------------------
2469 capabilities wrappers
2470 ------------------------------------------------------------------ */
2471
njn9fe7b122005-08-26 04:03:04 +00002472PRE(sys_capget)
2473{
barta0b6b2c2008-07-07 06:49:24 +00002474 PRINT("sys_capget ( %#lx, %#lx )", ARG1, ARG2 );
njn9fe7b122005-08-26 04:03:04 +00002475 PRE_REG_READ2(long, "capget",
2476 vki_cap_user_header_t, header, vki_cap_user_data_t, data);
2477 PRE_MEM_READ( "capget(header)", ARG1,
2478 sizeof(struct __vki_user_cap_header_struct) );
tom199c15b2012-10-04 21:38:27 +00002479 if (ARG2 != (Addr)NULL)
2480 PRE_MEM_WRITE( "capget(data)", ARG2,
2481 sizeof(struct __vki_user_cap_data_struct) );
njn9fe7b122005-08-26 04:03:04 +00002482}
2483POST(sys_capget)
2484{
2485 if (ARG2 != (Addr)NULL)
2486 POST_MEM_WRITE( ARG2, sizeof(struct __vki_user_cap_data_struct) );
2487}
2488
2489PRE(sys_capset)
2490{
barta0b6b2c2008-07-07 06:49:24 +00002491 PRINT("sys_capset ( %#lx, %#lx )", ARG1, ARG2 );
njn9fe7b122005-08-26 04:03:04 +00002492 PRE_REG_READ2(long, "capset",
2493 vki_cap_user_header_t, header,
2494 const vki_cap_user_data_t, data);
2495 PRE_MEM_READ( "capset(header)",
2496 ARG1, sizeof(struct __vki_user_cap_header_struct) );
2497 PRE_MEM_READ( "capset(data)",
2498 ARG2, sizeof(struct __vki_user_cap_data_struct) );
2499}
2500
njn73975482005-08-30 02:45:44 +00002501/* ---------------------------------------------------------------------
2502 16-bit uid/gid/groups wrappers
2503 ------------------------------------------------------------------ */
2504
njna3b67b72005-08-26 04:27:54 +00002505PRE(sys_getuid16)
2506{
2507 PRINT("sys_getuid16 ( )");
2508 PRE_REG_READ0(long, "getuid16");
2509}
2510
2511PRE(sys_setuid16)
2512{
florianb26101c2015-08-08 21:45:33 +00002513 PRINT("sys_setuid16 ( %lu )", ARG1);
njna3b67b72005-08-26 04:27:54 +00002514 PRE_REG_READ1(long, "setuid16", vki_old_uid_t, uid);
2515}
2516
2517PRE(sys_getgid16)
2518{
2519 PRINT("sys_getgid16 ( )");
2520 PRE_REG_READ0(long, "getgid16");
2521}
2522
2523PRE(sys_setgid16)
2524{
florianb26101c2015-08-08 21:45:33 +00002525 PRINT("sys_setgid16 ( %lu )", ARG1);
njna3b67b72005-08-26 04:27:54 +00002526 PRE_REG_READ1(long, "setgid16", vki_old_gid_t, gid);
2527}
2528
2529PRE(sys_geteuid16)
2530{
2531 PRINT("sys_geteuid16 ( )");
2532 PRE_REG_READ0(long, "geteuid16");
2533}
2534
2535PRE(sys_getegid16)
2536{
2537 PRINT("sys_getegid16 ( )");
2538 PRE_REG_READ0(long, "getegid16");
2539}
2540
2541PRE(sys_setreuid16)
2542{
barta0b6b2c2008-07-07 06:49:24 +00002543 PRINT("setreuid16 ( 0x%lx, 0x%lx )", ARG1, ARG2);
njna3b67b72005-08-26 04:27:54 +00002544 PRE_REG_READ2(long, "setreuid16", vki_old_uid_t, ruid, vki_old_uid_t, euid);
2545}
2546
2547PRE(sys_setregid16)
2548{
florianb26101c2015-08-08 21:45:33 +00002549 PRINT("sys_setregid16 ( %lu, %lu )", ARG1, ARG2);
njna3b67b72005-08-26 04:27:54 +00002550 PRE_REG_READ2(long, "setregid16", vki_old_gid_t, rgid, vki_old_gid_t, egid);
2551}
2552
2553PRE(sys_getgroups16)
2554{
florianb26101c2015-08-08 21:45:33 +00002555 PRINT("sys_getgroups16 ( %ld, %#lx )", SARG1, ARG2);
njna3b67b72005-08-26 04:27:54 +00002556 PRE_REG_READ2(long, "getgroups16", int, size, vki_old_gid_t *, list);
2557 if (ARG1 > 0)
2558 PRE_MEM_WRITE( "getgroups16(list)", ARG2, ARG1 * sizeof(vki_old_gid_t) );
2559}
2560POST(sys_getgroups16)
2561{
2562 vg_assert(SUCCESS);
2563 if (ARG1 > 0 && RES > 0)
2564 POST_MEM_WRITE( ARG2, RES * sizeof(vki_old_gid_t) );
2565}
2566
2567PRE(sys_setgroups16)
2568{
barta0b6b2c2008-07-07 06:49:24 +00002569 PRINT("sys_setgroups16 ( %llu, %#lx )", (ULong)ARG1, ARG2);
njna3b67b72005-08-26 04:27:54 +00002570 PRE_REG_READ2(long, "setgroups16", int, size, vki_old_gid_t *, list);
2571 if (ARG1 > 0)
2572 PRE_MEM_READ( "setgroups16(list)", ARG2, ARG1 * sizeof(vki_old_gid_t) );
2573}
2574
njn73975482005-08-30 02:45:44 +00002575/* ---------------------------------------------------------------------
2576 *chown16 wrappers
2577 ------------------------------------------------------------------ */
2578
njnefc957c2005-08-26 04:36:10 +00002579PRE(sys_chown16)
2580{
barta0b6b2c2008-07-07 06:49:24 +00002581 PRINT("sys_chown16 ( %#lx, 0x%lx, 0x%lx )", ARG1,ARG2,ARG3);
njnefc957c2005-08-26 04:36:10 +00002582 PRE_REG_READ3(long, "chown16",
2583 const char *, path,
2584 vki_old_uid_t, owner, vki_old_gid_t, group);
2585 PRE_MEM_RASCIIZ( "chown16(path)", ARG1 );
2586}
2587
2588PRE(sys_fchown16)
2589{
florianb26101c2015-08-08 21:45:33 +00002590 PRINT("sys_fchown16 ( %lu, %lu, %lu )", ARG1,ARG2,ARG3);
njnefc957c2005-08-26 04:36:10 +00002591 PRE_REG_READ3(long, "fchown16",
2592 unsigned int, fd, vki_old_uid_t, owner, vki_old_gid_t, group);
2593}
2594
njn73975482005-08-30 02:45:44 +00002595/* ---------------------------------------------------------------------
2596 *xattr wrappers
2597 ------------------------------------------------------------------ */
2598
njn65ccc502005-08-30 01:53:54 +00002599PRE(sys_setxattr)
2600{
2601 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00002602 PRINT("sys_setxattr ( %#lx, %#lx, %#lx, %lu, %ld )",
2603 ARG1, ARG2, ARG3, ARG4, SARG5);
njn65ccc502005-08-30 01:53:54 +00002604 PRE_REG_READ5(long, "setxattr",
2605 char *, path, char *, name,
2606 void *, value, vki_size_t, size, int, flags);
2607 PRE_MEM_RASCIIZ( "setxattr(path)", ARG1 );
2608 PRE_MEM_RASCIIZ( "setxattr(name)", ARG2 );
2609 PRE_MEM_READ( "setxattr(value)", ARG3, ARG4 );
2610}
2611
2612PRE(sys_lsetxattr)
2613{
2614 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00002615 PRINT("sys_lsetxattr ( %#lx, %#lx, %#lx, %lu, %ld )",
2616 ARG1, ARG2, ARG3, ARG4, SARG5);
njn65ccc502005-08-30 01:53:54 +00002617 PRE_REG_READ5(long, "lsetxattr",
2618 char *, path, char *, name,
2619 void *, value, vki_size_t, size, int, flags);
2620 PRE_MEM_RASCIIZ( "lsetxattr(path)", ARG1 );
2621 PRE_MEM_RASCIIZ( "lsetxattr(name)", ARG2 );
2622 PRE_MEM_READ( "lsetxattr(value)", ARG3, ARG4 );
2623}
2624
2625PRE(sys_fsetxattr)
2626{
2627 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00002628 PRINT("sys_fsetxattr ( %ld, %#lx, %#lx, %lu, %ld )",
2629 SARG1, ARG2, ARG3, ARG4, SARG5);
njn65ccc502005-08-30 01:53:54 +00002630 PRE_REG_READ5(long, "fsetxattr",
2631 int, fd, char *, name, void *, value,
2632 vki_size_t, size, int, flags);
2633 PRE_MEM_RASCIIZ( "fsetxattr(name)", ARG2 );
2634 PRE_MEM_READ( "fsetxattr(value)", ARG3, ARG4 );
2635}
2636
2637PRE(sys_getxattr)
2638{
2639 *flags |= SfMayBlock;
barta0b6b2c2008-07-07 06:49:24 +00002640 PRINT("sys_getxattr ( %#lx, %#lx, %#lx, %llu )", ARG1,ARG2,ARG3, (ULong)ARG4);
njn65ccc502005-08-30 01:53:54 +00002641 PRE_REG_READ4(ssize_t, "getxattr",
2642 char *, path, char *, name, void *, value, vki_size_t, size);
2643 PRE_MEM_RASCIIZ( "getxattr(path)", ARG1 );
2644 PRE_MEM_RASCIIZ( "getxattr(name)", ARG2 );
2645 PRE_MEM_WRITE( "getxattr(value)", ARG3, ARG4 );
2646}
2647POST(sys_getxattr)
2648{
2649 vg_assert(SUCCESS);
2650 if (RES > 0 && ARG3 != (Addr)NULL) {
2651 POST_MEM_WRITE( ARG3, RES );
2652 }
2653}
2654
2655PRE(sys_lgetxattr)
2656{
2657 *flags |= SfMayBlock;
barta0b6b2c2008-07-07 06:49:24 +00002658 PRINT("sys_lgetxattr ( %#lx, %#lx, %#lx, %llu )", ARG1,ARG2,ARG3, (ULong)ARG4);
njn65ccc502005-08-30 01:53:54 +00002659 PRE_REG_READ4(ssize_t, "lgetxattr",
2660 char *, path, char *, name, void *, value, vki_size_t, size);
2661 PRE_MEM_RASCIIZ( "lgetxattr(path)", ARG1 );
2662 PRE_MEM_RASCIIZ( "lgetxattr(name)", ARG2 );
2663 PRE_MEM_WRITE( "lgetxattr(value)", ARG3, ARG4 );
2664}
2665POST(sys_lgetxattr)
2666{
2667 vg_assert(SUCCESS);
2668 if (RES > 0 && ARG3 != (Addr)NULL) {
2669 POST_MEM_WRITE( ARG3, RES );
2670 }
2671}
2672
2673PRE(sys_fgetxattr)
2674{
2675 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00002676 PRINT("sys_fgetxattr ( %ld, %#lx, %#lx, %lu )", SARG1, ARG2, ARG3, ARG4);
njn65ccc502005-08-30 01:53:54 +00002677 PRE_REG_READ4(ssize_t, "fgetxattr",
2678 int, fd, char *, name, void *, value, vki_size_t, size);
2679 PRE_MEM_RASCIIZ( "fgetxattr(name)", ARG2 );
2680 PRE_MEM_WRITE( "fgetxattr(value)", ARG3, ARG4 );
2681}
2682POST(sys_fgetxattr)
2683{
2684 if (RES > 0 && ARG3 != (Addr)NULL)
2685 POST_MEM_WRITE( ARG3, RES );
2686}
2687
2688PRE(sys_listxattr)
2689{
2690 *flags |= SfMayBlock;
barta0b6b2c2008-07-07 06:49:24 +00002691 PRINT("sys_listxattr ( %#lx, %#lx, %llu )", ARG1, ARG2, (ULong)ARG3);
njn65ccc502005-08-30 01:53:54 +00002692 PRE_REG_READ3(ssize_t, "listxattr",
2693 char *, path, char *, list, vki_size_t, size);
2694 PRE_MEM_RASCIIZ( "listxattr(path)", ARG1 );
2695 PRE_MEM_WRITE( "listxattr(list)", ARG2, ARG3 );
2696}
2697POST(sys_listxattr)
2698{
2699 if (RES > 0 && ARG2 != (Addr)NULL)
2700 POST_MEM_WRITE( ARG2, RES );
2701}
2702
2703PRE(sys_llistxattr)
2704{
2705 *flags |= SfMayBlock;
barta0b6b2c2008-07-07 06:49:24 +00002706 PRINT("sys_llistxattr ( %#lx, %#lx, %llu )", ARG1, ARG2, (ULong)ARG3);
njn65ccc502005-08-30 01:53:54 +00002707 PRE_REG_READ3(ssize_t, "llistxattr",
2708 char *, path, char *, list, vki_size_t, size);
2709 PRE_MEM_RASCIIZ( "llistxattr(path)", ARG1 );
2710 PRE_MEM_WRITE( "llistxattr(list)", ARG2, ARG3 );
2711}
2712POST(sys_llistxattr)
2713{
2714 if (RES > 0 && ARG2 != (Addr)NULL)
2715 POST_MEM_WRITE( ARG2, RES );
2716}
2717
2718PRE(sys_flistxattr)
2719{
2720 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00002721 PRINT("sys_flistxattr ( %ld, %#lx, %lu )", SARG1, ARG2, ARG3);
njn65ccc502005-08-30 01:53:54 +00002722 PRE_REG_READ3(ssize_t, "flistxattr",
2723 int, fd, char *, list, vki_size_t, size);
2724 PRE_MEM_WRITE( "flistxattr(list)", ARG2, ARG3 );
2725}
2726POST(sys_flistxattr)
2727{
2728 if (RES > 0 && ARG2 != (Addr)NULL)
2729 POST_MEM_WRITE( ARG2, RES );
2730}
2731
2732PRE(sys_removexattr)
2733{
2734 *flags |= SfMayBlock;
barta0b6b2c2008-07-07 06:49:24 +00002735 PRINT("sys_removexattr ( %#lx, %#lx )", ARG1, ARG2);
njn65ccc502005-08-30 01:53:54 +00002736 PRE_REG_READ2(long, "removexattr", char *, path, char *, name);
2737 PRE_MEM_RASCIIZ( "removexattr(path)", ARG1 );
2738 PRE_MEM_RASCIIZ( "removexattr(name)", ARG2 );
2739}
2740
2741PRE(sys_lremovexattr)
2742{
2743 *flags |= SfMayBlock;
barta0b6b2c2008-07-07 06:49:24 +00002744 PRINT("sys_lremovexattr ( %#lx, %#lx )", ARG1, ARG2);
njn65ccc502005-08-30 01:53:54 +00002745 PRE_REG_READ2(long, "lremovexattr", char *, path, char *, name);
2746 PRE_MEM_RASCIIZ( "lremovexattr(path)", ARG1 );
2747 PRE_MEM_RASCIIZ( "lremovexattr(name)", ARG2 );
2748}
2749
2750PRE(sys_fremovexattr)
2751{
2752 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00002753 PRINT("sys_fremovexattr ( %ld, %#lx )", SARG1, ARG2);
njn65ccc502005-08-30 01:53:54 +00002754 PRE_REG_READ2(long, "fremovexattr", int, fd, char *, name);
2755 PRE_MEM_RASCIIZ( "fremovexattr(name)", ARG2 );
2756}
2757
njn73975482005-08-30 02:45:44 +00002758/* ---------------------------------------------------------------------
2759 sched_* wrappers
2760 ------------------------------------------------------------------ */
2761
njnb2480c92005-08-30 02:17:23 +00002762PRE(sys_sched_setparam)
2763{
florianb26101c2015-08-08 21:45:33 +00002764 PRINT("sched_setparam ( %ld, %#lx )", SARG1, ARG2 );
njnb2480c92005-08-30 02:17:23 +00002765 PRE_REG_READ2(long, "sched_setparam",
2766 vki_pid_t, pid, struct sched_param *, p);
2767 PRE_MEM_READ( "sched_setparam(p)", ARG2, sizeof(struct vki_sched_param) );
2768}
2769POST(sys_sched_setparam)
2770{
2771 POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) );
2772}
2773
2774PRE(sys_sched_getparam)
2775{
florianb26101c2015-08-08 21:45:33 +00002776 PRINT("sched_getparam ( %ld, %#lx )", SARG1, ARG2 );
njnb2480c92005-08-30 02:17:23 +00002777 PRE_REG_READ2(long, "sched_getparam",
2778 vki_pid_t, pid, struct sched_param *, p);
2779 PRE_MEM_WRITE( "sched_getparam(p)", ARG2, sizeof(struct vki_sched_param) );
2780}
2781POST(sys_sched_getparam)
2782{
2783 POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) );
2784}
2785
2786PRE(sys_sched_getscheduler)
2787{
florianb26101c2015-08-08 21:45:33 +00002788 PRINT("sys_sched_getscheduler ( %ld )", SARG1);
njnb2480c92005-08-30 02:17:23 +00002789 PRE_REG_READ1(long, "sched_getscheduler", vki_pid_t, pid);
2790}
2791
2792PRE(sys_sched_setscheduler)
2793{
florianb26101c2015-08-08 21:45:33 +00002794 PRINT("sys_sched_setscheduler ( %ld, %ld, %#lx )", SARG1, SARG2, ARG3);
njnb2480c92005-08-30 02:17:23 +00002795 PRE_REG_READ3(long, "sched_setscheduler",
2796 vki_pid_t, pid, int, policy, struct sched_param *, p);
2797 if (ARG3 != 0)
2798 PRE_MEM_READ( "sched_setscheduler(p)",
2799 ARG3, sizeof(struct vki_sched_param));
2800}
2801
2802PRE(sys_sched_yield)
2803{
2804 *flags |= SfMayBlock;
2805 PRINT("sched_yield()");
2806 PRE_REG_READ0(long, "sys_sched_yield");
2807}
2808
2809PRE(sys_sched_get_priority_max)
2810{
florianb26101c2015-08-08 21:45:33 +00002811 PRINT("sched_get_priority_max ( %ld )", SARG1);
njnb2480c92005-08-30 02:17:23 +00002812 PRE_REG_READ1(long, "sched_get_priority_max", int, policy);
2813}
2814
2815PRE(sys_sched_get_priority_min)
2816{
florianb26101c2015-08-08 21:45:33 +00002817 PRINT("sched_get_priority_min ( %ld )", SARG1);
njnb2480c92005-08-30 02:17:23 +00002818 PRE_REG_READ1(long, "sched_get_priority_min", int, policy);
2819}
2820
tomb8b48482009-11-24 16:03:19 +00002821PRE(sys_sched_rr_get_interval)
2822{
florianb26101c2015-08-08 21:45:33 +00002823 PRINT("sys_sched_rr_get_interval ( %ld, %#lx )", SARG1, ARG2);
tomb8b48482009-11-24 16:03:19 +00002824 PRE_REG_READ2(int, "sched_rr_get_interval",
2825 vki_pid_t, pid,
2826 struct vki_timespec *, tp);
2827 PRE_MEM_WRITE("sched_rr_get_interval(timespec)",
2828 ARG2, sizeof(struct vki_timespec));
2829}
2830
2831POST(sys_sched_rr_get_interval)
2832{
2833 POST_MEM_WRITE(ARG2, sizeof(struct vki_timespec));
2834}
2835
njnb2480c92005-08-30 02:17:23 +00002836PRE(sys_sched_setaffinity)
2837{
florianb26101c2015-08-08 21:45:33 +00002838 PRINT("sched_setaffinity ( %ld, %lu, %#lx )", SARG1, ARG2, ARG3);
njnb2480c92005-08-30 02:17:23 +00002839 PRE_REG_READ3(long, "sched_setaffinity",
2840 vki_pid_t, pid, unsigned int, len, unsigned long *, mask);
2841 PRE_MEM_READ( "sched_setaffinity(mask)", ARG3, ARG2);
2842}
2843
2844PRE(sys_sched_getaffinity)
2845{
florianb26101c2015-08-08 21:45:33 +00002846 PRINT("sched_getaffinity ( %ld, %lu, %#lx )", SARG1, ARG2, ARG3);
njnb2480c92005-08-30 02:17:23 +00002847 PRE_REG_READ3(long, "sched_getaffinity",
2848 vki_pid_t, pid, unsigned int, len, unsigned long *, mask);
2849 PRE_MEM_WRITE( "sched_getaffinity(mask)", ARG3, ARG2);
2850}
2851POST(sys_sched_getaffinity)
2852{
2853 POST_MEM_WRITE(ARG3, ARG2);
2854}
2855
sewardj8a3377f2014-09-08 11:19:48 +00002856PRE(sys_unshare)
2857{
florianb26101c2015-08-08 21:45:33 +00002858 PRINT("sys_unshare ( %#lx )", ARG1);
2859 PRE_REG_READ1(int, "unshare", unsigned long, flags);
sewardj8a3377f2014-09-08 11:19:48 +00002860}
2861
njncd405ea2005-08-31 02:44:31 +00002862/* ---------------------------------------------------------------------
2863 miscellaneous wrappers
2864 ------------------------------------------------------------------ */
2865
2866PRE(sys_munlockall)
2867{
2868 *flags |= SfMayBlock;
2869 PRINT("sys_munlockall ( )");
2870 PRE_REG_READ0(long, "munlockall");
2871}
2872
njnf4ef1822005-09-24 19:42:41 +00002873// This has different signatures for different platforms.
2874//
2875// x86: int sys_pipe(unsigned long __user *fildes);
2876// AMD64: long sys_pipe(int *fildes);
2877// ppc32: int sys_pipe(int __user *fildes);
2878// ppc64: int sys_pipe(int __user *fildes);
2879//
2880// The type of the argument is most important, and it is an array of 32 bit
2881// values in all cases. (The return type differs across platforms, but it
2882// is not used.) So we use 'int' as its type. This fixed bug #113230 which
2883// was caused by using an array of 'unsigned long's, which didn't work on
2884// AMD64.
njncd405ea2005-08-31 02:44:31 +00002885PRE(sys_pipe)
2886{
barta0b6b2c2008-07-07 06:49:24 +00002887 PRINT("sys_pipe ( %#lx )", ARG1);
njnf4ef1822005-09-24 19:42:41 +00002888 PRE_REG_READ1(int, "pipe", int *, filedes);
2889 PRE_MEM_WRITE( "pipe(filedes)", ARG1, 2*sizeof(int) );
njncd405ea2005-08-31 02:44:31 +00002890}
2891POST(sys_pipe)
2892{
2893 Int *p = (Int *)ARG1;
njncd405ea2005-08-31 02:44:31 +00002894 if (!ML_(fd_allowed)(p[0], "pipe", tid, True) ||
2895 !ML_(fd_allowed)(p[1], "pipe", tid, True)) {
2896 VG_(close)(p[0]);
2897 VG_(close)(p[1]);
2898 SET_STATUS_Failure( VKI_EMFILE );
2899 } else {
2900 POST_MEM_WRITE( ARG1, 2*sizeof(int) );
2901 if (VG_(clo_track_fds)) {
2902 ML_(record_fd_open_nameless)(tid, p[0]);
2903 ML_(record_fd_open_nameless)(tid, p[1]);
2904 }
2905 }
2906}
2907
sewardj586c8152008-11-05 11:20:59 +00002908/* pipe2 (a kernel 2.6.twentysomething invention) is like pipe, except
2909 there's a second arg containing flags to be applied to the new file
2910 descriptors. It hardly seems worth the effort to factor out the
2911 duplicated code, hence: */
2912PRE(sys_pipe2)
2913{
2914 PRINT("sys_pipe2 ( %#lx, %#lx )", ARG1, ARG2);
2915 PRE_REG_READ2(int, "pipe", int *, filedes, long, flags);
2916 PRE_MEM_WRITE( "pipe2(filedes)", ARG1, 2*sizeof(int) );
2917}
2918POST(sys_pipe2)
2919{
2920 Int *p = (Int *)ARG1;
2921 if (!ML_(fd_allowed)(p[0], "pipe2", tid, True) ||
2922 !ML_(fd_allowed)(p[1], "pipe2", tid, True)) {
2923 VG_(close)(p[0]);
2924 VG_(close)(p[1]);
2925 SET_STATUS_Failure( VKI_EMFILE );
2926 } else {
2927 POST_MEM_WRITE( ARG1, 2*sizeof(int) );
2928 if (VG_(clo_track_fds)) {
2929 ML_(record_fd_open_nameless)(tid, p[0]);
2930 ML_(record_fd_open_nameless)(tid, p[1]);
2931 }
2932 }
2933}
2934
tomf43793a2009-11-23 08:19:20 +00002935PRE(sys_dup3)
2936{
florianb26101c2015-08-08 21:45:33 +00002937 PRINT("sys_dup3 ( %lu, %lu, %#lx )", ARG1, ARG2, ARG3);
tomf43793a2009-11-23 08:19:20 +00002938 PRE_REG_READ3(long, "dup3", unsigned int, oldfd, unsigned int, newfd, int, flags);
2939 if (!ML_(fd_allowed)(ARG2, "dup3", tid, True))
2940 SET_STATUS_Failure( VKI_EBADF );
2941}
2942
2943POST(sys_dup3)
2944{
2945 vg_assert(SUCCESS);
2946 if (VG_(clo_track_fds))
2947 ML_(record_fd_open_named)(tid, RES);
2948}
2949
njncd405ea2005-08-31 02:44:31 +00002950PRE(sys_quotactl)
2951{
barta0b6b2c2008-07-07 06:49:24 +00002952 PRINT("sys_quotactl (0x%lx, %#lx, 0x%lx, 0x%lx )", ARG1,ARG2,ARG3, ARG4);
njncd405ea2005-08-31 02:44:31 +00002953 PRE_REG_READ4(long, "quotactl",
2954 unsigned int, cmd, const char *, special, vki_qid_t, id,
2955 void *, addr);
2956 PRE_MEM_RASCIIZ( "quotactl(special)", ARG2 );
2957}
2958
2959PRE(sys_waitid)
2960{
2961 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00002962 PRINT("sys_waitid( %ld, %ld, %#lx, %ld, %#lx )",
2963 SARG1, SARG2, ARG3, SARG4, ARG5);
njncd405ea2005-08-31 02:44:31 +00002964 PRE_REG_READ5(int32_t, "sys_waitid",
2965 int, which, vki_pid_t, pid, struct vki_siginfo *, infop,
2966 int, options, struct vki_rusage *, ru);
2967 PRE_MEM_WRITE( "waitid(infop)", ARG3, sizeof(struct vki_siginfo) );
2968 if (ARG5 != 0)
2969 PRE_MEM_WRITE( "waitid(ru)", ARG5, sizeof(struct vki_rusage) );
2970}
2971POST(sys_waitid)
2972{
2973 POST_MEM_WRITE( ARG3, sizeof(struct vki_siginfo) );
2974 if (ARG5 != 0)
2975 POST_MEM_WRITE( ARG5, sizeof(struct vki_rusage) );
2976}
2977
tomc4e466f2008-01-08 16:31:25 +00002978PRE(sys_sync_file_range)
2979{
sewardjfc2aa032008-06-04 06:49:56 +00002980 *flags |= SfMayBlock;
tomc0fe32a2009-11-25 11:29:14 +00002981#if VG_WORDSIZE == 4
florianb26101c2015-08-08 21:45:33 +00002982 PRINT("sys_sync_file_range ( %ld, %lld, %lld, %#lx )",
2983 SARG1, (Long)MERGE64(ARG2,ARG3), (Long)MERGE64(ARG4,ARG5),ARG6);
tomc0fe32a2009-11-25 11:29:14 +00002984 PRE_REG_READ6(long, "sync_file_range",
2985 int, fd,
2986 unsigned, MERGE64_FIRST(offset), unsigned, MERGE64_SECOND(offset),
2987 unsigned, MERGE64_FIRST(nbytes), unsigned, MERGE64_SECOND(nbytes),
2988 unsigned int, flags);
2989#elif VG_WORDSIZE == 8
florianb26101c2015-08-08 21:45:33 +00002990 PRINT("sys_sync_file_range ( %ld, %ld, %ld, %#lx )",
2991 SARG1, SARG2, SARG3, ARG4);
sewardjfc2aa032008-06-04 06:49:56 +00002992 PRE_REG_READ4(long, "sync_file_range",
2993 int, fd, vki_loff_t, offset, vki_loff_t, nbytes,
2994 unsigned int, flags);
tomc0fe32a2009-11-25 11:29:14 +00002995#else
2996# error Unexpected word size
2997#endif
sewardjfc2aa032008-06-04 06:49:56 +00002998 if (!ML_(fd_allowed)(ARG1, "sync_file_range", tid, False))
2999 SET_STATUS_Failure( VKI_EBADF );
tomc4e466f2008-01-08 16:31:25 +00003000}
3001
tomc0fe32a2009-11-25 11:29:14 +00003002PRE(sys_sync_file_range2)
3003{
3004 *flags |= SfMayBlock;
3005#if VG_WORDSIZE == 4
florianb26101c2015-08-08 21:45:33 +00003006 PRINT("sys_sync_file_range2 ( %ld, %lu, %lld, %lld )",
3007 SARG1, ARG2, (Long)MERGE64(ARG3,ARG4), (Long)MERGE64(ARG5,ARG6));
tomc0fe32a2009-11-25 11:29:14 +00003008 PRE_REG_READ6(long, "sync_file_range2",
3009 int, fd, unsigned int, flags,
3010 unsigned, MERGE64_FIRST(offset), unsigned, MERGE64_SECOND(offset),
3011 unsigned, MERGE64_FIRST(nbytes), unsigned, MERGE64_SECOND(nbytes));
3012#elif VG_WORDSIZE == 8
florianb26101c2015-08-08 21:45:33 +00003013 PRINT("sys_sync_file_range2 ( %ld, %lu, %ld, %ld )",
3014 SARG1, ARG2, SARG3, SARG4);
tomc0fe32a2009-11-25 11:29:14 +00003015 PRE_REG_READ4(long, "sync_file_range2",
3016 int, fd, unsigned int, flags,
3017 vki_loff_t, offset, vki_loff_t, nbytes);
3018#else
3019# error Unexpected word size
3020#endif
3021 if (!ML_(fd_allowed)(ARG1, "sync_file_range2", tid, False))
3022 SET_STATUS_Failure( VKI_EBADF );
3023}
3024
sewardj6d652772008-11-06 23:11:42 +00003025PRE(sys_stime)
3026{
3027 PRINT("sys_stime ( %#lx )", ARG1);
3028 PRE_REG_READ1(int, "stime", vki_time_t*, t);
3029 PRE_MEM_READ( "stime(t)", ARG1, sizeof(vki_time_t) );
3030}
3031
tomc8232f92011-06-08 09:10:40 +00003032PRE(sys_perf_event_open)
tom3fbccee2009-10-27 09:19:26 +00003033{
tomc8232f92011-06-08 09:10:40 +00003034 struct vki_perf_event_attr *attr;
florianb26101c2015-08-08 21:45:33 +00003035 PRINT("sys_perf_event_open ( %#lx, %ld, %ld, %ld, %#lx )",
3036 ARG1, SARG2, SARG3, SARG4, ARG5);
tomc8232f92011-06-08 09:10:40 +00003037 PRE_REG_READ5(long, "perf_event_open",
3038 struct vki_perf_event_attr *, attr,
tom3fbccee2009-10-27 09:19:26 +00003039 vki_pid_t, pid, int, cpu, int, group_fd,
3040 unsigned long, flags);
tomc8232f92011-06-08 09:10:40 +00003041 attr = (struct vki_perf_event_attr *)ARG1;
3042 PRE_MEM_READ( "perf_event_open(attr->size)",
tom9fd3c512011-06-08 09:57:54 +00003043 (Addr)&attr->size, sizeof(attr->size) );
tomc8232f92011-06-08 09:10:40 +00003044 PRE_MEM_READ( "perf_event_open(attr)",
tom9fd3c512011-06-08 09:57:54 +00003045 (Addr)attr, attr->size );
tom3fbccee2009-10-27 09:19:26 +00003046}
3047
tomc8232f92011-06-08 09:10:40 +00003048POST(sys_perf_event_open)
tom3fbccee2009-10-27 09:19:26 +00003049{
3050 vg_assert(SUCCESS);
tomc8232f92011-06-08 09:10:40 +00003051 if (!ML_(fd_allowed)(RES, "perf_event_open", tid, True)) {
tom3fbccee2009-10-27 09:19:26 +00003052 VG_(close)(RES);
3053 SET_STATUS_Failure( VKI_EMFILE );
3054 } else {
3055 if (VG_(clo_track_fds))
3056 ML_(record_fd_open_nameless)(tid, RES);
3057 }
3058}
3059
tom472a34b2010-02-23 10:02:55 +00003060PRE(sys_getcpu)
3061{
3062 PRINT("sys_getcpu ( %#lx, %#lx, %#lx )" , ARG1,ARG2,ARG3);
3063 PRE_REG_READ3(int, "getcpu",
3064 unsigned *, cpu, unsigned *, node, struct vki_getcpu_cache *, tcache);
3065 if (ARG1 != 0)
3066 PRE_MEM_WRITE( "getcpu(cpu)", ARG1, sizeof(unsigned) );
3067 if (ARG2 != 0)
3068 PRE_MEM_WRITE( "getcpu(node)", ARG2, sizeof(unsigned) );
3069 if (ARG3 != 0)
3070 PRE_MEM_WRITE( "getcpu(tcache)", ARG3, sizeof(struct vki_getcpu_cache) );
3071}
3072
3073POST(sys_getcpu)
3074{
3075 if (ARG1 != 0)
3076 POST_MEM_WRITE( ARG1, sizeof(unsigned) );
3077 if (ARG2 != 0)
3078 POST_MEM_WRITE( ARG2, sizeof(unsigned) );
3079 if (ARG3 != 0)
3080 POST_MEM_WRITE( ARG3, sizeof(struct vki_getcpu_cache) );
3081}
3082
tomd5fb58e2012-04-03 10:51:27 +00003083PRE(sys_move_pages)
3084{
florianb26101c2015-08-08 21:45:33 +00003085 PRINT("sys_move_pages ( %ld, %lu, %#lx, %#lx, %#lx, %#lx )",
3086 SARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
tomd5fb58e2012-04-03 10:51:27 +00003087 PRE_REG_READ6(int, "move_pages",
3088 vki_pid_t, pid, unsigned long, nr_pages, const void **, pages,
3089 const int *, nodes, int *, status, int, flags);
3090 PRE_MEM_READ("move_pages(pages)", ARG3, ARG2 * sizeof(void *));
3091 if (ARG4)
3092 PRE_MEM_READ("move_pages(nodes)", ARG4, ARG2 * sizeof(int));
3093 PRE_MEM_WRITE("move_pages(status)", ARG5, ARG2 * sizeof(int));
3094}
3095
3096POST(sys_move_pages)
3097{
3098 POST_MEM_WRITE(ARG5, ARG2 * sizeof(int));
3099}
3100
tome6366712014-11-10 09:55:59 +00003101PRE(sys_getrandom)
3102{
florianb26101c2015-08-08 21:45:33 +00003103 PRINT("sys_getrandom ( %#lx, %lu, %lu )" , ARG1, ARG2, ARG3);
tome6366712014-11-10 09:55:59 +00003104 PRE_REG_READ3(int, "getrandom",
3105 char *, buf, vki_size_t, count, unsigned int, flags);
3106 PRE_MEM_WRITE( "getrandom(cpu)", ARG1, ARG2 );
3107}
3108
3109POST(sys_getrandom)
3110{
3111 POST_MEM_WRITE( ARG1, ARG2 );
3112}
3113
tom9d7592e2015-01-19 21:52:44 +00003114PRE(sys_memfd_create)
3115{
florianb26101c2015-08-08 21:45:33 +00003116 PRINT("sys_memfd_create ( %#lx, %lu )" , ARG1, ARG2);
tom9d7592e2015-01-19 21:52:44 +00003117 PRE_REG_READ2(int, "memfd_create",
3118 char *, uname, unsigned int, flags);
3119 PRE_MEM_RASCIIZ( "memfd_create(uname)", ARG1 );
3120}
3121
3122POST(sys_memfd_create)
3123{
3124 vg_assert(SUCCESS);
3125 if (!ML_(fd_allowed)(RES, "memfd_create", tid, True)) {
3126 VG_(close)(RES);
3127 SET_STATUS_Failure( VKI_EMFILE );
3128 } else {
3129 if (VG_(clo_track_fds))
3130 ML_(record_fd_open_nameless)(tid, RES);
3131 }
3132}
3133
tom9e2645c2015-05-07 18:54:31 +00003134PRE(sys_syncfs)
3135{
3136 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00003137 PRINT("sys_syncfs ( %lu )", ARG1);
tom9e2645c2015-05-07 18:54:31 +00003138 PRE_REG_READ1(long, "syncfs", unsigned int, fd);
3139}
3140
njncd405ea2005-08-31 02:44:31 +00003141/* ---------------------------------------------------------------------
3142 utime wrapper
3143 ------------------------------------------------------------------ */
3144
3145PRE(sys_utime)
3146{
3147 *flags |= SfMayBlock;
barta0b6b2c2008-07-07 06:49:24 +00003148 PRINT("sys_utime ( %#lx, %#lx )", ARG1,ARG2);
njncd405ea2005-08-31 02:44:31 +00003149 PRE_REG_READ2(long, "utime", char *, filename, struct utimbuf *, buf);
3150 PRE_MEM_RASCIIZ( "utime(filename)", ARG1 );
3151 if (ARG2 != 0)
3152 PRE_MEM_READ( "utime(buf)", ARG2, sizeof(struct vki_utimbuf) );
3153}
3154
3155/* ---------------------------------------------------------------------
3156 lseek wrapper
3157 ------------------------------------------------------------------ */
3158
3159PRE(sys_lseek)
3160{
florianb26101c2015-08-08 21:45:33 +00003161 PRINT("sys_lseek ( %lu, %ld, %lu )", ARG1, SARG2, ARG3);
njncd405ea2005-08-31 02:44:31 +00003162 PRE_REG_READ3(vki_off_t, "lseek",
3163 unsigned int, fd, vki_off_t, offset, unsigned int, whence);
3164}
3165
3166/* ---------------------------------------------------------------------
sewardj792e00a2010-10-04 20:03:27 +00003167 readahead wrapper
3168 ------------------------------------------------------------------ */
3169
3170PRE(sys_readahead)
3171{
3172 *flags |= SfMayBlock;
3173#if VG_WORDSIZE == 4
florianb26101c2015-08-08 21:45:33 +00003174 PRINT("sys_readahead ( %ld, %lld, %lu )",
3175 SARG1, (Long)MERGE64(ARG2,ARG3), ARG4);
sewardj792e00a2010-10-04 20:03:27 +00003176 PRE_REG_READ4(vki_off_t, "readahead",
3177 int, fd, unsigned, MERGE64_FIRST(offset),
3178 unsigned, MERGE64_SECOND(offset), vki_size_t, count);
3179#elif VG_WORDSIZE == 8
florianb26101c2015-08-08 21:45:33 +00003180 PRINT("sys_readahead ( %ld, %ld, %lu )", SARG1, SARG2, ARG3);
sewardj792e00a2010-10-04 20:03:27 +00003181 PRE_REG_READ3(vki_off_t, "readahead",
3182 int, fd, vki_loff_t, offset, vki_size_t, count);
3183#else
3184# error Unexpected word size
3185#endif
3186 if (!ML_(fd_allowed)(ARG1, "readahead", tid, False))
3187 SET_STATUS_Failure( VKI_EBADF );
3188}
3189
3190/* ---------------------------------------------------------------------
njncd405ea2005-08-31 02:44:31 +00003191 sig* wrappers
3192 ------------------------------------------------------------------ */
3193
3194PRE(sys_sigpending)
3195{
barta0b6b2c2008-07-07 06:49:24 +00003196 PRINT( "sys_sigpending ( %#lx )", ARG1 );
njncd405ea2005-08-31 02:44:31 +00003197 PRE_REG_READ1(long, "sigpending", vki_old_sigset_t *, set);
3198 PRE_MEM_WRITE( "sigpending(set)", ARG1, sizeof(vki_old_sigset_t));
3199}
3200POST(sys_sigpending)
3201{
3202 POST_MEM_WRITE( ARG1, sizeof(vki_old_sigset_t) ) ;
3203}
3204
3205// This syscall is not used on amd64/Linux -- it only provides
3206// sys_rt_sigprocmask, which uses sigset_t rather than old_sigset_t.
3207// This wrapper is only suitable for 32-bit architectures.
3208// (XXX: so how is it that PRE(sys_sigpending) above doesn't need
3209// conditional compilation like this?)
petarj13edb6a2012-06-21 17:33:35 +00003210#if defined(VGP_x86_linux) || defined(VGP_ppc32_linux) \
3211 || defined(VGP_arm_linux) || defined(VGP_mips32_linux)
njncd405ea2005-08-31 02:44:31 +00003212PRE(sys_sigprocmask)
3213{
3214 vki_old_sigset_t* set;
3215 vki_old_sigset_t* oldset;
3216 vki_sigset_t bigger_set;
3217 vki_sigset_t bigger_oldset;
3218
florianb26101c2015-08-08 21:45:33 +00003219 PRINT("sys_sigprocmask ( %ld, %#lx, %#lx )", SARG1, ARG2, ARG3);
njncd405ea2005-08-31 02:44:31 +00003220 PRE_REG_READ3(long, "sigprocmask",
3221 int, how, vki_old_sigset_t *, set, vki_old_sigset_t *, oldset);
3222 if (ARG2 != 0)
3223 PRE_MEM_READ( "sigprocmask(set)", ARG2, sizeof(vki_old_sigset_t));
3224 if (ARG3 != 0)
3225 PRE_MEM_WRITE( "sigprocmask(oldset)", ARG3, sizeof(vki_old_sigset_t));
3226
3227 // Nb: We must convert the smaller vki_old_sigset_t params into bigger
3228 // vki_sigset_t params.
3229 set = (vki_old_sigset_t*)ARG2;
3230 oldset = (vki_old_sigset_t*)ARG3;
3231
3232 VG_(memset)(&bigger_set, 0, sizeof(vki_sigset_t));
3233 VG_(memset)(&bigger_oldset, 0, sizeof(vki_sigset_t));
3234 if (set)
3235 bigger_set.sig[0] = *(vki_old_sigset_t*)set;
3236
3237 SET_STATUS_from_SysRes(
3238 VG_(do_sys_sigprocmask) ( tid, ARG1 /*how*/,
3239 set ? &bigger_set : NULL,
3240 oldset ? &bigger_oldset : NULL)
3241 );
3242
3243 if (oldset)
3244 *oldset = bigger_oldset.sig[0];
3245
3246 if (SUCCESS)
3247 *flags |= SfPollAfter;
3248}
3249POST(sys_sigprocmask)
3250{
3251 vg_assert(SUCCESS);
3252 if (RES == 0 && ARG3 != 0)
3253 POST_MEM_WRITE( ARG3, sizeof(vki_old_sigset_t));
3254}
sewardjde9264c2011-07-11 17:48:24 +00003255
3256/* Convert from non-RT to RT sigset_t's */
3257static
3258void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigset_t *set)
3259{
3260 VG_(sigemptyset)(set);
3261 set->sig[0] = *oldset;
3262}
3263PRE(sys_sigaction)
3264{
3265 vki_sigaction_toK_t new, *newp;
3266 vki_sigaction_fromK_t old, *oldp;
3267
florianb26101c2015-08-08 21:45:33 +00003268 PRINT("sys_sigaction ( %ld, %#lx, %#lx )", SARG1, ARG2, ARG3);
sewardjde9264c2011-07-11 17:48:24 +00003269 PRE_REG_READ3(int, "sigaction",
3270 int, signum, const struct old_sigaction *, act,
3271 struct old_sigaction *, oldact);
3272
3273 newp = oldp = NULL;
3274
3275 if (ARG2 != 0) {
3276 struct vki_old_sigaction *sa = (struct vki_old_sigaction *)ARG2;
3277 PRE_MEM_READ( "sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
3278 PRE_MEM_READ( "sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
3279 PRE_MEM_READ( "sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
Elliott Hughesa0664b92017-04-18 17:46:52 -07003280 if (ML_(safe_to_deref)(sa,sizeof(sa))
sewardjde9264c2011-07-11 17:48:24 +00003281 && (sa->sa_flags & VKI_SA_RESTORER))
3282 PRE_MEM_READ( "sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
3283 }
3284
3285 if (ARG3 != 0) {
3286 PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction));
3287 oldp = &old;
3288 }
3289
Elliott Hughesa0664b92017-04-18 17:46:52 -07003290 /* If the new or old sigaction is not NULL, but the structs
3291 aren't accessible then sigaction returns EFAULT and we cannot
3292 use either struct for our own bookkeeping. Just fail early. */
3293 if (ARG2 != 0
3294 && ! ML_(safe_to_deref)((void *)ARG2,
3295 sizeof(struct vki_old_sigaction))) {
3296 VG_(umsg)("Warning: bad act handler address %p in sigaction()\n",
3297 (void *)ARG2);
3298 SET_STATUS_Failure ( VKI_EFAULT );
3299 } else if ((ARG3 != 0
3300 && ! ML_(safe_to_deref)((void *)ARG3,
3301 sizeof(struct vki_old_sigaction)))) {
3302 VG_(umsg)("Warning: bad oldact handler address %p in sigaction()\n",
3303 (void *)ARG3);
3304 SET_STATUS_Failure ( VKI_EFAULT );
3305 } else {
3306 if (ARG2 != 0) {
3307 struct vki_old_sigaction *oldnew = (struct vki_old_sigaction *)ARG2;
sewardjde9264c2011-07-11 17:48:24 +00003308
Elliott Hughesa0664b92017-04-18 17:46:52 -07003309 new.ksa_handler = oldnew->ksa_handler;
3310 new.sa_flags = oldnew->sa_flags;
3311 new.sa_restorer = oldnew->sa_restorer;
3312 convert_sigset_to_rt(&oldnew->sa_mask, &new.sa_mask);
3313 newp = &new;
3314 }
sewardjde9264c2011-07-11 17:48:24 +00003315
Elliott Hughesa0664b92017-04-18 17:46:52 -07003316 SET_STATUS_from_SysRes( VG_(do_sys_sigaction)(ARG1, newp, oldp) );
sewardjde9264c2011-07-11 17:48:24 +00003317
Elliott Hughesa0664b92017-04-18 17:46:52 -07003318 if (ARG3 != 0 && SUCCESS && RES == 0) {
3319 struct vki_old_sigaction *oldold = (struct vki_old_sigaction *)ARG3;
sewardjde9264c2011-07-11 17:48:24 +00003320
Elliott Hughesa0664b92017-04-18 17:46:52 -07003321 oldold->ksa_handler = oldp->ksa_handler;
3322 oldold->sa_flags = oldp->sa_flags;
3323 oldold->sa_restorer = oldp->sa_restorer;
3324 oldold->sa_mask = oldp->sa_mask.sig[0];
3325 }
3326 }
sewardjde9264c2011-07-11 17:48:24 +00003327}
3328POST(sys_sigaction)
3329{
3330 vg_assert(SUCCESS);
3331 if (RES == 0 && ARG3 != 0)
3332 POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
3333}
njncd405ea2005-08-31 02:44:31 +00003334#endif
3335
bartf5ceec82008-04-26 07:45:10 +00003336PRE(sys_signalfd)
3337{
tom6c67ef52009-01-09 16:42:51 +00003338 PRINT("sys_signalfd ( %d, %#lx, %llu )", (Int)ARG1,ARG2,(ULong)ARG3);
bartf5ceec82008-04-26 07:45:10 +00003339 PRE_REG_READ3(long, "sys_signalfd",
3340 int, fd, vki_sigset_t *, sigmask, vki_size_t, sigsetsize);
3341 PRE_MEM_READ( "signalfd(sigmask)", ARG2, sizeof(vki_sigset_t) );
bart58cac552008-05-26 17:16:08 +00003342 if ((int)ARG1 != -1 && !ML_(fd_allowed)(ARG1, "signalfd", tid, False))
bartf5ceec82008-04-26 07:45:10 +00003343 SET_STATUS_Failure( VKI_EBADF );
3344}
3345POST(sys_signalfd)
3346{
3347 if (!ML_(fd_allowed)(RES, "signalfd", tid, True)) {
3348 VG_(close)(RES);
3349 SET_STATUS_Failure( VKI_EMFILE );
3350 } else {
3351 if (VG_(clo_track_fds))
3352 ML_(record_fd_open_nameless) (tid, RES);
3353 }
3354}
3355
tom6c67ef52009-01-09 16:42:51 +00003356PRE(sys_signalfd4)
3357{
florianb26101c2015-08-08 21:45:33 +00003358 PRINT("sys_signalfd4 ( %ld, %#lx, %lu, %ld )", SARG1, ARG2, ARG3, SARG4);
tom6c67ef52009-01-09 16:42:51 +00003359 PRE_REG_READ4(long, "sys_signalfd4",
3360 int, fd, vki_sigset_t *, sigmask, vki_size_t, sigsetsize, int, flags);
3361 PRE_MEM_READ( "signalfd(sigmask)", ARG2, sizeof(vki_sigset_t) );
3362 if ((int)ARG1 != -1 && !ML_(fd_allowed)(ARG1, "signalfd", tid, False))
3363 SET_STATUS_Failure( VKI_EBADF );
3364}
3365POST(sys_signalfd4)
3366{
3367 if (!ML_(fd_allowed)(RES, "signalfd4", tid, True)) {
3368 VG_(close)(RES);
3369 SET_STATUS_Failure( VKI_EMFILE );
3370 } else {
3371 if (VG_(clo_track_fds))
3372 ML_(record_fd_open_nameless) (tid, RES);
3373 }
3374}
3375
bartf5ceec82008-04-26 07:45:10 +00003376
njncd405ea2005-08-31 02:44:31 +00003377/* ---------------------------------------------------------------------
3378 rt_sig* wrappers
3379 ------------------------------------------------------------------ */
3380
3381PRE(sys_rt_sigaction)
3382{
florianb26101c2015-08-08 21:45:33 +00003383 PRINT("sys_rt_sigaction ( %ld, %#lx, %#lx, %lu )", SARG1, ARG2, ARG3, ARG4);
njncd405ea2005-08-31 02:44:31 +00003384 PRE_REG_READ4(long, "rt_sigaction",
3385 int, signum, const struct sigaction *, act,
3386 struct sigaction *, oldact, vki_size_t, sigsetsize);
3387
3388 if (ARG2 != 0) {
njncda2f0f2009-05-18 02:12:08 +00003389 vki_sigaction_toK_t *sa = (vki_sigaction_toK_t *)ARG2;
njncd405ea2005-08-31 02:44:31 +00003390 PRE_MEM_READ( "rt_sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
3391 PRE_MEM_READ( "rt_sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
3392 PRE_MEM_READ( "rt_sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
Elliott Hughesa0664b92017-04-18 17:46:52 -07003393 if (ML_(safe_to_deref)(sa,sizeof(sa))
3394 && (sa->sa_flags & VKI_SA_RESTORER))
njncd405ea2005-08-31 02:44:31 +00003395 PRE_MEM_READ( "rt_sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
3396 }
3397 if (ARG3 != 0)
njncda2f0f2009-05-18 02:12:08 +00003398 PRE_MEM_WRITE( "rt_sigaction(oldact)", ARG3, sizeof(vki_sigaction_fromK_t));
njncd405ea2005-08-31 02:44:31 +00003399
Elliott Hughesa0664b92017-04-18 17:46:52 -07003400 /* If the new or old sigaction is not NULL, but the structs
3401 aren't accessible then sigaction returns EFAULT and we cannot
3402 use either struct for our own bookkeeping. Just fail early. */
3403 if (ARG2 != 0
3404 && ! ML_(safe_to_deref)((void *)ARG2,
3405 sizeof(vki_sigaction_toK_t))) {
3406 VG_(umsg)("Warning: bad act handler address %p in rt_sigaction()\n",
3407 (void *)ARG2);
3408 SET_STATUS_Failure ( VKI_EFAULT );
3409 } else if ((ARG3 != 0
3410 && ! ML_(safe_to_deref)((void *)ARG3,
3411 sizeof(vki_sigaction_fromK_t)))) {
3412 VG_(umsg)("Warning: bad oldact handler address %p in rt_sigaction()\n",
3413 (void *)ARG3);
3414 SET_STATUS_Failure ( VKI_EFAULT );
3415 } else {
njncd405ea2005-08-31 02:44:31 +00003416
Elliott Hughesa0664b92017-04-18 17:46:52 -07003417 // XXX: doesn't seem right to be calling do_sys_sigaction for
3418 // sys_rt_sigaction... perhaps this function should be renamed
3419 // VG_(do_sys_rt_sigaction)() --njn
3420
3421 SET_STATUS_from_SysRes(
3422 VG_(do_sys_sigaction)(ARG1, (const vki_sigaction_toK_t *)ARG2,
3423 (vki_sigaction_fromK_t *)ARG3)
3424 );
3425 }
njncd405ea2005-08-31 02:44:31 +00003426}
3427POST(sys_rt_sigaction)
3428{
3429 vg_assert(SUCCESS);
3430 if (RES == 0 && ARG3 != 0)
njncda2f0f2009-05-18 02:12:08 +00003431 POST_MEM_WRITE( ARG3, sizeof(vki_sigaction_fromK_t));
njncd405ea2005-08-31 02:44:31 +00003432}
3433
3434PRE(sys_rt_sigprocmask)
3435{
florianb26101c2015-08-08 21:45:33 +00003436 PRINT("sys_rt_sigprocmask ( %ld, %#lx, %#lx, %lu )",
3437 SARG1, ARG2, ARG3, ARG4);
njncd405ea2005-08-31 02:44:31 +00003438 PRE_REG_READ4(long, "rt_sigprocmask",
3439 int, how, vki_sigset_t *, set, vki_sigset_t *, oldset,
3440 vki_size_t, sigsetsize);
3441 if (ARG2 != 0)
3442 PRE_MEM_READ( "rt_sigprocmask(set)", ARG2, sizeof(vki_sigset_t));
3443 if (ARG3 != 0)
3444 PRE_MEM_WRITE( "rt_sigprocmask(oldset)", ARG3, sizeof(vki_sigset_t));
3445
3446 // Like the kernel, we fail if the sigsetsize is not exactly what we expect.
Elliott Hughesa0664b92017-04-18 17:46:52 -07003447 // Since we want to use the set and oldset for bookkeeping we also want
3448 // to make sure they are addressable otherwise, like the kernel, we EFAULT.
njncd405ea2005-08-31 02:44:31 +00003449 if (sizeof(vki_sigset_t) != ARG4)
Elliott Hughesa0664b92017-04-18 17:46:52 -07003450 SET_STATUS_Failure( VKI_EINVAL );
3451 else if (ARG2 != 0
3452 && ! ML_(safe_to_deref)((void *)ARG2, sizeof(vki_sigset_t))) {
3453 VG_(dmsg)("Warning: Bad set handler address %p in sigprocmask\n",
3454 (void *)ARG2);
3455 SET_STATUS_Failure ( VKI_EFAULT );
3456 }
3457 else if (ARG3 != 0
3458 && ! ML_(safe_to_deref)((void *)ARG3, sizeof(vki_sigset_t))) {
3459 VG_(dmsg)("Warning: Bad oldset address %p in sigprocmask\n",
3460 (void *)ARG3);
3461 SET_STATUS_Failure ( VKI_EFAULT );
3462 }
3463
njncd405ea2005-08-31 02:44:31 +00003464 else {
3465 SET_STATUS_from_SysRes(
3466 VG_(do_sys_sigprocmask) ( tid, ARG1 /*how*/,
3467 (vki_sigset_t*) ARG2,
3468 (vki_sigset_t*) ARG3 )
3469 );
3470 }
3471
3472 if (SUCCESS)
3473 *flags |= SfPollAfter;
3474}
3475POST(sys_rt_sigprocmask)
3476{
3477 vg_assert(SUCCESS);
3478 if (RES == 0 && ARG3 != 0)
3479 POST_MEM_WRITE( ARG3, sizeof(vki_sigset_t));
3480}
3481
3482PRE(sys_rt_sigpending)
3483{
barta0b6b2c2008-07-07 06:49:24 +00003484 PRINT( "sys_rt_sigpending ( %#lx )", ARG1 );
njncd405ea2005-08-31 02:44:31 +00003485 PRE_REG_READ2(long, "rt_sigpending",
3486 vki_sigset_t *, set, vki_size_t, sigsetsize);
3487 PRE_MEM_WRITE( "rt_sigpending(set)", ARG1, sizeof(vki_sigset_t));
3488}
3489POST(sys_rt_sigpending)
3490{
3491 POST_MEM_WRITE( ARG1, sizeof(vki_sigset_t) ) ;
3492}
3493
3494PRE(sys_rt_sigtimedwait)
3495{
3496 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00003497 PRINT("sys_rt_sigtimedwait ( %#lx, %#lx, %#lx, %lu )",
3498 ARG1, ARG2, ARG3, ARG4);
njncd405ea2005-08-31 02:44:31 +00003499 PRE_REG_READ4(long, "rt_sigtimedwait",
3500 const vki_sigset_t *, set, vki_siginfo_t *, info,
3501 const struct timespec *, timeout, vki_size_t, sigsetsize);
3502 if (ARG1 != 0)
3503 PRE_MEM_READ( "rt_sigtimedwait(set)", ARG1, sizeof(vki_sigset_t));
3504 if (ARG2 != 0)
3505 PRE_MEM_WRITE( "rt_sigtimedwait(info)", ARG2, sizeof(vki_siginfo_t) );
3506 if (ARG3 != 0)
3507 PRE_MEM_READ( "rt_sigtimedwait(timeout)",
3508 ARG3, sizeof(struct vki_timespec) );
3509}
3510POST(sys_rt_sigtimedwait)
3511{
3512 if (ARG2 != 0)
3513 POST_MEM_WRITE( ARG2, sizeof(vki_siginfo_t) );
3514}
3515
3516PRE(sys_rt_sigqueueinfo)
3517{
florianb26101c2015-08-08 21:45:33 +00003518 PRINT("sys_rt_sigqueueinfo(%ld, %ld, %#lx)", SARG1, SARG2, ARG3);
njncd405ea2005-08-31 02:44:31 +00003519 PRE_REG_READ3(long, "rt_sigqueueinfo",
3520 int, pid, int, sig, vki_siginfo_t *, uinfo);
3521 if (ARG2 != 0)
bart89e070c2009-10-28 10:15:06 +00003522 PRE_MEM_READ( "rt_sigqueueinfo(uinfo)", ARG3, VKI_SI_MAX_SIZE );
njncd405ea2005-08-31 02:44:31 +00003523}
3524POST(sys_rt_sigqueueinfo)
3525{
3526 if (!ML_(client_signal_OK)(ARG2))
3527 SET_STATUS_Failure( VKI_EINVAL );
3528}
3529
tomd18b5412009-11-24 16:08:40 +00003530PRE(sys_rt_tgsigqueueinfo)
3531{
florianb26101c2015-08-08 21:45:33 +00003532 PRINT("sys_rt_tgsigqueueinfo(%ld, %ld, %ld, %#lx)",
3533 SARG1, SARG2, SARG3, ARG4);
tomd18b5412009-11-24 16:08:40 +00003534 PRE_REG_READ4(long, "rt_tgsigqueueinfo",
3535 int, tgid, int, pid, int, sig, vki_siginfo_t *, uinfo);
3536 if (ARG3 != 0)
3537 PRE_MEM_READ( "rt_tgsigqueueinfo(uinfo)", ARG4, VKI_SI_MAX_SIZE );
3538}
3539
3540POST(sys_rt_tgsigqueueinfo)
3541{
3542 if (!ML_(client_signal_OK)(ARG3))
3543 SET_STATUS_Failure( VKI_EINVAL );
3544}
3545
njncd405ea2005-08-31 02:44:31 +00003546// XXX: x86-specific? The kernel prototypes for the different archs are
3547// hard to decipher.
3548PRE(sys_rt_sigsuspend)
3549{
3550 /* The C library interface to sigsuspend just takes a pointer to
3551 a signal mask but this system call has two arguments - a pointer
3552 to the mask and the number of bytes used by it. The kernel insists
3553 on the size being equal to sizeof(sigset_t) however and will just
3554 return EINVAL if it isn't.
3555 */
3556 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00003557 PRINT("sys_rt_sigsuspend ( %#lx, %lu )", ARG1, ARG2 );
njncd405ea2005-08-31 02:44:31 +00003558 PRE_REG_READ2(int, "rt_sigsuspend", vki_sigset_t *, mask, vki_size_t, size)
3559 if (ARG1 != (Addr)NULL) {
3560 PRE_MEM_READ( "rt_sigsuspend(mask)", ARG1, sizeof(vki_sigset_t) );
3561 }
3562}
3563
3564/* ---------------------------------------------------------------------
3565 linux msg* wrapper helpers
3566 ------------------------------------------------------------------ */
3567
3568void
3569ML_(linux_PRE_sys_msgsnd) ( ThreadId tid,
3570 UWord arg0, UWord arg1, UWord arg2, UWord arg3 )
3571{
3572 /* int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg); */
3573 struct vki_msgbuf *msgp = (struct vki_msgbuf *)arg1;
3574 PRE_MEM_READ( "msgsnd(msgp->mtype)", (Addr)&msgp->mtype, sizeof(msgp->mtype) );
3575 PRE_MEM_READ( "msgsnd(msgp->mtext)", (Addr)&msgp->mtext, arg2 );
3576}
3577
3578void
3579ML_(linux_PRE_sys_msgrcv) ( ThreadId tid,
3580 UWord arg0, UWord arg1, UWord arg2,
3581 UWord arg3, UWord arg4 )
3582{
3583 /* ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz,
3584 long msgtyp, int msgflg); */
3585 struct vki_msgbuf *msgp = (struct vki_msgbuf *)arg1;
3586 PRE_MEM_WRITE( "msgrcv(msgp->mtype)", (Addr)&msgp->mtype, sizeof(msgp->mtype) );
3587 PRE_MEM_WRITE( "msgrcv(msgp->mtext)", (Addr)&msgp->mtext, arg2 );
3588}
3589void
3590ML_(linux_POST_sys_msgrcv) ( ThreadId tid,
3591 UWord res,
3592 UWord arg0, UWord arg1, UWord arg2,
3593 UWord arg3, UWord arg4 )
3594{
3595 struct vki_msgbuf *msgp = (struct vki_msgbuf *)arg1;
3596 POST_MEM_WRITE( (Addr)&msgp->mtype, sizeof(msgp->mtype) );
3597 POST_MEM_WRITE( (Addr)&msgp->mtext, res );
3598}
3599
3600void
3601ML_(linux_PRE_sys_msgctl) ( ThreadId tid,
3602 UWord arg0, UWord arg1, UWord arg2 )
3603{
3604 /* int msgctl(int msqid, int cmd, struct msqid_ds *buf); */
3605 switch (arg1 /* cmd */) {
3606 case VKI_IPC_INFO:
3607 case VKI_MSG_INFO:
3608 case VKI_IPC_INFO|VKI_IPC_64:
3609 case VKI_MSG_INFO|VKI_IPC_64:
3610 PRE_MEM_WRITE( "msgctl(IPC_INFO, buf)",
3611 arg2, sizeof(struct vki_msginfo) );
3612 break;
3613 case VKI_IPC_STAT:
3614 case VKI_MSG_STAT:
3615 PRE_MEM_WRITE( "msgctl(IPC_STAT, buf)",
3616 arg2, sizeof(struct vki_msqid_ds) );
3617 break;
3618 case VKI_IPC_STAT|VKI_IPC_64:
3619 case VKI_MSG_STAT|VKI_IPC_64:
3620 PRE_MEM_WRITE( "msgctl(IPC_STAT, arg.buf)",
3621 arg2, sizeof(struct vki_msqid64_ds) );
3622 break;
3623 case VKI_IPC_SET:
3624 PRE_MEM_READ( "msgctl(IPC_SET, arg.buf)",
3625 arg2, sizeof(struct vki_msqid_ds) );
3626 break;
3627 case VKI_IPC_SET|VKI_IPC_64:
3628 PRE_MEM_READ( "msgctl(IPC_SET, arg.buf)",
3629 arg2, sizeof(struct vki_msqid64_ds) );
3630 break;
3631 }
3632}
3633void
3634ML_(linux_POST_sys_msgctl) ( ThreadId tid,
3635 UWord res,
3636 UWord arg0, UWord arg1, UWord arg2 )
3637{
3638 switch (arg1 /* cmd */) {
3639 case VKI_IPC_INFO:
3640 case VKI_MSG_INFO:
3641 case VKI_IPC_INFO|VKI_IPC_64:
3642 case VKI_MSG_INFO|VKI_IPC_64:
3643 POST_MEM_WRITE( arg2, sizeof(struct vki_msginfo) );
3644 break;
3645 case VKI_IPC_STAT:
3646 case VKI_MSG_STAT:
3647 POST_MEM_WRITE( arg2, sizeof(struct vki_msqid_ds) );
3648 break;
3649 case VKI_IPC_STAT|VKI_IPC_64:
3650 case VKI_MSG_STAT|VKI_IPC_64:
3651 POST_MEM_WRITE( arg2, sizeof(struct vki_msqid64_ds) );
3652 break;
3653 }
3654}
3655
tom363ec762006-03-21 10:58:35 +00003656/* ---------------------------------------------------------------------
philippe4eefc8c2012-10-21 20:21:17 +00003657 Generic handler for sys_ipc
3658 Depending on the platform, some syscalls (e.g. semctl, semop, ...)
3659 are either direct system calls, or are all implemented via sys_ipc.
3660 ------------------------------------------------------------------ */
3661#ifdef __NR_ipc
florian87e0a642012-11-18 22:15:22 +00003662static Addr deref_Addr ( ThreadId tid, Addr a, const HChar* s )
philippe4eefc8c2012-10-21 20:21:17 +00003663{
3664 Addr* a_p = (Addr*)a;
3665 PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
3666 return *a_p;
3667}
3668
philippef2a7bbe2012-11-04 20:40:33 +00003669static Bool semctl_cmd_has_4args (UWord cmd)
philippe228552d2012-10-23 21:38:52 +00003670{
3671 switch (cmd & ~VKI_IPC_64)
3672 {
3673 case VKI_IPC_INFO:
3674 case VKI_SEM_INFO:
3675 case VKI_IPC_STAT:
3676 case VKI_SEM_STAT:
3677 case VKI_IPC_SET:
3678 case VKI_GETALL:
3679 case VKI_SETALL:
3680 return True;
3681 default:
3682 return False;
3683 }
3684}
3685
philippe4eefc8c2012-10-21 20:21:17 +00003686PRE(sys_ipc)
3687{
florianb26101c2015-08-08 21:45:33 +00003688 PRINT("sys_ipc ( %lu, %ld, %ld, %ld, %#lx, %ld )",
3689 ARG1, SARG2, SARG3, SARG4, ARG5, SARG6);
philippe4eefc8c2012-10-21 20:21:17 +00003690
3691 switch (ARG1 /* call */) {
3692 case VKI_SEMOP:
petarj73a0e192012-10-26 16:16:43 +00003693 PRE_REG_READ5(int, "ipc",
3694 vki_uint, call, int, first, int, second, int, third,
3695 void *, ptr);
philippe4eefc8c2012-10-21 20:21:17 +00003696 ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
3697 *flags |= SfMayBlock;
3698 break;
3699 case VKI_SEMGET:
petarj73a0e192012-10-26 16:16:43 +00003700 PRE_REG_READ4(int, "ipc",
3701 vki_uint, call, int, first, int, second, int, third);
philippe4eefc8c2012-10-21 20:21:17 +00003702 break;
3703 case VKI_SEMCTL:
3704 {
petarj73a0e192012-10-26 16:16:43 +00003705 PRE_REG_READ5(int, "ipc",
3706 vki_uint, call, int, first, int, second, int, third,
3707 void *, ptr);
philippe228552d2012-10-23 21:38:52 +00003708 UWord arg;
3709 if (semctl_cmd_has_4args(ARG4))
3710 arg = deref_Addr( tid, ARG5, "semctl(arg)" );
3711 else
3712 arg = 0;
philippe4eefc8c2012-10-21 20:21:17 +00003713 ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
3714 break;
3715 }
3716 case VKI_SEMTIMEDOP:
petarj73a0e192012-10-26 16:16:43 +00003717 PRE_REG_READ6(int, "ipc",
3718 vki_uint, call, int, first, int, second, int, third,
3719 void *, ptr, long, fifth);
philippe4eefc8c2012-10-21 20:21:17 +00003720 ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
3721 *flags |= SfMayBlock;
3722 break;
3723 case VKI_MSGSND:
petarj73a0e192012-10-26 16:16:43 +00003724 PRE_REG_READ5(int, "ipc",
3725 vki_uint, call, int, first, int, second, int, third,
3726 void *, ptr);
philippe4eefc8c2012-10-21 20:21:17 +00003727 ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
3728 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
3729 *flags |= SfMayBlock;
3730 break;
3731 case VKI_MSGRCV:
3732 {
petarj73a0e192012-10-26 16:16:43 +00003733 PRE_REG_READ5(int, "ipc",
3734 vki_uint, call, int, first, int, second, int, third,
3735 void *, ptr);
philippe4eefc8c2012-10-21 20:21:17 +00003736 Addr msgp;
3737 Word msgtyp;
3738
petarj73a0e192012-10-26 16:16:43 +00003739 msgp = deref_Addr( tid, (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
3740 "msgrcv(msgp)" );
3741 msgtyp = deref_Addr( tid,
3742 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
3743 "msgrcv(msgp)" );
philippe4eefc8c2012-10-21 20:21:17 +00003744
3745 ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
3746
3747 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
3748 *flags |= SfMayBlock;
3749 break;
3750 }
3751 case VKI_MSGGET:
petarj73a0e192012-10-26 16:16:43 +00003752 PRE_REG_READ3(int, "ipc", vki_uint, call, int, first, int, second);
philippe4eefc8c2012-10-21 20:21:17 +00003753 break;
3754 case VKI_MSGCTL:
petarj73a0e192012-10-26 16:16:43 +00003755 PRE_REG_READ5(int, "ipc",
3756 vki_uint, call, int, first, int, second, int, third,
3757 void *, ptr);
philippe4eefc8c2012-10-21 20:21:17 +00003758 ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
3759 break;
3760 case VKI_SHMAT:
3761 {
petarj73a0e192012-10-26 16:16:43 +00003762 PRE_REG_READ5(int, "ipc",
3763 vki_uint, call, int, first, int, second, int, third,
3764 void *, ptr);
philippe4eefc8c2012-10-21 20:21:17 +00003765 UWord w;
3766 PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
3767 w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
3768 if (w == 0)
3769 SET_STATUS_Failure( VKI_EINVAL );
3770 else
3771 ARG5 = w;
3772 break;
3773 }
3774 case VKI_SHMDT:
petarj73a0e192012-10-26 16:16:43 +00003775 PRE_REG_READ5(int, "ipc",
3776 vki_uint, call, int, first, int, second, int, third,
3777 void *, ptr);
philippe4eefc8c2012-10-21 20:21:17 +00003778 if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
3779 SET_STATUS_Failure( VKI_EINVAL );
3780 break;
3781 case VKI_SHMGET:
petarj73a0e192012-10-26 16:16:43 +00003782 PRE_REG_READ4(int, "ipc",
3783 vki_uint, call, int, first, int, second, int, third);
philippe13994812014-11-01 22:00:50 +00003784 if (ARG4 & VKI_SHM_HUGETLB) {
3785 static Bool warning_given = False;
3786 ARG4 &= ~VKI_SHM_HUGETLB;
3787 if (!warning_given) {
3788 warning_given = True;
3789 VG_(umsg)(
3790 "WARNING: valgrind ignores shmget(shmflg) SHM_HUGETLB\n");
3791 }
3792 }
philippe4eefc8c2012-10-21 20:21:17 +00003793 break;
3794 case VKI_SHMCTL: /* IPCOP_shmctl */
petarj73a0e192012-10-26 16:16:43 +00003795 PRE_REG_READ5(int, "ipc",
3796 vki_uint, call, int, first, int, second, int, third,
3797 void *, ptr);
philippe4eefc8c2012-10-21 20:21:17 +00003798 ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
3799 break;
3800 default:
florianb26101c2015-08-08 21:45:33 +00003801 VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %lu\n", ARG1 );
philippe4eefc8c2012-10-21 20:21:17 +00003802 VG_(core_panic)("... bye!\n");
3803 break; /*NOTREACHED*/
petarj73a0e192012-10-26 16:16:43 +00003804 }
philippe4eefc8c2012-10-21 20:21:17 +00003805}
3806
3807POST(sys_ipc)
3808{
3809 vg_assert(SUCCESS);
3810 switch (ARG1 /* call */) {
3811 case VKI_SEMOP:
3812 case VKI_SEMGET:
philippe4eefc8c2012-10-21 20:21:17 +00003813 break;
philippecf4a22e2012-10-21 21:49:33 +00003814 case VKI_SEMCTL:
3815 {
philippe228552d2012-10-23 21:38:52 +00003816 UWord arg;
3817 if (semctl_cmd_has_4args(ARG4))
3818 arg = deref_Addr( tid, ARG5, "semctl(arg)" );
3819 else
3820 arg = 0;
philippecf4a22e2012-10-21 21:49:33 +00003821 ML_(generic_POST_sys_semctl)( tid, RES, ARG2, ARG3, ARG4, arg );
3822 break;
3823 }
philippe4eefc8c2012-10-21 20:21:17 +00003824 case VKI_SEMTIMEDOP:
3825 case VKI_MSGSND:
3826 break;
3827 case VKI_MSGRCV:
3828 {
3829 Addr msgp;
3830 Word msgtyp;
3831
3832 msgp = deref_Addr( tid,
3833 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
3834 "msgrcv(msgp)" );
3835 msgtyp = deref_Addr( tid,
3836 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
3837 "msgrcv(msgp)" );
3838
3839 ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
3840 break;
3841 }
3842 case VKI_MSGGET:
3843 break;
3844 case VKI_MSGCTL:
3845 ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
3846 break;
3847 case VKI_SHMAT:
3848 {
3849 Addr addr;
3850
3851 /* force readability. before the syscall it is
3852 * indeed uninitialized, as can be seen in
3853 * glibc/sysdeps/unix/sysv/linux/shmat.c */
3854 POST_MEM_WRITE( ARG4, sizeof( Addr ) );
3855
3856 addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
3857 ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
3858 break;
3859 }
3860 case VKI_SHMDT:
3861 ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
3862 break;
3863 case VKI_SHMGET:
3864 break;
3865 case VKI_SHMCTL:
3866 ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
3867 break;
3868 default:
3869 VG_(message)(Vg_DebugMsg,
florianb26101c2015-08-08 21:45:33 +00003870 "FATAL: unhandled syscall(ipc) %lu\n",
philippe4eefc8c2012-10-21 20:21:17 +00003871 ARG1 );
3872 VG_(core_panic)("... bye!\n");
3873 break; /*NOTREACHED*/
3874 }
3875}
3876#endif
3877
philippe6b087762013-03-01 23:31:09 +00003878PRE(sys_semget)
3879{
florianb26101c2015-08-08 21:45:33 +00003880 PRINT("sys_semget ( %ld, %ld, %ld )", SARG1, SARG2, SARG3);
philippe6b087762013-03-01 23:31:09 +00003881 PRE_REG_READ3(long, "semget", vki_key_t, key, int, nsems, int, semflg);
3882}
3883
3884PRE(sys_semop)
3885{
3886 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00003887 PRINT("sys_semop ( %ld, %#lx, %lu )", SARG1, ARG2, ARG3);
philippe6b087762013-03-01 23:31:09 +00003888 PRE_REG_READ3(long, "semop",
3889 int, semid, struct sembuf *, sops, unsigned, nsoops);
3890 ML_(generic_PRE_sys_semop)(tid, ARG1,ARG2,ARG3);
3891}
3892
3893PRE(sys_semctl)
3894{
3895 switch (ARG3 & ~VKI_IPC_64) {
3896 case VKI_IPC_INFO:
3897 case VKI_SEM_INFO:
florianb26101c2015-08-08 21:45:33 +00003898 PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )", SARG1, SARG2, SARG3, ARG4);
philippe6b087762013-03-01 23:31:09 +00003899 PRE_REG_READ4(long, "semctl",
3900 int, semid, int, semnum, int, cmd, struct seminfo *, arg);
3901 break;
3902 case VKI_IPC_STAT:
3903 case VKI_SEM_STAT:
3904 case VKI_IPC_SET:
florianb26101c2015-08-08 21:45:33 +00003905 PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )", SARG1, SARG2, SARG3, ARG4);
philippe6b087762013-03-01 23:31:09 +00003906 PRE_REG_READ4(long, "semctl",
3907 int, semid, int, semnum, int, cmd, struct semid_ds *, arg);
3908 break;
3909 case VKI_GETALL:
3910 case VKI_SETALL:
florianb26101c2015-08-08 21:45:33 +00003911 PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )", SARG1, SARG2, SARG3, ARG4);
philippe6b087762013-03-01 23:31:09 +00003912 PRE_REG_READ4(long, "semctl",
3913 int, semid, int, semnum, int, cmd, unsigned short *, arg);
3914 break;
3915 default:
florianb26101c2015-08-08 21:45:33 +00003916 PRINT("sys_semctl ( %ld, %ld, %ld )", SARG1, SARG2, SARG3);
philippe6b087762013-03-01 23:31:09 +00003917 PRE_REG_READ3(long, "semctl",
3918 int, semid, int, semnum, int, cmd);
3919 break;
3920 }
3921#ifdef VGP_amd64_linux
3922 ML_(generic_PRE_sys_semctl)(tid, ARG1,ARG2,ARG3|VKI_IPC_64,ARG4);
3923#else
3924 ML_(generic_PRE_sys_semctl)(tid, ARG1,ARG2,ARG3,ARG4);
3925#endif
3926}
3927
3928POST(sys_semctl)
3929{
3930#ifdef VGP_amd64_linux
3931 ML_(generic_POST_sys_semctl)(tid, RES,ARG1,ARG2,ARG3|VKI_IPC_64,ARG4);
3932#else
3933 ML_(generic_POST_sys_semctl)(tid, RES,ARG1,ARG2,ARG3,ARG4);
3934#endif
3935}
3936
3937PRE(sys_semtimedop)
3938{
3939 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00003940 PRINT("sys_semtimedop ( %ld, %#lx, %lu, %#lx )", SARG1, ARG2, ARG3, ARG4);
philippe6b087762013-03-01 23:31:09 +00003941 PRE_REG_READ4(long, "semtimedop",
3942 int, semid, struct sembuf *, sops, unsigned, nsoops,
3943 struct timespec *, timeout);
3944 ML_(generic_PRE_sys_semtimedop)(tid, ARG1,ARG2,ARG3,ARG4);
3945}
3946
3947PRE(sys_msgget)
3948{
florianb26101c2015-08-08 21:45:33 +00003949 PRINT("sys_msgget ( %ld, %ld )", SARG1, SARG2);
philippe6b087762013-03-01 23:31:09 +00003950 PRE_REG_READ2(long, "msgget", vki_key_t, key, int, msgflg);
3951}
3952
3953PRE(sys_msgsnd)
3954{
florianb26101c2015-08-08 21:45:33 +00003955 PRINT("sys_msgsnd ( %ld, %#lx, %lu, %ld )", SARG1, ARG2, ARG3, SARG4);
philippe6b087762013-03-01 23:31:09 +00003956 PRE_REG_READ4(long, "msgsnd",
3957 int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz, int, msgflg);
3958 ML_(linux_PRE_sys_msgsnd)(tid, ARG1,ARG2,ARG3,ARG4);
3959 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
3960 *flags |= SfMayBlock;
3961}
3962
3963PRE(sys_msgrcv)
3964{
florianb26101c2015-08-08 21:45:33 +00003965 PRINT("sys_msgrcv ( %ld, %#lx, %lu, %ld, %ld )",
3966 SARG1, ARG2, ARG3, SARG4, SARG5);
philippe6b087762013-03-01 23:31:09 +00003967 PRE_REG_READ5(long, "msgrcv",
3968 int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz,
3969 long, msgytp, int, msgflg);
3970 ML_(linux_PRE_sys_msgrcv)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
3971 if ((ARG5 & VKI_IPC_NOWAIT) == 0)
3972 *flags |= SfMayBlock;
3973}
3974POST(sys_msgrcv)
3975{
3976 ML_(linux_POST_sys_msgrcv)(tid, RES,ARG1,ARG2,ARG3,ARG4,ARG5);
3977}
3978
3979PRE(sys_msgctl)
3980{
florianb26101c2015-08-08 21:45:33 +00003981 PRINT("sys_msgctl ( %ld, %ld, %#lx )", SARG1, SARG2, ARG3);
philippe6b087762013-03-01 23:31:09 +00003982 PRE_REG_READ3(long, "msgctl",
3983 int, msqid, int, cmd, struct msqid_ds *, buf);
3984 ML_(linux_PRE_sys_msgctl)(tid, ARG1,ARG2,ARG3);
3985}
3986
3987POST(sys_msgctl)
3988{
3989 ML_(linux_POST_sys_msgctl)(tid, RES,ARG1,ARG2,ARG3);
3990}
3991
3992PRE(sys_shmget)
3993{
florianb26101c2015-08-08 21:45:33 +00003994 PRINT("sys_shmget ( %ld, %lu, %ld )", SARG1, ARG2, SARG3);
philippe6b087762013-03-01 23:31:09 +00003995 PRE_REG_READ3(long, "shmget", vki_key_t, key, vki_size_t, size, int, shmflg);
philippe13994812014-11-01 22:00:50 +00003996 if (ARG3 & VKI_SHM_HUGETLB) {
3997 static Bool warning_given = False;
3998 ARG3 &= ~VKI_SHM_HUGETLB;
3999 if (!warning_given) {
4000 warning_given = True;
4001 VG_(umsg)(
4002 "WARNING: valgrind ignores shmget(shmflg) SHM_HUGETLB\n");
4003 }
4004 }
philippe6b087762013-03-01 23:31:09 +00004005}
4006
4007PRE(wrap_sys_shmat)
4008{
4009 UWord arg2tmp;
florianb26101c2015-08-08 21:45:33 +00004010 PRINT("wrap_sys_shmat ( %ld, %#lx, %ld )", SARG1, ARG2, SARG3);
philippe6b087762013-03-01 23:31:09 +00004011 PRE_REG_READ3(long, "shmat",
4012 int, shmid, const void *, shmaddr, int, shmflg);
4013#if defined(VGP_arm_linux)
4014 /* Round the attach address down to an VKI_SHMLBA boundary if the
4015 client requested rounding. See #222545. This is necessary only
4016 on arm-linux because VKI_SHMLBA is 4 * VKI_PAGE size; on all
4017 other linux targets it is the same as the page size. */
4018 if (ARG3 & VKI_SHM_RND)
4019 ARG2 = VG_ROUNDDN(ARG2, VKI_SHMLBA);
4020#endif
4021 arg2tmp = ML_(generic_PRE_sys_shmat)(tid, ARG1,ARG2,ARG3);
4022 if (arg2tmp == 0)
4023 SET_STATUS_Failure( VKI_EINVAL );
4024 else
4025 ARG2 = arg2tmp; // used in POST
4026}
4027
4028POST(wrap_sys_shmat)
4029{
4030 ML_(generic_POST_sys_shmat)(tid, RES,ARG1,ARG2,ARG3);
4031}
4032
4033PRE(sys_shmdt)
4034{
4035 PRINT("sys_shmdt ( %#lx )",ARG1);
4036 PRE_REG_READ1(long, "shmdt", const void *, shmaddr);
4037 if (!ML_(generic_PRE_sys_shmdt)(tid, ARG1))
4038 SET_STATUS_Failure( VKI_EINVAL );
4039}
4040
4041POST(sys_shmdt)
4042{
4043 ML_(generic_POST_sys_shmdt)(tid, RES,ARG1);
4044}
4045
4046PRE(sys_shmctl)
4047{
florianb26101c2015-08-08 21:45:33 +00004048 PRINT("sys_shmctl ( %ld, %ld, %#lx )", SARG1, SARG2, ARG3);
philippe6b087762013-03-01 23:31:09 +00004049 PRE_REG_READ3(long, "shmctl",
4050 int, shmid, int, cmd, struct shmid_ds *, buf);
4051#ifdef VGP_amd64_linux
4052 ML_(generic_PRE_sys_shmctl)(tid, ARG1,ARG2|VKI_IPC_64,ARG3);
4053#else
4054 ML_(generic_PRE_sys_shmctl)(tid, ARG1,ARG2,ARG3);
4055#endif
4056}
4057
4058POST(sys_shmctl)
4059{
4060#ifdef VGP_amd64_linux
4061 ML_(generic_POST_sys_shmctl)(tid, RES,ARG1,ARG2|VKI_IPC_64,ARG3);
4062#else
4063 ML_(generic_POST_sys_shmctl)(tid, RES,ARG1,ARG2,ARG3);
4064#endif
4065}
4066
4067
philippe4eefc8c2012-10-21 20:21:17 +00004068/* ---------------------------------------------------------------------
philippef2a7bbe2012-11-04 20:40:33 +00004069 Generic handler for sys_socketcall
4070 Depending on the platform, some socket related syscalls (e.g. socketpair,
4071 socket, bind, ...)
4072 are either direct system calls, or are all implemented via sys_socketcall.
4073 ------------------------------------------------------------------ */
4074#ifdef __NR_socketcall
4075PRE(sys_socketcall)
4076{
4077# define ARG2_0 (((UWord*)ARG2)[0])
4078# define ARG2_1 (((UWord*)ARG2)[1])
4079# define ARG2_2 (((UWord*)ARG2)[2])
4080# define ARG2_3 (((UWord*)ARG2)[3])
4081# define ARG2_4 (((UWord*)ARG2)[4])
4082# define ARG2_5 (((UWord*)ARG2)[5])
4083
4084// call PRE_MEM_READ and check for EFAULT result.
4085#define PRE_MEM_READ_ef(msg, arg, size) \
4086 { \
4087 PRE_MEM_READ( msg, arg, size); \
4088 if (!ML_(valid_client_addr)(arg, size, tid, NULL)) { \
4089 SET_STATUS_Failure( VKI_EFAULT ); \
4090 break; \
4091 } \
4092 }
4093
4094 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004095 PRINT("sys_socketcall ( %ld, %#lx )", SARG1, ARG2);
philippef2a7bbe2012-11-04 20:40:33 +00004096 PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
4097
4098 switch (ARG1 /* request */) {
4099
4100 case VKI_SYS_SOCKETPAIR:
4101 /* int socketpair(int d, int type, int protocol, int sv[2]); */
4102 PRE_MEM_READ_ef( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
4103 ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
4104 break;
4105
4106 case VKI_SYS_SOCKET:
4107 /* int socket(int domain, int type, int protocol); */
4108 PRE_MEM_READ_ef( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
4109 break;
4110
4111 case VKI_SYS_BIND:
4112 /* int bind(int sockfd, struct sockaddr *my_addr,
4113 int addrlen); */
4114 PRE_MEM_READ_ef( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
4115 ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
4116 break;
4117
4118 case VKI_SYS_LISTEN:
4119 /* int listen(int s, int backlog); */
4120 PRE_MEM_READ_ef( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
4121 break;
4122
4123 case VKI_SYS_ACCEPT:
4124 /* int accept(int s, struct sockaddr *addr, int *addrlen); */
4125 PRE_MEM_READ_ef( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
4126 ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
4127 break;
4128
4129 case VKI_SYS_ACCEPT4:
4130 /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
4131 PRE_MEM_READ_ef( "socketcall.accept4(args)", ARG2, 4*sizeof(Addr) );
4132 ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
4133 break;
4134
4135 case VKI_SYS_SENDTO:
4136 /* int sendto(int s, const void *msg, int len,
4137 unsigned int flags,
4138 const struct sockaddr *to, int tolen); */
4139 PRE_MEM_READ_ef( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
4140 ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
4141 ARG2_3, ARG2_4, ARG2_5 );
4142 break;
4143
4144 case VKI_SYS_SEND:
4145 /* int send(int s, const void *msg, size_t len, int flags); */
4146 PRE_MEM_READ_ef( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
4147 ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
4148 break;
4149
4150 case VKI_SYS_RECVFROM:
4151 /* int recvfrom(int s, void *buf, int len, unsigned int flags,
4152 struct sockaddr *from, int *fromlen); */
4153 PRE_MEM_READ_ef( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
4154 ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
4155 ARG2_3, ARG2_4, ARG2_5 );
4156 break;
4157
4158 case VKI_SYS_RECV:
4159 /* int recv(int s, void *buf, int len, unsigned int flags); */
4160 /* man 2 recv says:
4161 The recv call is normally used only on a connected socket
4162 (see connect(2)) and is identical to recvfrom with a NULL
4163 from parameter.
4164 */
4165 PRE_MEM_READ_ef( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
4166 ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
4167 break;
4168
4169 case VKI_SYS_CONNECT:
4170 /* int connect(int sockfd,
4171 struct sockaddr *serv_addr, int addrlen ); */
4172 PRE_MEM_READ_ef( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
4173 ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
4174 break;
4175
4176 case VKI_SYS_SETSOCKOPT:
4177 /* int setsockopt(int s, int level, int optname,
4178 const void *optval, int optlen); */
4179 PRE_MEM_READ_ef( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
tom70f71aa2013-07-17 14:36:57 +00004180 ML_(linux_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
4181 ARG2_3, ARG2_4 );
philippef2a7bbe2012-11-04 20:40:33 +00004182 break;
4183
4184 case VKI_SYS_GETSOCKOPT:
4185 /* int getsockopt(int s, int level, int optname,
4186 void *optval, socklen_t *optlen); */
4187 PRE_MEM_READ_ef( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
4188 ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
4189 ARG2_3, ARG2_4 );
4190 break;
4191
4192 case VKI_SYS_GETSOCKNAME:
4193 /* int getsockname(int s, struct sockaddr* name, int* namelen) */
4194 PRE_MEM_READ_ef( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
4195 ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
4196 break;
4197
4198 case VKI_SYS_GETPEERNAME:
4199 /* int getpeername(int s, struct sockaddr* name, int* namelen) */
4200 PRE_MEM_READ_ef( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
4201 ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
4202 break;
4203
4204 case VKI_SYS_SHUTDOWN:
4205 /* int shutdown(int s, int how); */
4206 PRE_MEM_READ_ef( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
4207 break;
4208
4209 case VKI_SYS_SENDMSG:
4210 /* int sendmsg(int s, const struct msghdr *msg, int flags); */
4211 PRE_MEM_READ_ef( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
4212 ML_(generic_PRE_sys_sendmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
4213 break;
4214
4215 case VKI_SYS_RECVMSG:
4216 /* int recvmsg(int s, struct msghdr *msg, int flags); */
4217 PRE_MEM_READ_ef("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
4218 ML_(generic_PRE_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
4219 break;
4220
mjwe3e61c52015-02-25 14:00:14 +00004221 case VKI_SYS_RECVMMSG:
4222 /* int recvmmsg(int s, struct mmsghdr *mmsg, int vlen, int flags,
4223 struct timespec *timeout); */
4224 PRE_MEM_READ_ef("socketcall.recvmmsg(args)", ARG2, 5*sizeof(Addr) );
4225 ML_(linux_PRE_sys_recvmmsg)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3,
4226 ARG2_4 );
4227 break;
4228
4229 case VKI_SYS_SENDMMSG:
4230 /* int sendmmsg(int s, struct mmsghdr *mmsg, int vlen, int flags); */
4231 PRE_MEM_READ_ef("socketcall.sendmmsg(args)", ARG2, 4*sizeof(Addr) );
4232 ML_(linux_PRE_sys_sendmmsg)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
4233 break;
4234
philippef2a7bbe2012-11-04 20:40:33 +00004235 default:
4236 VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1);
4237 SET_STATUS_Failure( VKI_EINVAL );
4238 break;
4239 }
4240# undef ARG2_0
4241# undef ARG2_1
4242# undef ARG2_2
4243# undef ARG2_3
4244# undef ARG2_4
4245# undef ARG2_5
4246}
4247
4248POST(sys_socketcall)
4249{
4250# define ARG2_0 (((UWord*)ARG2)[0])
4251# define ARG2_1 (((UWord*)ARG2)[1])
4252# define ARG2_2 (((UWord*)ARG2)[2])
4253# define ARG2_3 (((UWord*)ARG2)[3])
4254# define ARG2_4 (((UWord*)ARG2)[4])
4255# define ARG2_5 (((UWord*)ARG2)[5])
4256
4257 SysRes r;
4258 vg_assert(SUCCESS);
4259 switch (ARG1 /* request */) {
4260
4261 case VKI_SYS_SOCKETPAIR:
4262 r = ML_(generic_POST_sys_socketpair)(
4263 tid, VG_(mk_SysRes_Success)(RES),
4264 ARG2_0, ARG2_1, ARG2_2, ARG2_3
4265 );
4266 SET_STATUS_from_SysRes(r);
4267 break;
4268
4269 case VKI_SYS_SOCKET:
4270 r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
4271 SET_STATUS_from_SysRes(r);
4272 break;
4273
4274 case VKI_SYS_BIND:
4275 /* int bind(int sockfd, struct sockaddr *my_addr,
4276 int addrlen); */
4277 break;
4278
4279 case VKI_SYS_LISTEN:
4280 /* int listen(int s, int backlog); */
4281 break;
4282
4283 case VKI_SYS_ACCEPT:
4284 case VKI_SYS_ACCEPT4:
4285 /* int accept(int s, struct sockaddr *addr, int *addrlen); */
4286 /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
4287 r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
4288 ARG2_0, ARG2_1, ARG2_2 );
4289 SET_STATUS_from_SysRes(r);
4290 break;
4291
4292 case VKI_SYS_SENDTO:
4293 break;
4294
4295 case VKI_SYS_SEND:
4296 break;
4297
4298 case VKI_SYS_RECVFROM:
4299 ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
4300 ARG2_0, ARG2_1, ARG2_2,
4301 ARG2_3, ARG2_4, ARG2_5 );
4302 break;
4303
4304 case VKI_SYS_RECV:
4305 ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
4306 break;
4307
4308 case VKI_SYS_CONNECT:
4309 break;
4310
4311 case VKI_SYS_SETSOCKOPT:
4312 break;
4313
4314 case VKI_SYS_GETSOCKOPT:
4315 ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
4316 ARG2_0, ARG2_1,
4317 ARG2_2, ARG2_3, ARG2_4 );
4318 break;
4319
4320 case VKI_SYS_GETSOCKNAME:
4321 ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
4322 ARG2_0, ARG2_1, ARG2_2 );
4323 break;
4324
4325 case VKI_SYS_GETPEERNAME:
4326 ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
4327 ARG2_0, ARG2_1, ARG2_2 );
4328 break;
4329
4330 case VKI_SYS_SHUTDOWN:
4331 break;
4332
4333 case VKI_SYS_SENDMSG:
4334 break;
4335
4336 case VKI_SYS_RECVMSG:
4337 ML_(generic_POST_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1, RES );
4338 break;
4339
mjwe3e61c52015-02-25 14:00:14 +00004340 case VKI_SYS_RECVMMSG:
4341 ML_(linux_POST_sys_recvmmsg)( tid, RES,
4342 ARG2_0, ARG2_1, ARG2_2, ARG2_3, ARG2_4 );
4343 break;
4344
4345 case VKI_SYS_SENDMMSG:
4346 ML_(linux_POST_sys_sendmmsg)( tid, RES, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
4347 break;
4348
philippef2a7bbe2012-11-04 20:40:33 +00004349 default:
4350 VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1);
4351 VG_(core_panic)("... bye!\n");
4352 break; /*NOTREACHED*/
4353 }
4354# undef ARG2_0
4355# undef ARG2_1
4356# undef ARG2_2
4357# undef ARG2_3
4358# undef ARG2_4
4359# undef ARG2_5
4360}
4361#endif
4362
philippe6b087762013-03-01 23:31:09 +00004363PRE(sys_socket)
4364{
florianb26101c2015-08-08 21:45:33 +00004365 PRINT("sys_socket ( %ld, %ld, %ld )", SARG1, SARG2, SARG3);
philippe6b087762013-03-01 23:31:09 +00004366 PRE_REG_READ3(long, "socket", int, domain, int, type, int, protocol);
4367}
4368POST(sys_socket)
4369{
4370 SysRes r;
4371 vg_assert(SUCCESS);
4372 r = ML_(generic_POST_sys_socket)(tid, VG_(mk_SysRes_Success)(RES));
4373 SET_STATUS_from_SysRes(r);
4374}
4375
4376PRE(sys_setsockopt)
4377{
florianb26101c2015-08-08 21:45:33 +00004378 PRINT("sys_setsockopt ( %ld, %ld, %ld, %#lx, %lu )",
4379 SARG1, SARG2, SARG3, ARG4, ARG5);
philippe6b087762013-03-01 23:31:09 +00004380 PRE_REG_READ5(long, "setsockopt",
4381 int, s, int, level, int, optname,
florianb26101c2015-08-08 21:45:33 +00004382 const void *, optval, unsigned, optlen); // socklen_t
tom70f71aa2013-07-17 14:36:57 +00004383 ML_(linux_PRE_sys_setsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
philippe6b087762013-03-01 23:31:09 +00004384}
4385
4386PRE(sys_getsockopt)
4387{
florianb26101c2015-08-08 21:45:33 +00004388 PRINT("sys_getsockopt ( %ld, %ld, %ld, %#lx, %ld )",
4389 SARG1, SARG2, SARG3, ARG4, SARG5);
philippe6b087762013-03-01 23:31:09 +00004390 PRE_REG_READ5(long, "getsockopt",
4391 int, s, int, level, int, optname,
4392 void *, optval, int, *optlen);
4393 ML_(linux_PRE_sys_getsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
4394}
4395POST(sys_getsockopt)
4396{
4397 vg_assert(SUCCESS);
4398 ML_(linux_POST_sys_getsockopt)(tid, VG_(mk_SysRes_Success)(RES),
4399 ARG1,ARG2,ARG3,ARG4,ARG5);
4400}
4401
4402PRE(sys_connect)
4403{
4404 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004405 PRINT("sys_connect ( %ld, %#lx, %ld )", SARG1, ARG2, SARG3);
philippe6b087762013-03-01 23:31:09 +00004406 PRE_REG_READ3(long, "connect",
4407 int, sockfd, struct sockaddr *, serv_addr, int, addrlen);
4408 ML_(generic_PRE_sys_connect)(tid, ARG1,ARG2,ARG3);
4409}
4410
4411PRE(sys_accept)
4412{
4413 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004414 PRINT("sys_accept ( %ld, %#lx, %#lx )", SARG1, ARG2, ARG3);
philippe6b087762013-03-01 23:31:09 +00004415 PRE_REG_READ3(long, "accept",
florianb26101c2015-08-08 21:45:33 +00004416 int, s, struct sockaddr *, addr, int *, addrlen);
philippe6b087762013-03-01 23:31:09 +00004417 ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3);
4418}
4419POST(sys_accept)
4420{
4421 SysRes r;
4422 vg_assert(SUCCESS);
4423 r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES),
4424 ARG1,ARG2,ARG3);
4425 SET_STATUS_from_SysRes(r);
4426}
4427
4428PRE(sys_accept4)
4429{
4430 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004431 PRINT("sys_accept4 ( %ld, %#lx, %#lx, %ld )", SARG1, ARG2, ARG3, SARG4);
philippe6b087762013-03-01 23:31:09 +00004432 PRE_REG_READ4(long, "accept4",
florianb26101c2015-08-08 21:45:33 +00004433 int, s, struct sockaddr *, addr, int *, addrlen, int, flags);
philippe6b087762013-03-01 23:31:09 +00004434 ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3);
4435}
4436POST(sys_accept4)
4437{
4438 SysRes r;
4439 vg_assert(SUCCESS);
4440 r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES),
4441 ARG1,ARG2,ARG3);
4442 SET_STATUS_from_SysRes(r);
4443}
4444
4445PRE(sys_send)
4446{
4447 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004448 PRINT("sys_send ( %ld, %#lx, %lu, %#lx )", SARG1, ARG2, ARG3, ARG4);
philippe6b087762013-03-01 23:31:09 +00004449 PRE_REG_READ4(long, "send",
florianb26101c2015-08-08 21:45:33 +00004450 int, s, const void *, msg, vki_size_t, len,
4451 int, flags);
philippe6b087762013-03-01 23:31:09 +00004452
4453 ML_(generic_PRE_sys_send)( tid, ARG1, ARG2, ARG3 );
4454}
4455
4456PRE(sys_sendto)
4457{
4458 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004459 PRINT("sys_sendto ( %ld, %#lx, %lu, %lu, %#lx, %ld )",
4460 SARG1, ARG2, ARG3, ARG4, ARG5, SARG6);
philippe6b087762013-03-01 23:31:09 +00004461 PRE_REG_READ6(long, "sendto",
florianb26101c2015-08-08 21:45:33 +00004462 int, s, const void *, msg, vki_size_t, len,
philippe6b087762013-03-01 23:31:09 +00004463 unsigned int, flags,
4464 const struct sockaddr *, to, int, tolen);
4465 ML_(generic_PRE_sys_sendto)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
4466}
4467
4468PRE (sys_recv)
4469{
4470 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004471 PRINT ("sys_recv ( %ld, %#lx, %lu, %lu )", SARG1, ARG2, ARG3, ARG4);
4472 PRE_REG_READ4 (long, "recv", int, s, void *, buf, vki_size_t, len,
philippe6b087762013-03-01 23:31:09 +00004473 unsigned int, flags);
4474 ML_ (generic_PRE_sys_recv) (tid, ARG1, ARG2, ARG3);
4475}
4476
4477POST (sys_recv)
4478{
4479 ML_ (generic_POST_sys_recv) (tid, RES, ARG1, ARG2, ARG3);
4480}
4481
4482PRE(sys_recvfrom)
4483{
4484 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004485 PRINT("sys_recvfrom ( %ld, %#lx, %lu, %lu, %#lx, %#lx )",
4486 SARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
philippe6b087762013-03-01 23:31:09 +00004487 PRE_REG_READ6(long, "recvfrom",
florianb26101c2015-08-08 21:45:33 +00004488 int, s, void *, buf, vki_size_t, len, unsigned int, flags,
philippe6b087762013-03-01 23:31:09 +00004489 struct sockaddr *, from, int *, fromlen);
4490 ML_(generic_PRE_sys_recvfrom)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
4491}
4492POST(sys_recvfrom)
4493{
4494 vg_assert(SUCCESS);
4495 ML_(generic_POST_sys_recvfrom)(tid, VG_(mk_SysRes_Success)(RES),
4496 ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
4497}
4498
4499PRE(sys_sendmsg)
4500{
4501 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004502 PRINT("sys_sendmsg ( %ld, %#lx, %lu )", SARG1, ARG2, ARG3);
philippe6b087762013-03-01 23:31:09 +00004503 PRE_REG_READ3(long, "sendmsg",
florianb26101c2015-08-08 21:45:33 +00004504 int, s, const struct msghdr *, msg, unsigned int, flags);
philippe6b087762013-03-01 23:31:09 +00004505 ML_(generic_PRE_sys_sendmsg)(tid, "msg", (struct vki_msghdr *)ARG2);
4506}
4507
4508PRE(sys_recvmsg)
4509{
4510 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004511 PRINT("sys_recvmsg ( %ld, %#lx, %lu )", SARG1, ARG2, ARG3);
4512 PRE_REG_READ3(long, "recvmsg", int, s, struct msghdr *, msg,
4513 unsigned int, flags);
philippe6b087762013-03-01 23:31:09 +00004514 ML_(generic_PRE_sys_recvmsg)(tid, "msg", (struct vki_msghdr *)ARG2);
4515}
4516POST(sys_recvmsg)
4517{
4518 ML_(generic_POST_sys_recvmsg)(tid, "msg", (struct vki_msghdr *)ARG2, RES);
4519}
4520
4521PRE(sys_shutdown)
4522{
4523 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004524 PRINT("sys_shutdown ( %ld, %ld )", SARG1, SARG2);
philippe6b087762013-03-01 23:31:09 +00004525 PRE_REG_READ2(int, "shutdown", int, s, int, how);
4526}
4527
4528PRE(sys_bind)
4529{
florianb26101c2015-08-08 21:45:33 +00004530 PRINT("sys_bind ( %ld, %#lx, %ld )", SARG1, ARG2, SARG3);
philippe6b087762013-03-01 23:31:09 +00004531 PRE_REG_READ3(long, "bind",
4532 int, sockfd, struct sockaddr *, my_addr, int, addrlen);
4533 ML_(generic_PRE_sys_bind)(tid, ARG1,ARG2,ARG3);
4534}
4535
4536PRE(sys_listen)
4537{
florianb26101c2015-08-08 21:45:33 +00004538 PRINT("sys_listen ( %ld, %ld )", SARG1, SARG2);
philippe6b087762013-03-01 23:31:09 +00004539 PRE_REG_READ2(long, "listen", int, s, int, backlog);
4540}
4541
4542PRE(sys_getsockname)
4543{
florianb26101c2015-08-08 21:45:33 +00004544 PRINT("sys_getsockname ( %ld, %#lx, %#lx )", SARG1, ARG2, ARG3);
philippe6b087762013-03-01 23:31:09 +00004545 PRE_REG_READ3(long, "getsockname",
4546 int, s, struct sockaddr *, name, int *, namelen);
4547 ML_(generic_PRE_sys_getsockname)(tid, ARG1,ARG2,ARG3);
4548}
4549POST(sys_getsockname)
4550{
4551 vg_assert(SUCCESS);
4552 ML_(generic_POST_sys_getsockname)(tid, VG_(mk_SysRes_Success)(RES),
4553 ARG1,ARG2,ARG3);
4554}
4555
4556PRE(sys_getpeername)
4557{
florianb26101c2015-08-08 21:45:33 +00004558 PRINT("sys_getpeername ( %ld, %#lx, %#lx )", SARG1, ARG2, ARG3);
philippe6b087762013-03-01 23:31:09 +00004559 PRE_REG_READ3(long, "getpeername",
4560 int, s, struct sockaddr *, name, int *, namelen);
4561 ML_(generic_PRE_sys_getpeername)(tid, ARG1,ARG2,ARG3);
4562}
4563POST(sys_getpeername)
4564{
4565 vg_assert(SUCCESS);
4566 ML_(generic_POST_sys_getpeername)(tid, VG_(mk_SysRes_Success)(RES),
4567 ARG1,ARG2,ARG3);
4568}
4569
4570PRE(sys_socketpair)
4571{
florianb26101c2015-08-08 21:45:33 +00004572 PRINT("sys_socketpair ( %ld, %ld, %ld, %#lx )", SARG1, SARG2, SARG3, ARG4);
philippe6b087762013-03-01 23:31:09 +00004573 PRE_REG_READ4(long, "socketpair",
4574 int, d, int, type, int, protocol, int*, sv);
4575 ML_(generic_PRE_sys_socketpair)(tid, ARG1,ARG2,ARG3,ARG4);
4576}
4577POST(sys_socketpair)
4578{
4579 vg_assert(SUCCESS);
4580 ML_(generic_POST_sys_socketpair)(tid, VG_(mk_SysRes_Success)(RES),
4581 ARG1,ARG2,ARG3,ARG4);
4582}
4583
4584
philippef2a7bbe2012-11-04 20:40:33 +00004585/* ---------------------------------------------------------------------
tom363ec762006-03-21 10:58:35 +00004586 *at wrappers
4587 ------------------------------------------------------------------ */
4588
4589PRE(sys_openat)
4590{
florianf44ff622014-12-20 16:52:08 +00004591 HChar name[30]; // large enough
tom363ec762006-03-21 10:58:35 +00004592 SysRes sres;
4593
4594 if (ARG3 & VKI_O_CREAT) {
4595 // 4-arg version
florianb26101c2015-08-08 21:45:33 +00004596 PRINT("sys_openat ( %ld, %#lx(%s), %ld, %ld )",
4597 SARG1, ARG2, (HChar*)ARG2, SARG3, SARG4);
tom363ec762006-03-21 10:58:35 +00004598 PRE_REG_READ4(long, "openat",
4599 int, dfd, const char *, filename, int, flags, int, mode);
4600 } else {
4601 // 3-arg version
florianb26101c2015-08-08 21:45:33 +00004602 PRINT("sys_openat ( %ld, %#lx(%s), %ld )",
4603 SARG1, ARG2, (HChar*)ARG2, SARG3);
tom363ec762006-03-21 10:58:35 +00004604 PRE_REG_READ3(long, "openat",
4605 int, dfd, const char *, filename, int, flags);
4606 }
4607
sewardjf73de262012-12-06 16:05:18 +00004608 PRE_MEM_RASCIIZ( "openat(filename)", ARG2 );
4609
4610 /* For absolute filenames, dfd is ignored. If dfd is AT_FDCWD,
sewardjf2782222014-11-04 17:35:04 +00004611 filename is relative to cwd. When comparing dfd against AT_FDCWD,
4612 be sure only to compare the bottom 32 bits. */
sewardjf73de262012-12-06 16:05:18 +00004613 if (ML_(safe_to_deref)( (void*)ARG2, 1 )
4614 && *(Char *)ARG2 != '/'
sewardjf2782222014-11-04 17:35:04 +00004615 && ((Int)ARG1) != ((Int)VKI_AT_FDCWD)
sewardjf73de262012-12-06 16:05:18 +00004616 && !ML_(fd_allowed)(ARG1, "openat", tid, False))
tom363ec762006-03-21 10:58:35 +00004617 SET_STATUS_Failure( VKI_EBADF );
tom363ec762006-03-21 10:58:35 +00004618
4619 /* Handle the case where the open is of /proc/self/cmdline or
4620 /proc/<pid>/cmdline, and just give it a copy of the fd for the
4621 fake file we cooked up at startup (in m_main). Also, seek the
4622 cloned fd back to the start. */
4623
4624 VG_(sprintf)(name, "/proc/%d/cmdline", VG_(getpid)());
4625 if (ML_(safe_to_deref)( (void*)ARG2, 1 )
florian1636d332012-11-15 04:27:04 +00004626 && (VG_(strcmp)((HChar *)ARG2, name) == 0
4627 || VG_(strcmp)((HChar *)ARG2, "/proc/self/cmdline") == 0)) {
tom363ec762006-03-21 10:58:35 +00004628 sres = VG_(dup)( VG_(cl_cmdline_fd) );
4629 SET_STATUS_from_SysRes( sres );
njncda2f0f2009-05-18 02:12:08 +00004630 if (!sr_isError(sres)) {
4631 OffT off = VG_(lseek)( sr_Res(sres), 0, VKI_SEEK_SET );
tom363ec762006-03-21 10:58:35 +00004632 if (off < 0)
4633 SET_STATUS_Failure( VKI_EMFILE );
4634 }
4635 return;
4636 }
4637
tom41ad7e72012-10-04 20:27:38 +00004638 /* Do the same for /proc/self/auxv or /proc/<pid>/auxv case. */
4639
4640 VG_(sprintf)(name, "/proc/%d/auxv", VG_(getpid)());
4641 if (ML_(safe_to_deref)( (void*)ARG2, 1 )
florian1636d332012-11-15 04:27:04 +00004642 && (VG_(strcmp)((HChar *)ARG2, name) == 0
4643 || VG_(strcmp)((HChar *)ARG2, "/proc/self/auxv") == 0)) {
tom41ad7e72012-10-04 20:27:38 +00004644 sres = VG_(dup)( VG_(cl_auxv_fd) );
4645 SET_STATUS_from_SysRes( sres );
4646 if (!sr_isError(sres)) {
4647 OffT off = VG_(lseek)( sr_Res(sres), 0, VKI_SEEK_SET );
4648 if (off < 0)
4649 SET_STATUS_Failure( VKI_EMFILE );
4650 }
4651 return;
4652 }
4653
tom363ec762006-03-21 10:58:35 +00004654 /* Otherwise handle normally */
4655 *flags |= SfMayBlock;
4656}
4657
4658POST(sys_openat)
4659{
4660 vg_assert(SUCCESS);
4661 if (!ML_(fd_allowed)(RES, "openat", tid, True)) {
4662 VG_(close)(RES);
4663 SET_STATUS_Failure( VKI_EMFILE );
4664 } else {
4665 if (VG_(clo_track_fds))
florian1636d332012-11-15 04:27:04 +00004666 ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG2);
tom363ec762006-03-21 10:58:35 +00004667 }
4668}
4669
4670PRE(sys_mkdirat)
4671{
4672 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004673 PRINT("sys_mkdirat ( %ld, %#lx(%s), %ld )",
4674 SARG1, ARG2, (HChar*)ARG2, SARG3);
tom363ec762006-03-21 10:58:35 +00004675 PRE_REG_READ3(long, "mkdirat",
4676 int, dfd, const char *, pathname, int, mode);
4677 PRE_MEM_RASCIIZ( "mkdirat(pathname)", ARG2 );
4678}
4679
4680PRE(sys_mknodat)
4681{
florianb26101c2015-08-08 21:45:33 +00004682 PRINT("sys_mknodat ( %ld, %#lx(%s), 0x%lx, 0x%lx )",
4683 SARG1, ARG2, (HChar*)ARG2, ARG3, ARG4 );
tom363ec762006-03-21 10:58:35 +00004684 PRE_REG_READ4(long, "mknodat",
4685 int, dfd, const char *, pathname, int, mode, unsigned, dev);
4686 PRE_MEM_RASCIIZ( "mknodat(pathname)", ARG2 );
4687}
4688
4689PRE(sys_fchownat)
4690{
florianb26101c2015-08-08 21:45:33 +00004691 PRINT("sys_fchownat ( %ld, %#lx(%s), 0x%lx, 0x%lx )",
4692 SARG1, ARG2, (HChar*)ARG2, ARG3, ARG4);
tom363ec762006-03-21 10:58:35 +00004693 PRE_REG_READ4(long, "fchownat",
4694 int, dfd, const char *, path,
4695 vki_uid_t, owner, vki_gid_t, group);
4696 PRE_MEM_RASCIIZ( "fchownat(path)", ARG2 );
4697}
4698
4699PRE(sys_futimesat)
4700{
florianb26101c2015-08-08 21:45:33 +00004701 PRINT("sys_futimesat ( %ld, %#lx(%s), %#lx )",
4702 SARG1, ARG2, (HChar*)ARG2, ARG3);
tom363ec762006-03-21 10:58:35 +00004703 PRE_REG_READ3(long, "futimesat",
4704 int, dfd, char *, filename, struct timeval *, tvp);
sewardjf4ef2ea2008-05-12 14:29:23 +00004705 if (ARG2 != 0)
4706 PRE_MEM_RASCIIZ( "futimesat(filename)", ARG2 );
tom363ec762006-03-21 10:58:35 +00004707 if (ARG3 != 0)
bartf5ceec82008-04-26 07:45:10 +00004708 PRE_MEM_READ( "futimesat(tvp)", ARG3, 2 * sizeof(struct vki_timeval) );
4709}
4710
4711PRE(sys_utimensat)
4712{
florianb26101c2015-08-08 21:45:33 +00004713 PRINT("sys_utimensat ( %ld, %#lx(%s), %#lx, 0x%lx )",
4714 SARG1, ARG2, (HChar*)ARG2, ARG3, ARG4);
bartf5ceec82008-04-26 07:45:10 +00004715 PRE_REG_READ4(long, "utimensat",
4716 int, dfd, char *, filename, struct timespec *, utimes, int, flags);
sewardjf4ef2ea2008-05-12 14:29:23 +00004717 if (ARG2 != 0)
4718 PRE_MEM_RASCIIZ( "utimensat(filename)", ARG2 );
bartf5ceec82008-04-26 07:45:10 +00004719 if (ARG3 != 0)
4720 PRE_MEM_READ( "utimensat(tvp)", ARG3, 2 * sizeof(struct vki_timespec) );
tom363ec762006-03-21 10:58:35 +00004721}
4722
4723PRE(sys_newfstatat)
4724{
sewardjcc3de2d2011-08-18 15:08:20 +00004725 FUSE_COMPATIBLE_MAY_BLOCK();
florianb26101c2015-08-08 21:45:33 +00004726 PRINT("sys_newfstatat ( %ld, %#lx(%s), %#lx )",
4727 SARG1, ARG2, (HChar*)ARG2, ARG3);
tom363ec762006-03-21 10:58:35 +00004728 PRE_REG_READ3(long, "fstatat",
4729 int, dfd, char *, file_name, struct stat *, buf);
4730 PRE_MEM_RASCIIZ( "fstatat(file_name)", ARG2 );
4731 PRE_MEM_WRITE( "fstatat(buf)", ARG3, sizeof(struct vki_stat) );
4732}
4733
4734POST(sys_newfstatat)
4735{
4736 POST_MEM_WRITE( ARG3, sizeof(struct vki_stat) );
4737}
4738
4739PRE(sys_unlinkat)
4740{
4741 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004742 PRINT("sys_unlinkat ( %ld, %#lx(%s) )", SARG1, ARG2, (HChar*)ARG2);
tom363ec762006-03-21 10:58:35 +00004743 PRE_REG_READ2(long, "unlinkat", int, dfd, const char *, pathname);
4744 PRE_MEM_RASCIIZ( "unlinkat(pathname)", ARG2 );
4745}
4746
4747PRE(sys_renameat)
4748{
florianb26101c2015-08-08 21:45:33 +00004749 PRINT("sys_renameat ( %ld, %#lx(%s), %ld, %#lx(%s) )",
4750 SARG1, ARG2, (HChar*)ARG2, SARG3, ARG4, (HChar*)ARG4);
toma43717f2006-05-08 11:19:47 +00004751 PRE_REG_READ4(long, "renameat",
4752 int, olddfd, const char *, oldpath,
4753 int, newdfd, const char *, newpath);
tom363ec762006-03-21 10:58:35 +00004754 PRE_MEM_RASCIIZ( "renameat(oldpath)", ARG2 );
toma43717f2006-05-08 11:19:47 +00004755 PRE_MEM_RASCIIZ( "renameat(newpath)", ARG4 );
tom363ec762006-03-21 10:58:35 +00004756}
4757
Elliott Hughesa0664b92017-04-18 17:46:52 -07004758PRE(sys_renameat2)
4759{
4760 PRINT("sys_renameat2 ( %ld, %#lx(%s), %ld, %#lx(%s), %lu )",
4761 SARG1, ARG2, (HChar*)ARG2, SARG3, ARG4, (HChar*)ARG4, ARG5);
4762 PRE_REG_READ5(long, "renameat2",
4763 int, olddfd, const char *, oldpath,
4764 int, newdfd, const char *, newpath,
4765 unsigned int, flags);
4766 PRE_MEM_RASCIIZ( "renameat2(oldpath)", ARG2 );
4767 PRE_MEM_RASCIIZ( "renameat2(newpath)", ARG4 );
4768}
4769
tom363ec762006-03-21 10:58:35 +00004770PRE(sys_linkat)
4771{
4772 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004773 PRINT("sys_linkat ( %ld, %#lx(%s), %ld, %#lx(%s), %ld )",
4774 SARG1, ARG2, (HChar*)ARG2, SARG3, ARG4, (HChar*)ARG4, SARG5);
toma43717f2006-05-08 11:19:47 +00004775 PRE_REG_READ5(long, "linkat",
4776 int, olddfd, const char *, oldpath,
4777 int, newdfd, const char *, newpath,
4778 int, flags);
tom363ec762006-03-21 10:58:35 +00004779 PRE_MEM_RASCIIZ( "linkat(oldpath)", ARG2);
toma43717f2006-05-08 11:19:47 +00004780 PRE_MEM_RASCIIZ( "linkat(newpath)", ARG4);
tom363ec762006-03-21 10:58:35 +00004781}
4782
4783PRE(sys_symlinkat)
4784{
4785 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004786 PRINT("sys_symlinkat ( %#lx(%s), %ld, %#lx(%s) )",
4787 ARG1, (HChar*)ARG1, SARG2, ARG3, (HChar*)ARG3);
tom363ec762006-03-21 10:58:35 +00004788 PRE_REG_READ3(long, "symlinkat",
toma43717f2006-05-08 11:19:47 +00004789 const char *, oldpath, int, newdfd, const char *, newpath);
4790 PRE_MEM_RASCIIZ( "symlinkat(oldpath)", ARG1 );
tom363ec762006-03-21 10:58:35 +00004791 PRE_MEM_RASCIIZ( "symlinkat(newpath)", ARG3 );
4792}
4793
4794PRE(sys_readlinkat)
4795{
florianf44ff622014-12-20 16:52:08 +00004796 HChar name[30]; // large enough
tom363ec762006-03-21 10:58:35 +00004797 Word saved = SYSNO;
4798
florianb26101c2015-08-08 21:45:33 +00004799 PRINT("sys_readlinkat ( %ld, %#lx(%s), %#lx, %lu )",
4800 SARG1, ARG2, (HChar*)ARG2, ARG3, ARG4);
tom363ec762006-03-21 10:58:35 +00004801 PRE_REG_READ4(long, "readlinkat",
florianb26101c2015-08-08 21:45:33 +00004802 int, dfd, const char *, path, char *, buf, vki_size_t, bufsiz);
tom363ec762006-03-21 10:58:35 +00004803 PRE_MEM_RASCIIZ( "readlinkat(path)", ARG2 );
4804 PRE_MEM_WRITE( "readlinkat(buf)", ARG3,ARG4 );
4805
4806 /*
4807 * Handle the case where readlinkat is looking at /proc/self/exe or
4808 * /proc/<pid>/exe.
4809 */
4810 VG_(sprintf)(name, "/proc/%d/exe", VG_(getpid)());
4811 if (ML_(safe_to_deref)((void*)ARG2, 1)
florian1636d332012-11-15 04:27:04 +00004812 && (VG_(strcmp)((HChar *)ARG2, name) == 0
4813 || VG_(strcmp)((HChar *)ARG2, "/proc/self/exe") == 0)) {
tom363ec762006-03-21 10:58:35 +00004814 VG_(sprintf)(name, "/proc/self/fd/%d", VG_(cl_exec_fd));
4815 SET_STATUS_from_SysRes( VG_(do_syscall4)(saved, ARG1, (UWord)name,
4816 ARG3, ARG4));
4817 } else {
4818 /* Normal case */
4819 SET_STATUS_from_SysRes( VG_(do_syscall4)(saved, ARG1, ARG2, ARG3, ARG4));
4820 }
4821
4822 if (SUCCESS && RES > 0)
4823 POST_MEM_WRITE( ARG3, RES );
4824}
4825
4826PRE(sys_fchmodat)
4827{
florianb26101c2015-08-08 21:45:33 +00004828 PRINT("sys_fchmodat ( %ld, %#lx(%s), %lu )",
4829 SARG1, ARG2, (HChar*)ARG2, ARG3);
tom363ec762006-03-21 10:58:35 +00004830 PRE_REG_READ3(long, "fchmodat",
4831 int, dfd, const char *, path, vki_mode_t, mode);
4832 PRE_MEM_RASCIIZ( "fchmodat(path)", ARG2 );
4833}
4834
4835PRE(sys_faccessat)
4836{
florianb26101c2015-08-08 21:45:33 +00004837 PRINT("sys_faccessat ( %ld, %#lx(%s), %ld )",
4838 SARG1, ARG2, (HChar*)ARG2, SARG3);
tom363ec762006-03-21 10:58:35 +00004839 PRE_REG_READ3(long, "faccessat",
4840 int, dfd, const char *, pathname, int, mode);
4841 PRE_MEM_RASCIIZ( "faccessat(pathname)", ARG2 );
4842}
4843
tomf9e5b5e2013-03-03 12:57:20 +00004844PRE(sys_name_to_handle_at)
4845{
florianb26101c2015-08-08 21:45:33 +00004846 PRINT("sys_name_to_handle_at ( %ld, %#lx(%s), %#lx, %#lx, %ld )",
4847 SARG1, ARG2, (HChar*)ARG2, ARG3, ARG4, SARG5);
tomf9e5b5e2013-03-03 12:57:20 +00004848 PRE_REG_READ5(int, "name_to_handle_at",
4849 int, dfd, const char *, name,
tom43ca0972013-07-17 13:25:08 +00004850 struct vki_file_handle *, handle,
tomf9e5b5e2013-03-03 12:57:20 +00004851 int *, mnt_id, int, flag);
4852 PRE_MEM_RASCIIZ( "name_to_handle_at(name)", ARG2 );
tom43ca0972013-07-17 13:25:08 +00004853 if (ML_(safe_to_deref)( (void*)ARG3, sizeof(struct vki_file_handle))) {
4854 struct vki_file_handle *fh = (struct vki_file_handle *)ARG3;
4855 PRE_MEM_READ( "name_to_handle_at(handle)", (Addr)&fh->handle_bytes, sizeof(fh->handle_bytes) );
4856 PRE_MEM_WRITE( "name_to_handle_at(handle)", (Addr)fh, sizeof(struct vki_file_handle) + fh->handle_bytes );
4857 }
tomf9e5b5e2013-03-03 12:57:20 +00004858 PRE_MEM_WRITE( "name_to_handle_at(mnt_id)", ARG4, sizeof(int) );
4859}
4860
4861POST(sys_name_to_handle_at)
4862{
tom43ca0972013-07-17 13:25:08 +00004863 struct vki_file_handle *fh = (struct vki_file_handle *)ARG3;
4864 POST_MEM_WRITE( ARG3, sizeof(struct vki_file_handle) + fh->handle_bytes );
tomf9e5b5e2013-03-03 12:57:20 +00004865 POST_MEM_WRITE( ARG4, sizeof(int) );
4866}
4867
tom43ca0972013-07-17 13:25:08 +00004868PRE(sys_open_by_handle_at)
4869{
4870 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00004871 PRINT("sys_open_by_handle_at ( %ld, %#lx, %ld )", SARG1, ARG2, SARG3);
tom43ca0972013-07-17 13:25:08 +00004872 PRE_REG_READ3(int, "open_by_handle_at",
4873 int, mountdirfd,
4874 struct vki_file_handle *, handle,
4875 int, flags);
4876 PRE_MEM_READ( "open_by_handle_at(handle)", ARG2, sizeof(struct vki_file_handle) + ((struct vki_file_handle*)ARG2)->handle_bytes );
4877}
4878
4879POST(sys_open_by_handle_at)
4880{
4881 vg_assert(SUCCESS);
4882 if (!ML_(fd_allowed)(RES, "open_by_handle_at", tid, True)) {
4883 VG_(close)(RES);
4884 SET_STATUS_Failure( VKI_EMFILE );
4885 } else {
4886 if (VG_(clo_track_fds))
4887 ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG2);
4888 }
4889}
4890
tom7f4d7e42007-03-07 11:12:13 +00004891/* ---------------------------------------------------------------------
tomd8feb702009-10-28 10:04:11 +00004892 p{read,write}v wrappers
4893 ------------------------------------------------------------------ */
4894
4895PRE(sys_preadv)
4896{
4897 Int i;
4898 struct vki_iovec * vec;
4899 *flags |= SfMayBlock;
4900#if VG_WORDSIZE == 4
tom41f4c852009-12-02 16:19:12 +00004901 /* Note that the offset argument here is in lo+hi order on both
4902 big and little endian platforms... */
florianb26101c2015-08-08 21:45:33 +00004903 PRINT("sys_preadv ( %lu, %#lx, %lu, %lld )",
4904 ARG1, ARG2, ARG3, (Long)LOHI64(ARG4,ARG5));
tomd8feb702009-10-28 10:04:11 +00004905 PRE_REG_READ5(ssize_t, "preadv",
4906 unsigned long, fd, const struct iovec *, vector,
tom41f4c852009-12-02 16:19:12 +00004907 unsigned long, count, vki_u32, offset_low,
4908 vki_u32, offset_high);
tomd8feb702009-10-28 10:04:11 +00004909#elif VG_WORDSIZE == 8
florianb26101c2015-08-08 21:45:33 +00004910 PRINT("sys_preadv ( %lu, %#lx, %lu, %ld )", ARG1, ARG2, ARG3, SARG4);
tomd8feb702009-10-28 10:04:11 +00004911 PRE_REG_READ4(ssize_t, "preadv",
4912 unsigned long, fd, const struct iovec *, vector,
4913 unsigned long, count, Word, offset);
4914#else
4915# error Unexpected word size
4916#endif
4917 if (!ML_(fd_allowed)(ARG1, "preadv", tid, False)) {
4918 SET_STATUS_Failure( VKI_EBADF );
4919 } else {
4920 PRE_MEM_READ( "preadv(vector)", ARG2, ARG3 * sizeof(struct vki_iovec) );
4921
4922 if (ARG2 != 0) {
4923 /* ToDo: don't do any of the following if the vector is invalid */
4924 vec = (struct vki_iovec *)ARG2;
4925 for (i = 0; i < (Int)ARG3; i++)
4926 PRE_MEM_WRITE( "preadv(vector[...])",
4927 (Addr)vec[i].iov_base, vec[i].iov_len );
4928 }
4929 }
4930}
4931
4932POST(sys_preadv)
4933{
4934 vg_assert(SUCCESS);
4935 if (RES > 0) {
4936 Int i;
4937 struct vki_iovec * vec = (struct vki_iovec *)ARG2;
4938 Int remains = RES;
4939
4940 /* RES holds the number of bytes read. */
4941 for (i = 0; i < (Int)ARG3; i++) {
4942 Int nReadThisBuf = vec[i].iov_len;
4943 if (nReadThisBuf > remains) nReadThisBuf = remains;
4944 POST_MEM_WRITE( (Addr)vec[i].iov_base, nReadThisBuf );
4945 remains -= nReadThisBuf;
4946 if (remains < 0) VG_(core_panic)("preadv: remains < 0");
4947 }
4948 }
4949}
4950
4951PRE(sys_pwritev)
4952{
4953 Int i;
4954 struct vki_iovec * vec;
4955 *flags |= SfMayBlock;
4956#if VG_WORDSIZE == 4
tom41f4c852009-12-02 16:19:12 +00004957 /* Note that the offset argument here is in lo+hi order on both
4958 big and little endian platforms... */
florianb26101c2015-08-08 21:45:33 +00004959 PRINT("sys_pwritev ( %lu, %#lx, %lu, %lld )",
4960 ARG1, ARG2, ARG3, (Long)LOHI64(ARG4,ARG5));
tomd8feb702009-10-28 10:04:11 +00004961 PRE_REG_READ5(ssize_t, "pwritev",
4962 unsigned long, fd, const struct iovec *, vector,
tom41f4c852009-12-02 16:19:12 +00004963 unsigned long, count, vki_u32, offset_low,
4964 vki_u32, offset_high);
tomd8feb702009-10-28 10:04:11 +00004965#elif VG_WORDSIZE == 8
florianb26101c2015-08-08 21:45:33 +00004966 PRINT("sys_pwritev ( %lu, %#lx, %lu, %ld )", ARG1, ARG2, ARG3, SARG4);
tomd8feb702009-10-28 10:04:11 +00004967 PRE_REG_READ4(ssize_t, "pwritev",
4968 unsigned long, fd, const struct iovec *, vector,
4969 unsigned long, count, Word, offset);
4970#else
4971# error Unexpected word size
4972#endif
4973 if (!ML_(fd_allowed)(ARG1, "pwritev", tid, False)) {
4974 SET_STATUS_Failure( VKI_EBADF );
4975 } else {
4976 PRE_MEM_READ( "pwritev(vector)",
4977 ARG2, ARG3 * sizeof(struct vki_iovec) );
4978 if (ARG2 != 0) {
4979 /* ToDo: don't do any of the following if the vector is invalid */
4980 vec = (struct vki_iovec *)ARG2;
4981 for (i = 0; i < (Int)ARG3; i++)
4982 PRE_MEM_READ( "pwritev(vector[...])",
4983 (Addr)vec[i].iov_base, vec[i].iov_len );
4984 }
4985 }
4986}
4987
4988/* ---------------------------------------------------------------------
tom9e4b6362012-02-10 09:39:37 +00004989 process_vm_{read,write}v wrappers
4990 ------------------------------------------------------------------ */
4991
4992PRE(sys_process_vm_readv)
4993{
florianb26101c2015-08-08 21:45:33 +00004994 PRINT("sys_process_vm_readv ( %ld, %#lx, %lu, %#lx, %lu, %lu )",
4995 SARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
tom9e4b6362012-02-10 09:39:37 +00004996 PRE_REG_READ6(ssize_t, "process_vm_readv",
4997 vki_pid_t, pid,
4998 const struct iovec *, lvec,
4999 unsigned long, liovcnt,
5000 const struct iovec *, rvec,
5001 unsigned long, riovcnt,
5002 unsigned long, flags);
5003 PRE_MEM_READ( "process_vm_readv(lvec)",
5004 ARG2, ARG3 * sizeof(struct vki_iovec) );
5005 PRE_MEM_READ( "process_vm_readv(rvec)",
5006 ARG4, ARG5 * sizeof(struct vki_iovec) );
Elliott Hughesa0664b92017-04-18 17:46:52 -07005007 if (ARG2 != 0
5008 && ML_(safe_to_deref) ((void *)ARG2, sizeof(struct vki_iovec) * ARG3)) {
tom9e4b6362012-02-10 09:39:37 +00005009 const struct vki_iovec *vec = (const struct vki_iovec *)ARG2;
5010 UInt i;
5011 for (i = 0; i < ARG3; i++)
5012 PRE_MEM_WRITE( "process_vm_readv(lvec[...])",
5013 (Addr)vec[i].iov_base, vec[i].iov_len );
5014 }
5015}
5016
5017POST(sys_process_vm_readv)
5018{
5019 const struct vki_iovec *vec = (const struct vki_iovec *)ARG2;
5020 UInt remains = RES;
5021 UInt i;
5022 for (i = 0; i < ARG3; i++) {
5023 UInt nReadThisBuf = vec[i].iov_len <= remains ?
5024 vec[i].iov_len : remains;
5025 POST_MEM_WRITE( (Addr)vec[i].iov_base, nReadThisBuf );
5026 remains -= nReadThisBuf;
5027 }
5028}
5029
5030PRE(sys_process_vm_writev)
5031{
florianb26101c2015-08-08 21:45:33 +00005032 PRINT("sys_process_vm_writev ( %ld, %#lx, %lu, %#lx, %lu, %lu )",
5033 SARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
tom9e4b6362012-02-10 09:39:37 +00005034 PRE_REG_READ6(ssize_t, "process_vm_writev",
5035 vki_pid_t, pid,
5036 const struct iovec *, lvec,
5037 unsigned long, liovcnt,
5038 const struct iovec *, rvec,
5039 unsigned long, riovcnt,
5040 unsigned long, flags);
5041 PRE_MEM_READ( "process_vm_writev(lvec)",
5042 ARG2, ARG3 * sizeof(struct vki_iovec) );
5043 PRE_MEM_READ( "process_vm_writev(rvec)",
5044 ARG4, ARG5 * sizeof(struct vki_iovec) );
Elliott Hughesa0664b92017-04-18 17:46:52 -07005045 if (ARG2 != 0
5046 && ML_(safe_to_deref) ((void *)ARG2, sizeof(struct vki_iovec) * ARG3)) {
tom9e4b6362012-02-10 09:39:37 +00005047 const struct vki_iovec *vec = (const struct vki_iovec *)ARG2;
5048 UInt i;
5049 for (i = 0; i < ARG3; i++)
5050 PRE_MEM_READ( "process_vm_writev(lvec[...])",
5051 (Addr)vec[i].iov_base, vec[i].iov_len );
5052 }
5053}
5054
5055/* ---------------------------------------------------------------------
toma4991232012-02-10 11:30:09 +00005056 {send,recv}mmsg wrappers
5057 ------------------------------------------------------------------ */
5058
5059PRE(sys_sendmmsg)
5060{
toma4991232012-02-10 11:30:09 +00005061 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00005062 PRINT("sys_sendmmsg ( %ld, %#lx, %ld, %ld )", SARG1, ARG2, SARG3, SARG4);
toma4991232012-02-10 11:30:09 +00005063 PRE_REG_READ4(long, "sendmmsg",
5064 int, s, const struct mmsghdr *, mmsg, int, vlen, int, flags);
mjwe3e61c52015-02-25 14:00:14 +00005065 ML_(linux_PRE_sys_sendmmsg)(tid, ARG1,ARG2,ARG3,ARG4);
tom27640002012-02-10 11:48:01 +00005066}
5067
5068POST(sys_sendmmsg)
5069{
mjwe3e61c52015-02-25 14:00:14 +00005070 ML_(linux_POST_sys_sendmmsg) (tid, RES, ARG1,ARG2,ARG3,ARG4);
toma4991232012-02-10 11:30:09 +00005071}
5072
5073PRE(sys_recvmmsg)
5074{
toma4991232012-02-10 11:30:09 +00005075 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00005076 PRINT("sys_recvmmsg ( %ld, %#lx, %ld, %ld, %#lx )",
5077 SARG1, ARG2, SARG3, SARG4, ARG5);
toma4991232012-02-10 11:30:09 +00005078 PRE_REG_READ5(long, "recvmmsg",
5079 int, s, struct mmsghdr *, mmsg, int, vlen,
5080 int, flags, struct timespec *, timeout);
mjwe3e61c52015-02-25 14:00:14 +00005081 ML_(linux_PRE_sys_recvmmsg)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
toma4991232012-02-10 11:30:09 +00005082}
5083
5084POST(sys_recvmmsg)
5085{
mjwe3e61c52015-02-25 14:00:14 +00005086 ML_(linux_POST_sys_recvmmsg) (tid, RES, ARG1,ARG2,ARG3,ARG4,ARG5);
toma4991232012-02-10 11:30:09 +00005087}
5088
5089/* ---------------------------------------------------------------------
tom7f4d7e42007-03-07 11:12:13 +00005090 key retention service wrappers
5091 ------------------------------------------------------------------ */
sewardj7acef082007-03-11 19:28:02 +00005092
tom7f4d7e42007-03-07 11:12:13 +00005093PRE(sys_request_key)
5094{
barta0b6b2c2008-07-07 06:49:24 +00005095 PRINT("sys_request_key ( %#lx(%s), %#lx(%s), %#lx(%s), %ld )",
florianb26101c2015-08-08 21:45:33 +00005096 ARG1, (HChar*)ARG1, ARG2, (HChar*)ARG2, ARG3, (HChar*)ARG3, SARG4);
tom7f4d7e42007-03-07 11:12:13 +00005097 PRE_REG_READ4(long, "request_key",
5098 const char *, type, const char *, description,
5099 const char *, callout_info, vki_key_serial_t, keyring);
5100 PRE_MEM_RASCIIZ( "request_key(type)", ARG1);
5101 PRE_MEM_RASCIIZ( "request_key(description)", ARG2);
5102 if (ARG3 != (UWord)NULL)
5103 PRE_MEM_RASCIIZ( "request_key(callout_info)", ARG3);
5104}
5105
5106PRE(sys_add_key)
5107{
florianb26101c2015-08-08 21:45:33 +00005108 PRINT("sys_add_key ( %#lx(%s), %#lx(%s), %#lx, %lu, %ld )",
5109 ARG1, (HChar*)ARG1, ARG2, (HChar*)ARG2, ARG3, ARG4, SARG5);
tom7f4d7e42007-03-07 11:12:13 +00005110 PRE_REG_READ5(long, "add_key",
5111 const char *, type, const char *, description,
5112 const void *, payload, vki_size_t, plen,
5113 vki_key_serial_t, keyring);
5114 PRE_MEM_RASCIIZ( "add_key(type)", ARG1);
5115 PRE_MEM_RASCIIZ( "add_key(description)", ARG2);
5116 if (ARG3 != (UWord)NULL)
5117 PRE_MEM_READ( "request_key(payload)", ARG3, ARG4);
5118}
5119
5120PRE(sys_keyctl)
5121{
5122 switch (ARG1 /* option */) {
5123 case VKI_KEYCTL_GET_KEYRING_ID:
florianb26101c2015-08-08 21:45:33 +00005124 PRINT("sys_keyctl ( KEYCTL_GET_KEYRING_ID, %ld, %ld )", SARG2, SARG3);
tom7f4d7e42007-03-07 11:12:13 +00005125 PRE_REG_READ3(long, "keyctl(KEYCTL_GET_KEYRING_ID)",
5126 int, option, vki_key_serial_t, id, int, create);
5127 break;
5128 case VKI_KEYCTL_JOIN_SESSION_KEYRING:
barta0b6b2c2008-07-07 06:49:24 +00005129 PRINT("sys_keyctl ( KEYCTL_JOIN_SESSION_KEYRING, %#lx(%s) )", ARG2,(char*)ARG2);
tom7f4d7e42007-03-07 11:12:13 +00005130 PRE_REG_READ2(long, "keyctl(KEYCTL_JOIN_SESSION_KEYRING)",
5131 int, option, const char *, name);
5132 if (ARG2 != (UWord)NULL)
5133 PRE_MEM_RASCIIZ("keyctl(KEYCTL_JOIN_SESSION_KEYRING, name)", ARG2);
5134 break;
5135 case VKI_KEYCTL_UPDATE:
florianb26101c2015-08-08 21:45:33 +00005136 PRINT("sys_keyctl ( KEYCTL_UPDATE, %ld, %#lx, %lu )", SARG2, ARG3, ARG4);
tom7f4d7e42007-03-07 11:12:13 +00005137 PRE_REG_READ4(long, "keyctl(KEYCTL_UPDATE)",
5138 int, option, vki_key_serial_t, key,
5139 const void *, payload, vki_size_t, plen);
5140 if (ARG3 != (UWord)NULL)
5141 PRE_MEM_READ("keyctl(KEYCTL_UPDATE, payload)", ARG3, ARG4);
5142 break;
5143 case VKI_KEYCTL_REVOKE:
florianb26101c2015-08-08 21:45:33 +00005144 PRINT("sys_keyctl ( KEYCTL_REVOKE, %ld )", SARG2);
tom7f4d7e42007-03-07 11:12:13 +00005145 PRE_REG_READ2(long, "keyctl(KEYCTL_REVOKE)",
5146 int, option, vki_key_serial_t, id);
5147 break;
5148 case VKI_KEYCTL_CHOWN:
florianb26101c2015-08-08 21:45:33 +00005149 PRINT("sys_keyctl ( KEYCTL_CHOWN, %ld, %lu, %lu )", SARG2, ARG3, ARG4);
tom7f4d7e42007-03-07 11:12:13 +00005150 PRE_REG_READ4(long, "keyctl(KEYCTL_CHOWN)",
5151 int, option, vki_key_serial_t, id,
5152 vki_uid_t, uid, vki_gid_t, gid);
5153 break;
5154 case VKI_KEYCTL_SETPERM:
florianb26101c2015-08-08 21:45:33 +00005155 PRINT("sys_keyctl ( KEYCTL_SETPERM, %ld, %lu )", SARG2, ARG3);
tom7f4d7e42007-03-07 11:12:13 +00005156 PRE_REG_READ3(long, "keyctl(KEYCTL_SETPERM)",
5157 int, option, vki_key_serial_t, id, vki_key_perm_t, perm);
5158 break;
5159 case VKI_KEYCTL_DESCRIBE:
florianb26101c2015-08-08 21:45:33 +00005160 PRINT("sys_keyctl ( KEYCTL_DESCRIBE, %ld, %#lx, %lu )", SARG2, ARG3, ARG4);
tom7f4d7e42007-03-07 11:12:13 +00005161 PRE_REG_READ4(long, "keyctl(KEYCTL_DESCRIBE)",
5162 int, option, vki_key_serial_t, id,
5163 char *, buffer, vki_size_t, buflen);
5164 if (ARG3 != (UWord)NULL)
5165 PRE_MEM_WRITE("keyctl(KEYCTL_DESCRIBE, buffer)", ARG3, ARG4);
5166 break;
5167 case VKI_KEYCTL_CLEAR:
florianb26101c2015-08-08 21:45:33 +00005168 PRINT("sys_keyctl ( KEYCTL_CLEAR, %ld )", SARG2);
tom7f4d7e42007-03-07 11:12:13 +00005169 PRE_REG_READ2(long, "keyctl(KEYCTL_CLEAR)",
5170 int, option, vki_key_serial_t, keyring);
5171 break;
5172 case VKI_KEYCTL_LINK:
florianb26101c2015-08-08 21:45:33 +00005173 PRINT("sys_keyctl ( KEYCTL_LINK, %ld, %ld )", SARG2, SARG3);
tom7f4d7e42007-03-07 11:12:13 +00005174 PRE_REG_READ3(long, "keyctl(KEYCTL_LINK)", int, option,
5175 vki_key_serial_t, keyring, vki_key_serial_t, key);
5176 break;
5177 case VKI_KEYCTL_UNLINK:
florianb26101c2015-08-08 21:45:33 +00005178 PRINT("sys_keyctl ( KEYCTL_UNLINK, %ld, %ld )", SARG2, SARG3);
tom7f4d7e42007-03-07 11:12:13 +00005179 PRE_REG_READ3(long, "keyctl(KEYCTL_UNLINK)", int, option,
5180 vki_key_serial_t, keyring, vki_key_serial_t, key);
5181 break;
5182 case VKI_KEYCTL_SEARCH:
barta0b6b2c2008-07-07 06:49:24 +00005183 PRINT("sys_keyctl ( KEYCTL_SEARCH, %ld, %#lx(%s), %#lx(%s), %ld )",
florianb26101c2015-08-08 21:45:33 +00005184 SARG2, ARG3, (HChar*)ARG3, ARG4, (HChar*)ARG4, SARG5);
tom7f4d7e42007-03-07 11:12:13 +00005185 PRE_REG_READ5(long, "keyctl(KEYCTL_SEARCH)",
5186 int, option, vki_key_serial_t, keyring,
5187 const char *, type, const char *, description,
5188 vki_key_serial_t, destring);
5189 PRE_MEM_RASCIIZ("sys_keyctl(KEYCTL_SEARCH, type)", ARG3);
5190 PRE_MEM_RASCIIZ("sys_keyctl(KEYCTL_SEARCH, description)", ARG4);
5191 break;
5192 case VKI_KEYCTL_READ:
florianb26101c2015-08-08 21:45:33 +00005193 PRINT("sys_keyctl ( KEYCTL_READ, %ld, %#lx, %lu )", SARG2, ARG3, ARG4);
tom7f4d7e42007-03-07 11:12:13 +00005194 PRE_REG_READ4(long, "keyctl(KEYCTL_READ)",
5195 int, option, vki_key_serial_t, keyring,
5196 char *, buffer, vki_size_t, buflen);
5197 if (ARG3 != (UWord)NULL)
5198 PRE_MEM_WRITE("keyctl(KEYCTL_READ, buffer)", ARG3, ARG4);
5199 break;
5200 case VKI_KEYCTL_INSTANTIATE:
florianb26101c2015-08-08 21:45:33 +00005201 PRINT("sys_keyctl ( KEYCTL_INSTANTIATE, %ld, %#lx, %lu, %ld )",
5202 SARG2, ARG3, ARG4, SARG5);
tom7f4d7e42007-03-07 11:12:13 +00005203 PRE_REG_READ5(long, "keyctl(KEYCTL_INSTANTIATE)",
5204 int, option, vki_key_serial_t, key,
5205 char *, payload, vki_size_t, plen,
5206 vki_key_serial_t, keyring);
5207 if (ARG3 != (UWord)NULL)
5208 PRE_MEM_READ("keyctl(KEYCTL_INSTANTIATE, payload)", ARG3, ARG4);
5209 break;
5210 case VKI_KEYCTL_NEGATE:
florianb26101c2015-08-08 21:45:33 +00005211 PRINT("sys_keyctl ( KEYCTL_NEGATE, %ld, %lu, %ld )", SARG2, ARG3, SARG4);
tom7f4d7e42007-03-07 11:12:13 +00005212 PRE_REG_READ4(long, "keyctl(KEYCTL_NEGATE)",
5213 int, option, vki_key_serial_t, key,
5214 unsigned, timeout, vki_key_serial_t, keyring);
5215 break;
5216 case VKI_KEYCTL_SET_REQKEY_KEYRING:
florianb26101c2015-08-08 21:45:33 +00005217 PRINT("sys_keyctl ( KEYCTL_SET_REQKEY_KEYRING, %ld )", SARG2);
tom7f4d7e42007-03-07 11:12:13 +00005218 PRE_REG_READ2(long, "keyctl(KEYCTL_SET_REQKEY_KEYRING)",
5219 int, option, int, reqkey_defl);
5220 break;
5221 case VKI_KEYCTL_SET_TIMEOUT:
florianb26101c2015-08-08 21:45:33 +00005222 PRINT("sys_keyctl ( KEYCTL_SET_TIMEOUT, %ld, %lu )", SARG2, ARG3);
tom7f4d7e42007-03-07 11:12:13 +00005223 PRE_REG_READ3(long, "keyctl(KEYCTL_SET_TIMEOUT)",
5224 int, option, vki_key_serial_t, key, unsigned, timeout);
5225 break;
5226 case VKI_KEYCTL_ASSUME_AUTHORITY:
florianb26101c2015-08-08 21:45:33 +00005227 PRINT("sys_keyctl ( KEYCTL_ASSUME_AUTHORITY, %ld )", SARG2);
tom7f4d7e42007-03-07 11:12:13 +00005228 PRE_REG_READ2(long, "keyctl(KEYCTL_ASSUME_AUTHORITY)",
5229 int, option, vki_key_serial_t, key);
5230 break;
5231 default:
florianb26101c2015-08-08 21:45:33 +00005232 PRINT("sys_keyctl ( %ld ) ", SARG1);
tom7f4d7e42007-03-07 11:12:13 +00005233 PRE_REG_READ1(long, "keyctl", int, option);
5234 break;
5235 }
5236}
5237
5238POST(sys_keyctl)
5239{
5240 vg_assert(SUCCESS);
5241 switch (ARG1 /* option */) {
5242 case VKI_KEYCTL_DESCRIBE:
5243 case VKI_KEYCTL_READ:
5244 if (RES > ARG4)
5245 POST_MEM_WRITE(ARG3, ARG4);
5246 else
5247 POST_MEM_WRITE(ARG3, RES);
5248 break;
5249 default:
5250 break;
5251 }
5252}
5253
sewardj7acef082007-03-11 19:28:02 +00005254/* ---------------------------------------------------------------------
5255 ioprio_ wrappers
5256 ------------------------------------------------------------------ */
5257
sewardj7acef082007-03-11 19:28:02 +00005258PRE(sys_ioprio_set)
5259{
florianb26101c2015-08-08 21:45:33 +00005260 PRINT("sys_ioprio_set ( %ld, %ld, %ld )", SARG1, SARG2, SARG3);
sewardj7acef082007-03-11 19:28:02 +00005261 PRE_REG_READ3(int, "ioprio_set", int, which, int, who, int, ioprio);
5262}
5263
tom16dfea42008-12-15 08:58:29 +00005264PRE(sys_ioprio_get)
5265{
florianb26101c2015-08-08 21:45:33 +00005266 PRINT("sys_ioprio_get ( %ld, %ld )", SARG1, SARG2);
tom16dfea42008-12-15 08:58:29 +00005267 PRE_REG_READ2(int, "ioprio_get", int, which, int, who);
5268}
5269
bart10ac1442008-06-21 16:28:24 +00005270/* ---------------------------------------------------------------------
5271 _module wrappers
5272 ------------------------------------------------------------------ */
5273
5274PRE(sys_init_module)
5275{
5276 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00005277 PRINT("sys_init_module ( %#lx, %lu, %#lx(\"%s\") )",
5278 ARG1, ARG2, ARG3, (HChar*)ARG3);
bart10ac1442008-06-21 16:28:24 +00005279 PRE_REG_READ3(long, "init_module",
5280 void *, umod, unsigned long, len, const char *, uargs);
5281 PRE_MEM_READ( "init_module(umod)", ARG1, ARG2 );
5282 PRE_MEM_RASCIIZ( "init_module(uargs)", ARG3 );
5283}
5284
5285PRE(sys_delete_module)
5286{
5287 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00005288 PRINT("sys_delete_module ( %#lx(\"%s\"), 0x%lx )", ARG1, (HChar*)ARG1, ARG2);
bart10ac1442008-06-21 16:28:24 +00005289 PRE_REG_READ2(long, "delete_module",
5290 const char *, name_user, unsigned int, flags);
5291 PRE_MEM_RASCIIZ("delete_module(name_user)", ARG1);
5292}
5293
sewardjd3263e52008-11-16 21:40:54 +00005294/* ---------------------------------------------------------------------
tom110743c2010-02-23 10:49:48 +00005295 splice wrappers
5296 ------------------------------------------------------------------ */
5297
5298PRE(sys_splice)
5299{
5300 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00005301 PRINT("sys_splice ( %ld, %#lx, %ld, %#lx, %lu, %#lx )",
5302 SARG1, ARG2, SARG3, ARG4, ARG5, ARG6);
tom5db7a792012-08-08 08:03:44 +00005303 PRE_REG_READ6(vki_ssize_t, "splice",
tom110743c2010-02-23 10:49:48 +00005304 int, fd_in, vki_loff_t *, off_in,
5305 int, fd_out, vki_loff_t *, off_out,
5306 vki_size_t, len, unsigned int, flags);
5307 if (!ML_(fd_allowed)(ARG1, "splice(fd_in)", tid, False) ||
5308 !ML_(fd_allowed)(ARG3, "splice(fd_out)", tid, False)) {
5309 SET_STATUS_Failure( VKI_EBADF );
5310 } else {
5311 if (ARG2 != 0)
5312 PRE_MEM_READ( "splice(off_in)", ARG2, sizeof(vki_loff_t));
5313 if (ARG4 != 0)
5314 PRE_MEM_READ( "splice(off_out)", ARG4, sizeof(vki_loff_t));
5315 }
5316}
5317
tom5db7a792012-08-08 08:03:44 +00005318PRE(sys_tee)
5319{
5320 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00005321 PRINT("sys_tree ( %ld, %ld, %lu, %#lx )", SARG1, SARG2, ARG3, ARG4);
tom5db7a792012-08-08 08:03:44 +00005322 PRE_REG_READ4(vki_ssize_t, "tee",
5323 int, fd_in, int, fd_out,
5324 vki_size_t, len, unsigned int, flags);
5325 if (!ML_(fd_allowed)(ARG1, "tee(fd_in)", tid, False) ||
5326 !ML_(fd_allowed)(ARG2, "tee(fd_out)", tid, False)) {
5327 SET_STATUS_Failure( VKI_EBADF );
5328 }
5329}
5330
5331PRE(sys_vmsplice)
5332{
5333 Int fdfl;
5334 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00005335 PRINT("sys_vmsplice ( %ld, %#lx, %lu, %lu )", SARG1, ARG2, ARG3, ARG4);
tom5db7a792012-08-08 08:03:44 +00005336 PRE_REG_READ4(vki_ssize_t, "splice",
5337 int, fd, struct vki_iovec *, iov,
5338 unsigned long, nr_segs, unsigned int, flags);
5339 if (!ML_(fd_allowed)(ARG1, "vmsplice(fd)", tid, False)) {
5340 SET_STATUS_Failure( VKI_EBADF );
5341 } else if ((fdfl = VG_(fcntl)(ARG1, VKI_F_GETFL, 0)) < 0) {
5342 SET_STATUS_Failure( VKI_EBADF );
5343 } else {
5344 const struct vki_iovec *iov;
5345 PRE_MEM_READ( "vmsplice(iov)", ARG2, sizeof(struct vki_iovec) * ARG3 );
5346 for (iov = (struct vki_iovec *)ARG2;
5347 iov < (struct vki_iovec *)ARG2 + ARG3; iov++)
5348 {
Elliott Hughesa0664b92017-04-18 17:46:52 -07005349 if (ML_(safe_to_deref) (iov, sizeof(struct vki_iovec))) {
5350 if ((fdfl & VKI_O_ACCMODE) == VKI_O_RDONLY)
5351 PRE_MEM_WRITE( "vmsplice(iov[...])",
5352 (Addr)iov->iov_base, iov->iov_len );
5353 else
5354 PRE_MEM_READ( "vmsplice(iov[...])",
5355 (Addr)iov->iov_base, iov->iov_len );
5356 }
tom5db7a792012-08-08 08:03:44 +00005357 }
5358 }
5359}
5360
5361POST(sys_vmsplice)
5362{
5363 vg_assert(SUCCESS);
5364 if (RES > 0) {
5365 Int fdfl = VG_(fcntl)(ARG1, VKI_F_GETFL, 0);
5366 vg_assert(fdfl >= 0);
tom91a16b72013-01-14 22:14:21 +00005367 if ((fdfl & VKI_O_ACCMODE) == VKI_O_RDONLY)
tom5db7a792012-08-08 08:03:44 +00005368 {
5369 const struct vki_iovec *iov;
5370 for (iov = (struct vki_iovec *)ARG2;
5371 iov < (struct vki_iovec *)ARG2 + ARG3; iov++)
5372 {
5373 POST_MEM_WRITE( (Addr)iov->iov_base, iov->iov_len );
5374 }
5375 }
5376 }
5377}
5378
tom110743c2010-02-23 10:49:48 +00005379/* ---------------------------------------------------------------------
sewardjd3263e52008-11-16 21:40:54 +00005380 oprofile-related wrappers
5381 ------------------------------------------------------------------ */
5382
5383#if defined(VGP_x86_linux)
5384PRE(sys_lookup_dcookie)
5385{
florianb26101c2015-08-08 21:45:33 +00005386 PRINT("sys_lookup_dcookie (0x%llx, %#lx, %lu)",
tomca787242009-11-25 11:24:00 +00005387 MERGE64(ARG1,ARG2), ARG3, ARG4);
sewardjd3263e52008-11-16 21:40:54 +00005388 PRE_REG_READ4(long, "lookup_dcookie",
tomca787242009-11-25 11:24:00 +00005389 vki_u32, MERGE64_FIRST(cookie), vki_u32, MERGE64_SECOND(cookie),
sewardjd3263e52008-11-16 21:40:54 +00005390 char *, buf, vki_size_t, len);
5391 PRE_MEM_WRITE( "lookup_dcookie(buf)", ARG3, ARG4);
5392}
5393POST(sys_lookup_dcookie)
5394{
5395 vg_assert(SUCCESS);
5396 if (ARG3 != (Addr)NULL)
5397 POST_MEM_WRITE( ARG3, RES);
5398}
5399#endif
5400
sewardj112711a2015-04-10 12:30:09 +00005401#if defined(VGP_amd64_linux) || defined(VGP_s390x_linux) \
Elliott Hughesa0664b92017-04-18 17:46:52 -07005402 || defined(VGP_tilegx_linux) || defined(VGP_arm64_linux)
sewardjd3263e52008-11-16 21:40:54 +00005403PRE(sys_lookup_dcookie)
5404{
5405 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +00005406 PRINT("sys_lookup_dcookie ( %lu, %#lx, %lu )", ARG1, ARG2, ARG3);
sewardjd3263e52008-11-16 21:40:54 +00005407 PRE_REG_READ3(int, "lookup_dcookie",
5408 unsigned long long, cookie, char *, buf, vki_size_t, len);
5409
5410 PRE_MEM_WRITE( "sys_lookup_dcookie(buf)", ARG2, ARG3 );
5411}
5412
5413POST(sys_lookup_dcookie)
5414{
5415 vg_assert(SUCCESS);
5416 if (ARG2 != (Addr)NULL)
5417 POST_MEM_WRITE( ARG2, RES );
5418}
5419#endif
5420
njnf37a81b2009-02-17 00:23:30 +00005421/* ---------------------------------------------------------------------
njn096ccdd2009-02-22 23:00:30 +00005422 fcntl wrappers
5423 ------------------------------------------------------------------ */
5424
5425PRE(sys_fcntl)
5426{
5427 switch (ARG2) {
5428 // These ones ignore ARG3.
5429 case VKI_F_GETFD:
5430 case VKI_F_GETFL:
5431 case VKI_F_GETOWN:
5432 case VKI_F_GETSIG:
5433 case VKI_F_GETLEASE:
tom5d770102011-08-10 10:11:14 +00005434 case VKI_F_GETPIPE_SZ:
florianb26101c2015-08-08 21:45:33 +00005435 PRINT("sys_fcntl ( %lu, %lu )", ARG1, ARG2);
njn096ccdd2009-02-22 23:00:30 +00005436 PRE_REG_READ2(long, "fcntl", unsigned int, fd, unsigned int, cmd);
5437 break;
5438
5439 // These ones use ARG3 as "arg".
5440 case VKI_F_DUPFD:
tomb23d5052010-09-02 08:23:35 +00005441 case VKI_F_DUPFD_CLOEXEC:
njn096ccdd2009-02-22 23:00:30 +00005442 case VKI_F_SETFD:
5443 case VKI_F_SETFL:
5444 case VKI_F_SETLEASE:
5445 case VKI_F_NOTIFY:
5446 case VKI_F_SETOWN:
5447 case VKI_F_SETSIG:
tom5d770102011-08-10 10:11:14 +00005448 case VKI_F_SETPIPE_SZ:
florianb26101c2015-08-08 21:45:33 +00005449 PRINT("sys_fcntl[ARG3=='arg'] ( %lu, %lu, %lu )", ARG1, ARG2, ARG3);
njn096ccdd2009-02-22 23:00:30 +00005450 PRE_REG_READ3(long, "fcntl",
5451 unsigned int, fd, unsigned int, cmd, unsigned long, arg);
5452 break;
5453
5454 // These ones use ARG3 as "lock".
5455 case VKI_F_GETLK:
5456 case VKI_F_SETLK:
5457 case VKI_F_SETLKW:
petarj4ab0a792013-04-03 23:43:11 +00005458# if defined(VGP_x86_linux) || defined(VGP_mips64_linux)
njn096ccdd2009-02-22 23:00:30 +00005459 case VKI_F_GETLK64:
5460 case VKI_F_SETLK64:
5461 case VKI_F_SETLKW64:
5462# endif
tomf77df942014-07-10 14:48:00 +00005463 case VKI_F_OFD_GETLK:
5464 case VKI_F_OFD_SETLK:
5465 case VKI_F_OFD_SETLKW:
florianb26101c2015-08-08 21:45:33 +00005466 PRINT("sys_fcntl[ARG3=='lock'] ( %lu, %lu, %#lx )", ARG1, ARG2, ARG3);
njn096ccdd2009-02-22 23:00:30 +00005467 PRE_REG_READ3(long, "fcntl",
5468 unsigned int, fd, unsigned int, cmd,
5469 struct flock64 *, lock);
5470 break;
njn223bd2b2009-05-22 00:38:15 +00005471
tom835a7142012-02-09 12:21:47 +00005472 case VKI_F_SETOWN_EX:
florianb26101c2015-08-08 21:45:33 +00005473 PRINT("sys_fcntl[F_SETOWN_EX] ( %lu, %lu, %lu )", ARG1, ARG2, ARG3);
tom835a7142012-02-09 12:21:47 +00005474 PRE_REG_READ3(long, "fcntl",
5475 unsigned int, fd, unsigned int, cmd,
5476 struct vki_f_owner_ex *, arg);
5477 PRE_MEM_READ("fcntl(F_SETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
5478 break;
5479
5480 case VKI_F_GETOWN_EX:
florianb26101c2015-08-08 21:45:33 +00005481 PRINT("sys_fcntl[F_GETOWN_EX] ( %lu, %lu, %lu )", ARG1, ARG2, ARG3);
tom835a7142012-02-09 12:21:47 +00005482 PRE_REG_READ3(long, "fcntl",
5483 unsigned int, fd, unsigned int, cmd,
5484 struct vki_f_owner_ex *, arg);
5485 PRE_MEM_WRITE("fcntl(F_GETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
5486 break;
5487
njn223bd2b2009-05-22 00:38:15 +00005488 default:
florianb26101c2015-08-08 21:45:33 +00005489 PRINT("sys_fcntl[UNKNOWN] ( %lu, %lu, %lu )", ARG1, ARG2, ARG3);
Elliott Hughesa0664b92017-04-18 17:46:52 -07005490 VG_(umsg)("Warning: unimplemented fcntl command: %lu\n", ARG2);
5491 SET_STATUS_Failure( VKI_EINVAL );
njn223bd2b2009-05-22 00:38:15 +00005492 break;
njn096ccdd2009-02-22 23:00:30 +00005493 }
5494
5495# if defined(VGP_x86_linux)
5496 if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64)
5497# else
5498 if (ARG2 == VKI_F_SETLKW)
5499# endif
5500 *flags |= SfMayBlock;
5501}
5502
5503POST(sys_fcntl)
5504{
5505 vg_assert(SUCCESS);
5506 if (ARG2 == VKI_F_DUPFD) {
5507 if (!ML_(fd_allowed)(RES, "fcntl(DUPFD)", tid, True)) {
5508 VG_(close)(RES);
5509 SET_STATUS_Failure( VKI_EMFILE );
5510 } else {
5511 if (VG_(clo_track_fds))
5512 ML_(record_fd_open_named)(tid, RES);
5513 }
5514 }
tomb23d5052010-09-02 08:23:35 +00005515 else if (ARG2 == VKI_F_DUPFD_CLOEXEC) {
5516 if (!ML_(fd_allowed)(RES, "fcntl(DUPFD_CLOEXEC)", tid, True)) {
5517 VG_(close)(RES);
5518 SET_STATUS_Failure( VKI_EMFILE );
5519 } else {
5520 if (VG_(clo_track_fds))
5521 ML_(record_fd_open_named)(tid, RES);
5522 }
tom835a7142012-02-09 12:21:47 +00005523 } else if (ARG2 == VKI_F_GETOWN_EX) {
5524 POST_MEM_WRITE(ARG3, sizeof(struct vki_f_owner_ex));
tomb23d5052010-09-02 08:23:35 +00005525 }
njn096ccdd2009-02-22 23:00:30 +00005526}
5527
5528// XXX: wrapper only suitable for 32-bit systems
5529PRE(sys_fcntl64)
5530{
5531 switch (ARG2) {
5532 // These ones ignore ARG3.
5533 case VKI_F_GETFD:
5534 case VKI_F_GETFL:
5535 case VKI_F_GETOWN:
5536 case VKI_F_SETOWN:
5537 case VKI_F_GETSIG:
5538 case VKI_F_SETSIG:
5539 case VKI_F_GETLEASE:
florianb26101c2015-08-08 21:45:33 +00005540 PRINT("sys_fcntl64 ( %lu, %lu )", ARG1, ARG2);
njn096ccdd2009-02-22 23:00:30 +00005541 PRE_REG_READ2(long, "fcntl64", unsigned int, fd, unsigned int, cmd);
5542 break;
5543
5544 // These ones use ARG3 as "arg".
5545 case VKI_F_DUPFD:
tomb23d5052010-09-02 08:23:35 +00005546 case VKI_F_DUPFD_CLOEXEC:
njn096ccdd2009-02-22 23:00:30 +00005547 case VKI_F_SETFD:
5548 case VKI_F_SETFL:
5549 case VKI_F_SETLEASE:
5550 case VKI_F_NOTIFY:
florianb26101c2015-08-08 21:45:33 +00005551 PRINT("sys_fcntl64[ARG3=='arg'] ( %lu, %lu, %lu )", ARG1, ARG2, ARG3);
njn096ccdd2009-02-22 23:00:30 +00005552 PRE_REG_READ3(long, "fcntl64",
5553 unsigned int, fd, unsigned int, cmd, unsigned long, arg);
5554 break;
5555
5556 // These ones use ARG3 as "lock".
5557 case VKI_F_GETLK:
5558 case VKI_F_SETLK:
5559 case VKI_F_SETLKW:
5560# if defined(VGP_x86_linux)
5561 case VKI_F_GETLK64:
5562 case VKI_F_SETLK64:
5563 case VKI_F_SETLKW64:
5564# endif
tom945d4d82014-07-10 14:50:06 +00005565 case VKI_F_OFD_GETLK:
5566 case VKI_F_OFD_SETLK:
5567 case VKI_F_OFD_SETLKW:
florianb26101c2015-08-08 21:45:33 +00005568 PRINT("sys_fcntl64[ARG3=='lock'] ( %lu, %lu, %#lx )", ARG1, ARG2, ARG3);
njn096ccdd2009-02-22 23:00:30 +00005569 PRE_REG_READ3(long, "fcntl64",
5570 unsigned int, fd, unsigned int, cmd,
5571 struct flock64 *, lock);
5572 break;
tom835a7142012-02-09 12:21:47 +00005573
5574 case VKI_F_SETOWN_EX:
florianb26101c2015-08-08 21:45:33 +00005575 PRINT("sys_fcntl[F_SETOWN_EX] ( %lu, %lu, %lu )", ARG1, ARG2, ARG3);
tom835a7142012-02-09 12:21:47 +00005576 PRE_REG_READ3(long, "fcntl",
5577 unsigned int, fd, unsigned int, cmd,
5578 struct vki_f_owner_ex *, arg);
5579 PRE_MEM_READ("fcntl(F_SETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
5580 break;
5581
5582 case VKI_F_GETOWN_EX:
florianb26101c2015-08-08 21:45:33 +00005583 PRINT("sys_fcntl[F_GETOWN_EX] ( %lu, %lu, %lu )", ARG1, ARG2, ARG3);
tom835a7142012-02-09 12:21:47 +00005584 PRE_REG_READ3(long, "fcntl",
5585 unsigned int, fd, unsigned int, cmd,
5586 struct vki_f_owner_ex *, arg);
5587 PRE_MEM_WRITE("fcntl(F_GETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
5588 break;
njn096ccdd2009-02-22 23:00:30 +00005589 }
5590
5591# if defined(VGP_x86_linux)
5592 if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64)
5593# else
5594 if (ARG2 == VKI_F_SETLKW)
5595# endif
5596 *flags |= SfMayBlock;
5597}
5598
5599POST(sys_fcntl64)
5600{
5601 vg_assert(SUCCESS);
5602 if (ARG2 == VKI_F_DUPFD) {
5603 if (!ML_(fd_allowed)(RES, "fcntl64(DUPFD)", tid, True)) {
5604 VG_(close)(RES);
5605 SET_STATUS_Failure( VKI_EMFILE );
5606 } else {
5607 if (VG_(clo_track_fds))
5608 ML_(record_fd_open_named)(tid, RES);
5609 }
5610 }
tomb23d5052010-09-02 08:23:35 +00005611 else if (ARG2 == VKI_F_DUPFD_CLOEXEC) {
5612 if (!ML_(fd_allowed)(RES, "fcntl64(DUPFD_CLOEXEC)", tid, True)) {
5613 VG_(close)(RES);
5614 SET_STATUS_Failure( VKI_EMFILE );
5615 } else {
5616 if (VG_(clo_track_fds))
5617 ML_(record_fd_open_named)(tid, RES);
5618 }
tom835a7142012-02-09 12:21:47 +00005619 } else if (ARG2 == VKI_F_GETOWN_EX) {
5620 POST_MEM_WRITE(ARG3, sizeof(struct vki_f_owner_ex));
tomb23d5052010-09-02 08:23:35 +00005621 }
njn096ccdd2009-02-22 23:00:30 +00005622}
5623
5624/* ---------------------------------------------------------------------
5625 ioctl wrappers
5626 ------------------------------------------------------------------ */
5627
5628PRE(sys_ioctl)
5629{
5630 *flags |= SfMayBlock;
njn096ccdd2009-02-22 23:00:30 +00005631
bart87da5fb2014-08-05 11:35:48 +00005632 ARG2 = (UInt)ARG2;
5633
njncf3bd972009-07-14 00:06:00 +00005634 // We first handle the ones that don't use ARG3 (even as a
5635 // scalar/non-pointer argument).
5636 switch (ARG2 /* request */) {
5637
tom0c7ff332013-07-17 14:57:18 +00005638 /* asm-generic/ioctls.h */
5639 case VKI_FIOCLEX:
5640 case VKI_FIONCLEX:
tom4efdae12014-06-26 11:03:32 +00005641 case VKI_TIOCNOTTY:
tom0c7ff332013-07-17 14:57:18 +00005642
Elliott Hughesa0664b92017-04-18 17:46:52 -07005643 /* linux perf_event ioctls */
5644 case VKI_PERF_EVENT_IOC_ENABLE:
5645 case VKI_PERF_EVENT_IOC_DISABLE:
5646
njncf3bd972009-07-14 00:06:00 +00005647 /* linux/soundcard interface (ALSA) */
5648 case VKI_SNDRV_PCM_IOCTL_HW_FREE:
5649 case VKI_SNDRV_PCM_IOCTL_HWSYNC:
5650 case VKI_SNDRV_PCM_IOCTL_PREPARE:
5651 case VKI_SNDRV_PCM_IOCTL_RESET:
5652 case VKI_SNDRV_PCM_IOCTL_START:
5653 case VKI_SNDRV_PCM_IOCTL_DROP:
5654 case VKI_SNDRV_PCM_IOCTL_DRAIN:
5655 case VKI_SNDRV_PCM_IOCTL_RESUME:
5656 case VKI_SNDRV_PCM_IOCTL_XRUN:
5657 case VKI_SNDRV_PCM_IOCTL_UNLINK:
5658 case VKI_SNDRV_TIMER_IOCTL_START:
5659 case VKI_SNDRV_TIMER_IOCTL_STOP:
5660 case VKI_SNDRV_TIMER_IOCTL_CONTINUE:
5661 case VKI_SNDRV_TIMER_IOCTL_PAUSE:
tom8758e702012-02-10 10:41:07 +00005662
5663 /* SCSI no operand */
5664 case VKI_SCSI_IOCTL_DOORLOCK:
5665 case VKI_SCSI_IOCTL_DOORUNLOCK:
tom96fb2c52014-06-26 11:11:56 +00005666
5667 /* CDROM stuff. */
5668 case VKI_CDROM_DISC_STATUS:
cborntra4ea8f142014-02-11 15:15:31 +00005669
cborntra65bdbe42012-05-23 15:59:40 +00005670 /* KVM ioctls that dont check for a numeric value as parameter */
5671 case VKI_KVM_S390_ENABLE_SIE:
cborntra4ea8f142014-02-11 15:15:31 +00005672 case VKI_KVM_CREATE_IRQCHIP:
cborntra65bdbe42012-05-23 15:59:40 +00005673 case VKI_KVM_S390_INITIAL_RESET:
cborntra9e431f02014-09-26 18:44:40 +00005674 case VKI_KVM_KVMCLOCK_CTRL:
sewardjb6bf12c2012-07-13 13:15:10 +00005675
cborntrae5a61e12013-03-01 13:17:49 +00005676 /* vhost without parameter */
5677 case VKI_VHOST_SET_OWNER:
5678 case VKI_VHOST_RESET_OWNER:
5679
sewardjb6bf12c2012-07-13 13:15:10 +00005680 /* User input device creation */
5681 case VKI_UI_DEV_CREATE:
5682 case VKI_UI_DEV_DESTROY:
bart9f2a3392013-02-14 17:10:01 +00005683
5684 /* InfiniBand */
5685 case VKI_IB_USER_MAD_ENABLE_PKEY:
sewardj66fbb212014-09-04 11:08:45 +00005686
sewardja0107d62015-08-14 08:05:35 +00005687 /* Lustre */
5688 case VKI_LL_IOC_GROUP_LOCK:
5689 case VKI_LL_IOC_GROUP_UNLOCK:
5690
sewardj66fbb212014-09-04 11:08:45 +00005691 /* V4L2 */
5692 case VKI_V4L2_LOG_STATUS:
sewardjf18210b2015-08-13 14:53:17 +00005693
5694 /* DVB */
5695 case VKI_DMX_STOP:
florianb26101c2015-08-08 21:45:33 +00005696 PRINT("sys_ioctl ( %lu, 0x%lx )", ARG1, ARG2);
njncf3bd972009-07-14 00:06:00 +00005697 PRE_REG_READ2(long, "ioctl",
5698 unsigned int, fd, unsigned int, request);
5699 return;
5700
5701 default:
florianb26101c2015-08-08 21:45:33 +00005702 PRINT("sys_ioctl ( %lu, 0x%lx, 0x%lx )", ARG1, ARG2, ARG3);
njncf3bd972009-07-14 00:06:00 +00005703 PRE_REG_READ3(long, "ioctl",
5704 unsigned int, fd, unsigned int, request, unsigned long, arg);
5705 break;
5706 }
5707
5708 // We now handle those that do look at ARG3 (and unknown ones fall into
5709 // this category). Nb: some of these may well belong in the
5710 // doesn't-use-ARG3 switch above.
njn096ccdd2009-02-22 23:00:30 +00005711 switch (ARG2 /* request */) {
sewardj98a40072015-01-23 12:00:25 +00005712
5713 case VKI_ION_IOC_ALLOC: {
5714 struct vki_ion_allocation_data* data
5715 = (struct vki_ion_allocation_data*)ARG3;
5716 PRE_FIELD_READ ("ioctl(ION_IOC_ALLOC).len", data->len);
5717 PRE_FIELD_READ ("ioctl(ION_IOC_ALLOC).align", data->align);
5718 PRE_FIELD_READ ("ioctl(ION_IOC_ALLOC).heap_id_mask", data->heap_id_mask);
5719 PRE_FIELD_READ ("ioctl(ION_IOC_ALLOC).flags", data->flags);
5720 PRE_FIELD_WRITE("ioctl(ION_IOC_ALLOC).handle", data->handle);
5721 break;
5722 }
5723 case VKI_ION_IOC_MAP: {
5724 struct vki_ion_fd_data* data = (struct vki_ion_fd_data*)ARG3;
5725 PRE_FIELD_READ ("ioctl(ION_IOC_MAP).handle", data->handle);
5726 PRE_FIELD_WRITE("ioctl(ION_IOC_MAP).fd", data->fd);
5727 break;
5728 }
5729 case VKI_ION_IOC_IMPORT: {
5730 struct vki_ion_fd_data* data = (struct vki_ion_fd_data*)ARG3;
5731 PRE_FIELD_READ ("ioctl(ION_IOC_IMPORT).fd", data->fd);
5732 PRE_FIELD_WRITE("ioctl(ION_IOC_IMPORT).handle", data->handle);
5733 break;
5734 }
5735
5736 case VKI_SYNC_IOC_MERGE: {
5737 struct vki_sync_merge_data* data = (struct vki_sync_merge_data*)ARG3;
5738 PRE_FIELD_READ ("ioctl(SYNC_IOC_MERGE).fd2", data->fd2);
5739 PRE_MEM_RASCIIZ("ioctl(SYNC_IOC_MERGE).name", (Addr)(&data->name[0]));
5740 PRE_FIELD_WRITE("ioctl(SYNC_IOC_MERGE).fence", data->fence);
5741 break;
5742 }
5743
njn096ccdd2009-02-22 23:00:30 +00005744 case VKI_TCSETS:
5745 case VKI_TCSETSW:
5746 case VKI_TCSETSF:
5747 PRE_MEM_READ( "ioctl(TCSET{S,SW,SF})", ARG3, sizeof(struct vki_termios) );
5748 break;
5749 case VKI_TCGETS:
5750 PRE_MEM_WRITE( "ioctl(TCGETS)", ARG3, sizeof(struct vki_termios) );
5751 break;
5752 case VKI_TCSETA:
5753 case VKI_TCSETAW:
5754 case VKI_TCSETAF:
5755 PRE_MEM_READ( "ioctl(TCSET{A,AW,AF})", ARG3, sizeof(struct vki_termio) );
5756 break;
5757 case VKI_TCGETA:
5758 PRE_MEM_WRITE( "ioctl(TCGETA)", ARG3, sizeof(struct vki_termio) );
5759 break;
5760 case VKI_TCSBRK:
5761 case VKI_TCXONC:
5762 case VKI_TCSBRKP:
5763 case VKI_TCFLSH:
floriana9ccca32014-10-21 07:20:20 +00005764 case VKI_TIOCSIG:
njn096ccdd2009-02-22 23:00:30 +00005765 /* These just take an int by value */
5766 break;
5767 case VKI_TIOCGWINSZ:
5768 PRE_MEM_WRITE( "ioctl(TIOCGWINSZ)", ARG3, sizeof(struct vki_winsize) );
5769 break;
5770 case VKI_TIOCSWINSZ:
5771 PRE_MEM_READ( "ioctl(TIOCSWINSZ)", ARG3, sizeof(struct vki_winsize) );
5772 break;
5773 case VKI_TIOCMBIS:
5774 PRE_MEM_READ( "ioctl(TIOCMBIS)", ARG3, sizeof(unsigned int) );
5775 break;
5776 case VKI_TIOCMBIC:
5777 PRE_MEM_READ( "ioctl(TIOCMBIC)", ARG3, sizeof(unsigned int) );
5778 break;
5779 case VKI_TIOCMSET:
5780 PRE_MEM_READ( "ioctl(TIOCMSET)", ARG3, sizeof(unsigned int) );
5781 break;
5782 case VKI_TIOCMGET:
5783 PRE_MEM_WRITE( "ioctl(TIOCMGET)", ARG3, sizeof(unsigned int) );
5784 break;
5785 case VKI_TIOCLINUX:
5786 PRE_MEM_READ( "ioctl(TIOCLINUX)", ARG3, sizeof(char *) );
5787 if (*(char *)ARG3 == 11) {
5788 PRE_MEM_READ( "ioctl(TIOCLINUX, 11)", ARG3, 2 * sizeof(char *) );
5789 }
5790 break;
5791 case VKI_TIOCGPGRP:
5792 /* Get process group ID for foreground processing group. */
5793 PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
5794 break;
5795 case VKI_TIOCSPGRP:
5796 /* Set a process group ID? */
5797 PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
5798 break;
5799 case VKI_TIOCGPTN: /* Get Pty Number (of pty-mux device) */
5800 PRE_MEM_WRITE( "ioctl(TIOCGPTN)", ARG3, sizeof(int) );
5801 break;
5802 case VKI_TIOCSCTTY:
5803 /* Just takes an int value. */
5804 break;
5805 case VKI_TIOCSPTLCK: /* Lock/unlock Pty */
5806 PRE_MEM_READ( "ioctl(TIOCSPTLCK)", ARG3, sizeof(int) );
5807 break;
5808 case VKI_FIONBIO:
5809 PRE_MEM_READ( "ioctl(FIONBIO)", ARG3, sizeof(int) );
5810 break;
5811 case VKI_FIOASYNC:
5812 PRE_MEM_READ( "ioctl(FIOASYNC)", ARG3, sizeof(int) );
5813 break;
5814 case VKI_FIONREAD: /* identical to SIOCINQ */
5815 PRE_MEM_WRITE( "ioctl(FIONREAD)", ARG3, sizeof(int) );
5816 break;
tom6bf71ef2011-08-10 14:25:06 +00005817 case VKI_FIOQSIZE:
5818 PRE_MEM_WRITE( "ioctl(FIOQSIZE)", ARG3, sizeof(vki_loff_t) );
5819 break;
njn096ccdd2009-02-22 23:00:30 +00005820
5821 case VKI_TIOCSERGETLSR:
5822 PRE_MEM_WRITE( "ioctl(TIOCSERGETLSR)", ARG3, sizeof(int) );
5823 break;
5824 case VKI_TIOCGICOUNT:
5825 PRE_MEM_WRITE( "ioctl(TIOCGICOUNT)", ARG3,
5826 sizeof(struct vki_serial_icounter_struct) );
5827 break;
5828
5829 case VKI_SG_SET_COMMAND_Q:
5830 PRE_MEM_READ( "ioctl(SG_SET_COMMAND_Q)", ARG3, sizeof(int) );
5831 break;
5832 case VKI_SG_IO:
tom55d05382014-06-26 11:29:05 +00005833 PRE_MEM_READ( "ioctl(SG_IO)", ARG3, sizeof(vki_sg_io_hdr_t) );
5834 {
5835 vki_sg_io_hdr_t *sgio = (vki_sg_io_hdr_t*)ARG3;
5836 PRE_MEM_READ( "ioctl(SG_IO)", (Addr)sgio->cmdp, sgio->cmd_len );
5837 if ( sgio->dxfer_direction == VKI_SG_DXFER_TO_DEV ||
5838 sgio->dxfer_direction == VKI_SG_DXFER_TO_FROM_DEV ) {
5839 PRE_MEM_READ( "ioctl(SG_IO)", (Addr)sgio->dxferp, sgio->dxfer_len );
5840 }
5841 }
njn096ccdd2009-02-22 23:00:30 +00005842 break;
5843 case VKI_SG_GET_SCSI_ID:
5844 PRE_MEM_WRITE( "ioctl(SG_GET_SCSI_ID)", ARG3, sizeof(vki_sg_scsi_id_t) );
5845 break;
5846 case VKI_SG_SET_RESERVED_SIZE:
5847 PRE_MEM_READ( "ioctl(SG_SET_RESERVED_SIZE)", ARG3, sizeof(int) );
5848 break;
5849 case VKI_SG_SET_TIMEOUT:
5850 PRE_MEM_READ( "ioctl(SG_SET_TIMEOUT)", ARG3, sizeof(int) );
5851 break;
5852 case VKI_SG_GET_RESERVED_SIZE:
5853 PRE_MEM_WRITE( "ioctl(SG_GET_RESERVED_SIZE)", ARG3, sizeof(int) );
5854 break;
5855 case VKI_SG_GET_TIMEOUT:
5856 break;
5857 case VKI_SG_GET_VERSION_NUM:
5858 PRE_MEM_WRITE( "ioctl(SG_GET_VERSION_NUM)", ARG3, sizeof(int) );
5859 break;
5860 case VKI_SG_EMULATED_HOST: /* 0x2203 */
5861 PRE_MEM_WRITE( "ioctl(SG_EMULATED_HOST)", ARG3, sizeof(int) );
5862 break;
5863 case VKI_SG_GET_SG_TABLESIZE: /* 0x227f */
5864 PRE_MEM_WRITE( "ioctl(SG_GET_SG_TABLESIZE)", ARG3, sizeof(int) );
5865 break;
5866
5867 case VKI_IIOCGETCPS:
5868 PRE_MEM_WRITE( "ioctl(IIOCGETCPS)", ARG3,
5869 VKI_ISDN_MAX_CHANNELS * 2 * sizeof(unsigned long) );
5870 break;
5871 case VKI_IIOCNETGPN:
5872 PRE_MEM_READ( "ioctl(IIOCNETGPN)",
5873 (Addr)&((vki_isdn_net_ioctl_phone *)ARG3)->name,
5874 sizeof(((vki_isdn_net_ioctl_phone *)ARG3)->name) );
5875 PRE_MEM_WRITE( "ioctl(IIOCNETGPN)", ARG3,
5876 sizeof(vki_isdn_net_ioctl_phone) );
5877 break;
5878
5879 /* These all use struct ifreq AFAIK */
5880 case VKI_SIOCGIFINDEX: /* get iface index */
5881 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFINDEX)",
5882 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5883 PRE_MEM_WRITE( "ioctl(SIOCGIFINDEX)", ARG3, sizeof(struct vki_ifreq));
5884 break;
5885 case VKI_SIOCGIFFLAGS: /* get flags */
5886 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFFLAGS)",
5887 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5888 PRE_MEM_WRITE( "ioctl(SIOCGIFFLAGS)", ARG3, sizeof(struct vki_ifreq));
5889 break;
5890 case VKI_SIOCGIFHWADDR: /* Get hardware address */
5891 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFHWADDR)",
5892 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5893 PRE_MEM_WRITE( "ioctl(SIOCGIFHWADDR)", ARG3, sizeof(struct vki_ifreq));
5894 break;
5895 case VKI_SIOCGIFMTU: /* get MTU size */
5896 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMTU)",
5897 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5898 PRE_MEM_WRITE( "ioctl(SIOCGIFMTU)", ARG3, sizeof(struct vki_ifreq));
5899 break;
5900 case VKI_SIOCGIFADDR: /* get PA address */
5901 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFADDR)",
5902 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5903 PRE_MEM_WRITE( "ioctl(SIOCGIFADDR)", ARG3, sizeof(struct vki_ifreq));
5904 break;
5905 case VKI_SIOCGIFNETMASK: /* get network PA mask */
5906 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFNETMASK)",
5907 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5908 PRE_MEM_WRITE( "ioctl(SIOCGIFNETMASK)", ARG3, sizeof(struct vki_ifreq));
5909 break;
5910 case VKI_SIOCGIFMETRIC: /* get metric */
5911 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMETRIC)",
5912 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5913 PRE_MEM_WRITE( "ioctl(SIOCGIFMETRIC)", ARG3, sizeof(struct vki_ifreq));
5914 break;
5915 case VKI_SIOCGIFMAP: /* Get device parameters */
5916 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMAP)",
5917 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5918 PRE_MEM_WRITE( "ioctl(SIOCGIFMAP)", ARG3, sizeof(struct vki_ifreq));
5919 break;
5920 case VKI_SIOCGIFTXQLEN: /* Get the tx queue length */
5921 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFTXQLEN)",
5922 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5923 PRE_MEM_WRITE( "ioctl(SIOCGIFTXQLEN)", ARG3, sizeof(struct vki_ifreq));
5924 break;
5925 case VKI_SIOCGIFDSTADDR: /* get remote PA address */
5926 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFDSTADDR)",
5927 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5928 PRE_MEM_WRITE( "ioctl(SIOCGIFDSTADDR)", ARG3, sizeof(struct vki_ifreq));
5929 break;
5930 case VKI_SIOCGIFBRDADDR: /* get broadcast PA address */
5931 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFBRDADDR)",
5932 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
5933 PRE_MEM_WRITE( "ioctl(SIOCGIFBRDADDR)", ARG3, sizeof(struct vki_ifreq));
5934 break;
5935 case VKI_SIOCGIFNAME: /* get iface name */
5936 PRE_MEM_READ( "ioctl(SIOCGIFNAME)",
5937 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_ifindex,
5938 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_ifindex) );
5939 PRE_MEM_WRITE( "ioctl(SIOCGIFNAME)", ARG3, sizeof(struct vki_ifreq));
5940 break;
tomabc11112014-06-27 09:59:52 +00005941 case VKI_SIOCETHTOOL: { /* ethtool(8) interface */
5942 struct vki_ifreq *ir = (struct vki_ifreq *)ARG3;
5943 PRE_MEM_READ( "ioctl(SIOCETHTOOL)", (Addr)ir, sizeof(struct vki_ifreq) );
5944 PRE_MEM_RASCIIZ( "ioctl(SIOCETHTOOL)", (Addr)ir->vki_ifr_name );
5945 PRE_MEM_READ( "ioctl(SIOCETHTOOL)", (Addr)ir->vki_ifr_data, sizeof(vki_u32) );
5946 PRINT("SIOCETHTOOL( 0x%x )", *(vki_u32 *)ir->vki_ifr_data );
5947 switch ( *(vki_u32 *)ir->vki_ifr_data ) {
5948 case VKI_ETHTOOL_GSET:
5949 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,GSET)",
5950 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_cmd) );
5951 break;
5952 case VKI_ETHTOOL_SSET:
5953 PRE_MEM_READ( "ioctl(SIOCETHTOOL,SSET)",
5954 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_cmd) );
5955 break;
5956 case VKI_ETHTOOL_GDRVINFO:
5957 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,GDRVINFO)",
5958 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_drvinfo) );
5959 break;
5960 case VKI_ETHTOOL_GREGS:
5961 PRE_MEM_READ( "ioctl(SIOCETHTOOL,GREGS)",
5962 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_regs) );
5963 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,GREGS)",
5964 (Addr)((struct vki_ethtool_regs *)ir->vki_ifr_data)->data,
5965 ((struct vki_ethtool_regs *)ir->vki_ifr_data)->len );
5966 break;
5967 case VKI_ETHTOOL_GWOL:
5968 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,GWOL)",
5969 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_wolinfo) );
5970 break;
5971 case VKI_ETHTOOL_SWOL:
5972 PRE_MEM_READ( "ioctl(SIOCETHTOOL,SWOL)",
5973 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_wolinfo) );
5974 break;
5975 case VKI_ETHTOOL_GMSGLVL:
5976 case VKI_ETHTOOL_GLINK:
5977 case VKI_ETHTOOL_GRXCSUM:
5978 case VKI_ETHTOOL_GSG:
5979 case VKI_ETHTOOL_GTSO:
5980 case VKI_ETHTOOL_GUFO:
5981 case VKI_ETHTOOL_GGSO:
5982 case VKI_ETHTOOL_GFLAGS:
5983 case VKI_ETHTOOL_GGRO:
5984 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,Gvalue)",
5985 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_value) );
5986 break;
5987 case VKI_ETHTOOL_SMSGLVL:
5988 case VKI_ETHTOOL_SRXCSUM:
5989 case VKI_ETHTOOL_SSG:
5990 case VKI_ETHTOOL_STSO:
5991 case VKI_ETHTOOL_SUFO:
5992 case VKI_ETHTOOL_SGSO:
5993 case VKI_ETHTOOL_SFLAGS:
5994 case VKI_ETHTOOL_SGRO:
5995 PRE_MEM_READ( "ioctl(SIOCETHTOOL,Svalue)",
5996 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_value) );
5997 break;
5998 case VKI_ETHTOOL_NWAY_RST:
5999 break;
6000 case VKI_ETHTOOL_GRINGPARAM:
6001 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,GRINGPARAM)",
6002 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_ringparam) );
6003 break;
6004 case VKI_ETHTOOL_SRINGPARAM:
6005 PRE_MEM_READ( "ioctl(SIOCETHTOOL,SRINGPARAM)",
6006 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_ringparam) );
6007 break;
6008 case VKI_ETHTOOL_TEST:
6009 PRE_MEM_READ( "ioctl(SIOCETHTOOL,TEST)",
6010 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_test) );
6011 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,TEST)",
6012 (Addr)((struct vki_ethtool_test *)ir->vki_ifr_data)->data,
6013 ((struct vki_ethtool_test *)ir->vki_ifr_data)->len * sizeof(__vki_u64) );
6014 break;
6015 case VKI_ETHTOOL_PHYS_ID:
6016 break;
6017 case VKI_ETHTOOL_GPERMADDR:
6018 PRE_MEM_READ( "ioctl(SIOCETHTOOL,GPERMADDR)",
6019 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_perm_addr) );
6020 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,GPERMADDR)",
6021 (Addr)((struct vki_ethtool_perm_addr *)ir->vki_ifr_data)->data,
6022 ((struct vki_ethtool_perm_addr *)ir->vki_ifr_data)->size );
6023 break;
6024 case VKI_ETHTOOL_RESET:
6025 break;
6026 case VKI_ETHTOOL_GSSET_INFO:
6027 PRE_MEM_READ( "ioctl(SIOCETHTOOL,GSSET_INFO)",
6028 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_sset_info) );
6029 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,GSSET_INFO)",
6030 (Addr)((struct vki_ethtool_sset_info *)ir->vki_ifr_data)->data,
6031 __builtin_popcountll(((struct vki_ethtool_sset_info *)ir->vki_ifr_data)->sset_mask) * sizeof(__vki_u32) );
6032 break;
6033 case VKI_ETHTOOL_GFEATURES:
6034 PRE_MEM_READ( "ioctl(SIOCETHTOOL,GFEATURES)",
6035 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_gfeatures) );
6036 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,GFEATURES)",
6037 (Addr)((struct vki_ethtool_gfeatures *)ir->vki_ifr_data)->features,
6038 ((struct vki_ethtool_gfeatures *)ir->vki_ifr_data)->size * sizeof(struct vki_ethtool_get_features_block) );
6039 break;
6040 case VKI_ETHTOOL_SFEATURES:
6041 PRE_MEM_READ( "ioctl(SIOCETHTOOL,SFEATURES)",
6042 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_sfeatures) );
6043 PRE_MEM_READ( "ioctl(SIOCETHTOOL,SFEATURES)",
6044 (Addr)((struct vki_ethtool_sfeatures *)ir->vki_ifr_data)->features,
6045 ((struct vki_ethtool_sfeatures *)ir->vki_ifr_data)->size * sizeof(struct vki_ethtool_set_features_block) );
6046 break;
6047 case VKI_ETHTOOL_GCHANNELS:
6048 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,GCHANNELS)",
6049 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_channels) );
6050 break;
6051 case VKI_ETHTOOL_SCHANNELS:
6052 PRE_MEM_READ( "ioctl(SIOCETHTOOL,SCHANNELS)",
6053 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_channels) );
6054 break;
6055 case VKI_ETHTOOL_GET_TS_INFO:
6056 PRE_MEM_WRITE( "ioctl(SIOCETHTOOL,GET_TS_INFO)",
6057 (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_ts_info) );
6058 break;
6059 }
6060 break;
6061 }
njn096ccdd2009-02-22 23:00:30 +00006062 case VKI_SIOCGMIIPHY: /* get hardware entry */
6063 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMIIPHY)",
6064 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6065 PRE_MEM_WRITE( "ioctl(SIOCGIFMIIPHY)", ARG3, sizeof(struct vki_ifreq));
6066 break;
6067 case VKI_SIOCGMIIREG: /* get hardware entry registers */
6068 PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMIIREG)",
6069 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6070 PRE_MEM_READ( "ioctl(SIOCGIFMIIREG)",
6071 (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
6072 sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
6073 PRE_MEM_READ( "ioctl(SIOCGIFMIIREG)",
6074 (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num,
6075 sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num) );
6076 PRE_MEM_WRITE( "ioctl(SIOCGIFMIIREG)", ARG3,
6077 sizeof(struct vki_ifreq));
6078 break;
6079 case VKI_SIOCGIFCONF: /* get iface list */
6080 /* WAS:
6081 PRE_MEM_WRITE( "ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
6082 KERNEL_DO_SYSCALL(tid,RES);
6083 if (!VG_(is_kerror)(RES) && RES == 0)
6084 POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
6085 */
6086 PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
6087 (Addr)&((struct vki_ifconf *)ARG3)->ifc_len,
6088 sizeof(((struct vki_ifconf *)ARG3)->ifc_len));
6089 PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
6090 (Addr)&((struct vki_ifconf *)ARG3)->vki_ifc_buf,
6091 sizeof(((struct vki_ifconf *)ARG3)->vki_ifc_buf));
6092 if ( ARG3 ) {
6093 // TODO len must be readable and writable
6094 // buf pointer only needs to be readable
6095 struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
6096 PRE_MEM_WRITE( "ioctl(SIOCGIFCONF).ifc_buf",
6097 (Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
6098 }
6099 break;
6100 case VKI_SIOCGSTAMP:
6101 PRE_MEM_WRITE( "ioctl(SIOCGSTAMP)", ARG3, sizeof(struct vki_timeval));
6102 break;
toma2ec4f52009-03-31 10:36:58 +00006103 case VKI_SIOCGSTAMPNS:
6104 PRE_MEM_WRITE( "ioctl(SIOCGSTAMPNS)", ARG3, sizeof(struct vki_timespec));
6105 break;
njn096ccdd2009-02-22 23:00:30 +00006106 /* SIOCOUTQ is an ioctl that, when called on a socket, returns
6107 the number of bytes currently in that socket's send buffer.
6108 It writes this value as an int to the memory location
6109 indicated by the third argument of ioctl(2). */
6110 case VKI_SIOCOUTQ:
6111 PRE_MEM_WRITE( "ioctl(SIOCOUTQ)", ARG3, sizeof(int));
6112 break;
6113 case VKI_SIOCGRARP: /* get RARP table entry */
6114 case VKI_SIOCGARP: /* get ARP table entry */
6115 PRE_MEM_WRITE( "ioctl(SIOCGARP)", ARG3, sizeof(struct vki_arpreq));
6116 break;
6117
6118 case VKI_SIOCSIFFLAGS: /* set flags */
6119 PRE_MEM_RASCIIZ( "ioctl(SIOCSIFFLAGS)",
6120 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6121 PRE_MEM_READ( "ioctl(SIOCSIFFLAGS)",
6122 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
6123 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
6124 break;
6125 case VKI_SIOCSIFMAP: /* Set device parameters */
6126 PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMAP)",
6127 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6128 PRE_MEM_READ( "ioctl(SIOCSIFMAP)",
sewardj28d542d2015-10-19 11:21:33 +00006129 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_map,
6130 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_map) );
njn096ccdd2009-02-22 23:00:30 +00006131 break;
toma7b9dfc2012-07-11 14:33:10 +00006132 case VKI_SIOCSHWTSTAMP: /* Set hardware time stamping */
6133 PRE_MEM_RASCIIZ( "ioctl(SIOCSHWTSTAMP)",
6134 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6135 PRE_MEM_READ( "ioctl(SIOCSHWTSTAMP)",
6136 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_data,
6137 sizeof(struct vki_hwtstamp_config) );
6138 break;
njn096ccdd2009-02-22 23:00:30 +00006139 case VKI_SIOCSIFTXQLEN: /* Set the tx queue length */
6140 PRE_MEM_RASCIIZ( "ioctl(SIOCSIFTXQLEN)",
6141 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6142 PRE_MEM_READ( "ioctl(SIOCSIFTXQLEN)",
sewardj28d542d2015-10-19 11:21:33 +00006143 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_qlen,
6144 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_qlen) );
njn096ccdd2009-02-22 23:00:30 +00006145 break;
6146 case VKI_SIOCSIFADDR: /* set PA address */
6147 case VKI_SIOCSIFDSTADDR: /* set remote PA address */
6148 case VKI_SIOCSIFBRDADDR: /* set broadcast PA address */
6149 case VKI_SIOCSIFNETMASK: /* set network PA mask */
6150 PRE_MEM_RASCIIZ( "ioctl(SIOCSIF*ADDR)",
6151 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6152 PRE_MEM_READ( "ioctl(SIOCSIF*ADDR)",
sewardj28d542d2015-10-19 11:21:33 +00006153 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_addr,
6154 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_addr) );
njn096ccdd2009-02-22 23:00:30 +00006155 break;
6156 case VKI_SIOCSIFMETRIC: /* set metric */
6157 PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMETRIC)",
6158 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6159 PRE_MEM_READ( "ioctl(SIOCSIFMETRIC)",
6160 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
6161 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
6162 break;
6163 case VKI_SIOCSIFMTU: /* set MTU size */
6164 PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMTU)",
6165 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6166 PRE_MEM_READ( "ioctl(SIOCSIFMTU)",
6167 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
6168 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
6169 break;
6170 case VKI_SIOCSIFHWADDR: /* set hardware address */
6171 PRE_MEM_RASCIIZ( "ioctl(SIOCSIFHWADDR)",
6172 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6173 PRE_MEM_READ( "ioctl(SIOCSIFHWADDR)",
sewardj28d542d2015-10-19 11:21:33 +00006174 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_hwaddr,
6175 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_hwaddr) );
njn096ccdd2009-02-22 23:00:30 +00006176 break;
6177 case VKI_SIOCSMIIREG: /* set hardware entry registers */
6178 PRE_MEM_RASCIIZ( "ioctl(SIOCSMIIREG)",
6179 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6180 PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
6181 (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
6182 sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
6183 PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
6184 (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num,
6185 sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->reg_num) );
6186 PRE_MEM_READ( "ioctl(SIOCSMIIREG)",
6187 (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_in,
6188 sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_in) );
6189 break;
6190 /* Routing table calls. */
6191 case VKI_SIOCADDRT: /* add routing table entry */
6192 case VKI_SIOCDELRT: /* delete routing table entry */
6193 PRE_MEM_READ( "ioctl(SIOCADDRT/DELRT)", ARG3,
6194 sizeof(struct vki_rtentry));
6195 break;
6196
cborntradfe0dae2013-03-01 12:56:07 +00006197 /* tun/tap related ioctls */
tom5a5031e2014-09-02 12:54:29 +00006198 case VKI_TUNSETNOCSUM:
6199 case VKI_TUNSETDEBUG:
6200 break;
cborntradfe0dae2013-03-01 12:56:07 +00006201 case VKI_TUNSETIFF:
6202 PRE_MEM_RASCIIZ( "ioctl(TUNSETIFF)",
6203 (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
6204 PRE_MEM_READ( "ioctl(TUNSETIFF)",
6205 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
6206 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
tom5a5031e2014-09-02 12:54:29 +00006207 PRE_MEM_WRITE( "ioctl(TUNSETIFF)", ARG3, sizeof(struct vki_ifreq) );
6208 break;
6209 case VKI_TUNSETPERSIST:
6210 case VKI_TUNSETOWNER:
6211 case VKI_TUNSETLINK:
6212 case VKI_TUNSETGROUP:
6213 break;
6214 case VKI_TUNGETFEATURES:
6215 PRE_MEM_WRITE( "ioctl(TUNGETFEATURES)", ARG3, sizeof(unsigned int) );
cborntradfe0dae2013-03-01 12:56:07 +00006216 break;
6217 case VKI_TUNSETOFFLOAD:
tom5a5031e2014-09-02 12:54:29 +00006218 break;
cborntradfe0dae2013-03-01 12:56:07 +00006219 case VKI_TUNGETIFF:
tom5a5031e2014-09-02 12:54:29 +00006220 PRE_MEM_WRITE( "ioctl(TUNGETIFF)", ARG3, sizeof(struct vki_ifreq) );
6221 break;
6222 case VKI_TUNGETSNDBUF:
6223 PRE_MEM_WRITE( "ioctl(TUNGETSNDBUF)", ARG3, sizeof(int) );
6224 break;
6225 case VKI_TUNSETSNDBUF:
6226 PRE_MEM_READ( "ioctl(TUNSETSNDBUF)", ARG3, sizeof(int) );
6227 break;
6228 case VKI_TUNGETVNETHDRSZ:
6229 PRE_MEM_WRITE( "ioctl(TUNGETVNETHDRSZ)", ARG3, sizeof(int) );
6230 break;
6231 case VKI_TUNSETVNETHDRSZ:
6232 PRE_MEM_READ( "ioctl(TUNSETVNETHDRSZ)", ARG3, sizeof(int) );
6233 break;
6234 case VKI_TUNSETQUEUE:
6235 PRE_MEM_READ( "ioctl(TUNSETQUEUE)",
6236 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
6237 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
6238 break;
6239 case VKI_TUNSETIFINDEX:
6240 PRE_MEM_READ( "ioctl(TUNSETIFINDEX)", ARG3, sizeof(unsigned int));
cborntradfe0dae2013-03-01 12:56:07 +00006241 break;
6242
njn096ccdd2009-02-22 23:00:30 +00006243 /* RARP cache control calls. */
6244 case VKI_SIOCDRARP: /* delete RARP table entry */
6245 case VKI_SIOCSRARP: /* set RARP table entry */
6246 /* ARP cache control calls. */
6247 case VKI_SIOCSARP: /* set ARP table entry */
6248 case VKI_SIOCDARP: /* delete ARP table entry */
6249 PRE_MEM_READ( "ioctl(SIOCSIFFLAGS)", ARG3, sizeof(struct vki_ifreq));
6250 break;
6251
6252 case VKI_SIOCGPGRP:
6253 PRE_MEM_WRITE( "ioctl(SIOCGPGRP)", ARG3, sizeof(int) );
6254 break;
6255 case VKI_SIOCSPGRP:
6256 PRE_MEM_READ( "ioctl(SIOCSPGRP)", ARG3, sizeof(int) );
6257 //tst->sys_flags &= ~SfMayBlock;
6258 break;
6259
tom4f17e602014-06-26 13:14:56 +00006260 case VKI_SIOCATMARK:
6261 PRE_MEM_READ( "ioctl(SIOCATMARK)", ARG3, sizeof(int) );
6262 break;
6263
njn096ccdd2009-02-22 23:00:30 +00006264 /* linux/soundcard interface (OSS) */
6265 case VKI_SNDCTL_SEQ_GETOUTCOUNT:
6266 case VKI_SNDCTL_SEQ_GETINCOUNT:
6267 case VKI_SNDCTL_SEQ_PERCMODE:
6268 case VKI_SNDCTL_SEQ_TESTMIDI:
6269 case VKI_SNDCTL_SEQ_RESETSAMPLES:
6270 case VKI_SNDCTL_SEQ_NRSYNTHS:
6271 case VKI_SNDCTL_SEQ_NRMIDIS:
6272 case VKI_SNDCTL_SEQ_GETTIME:
tom55703df2010-02-18 15:54:45 +00006273 case VKI_SNDCTL_DSP_GETBLKSIZE:
njn096ccdd2009-02-22 23:00:30 +00006274 case VKI_SNDCTL_DSP_GETFMTS:
6275 case VKI_SNDCTL_DSP_GETTRIGGER:
6276 case VKI_SNDCTL_DSP_GETODELAY:
6277 case VKI_SNDCTL_DSP_GETSPDIF:
6278 case VKI_SNDCTL_DSP_GETCAPS:
6279 case VKI_SOUND_PCM_READ_RATE:
6280 case VKI_SOUND_PCM_READ_CHANNELS:
6281 case VKI_SOUND_PCM_READ_BITS:
njn096ccdd2009-02-22 23:00:30 +00006282 case VKI_SOUND_PCM_READ_FILTER:
6283 PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOR, int))",
6284 ARG3, sizeof(int));
6285 break;
6286 case VKI_SNDCTL_SEQ_CTRLRATE:
6287 case VKI_SNDCTL_DSP_SPEED:
6288 case VKI_SNDCTL_DSP_STEREO:
njn096ccdd2009-02-22 23:00:30 +00006289 case VKI_SNDCTL_DSP_CHANNELS:
6290 case VKI_SOUND_PCM_WRITE_FILTER:
6291 case VKI_SNDCTL_DSP_SUBDIVIDE:
6292 case VKI_SNDCTL_DSP_SETFRAGMENT:
tom55703df2010-02-18 15:54:45 +00006293 case VKI_SNDCTL_DSP_SETFMT:
njn096ccdd2009-02-22 23:00:30 +00006294 case VKI_SNDCTL_DSP_GETCHANNELMASK:
6295 case VKI_SNDCTL_DSP_BIND_CHANNEL:
6296 case VKI_SNDCTL_TMR_TIMEBASE:
6297 case VKI_SNDCTL_TMR_TEMPO:
6298 case VKI_SNDCTL_TMR_SOURCE:
6299 case VKI_SNDCTL_MIDI_PRETIME:
6300 case VKI_SNDCTL_MIDI_MPUMODE:
6301 PRE_MEM_READ( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOWR, int))",
6302 ARG3, sizeof(int));
6303 PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOWR, int))",
6304 ARG3, sizeof(int));
6305 break;
6306 case VKI_SNDCTL_DSP_GETOSPACE:
6307 case VKI_SNDCTL_DSP_GETISPACE:
6308 PRE_MEM_WRITE( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOR, audio_buf_info))",
6309 ARG3, sizeof(vki_audio_buf_info));
6310 break;
njn06605672009-06-09 22:31:00 +00006311 case VKI_SNDCTL_DSP_NONBLOCK:
6312 break;
njn096ccdd2009-02-22 23:00:30 +00006313 case VKI_SNDCTL_DSP_SETTRIGGER:
6314 PRE_MEM_READ( "ioctl(SNDCTL_XXX|SOUND_XXX (SIOW, int))",
6315 ARG3, sizeof(int));
6316 break;
6317
6318 case VKI_SNDCTL_DSP_POST:
6319 case VKI_SNDCTL_DSP_RESET:
6320 case VKI_SNDCTL_DSP_SYNC:
6321 case VKI_SNDCTL_DSP_SETSYNCRO:
6322 case VKI_SNDCTL_DSP_SETDUPLEX:
6323 break;
6324
6325 /* linux/soundcard interface (ALSA) */
njncf3bd972009-07-14 00:06:00 +00006326 case VKI_SNDRV_PCM_IOCTL_PAUSE:
6327 case VKI_SNDRV_PCM_IOCTL_LINK:
6328 /* these just take an int by value */
njn096ccdd2009-02-22 23:00:30 +00006329 break;
tom9b150432014-06-26 12:53:23 +00006330 case VKI_SNDRV_CTL_IOCTL_PVERSION:
6331 PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_PVERSION)", (Addr)ARG3, sizeof(int) );
6332 break;
6333 case VKI_SNDRV_CTL_IOCTL_CARD_INFO:
6334 PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_CARD_INFO)", (Addr)ARG3, sizeof(struct vki_snd_ctl_card_info) );
6335 break;
6336 case VKI_SNDRV_CTL_IOCTL_ELEM_LIST: {
6337 struct vki_snd_ctl_elem_list *data = (struct vki_snd_ctl_elem_list *)ARG3;
6338 PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)&data->offset, sizeof(data->offset) );
6339 PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)&data->space, sizeof(data->space) );
6340 PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)&data->used, sizeof(data->used) );
6341 PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)&data->count, sizeof(data->count) );
6342 PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)&data->pids, sizeof(data->pids) );
6343 if (data->pids) {
6344 PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)data->pids, sizeof(struct vki_snd_ctl_elem_id) * data->space );
6345 }
6346 break;
6347 }
6348 case VKI_SNDRV_CTL_IOCTL_TLV_READ: {
6349 struct vki_snd_ctl_tlv *data = (struct vki_snd_ctl_tlv *)ARG3;
6350 PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_TLV_READ)", (Addr)&data->numid, sizeof(data->numid) );
6351 PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_TLV_READ)", (Addr)&data->length, sizeof(data->length) );
6352 PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_TLV_READ)", (Addr)data->tlv, data->length );
6353 break;
6354 }
6355 case VKI_SNDRV_CTL_IOCTL_TLV_WRITE:
6356 case VKI_SNDRV_CTL_IOCTL_TLV_COMMAND: {
6357 struct vki_snd_ctl_tlv *data = (struct vki_snd_ctl_tlv *)ARG3;
6358 PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_TLV_WRITE)", (Addr)&data->numid, sizeof(data->numid) );
6359 PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_TLV_WRITE)", (Addr)&data->length, sizeof(data->length) );
6360 PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_TLV_WRITE)", (Addr)data->tlv, data->length );
6361 break;
6362 }
njn096ccdd2009-02-22 23:00:30 +00006363
6364 /* Real Time Clock (/dev/rtc) ioctls */
6365 case VKI_RTC_UIE_ON:
6366 case VKI_RTC_UIE_OFF:
6367 case VKI_RTC_AIE_ON:
6368 case VKI_RTC_AIE_OFF:
6369 case VKI_RTC_PIE_ON:
6370 case VKI_RTC_PIE_OFF:
6371 case VKI_RTC_IRQP_SET:
6372 break;
6373 case VKI_RTC_RD_TIME:
6374 case VKI_RTC_ALM_READ:
6375 PRE_MEM_WRITE( "ioctl(RTC_RD_TIME/ALM_READ)",
6376 ARG3, sizeof(struct vki_rtc_time));
6377 break;
6378 case VKI_RTC_ALM_SET:
6379 PRE_MEM_READ( "ioctl(RTC_ALM_SET)", ARG3, sizeof(struct vki_rtc_time));
6380 break;
6381 case VKI_RTC_IRQP_READ:
6382 PRE_MEM_WRITE( "ioctl(RTC_IRQP_READ)", ARG3, sizeof(unsigned long));
6383 break;
6384
6385 /* Block devices */
6386 case VKI_BLKROSET:
6387 PRE_MEM_READ( "ioctl(BLKROSET)", ARG3, sizeof(int));
6388 break;
6389 case VKI_BLKROGET:
6390 PRE_MEM_WRITE( "ioctl(BLKROGET)", ARG3, sizeof(int));
6391 break;
6392 case VKI_BLKGETSIZE:
6393 PRE_MEM_WRITE( "ioctl(BLKGETSIZE)", ARG3, sizeof(unsigned long));
6394 break;
6395 case VKI_BLKRASET:
6396 break;
6397 case VKI_BLKRAGET:
6398 PRE_MEM_WRITE( "ioctl(BLKRAGET)", ARG3, sizeof(long));
6399 break;
6400 case VKI_BLKFRASET:
6401 break;
6402 case VKI_BLKFRAGET:
6403 PRE_MEM_WRITE( "ioctl(BLKFRAGET)", ARG3, sizeof(long));
6404 break;
6405 case VKI_BLKSECTGET:
6406 PRE_MEM_WRITE( "ioctl(BLKSECTGET)", ARG3, sizeof(unsigned short));
6407 break;
6408 case VKI_BLKSSZGET:
6409 PRE_MEM_WRITE( "ioctl(BLKSSZGET)", ARG3, sizeof(int));
6410 break;
6411 case VKI_BLKBSZGET:
6412 PRE_MEM_WRITE( "ioctl(BLKBSZGET)", ARG3, sizeof(int));
6413 break;
6414 case VKI_BLKBSZSET:
6415 PRE_MEM_READ( "ioctl(BLKBSZSET)", ARG3, sizeof(int));
6416 break;
6417 case VKI_BLKGETSIZE64:
6418 PRE_MEM_WRITE( "ioctl(BLKGETSIZE64)", ARG3, sizeof(unsigned long long));
6419 break;
cborntra0e6d05e2012-11-09 16:01:38 +00006420 case VKI_BLKPBSZGET:
6421 PRE_MEM_WRITE( "ioctl(BLKPBSZGET)", ARG3, sizeof(int));
6422 break;
cborntrac6097322014-08-05 15:14:52 +00006423 case VKI_BLKDISCARDZEROES:
6424 PRE_MEM_WRITE( "ioctl(BLKDISCARDZEROES)", ARG3, sizeof(vki_uint));
6425 break;
njn096ccdd2009-02-22 23:00:30 +00006426
6427 /* Hard disks */
6428 case VKI_HDIO_GETGEO: /* 0x0301 */
6429 PRE_MEM_WRITE( "ioctl(HDIO_GETGEO)", ARG3, sizeof(struct vki_hd_geometry));
6430 break;
6431 case VKI_HDIO_GET_DMA: /* 0x030b */
6432 PRE_MEM_WRITE( "ioctl(HDIO_GET_DMA)", ARG3, sizeof(long));
6433 break;
6434 case VKI_HDIO_GET_IDENTITY: /* 0x030d */
6435 PRE_MEM_WRITE( "ioctl(HDIO_GET_IDENTITY)", ARG3,
6436 VKI_SIZEOF_STRUCT_HD_DRIVEID );
6437 break;
6438
tom8758e702012-02-10 10:41:07 +00006439 /* SCSI */
6440 case VKI_SCSI_IOCTL_GET_IDLUN: /* 0x5382 */
6441 PRE_MEM_WRITE( "ioctl(SCSI_IOCTL_GET_IDLUN)", ARG3, sizeof(struct vki_scsi_idlun));
6442 break;
6443 case VKI_SCSI_IOCTL_GET_BUS_NUMBER: /* 0x5386 */
6444 PRE_MEM_WRITE( "ioctl(SCSI_IOCTL_GET_BUS_NUMBER)", ARG3, sizeof(int));
6445 break;
6446
njn096ccdd2009-02-22 23:00:30 +00006447 /* CD ROM stuff (??) */
6448 case VKI_CDROM_GET_MCN:
6449 PRE_MEM_READ( "ioctl(CDROM_GET_MCN)", ARG3,
6450 sizeof(struct vki_cdrom_mcn) );
6451 break;
6452 case VKI_CDROM_SEND_PACKET:
6453 PRE_MEM_READ( "ioctl(CDROM_SEND_PACKET)", ARG3,
6454 sizeof(struct vki_cdrom_generic_command));
6455 break;
6456 case VKI_CDROMSUBCHNL:
6457 PRE_MEM_READ( "ioctl(CDROMSUBCHNL (cdsc_format, char))",
6458 (Addr) &(((struct vki_cdrom_subchnl*) ARG3)->cdsc_format),
6459 sizeof(((struct vki_cdrom_subchnl*) ARG3)->cdsc_format));
6460 PRE_MEM_WRITE( "ioctl(CDROMSUBCHNL)", ARG3,
6461 sizeof(struct vki_cdrom_subchnl));
6462 break;
6463 case VKI_CDROMREADMODE2:
6464 PRE_MEM_READ( "ioctl(CDROMREADMODE2)", ARG3, VKI_CD_FRAMESIZE_RAW0 );
6465 break;
6466 case VKI_CDROMREADTOCHDR:
6467 PRE_MEM_WRITE( "ioctl(CDROMREADTOCHDR)", ARG3,
6468 sizeof(struct vki_cdrom_tochdr));
6469 break;
6470 case VKI_CDROMREADTOCENTRY:
6471 PRE_MEM_READ( "ioctl(CDROMREADTOCENTRY (cdte_format, char))",
6472 (Addr) &(((struct vki_cdrom_tocentry*) ARG3)->cdte_format),
6473 sizeof(((struct vki_cdrom_tocentry*) ARG3)->cdte_format));
6474 PRE_MEM_READ( "ioctl(CDROMREADTOCENTRY (cdte_track, char))",
6475 (Addr) &(((struct vki_cdrom_tocentry*) ARG3)->cdte_track),
6476 sizeof(((struct vki_cdrom_tocentry*) ARG3)->cdte_track));
6477 PRE_MEM_WRITE( "ioctl(CDROMREADTOCENTRY)", ARG3,
6478 sizeof(struct vki_cdrom_tocentry));
6479 break;
6480 case VKI_CDROMMULTISESSION: /* 0x5310 */
6481 PRE_MEM_WRITE( "ioctl(CDROMMULTISESSION)", ARG3,
6482 sizeof(struct vki_cdrom_multisession));
6483 break;
6484 case VKI_CDROMVOLREAD: /* 0x5313 */
6485 PRE_MEM_WRITE( "ioctl(CDROMVOLREAD)", ARG3,
6486 sizeof(struct vki_cdrom_volctrl));
6487 break;
6488 case VKI_CDROMREADRAW: /* 0x5314 */
6489 PRE_MEM_READ( "ioctl(CDROMREADRAW)", ARG3, sizeof(struct vki_cdrom_msf));
6490 PRE_MEM_WRITE( "ioctl(CDROMREADRAW)", ARG3, VKI_CD_FRAMESIZE_RAW);
6491 break;
6492 case VKI_CDROMREADAUDIO: /* 0x530e */
6493 PRE_MEM_READ( "ioctl(CDROMREADAUDIO)", ARG3,
6494 sizeof (struct vki_cdrom_read_audio));
6495 if ( ARG3 ) {
6496 /* ToDo: don't do any of the following if the structure is invalid */
6497 struct vki_cdrom_read_audio *cra = (struct vki_cdrom_read_audio *) ARG3;
6498 PRE_MEM_WRITE( "ioctl(CDROMREADAUDIO).buf",
6499 (Addr)(cra->buf), cra->nframes * VKI_CD_FRAMESIZE_RAW);
6500 }
6501 break;
6502 case VKI_CDROMPLAYMSF:
6503 PRE_MEM_READ( "ioctl(CDROMPLAYMSF)", ARG3, sizeof(struct vki_cdrom_msf));
6504 break;
6505 /* The following two are probably bogus (should check args
6506 for readability). JRS 20021117 */
6507 case VKI_CDROM_DRIVE_STATUS: /* 0x5326 */
6508 case VKI_CDROM_CLEAR_OPTIONS: /* 0x5321 */
6509 break;
tom3fc99292012-07-11 12:02:06 +00006510 case VKI_CDROM_GET_CAPABILITY: /* 0x5331 */
6511 break;
njn096ccdd2009-02-22 23:00:30 +00006512
6513 case VKI_FIGETBSZ:
6514 PRE_MEM_WRITE( "ioctl(FIGETBSZ)", ARG3, sizeof(unsigned long));
6515 break;
6516 case VKI_FIBMAP:
tomc1cc9632010-08-25 09:13:44 +00006517 PRE_MEM_READ( "ioctl(FIBMAP)", ARG3, sizeof(int));
njn096ccdd2009-02-22 23:00:30 +00006518 break;
6519
6520 case VKI_FBIOGET_VSCREENINFO: /* 0x4600 */
6521 PRE_MEM_WRITE( "ioctl(FBIOGET_VSCREENINFO)", ARG3,
6522 sizeof(struct vki_fb_var_screeninfo));
6523 break;
tomfca8f5f2011-08-15 08:47:29 +00006524 case VKI_FBIOPUT_VSCREENINFO:
6525 PRE_MEM_READ( "ioctl(FBIOPUT_VSCREENINFO)", ARG3,
6526 sizeof(struct vki_fb_var_screeninfo));
6527 break;
njn096ccdd2009-02-22 23:00:30 +00006528 case VKI_FBIOGET_FSCREENINFO: /* 0x4602 */
6529 PRE_MEM_WRITE( "ioctl(FBIOGET_FSCREENINFO)", ARG3,
6530 sizeof(struct vki_fb_fix_screeninfo));
6531 break;
tomfca8f5f2011-08-15 08:47:29 +00006532 case VKI_FBIOPAN_DISPLAY:
6533 PRE_MEM_READ( "ioctl(FBIOPAN_DISPLAY)", ARG3,
6534 sizeof(struct vki_fb_var_screeninfo));
njn096ccdd2009-02-22 23:00:30 +00006535
tomfca8f5f2011-08-15 08:47:29 +00006536 break;
njn096ccdd2009-02-22 23:00:30 +00006537 case VKI_PPCLAIM:
6538 case VKI_PPEXCL:
6539 case VKI_PPYIELD:
6540 case VKI_PPRELEASE:
6541 break;
6542 case VKI_PPSETMODE:
6543 PRE_MEM_READ( "ioctl(PPSETMODE)", ARG3, sizeof(int) );
6544 break;
6545 case VKI_PPGETMODE:
6546 PRE_MEM_WRITE( "ioctl(PPGETMODE)", ARG3, sizeof(int) );
6547 break;
6548 case VKI_PPSETPHASE:
6549 PRE_MEM_READ( "ioctl(PPSETPHASE)", ARG3, sizeof(int) );
6550 break;
6551 case VKI_PPGETPHASE:
6552 PRE_MEM_WRITE( "ioctl(PPGETPHASE)", ARG3, sizeof(int) );
6553 break;
6554 case VKI_PPGETMODES:
6555 PRE_MEM_WRITE( "ioctl(PPGETMODES)", ARG3, sizeof(unsigned int) );
6556 break;
6557 case VKI_PPSETFLAGS:
6558 PRE_MEM_READ( "ioctl(PPSETFLAGS)", ARG3, sizeof(int) );
6559 break;
6560 case VKI_PPGETFLAGS:
6561 PRE_MEM_WRITE( "ioctl(PPGETFLAGS)", ARG3, sizeof(int) );
6562 break;
6563 case VKI_PPRSTATUS:
6564 PRE_MEM_WRITE( "ioctl(PPRSTATUS)", ARG3, sizeof(unsigned char) );
6565 break;
6566 case VKI_PPRDATA:
6567 PRE_MEM_WRITE( "ioctl(PPRDATA)", ARG3, sizeof(unsigned char) );
6568 break;
6569 case VKI_PPRCONTROL:
6570 PRE_MEM_WRITE( "ioctl(PPRCONTROL)", ARG3, sizeof(unsigned char) );
6571 break;
6572 case VKI_PPWDATA:
6573 PRE_MEM_READ( "ioctl(PPWDATA)", ARG3, sizeof(unsigned char) );
6574 break;
6575 case VKI_PPWCONTROL:
6576 PRE_MEM_READ( "ioctl(PPWCONTROL)", ARG3, sizeof(unsigned char) );
6577 break;
6578 case VKI_PPFCONTROL:
6579 PRE_MEM_READ( "ioctl(PPFCONTROL)", ARG3, 2 * sizeof(unsigned char) );
6580 break;
6581 case VKI_PPDATADIR:
6582 PRE_MEM_READ( "ioctl(PPDATADIR)", ARG3, sizeof(int) );
6583 break;
6584 case VKI_PPNEGOT:
6585 PRE_MEM_READ( "ioctl(PPNEGOT)", ARG3, sizeof(int) );
6586 break;
6587 case VKI_PPWCTLONIRQ:
6588 PRE_MEM_READ( "ioctl(PPWCTLONIRQ)",ARG3, sizeof(unsigned char) );
6589 break;
6590 case VKI_PPCLRIRQ:
6591 PRE_MEM_WRITE( "ioctl(PPCLRIRQ)", ARG3, sizeof(int) );
6592 break;
6593 case VKI_PPSETTIME:
6594 PRE_MEM_READ( "ioctl(PPSETTIME)", ARG3, sizeof(struct vki_timeval) );
6595 break;
6596 case VKI_PPGETTIME:
6597 PRE_MEM_WRITE( "ioctl(PPGETTIME)", ARG3, sizeof(struct vki_timeval) );
6598 break;
6599
6600 case VKI_GIO_FONT:
6601 PRE_MEM_WRITE( "ioctl(GIO_FONT)", ARG3, 32 * 256 );
6602 break;
6603 case VKI_PIO_FONT:
6604 PRE_MEM_READ( "ioctl(PIO_FONT)", ARG3, 32 * 256 );
6605 break;
6606
6607 case VKI_GIO_FONTX:
6608 PRE_MEM_READ( "ioctl(GIO_FONTX)", ARG3, sizeof(struct vki_consolefontdesc) );
6609 if ( ARG3 ) {
6610 /* ToDo: don't do any of the following if the structure is invalid */
6611 struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)ARG3;
6612 PRE_MEM_WRITE( "ioctl(GIO_FONTX).chardata", (Addr)cfd->chardata,
6613 32 * cfd->charcount );
6614 }
6615 break;
6616 case VKI_PIO_FONTX:
6617 PRE_MEM_READ( "ioctl(PIO_FONTX)", ARG3, sizeof(struct vki_consolefontdesc) );
6618 if ( ARG3 ) {
6619 /* ToDo: don't do any of the following if the structure is invalid */
6620 struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)ARG3;
6621 PRE_MEM_READ( "ioctl(PIO_FONTX).chardata", (Addr)cfd->chardata,
6622 32 * cfd->charcount );
6623 }
6624 break;
6625
6626 case VKI_PIO_FONTRESET:
6627 break;
6628
6629 case VKI_GIO_CMAP:
6630 PRE_MEM_WRITE( "ioctl(GIO_CMAP)", ARG3, 16 * 3 );
6631 break;
6632 case VKI_PIO_CMAP:
6633 PRE_MEM_READ( "ioctl(PIO_CMAP)", ARG3, 16 * 3 );
6634 break;
6635
6636 case VKI_KIOCSOUND:
6637 case VKI_KDMKTONE:
6638 break;
6639
6640 case VKI_KDGETLED:
6641 PRE_MEM_WRITE( "ioctl(KDGETLED)", ARG3, sizeof(char) );
6642 break;
6643 case VKI_KDSETLED:
6644 break;
6645
6646 case VKI_KDGKBTYPE:
6647 PRE_MEM_WRITE( "ioctl(KDGKBTYPE)", ARG3, sizeof(char) );
6648 break;
6649
6650 case VKI_KDADDIO:
6651 case VKI_KDDELIO:
6652 case VKI_KDENABIO:
6653 case VKI_KDDISABIO:
6654 break;
6655
6656 case VKI_KDSETMODE:
6657 break;
6658 case VKI_KDGETMODE:
6659 PRE_MEM_WRITE( "ioctl(KDGETMODE)", ARG3, sizeof(int) );
6660 break;
6661
6662 case VKI_KDMAPDISP:
6663 case VKI_KDUNMAPDISP:
6664 break;
6665
6666 case VKI_GIO_SCRNMAP:
6667 PRE_MEM_WRITE( "ioctl(GIO_SCRNMAP)", ARG3, VKI_E_TABSZ );
6668 break;
6669 case VKI_PIO_SCRNMAP:
6670 PRE_MEM_READ( "ioctl(PIO_SCRNMAP)", ARG3, VKI_E_TABSZ );
6671 break;
6672 case VKI_GIO_UNISCRNMAP:
6673 PRE_MEM_WRITE( "ioctl(GIO_UNISCRNMAP)", ARG3,
6674 VKI_E_TABSZ * sizeof(unsigned short) );
6675 break;
6676 case VKI_PIO_UNISCRNMAP:
6677 PRE_MEM_READ( "ioctl(PIO_UNISCRNMAP)", ARG3,
6678 VKI_E_TABSZ * sizeof(unsigned short) );
6679 break;
6680
6681 case VKI_GIO_UNIMAP:
6682 if ( ARG3 ) {
6683 struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
6684 PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct,
6685 sizeof(unsigned short));
6686 PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries,
6687 sizeof(struct vki_unipair *));
6688 PRE_MEM_WRITE( "ioctl(GIO_UNIMAP).entries", (Addr)desc->entries,
6689 desc->entry_ct * sizeof(struct vki_unipair));
6690 }
6691 break;
6692 case VKI_PIO_UNIMAP:
6693 if ( ARG3 ) {
6694 struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
6695 PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct,
6696 sizeof(unsigned short) );
6697 PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries,
6698 sizeof(struct vki_unipair *) );
6699 PRE_MEM_READ( "ioctl(PIO_UNIMAP).entries", (Addr)desc->entries,
6700 desc->entry_ct * sizeof(struct vki_unipair) );
6701 }
6702 break;
6703 case VKI_PIO_UNIMAPCLR:
6704 PRE_MEM_READ( "ioctl(GIO_UNIMAP)", ARG3, sizeof(struct vki_unimapinit));
6705 break;
6706
6707 case VKI_KDGKBMODE:
6708 PRE_MEM_WRITE( "ioctl(KDGKBMODE)", ARG3, sizeof(int) );
6709 break;
6710 case VKI_KDSKBMODE:
6711 break;
6712
6713 case VKI_KDGKBMETA:
6714 PRE_MEM_WRITE( "ioctl(KDGKBMETA)", ARG3, sizeof(int) );
6715 break;
6716 case VKI_KDSKBMETA:
6717 break;
6718
6719 case VKI_KDGKBLED:
6720 PRE_MEM_WRITE( "ioctl(KDGKBLED)", ARG3, sizeof(char) );
6721 break;
6722 case VKI_KDSKBLED:
6723 break;
6724
6725 case VKI_KDGKBENT:
6726 PRE_MEM_READ( "ioctl(KDGKBENT).kb_table",
6727 (Addr)&((struct vki_kbentry *)ARG3)->kb_table,
6728 sizeof(((struct vki_kbentry *)ARG3)->kb_table) );
6729 PRE_MEM_READ( "ioctl(KDGKBENT).kb_index",
6730 (Addr)&((struct vki_kbentry *)ARG3)->kb_index,
6731 sizeof(((struct vki_kbentry *)ARG3)->kb_index) );
6732 PRE_MEM_WRITE( "ioctl(KDGKBENT).kb_value",
6733 (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
6734 sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
6735 break;
6736 case VKI_KDSKBENT:
6737 PRE_MEM_READ( "ioctl(KDSKBENT).kb_table",
6738 (Addr)&((struct vki_kbentry *)ARG3)->kb_table,
6739 sizeof(((struct vki_kbentry *)ARG3)->kb_table) );
6740 PRE_MEM_READ( "ioctl(KDSKBENT).kb_index",
6741 (Addr)&((struct vki_kbentry *)ARG3)->kb_index,
6742 sizeof(((struct vki_kbentry *)ARG3)->kb_index) );
6743 PRE_MEM_READ( "ioctl(KDSKBENT).kb_value",
6744 (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
6745 sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
6746 break;
6747
6748 case VKI_KDGKBSENT:
6749 PRE_MEM_READ( "ioctl(KDGKBSENT).kb_func",
6750 (Addr)&((struct vki_kbsentry *)ARG3)->kb_func,
6751 sizeof(((struct vki_kbsentry *)ARG3)->kb_func) );
6752 PRE_MEM_WRITE( "ioctl(KDGKSENT).kb_string",
6753 (Addr)((struct vki_kbsentry *)ARG3)->kb_string,
6754 sizeof(((struct vki_kbsentry *)ARG3)->kb_string) );
6755 break;
6756 case VKI_KDSKBSENT:
6757 PRE_MEM_READ( "ioctl(KDSKBSENT).kb_func",
6758 (Addr)&((struct vki_kbsentry *)ARG3)->kb_func,
6759 sizeof(((struct vki_kbsentry *)ARG3)->kb_func) );
6760 PRE_MEM_RASCIIZ( "ioctl(KDSKBSENT).kb_string",
6761 (Addr)((struct vki_kbsentry *)ARG3)->kb_string );
6762 break;
6763
6764 case VKI_KDGKBDIACR:
6765 PRE_MEM_WRITE( "ioctl(KDGKBDIACR)", ARG3, sizeof(struct vki_kbdiacrs) );
6766 break;
6767 case VKI_KDSKBDIACR:
6768 PRE_MEM_READ( "ioctl(KDSKBDIACR)", ARG3, sizeof(struct vki_kbdiacrs) );
6769 break;
6770
6771 case VKI_KDGETKEYCODE:
6772 PRE_MEM_READ( "ioctl(KDGETKEYCODE).scancode",
6773 (Addr)&((struct vki_kbkeycode *)ARG3)->scancode,
6774 sizeof(((struct vki_kbkeycode *)ARG3)->scancode) );
6775 PRE_MEM_WRITE( "ioctl(KDGETKEYCODE).keycode",
6776 (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
6777 sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
6778 break;
6779 case VKI_KDSETKEYCODE:
6780 PRE_MEM_READ( "ioctl(KDSETKEYCODE).scancode",
6781 (Addr)&((struct vki_kbkeycode *)ARG3)->scancode,
6782 sizeof(((struct vki_kbkeycode *)ARG3)->scancode) );
6783 PRE_MEM_READ( "ioctl(KDSETKEYCODE).keycode",
6784 (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
6785 sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
6786 break;
6787
6788 case VKI_KDSIGACCEPT:
6789 break;
6790
6791 case VKI_KDKBDREP:
6792 PRE_MEM_READ( "ioctl(KBKBDREP)", ARG3, sizeof(struct vki_kbd_repeat) );
6793 break;
6794
6795 case VKI_KDFONTOP:
6796 if ( ARG3 ) {
6797 struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3;
6798 PRE_MEM_READ( "ioctl(KDFONTOP)", (Addr)op,
6799 sizeof(struct vki_console_font_op) );
6800 switch ( op->op ) {
6801 case VKI_KD_FONT_OP_SET:
6802 PRE_MEM_READ( "ioctl(KDFONTOP,KD_FONT_OP_SET).data",
6803 (Addr)op->data,
6804 (op->width + 7) / 8 * 32 * op->charcount );
6805 break;
6806 case VKI_KD_FONT_OP_GET:
6807 if ( op->data )
6808 PRE_MEM_WRITE( "ioctl(KDFONTOP,KD_FONT_OP_GET).data",
6809 (Addr)op->data,
6810 (op->width + 7) / 8 * 32 * op->charcount );
6811 break;
6812 case VKI_KD_FONT_OP_SET_DEFAULT:
6813 if ( op->data )
6814 PRE_MEM_RASCIIZ( "ioctl(KDFONTOP,KD_FONT_OP_SET_DEFAULT).data",
6815 (Addr)op->data );
6816 break;
6817 case VKI_KD_FONT_OP_COPY:
6818 break;
6819 }
6820 }
6821 break;
6822
6823 case VKI_VT_OPENQRY:
6824 PRE_MEM_WRITE( "ioctl(VT_OPENQRY)", ARG3, sizeof(int) );
6825 break;
6826 case VKI_VT_GETMODE:
6827 PRE_MEM_WRITE( "ioctl(VT_GETMODE)", ARG3, sizeof(struct vki_vt_mode) );
6828 break;
6829 case VKI_VT_SETMODE:
6830 PRE_MEM_READ( "ioctl(VT_SETMODE)", ARG3, sizeof(struct vki_vt_mode) );
6831 break;
6832 case VKI_VT_GETSTATE:
njn096ccdd2009-02-22 23:00:30 +00006833 PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_active",
6834 (Addr) &(((struct vki_vt_stat*) ARG3)->v_active),
6835 sizeof(((struct vki_vt_stat*) ARG3)->v_active));
6836 PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_state",
6837 (Addr) &(((struct vki_vt_stat*) ARG3)->v_state),
6838 sizeof(((struct vki_vt_stat*) ARG3)->v_state));
6839 break;
6840 case VKI_VT_RELDISP:
6841 case VKI_VT_ACTIVATE:
6842 case VKI_VT_WAITACTIVE:
6843 case VKI_VT_DISALLOCATE:
6844 break;
6845 case VKI_VT_RESIZE:
6846 PRE_MEM_READ( "ioctl(VT_RESIZE)", ARG3, sizeof(struct vki_vt_sizes) );
6847 break;
6848 case VKI_VT_RESIZEX:
6849 PRE_MEM_READ( "ioctl(VT_RESIZEX)", ARG3, sizeof(struct vki_vt_consize) );
6850 break;
6851 case VKI_VT_LOCKSWITCH:
6852 case VKI_VT_UNLOCKSWITCH:
6853 break;
6854
6855 case VKI_USBDEVFS_CONTROL:
6856 if ( ARG3 ) {
6857 struct vki_usbdevfs_ctrltransfer *vkuc = (struct vki_usbdevfs_ctrltransfer *)ARG3;
6858 PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).bRequestType", (Addr)&vkuc->bRequestType, sizeof(vkuc->bRequestType));
6859 PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).bRequest", (Addr)&vkuc->bRequest, sizeof(vkuc->bRequest));
6860 PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wValue", (Addr)&vkuc->wValue, sizeof(vkuc->wValue));
6861 PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wIndex", (Addr)&vkuc->wIndex, sizeof(vkuc->wIndex));
6862 PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).wLength", (Addr)&vkuc->wLength, sizeof(vkuc->wLength));
6863 PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).timeout", (Addr)&vkuc->timeout, sizeof(vkuc->timeout));
6864 if (vkuc->bRequestType & 0x80)
6865 PRE_MEM_WRITE( "ioctl(USBDEVFS_CONTROL).data", (Addr)vkuc->data, vkuc->wLength);
6866 else
6867 PRE_MEM_READ( "ioctl(USBDEVFS_CONTROL).data", (Addr)vkuc->data, vkuc->wLength);
6868 }
6869 break;
6870 case VKI_USBDEVFS_BULK:
6871 if ( ARG3 ) {
6872 struct vki_usbdevfs_bulktransfer *vkub = (struct vki_usbdevfs_bulktransfer *)ARG3;
6873 PRE_MEM_READ( "ioctl(USBDEVFS_BULK)", ARG3, sizeof(struct vki_usbdevfs_bulktransfer));
6874 if (vkub->ep & 0x80)
6875 PRE_MEM_WRITE( "ioctl(USBDEVFS_BULK).data", (Addr)vkub->data, vkub->len);
6876 else
6877 PRE_MEM_READ( "ioctl(USBDEVFS_BULK).data", (Addr)vkub->data, vkub->len);
njn096ccdd2009-02-22 23:00:30 +00006878 }
tom8bb4d8f2011-07-06 14:11:56 +00006879 break;
njn096ccdd2009-02-22 23:00:30 +00006880 case VKI_USBDEVFS_GETDRIVER:
6881 if ( ARG3 ) {
6882 struct vki_usbdevfs_getdriver *vkugd = (struct vki_usbdevfs_getdriver *) ARG3;
6883 PRE_MEM_WRITE( "ioctl(USBDEVFS_GETDRIVER)", (Addr)&vkugd->driver, sizeof(vkugd->driver));
njn096ccdd2009-02-22 23:00:30 +00006884 }
tom8bb4d8f2011-07-06 14:11:56 +00006885 break;
njn096ccdd2009-02-22 23:00:30 +00006886 case VKI_USBDEVFS_SUBMITURB:
6887 if ( ARG3 ) {
6888 struct vki_usbdevfs_urb *vkuu = (struct vki_usbdevfs_urb *)ARG3;
6889
6890 /* Not the whole struct needs to be initialized */
njn6e10c6c2009-06-09 23:03:02 +00006891 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).endpoint", (Addr)&vkuu->endpoint, sizeof(vkuu->endpoint));
njn096ccdd2009-02-22 23:00:30 +00006892 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).type", (Addr)&vkuu->type, sizeof(vkuu->type));
6893 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).flags", (Addr)&vkuu->flags, sizeof(vkuu->flags));
6894 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)&vkuu->buffer, sizeof(vkuu->buffer));
njn6e10c6c2009-06-09 23:03:02 +00006895 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).signr", (Addr)&vkuu->signr, sizeof(vkuu->signr));
6896 PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).status", (Addr)&vkuu->status, sizeof(vkuu->status));
6897 if (vkuu->type == VKI_USBDEVFS_URB_TYPE_CONTROL) {
6898 struct vki_usbdevfs_setuppacket *vkusp = (struct vki_usbdevfs_setuppacket *)vkuu->buffer;
6899 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer_length", (Addr)&vkuu->buffer_length, sizeof(vkuu->buffer_length));
6900 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer.setup_packet", (Addr)vkusp, sizeof(*vkusp));
6901 if (vkusp->bRequestType & 0x80)
6902 PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer.data", (Addr)(vkusp+1), vkuu->buffer_length - sizeof(*vkusp));
6903 else
6904 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer.data", (Addr)(vkusp+1), vkuu->buffer_length - sizeof(*vkusp));
6905 PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).actual_length", (Addr)&vkuu->actual_length, sizeof(vkuu->actual_length));
6906 } else if (vkuu->type == VKI_USBDEVFS_URB_TYPE_ISO) {
6907 int total_length = 0;
6908 int i;
6909 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).number_of_packets", (Addr)&vkuu->number_of_packets, sizeof(vkuu->number_of_packets));
6910 for(i=0; i<vkuu->number_of_packets; i++) {
6911 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).iso_frame_desc[].length", (Addr)&vkuu->iso_frame_desc[i].length, sizeof(vkuu->iso_frame_desc[i].length));
6912 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));
6913 PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).iso_frame_desc[].status", (Addr)&vkuu->iso_frame_desc[i].status, sizeof(vkuu->iso_frame_desc[i].status));
6914 total_length += vkuu->iso_frame_desc[i].length;
6915 }
6916 if (vkuu->endpoint & 0x80)
6917 PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, total_length);
6918 else
6919 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, total_length);
6920 PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).error_count", (Addr)&vkuu->error_count, sizeof(vkuu->error_count));
6921 } else {
6922 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer_length", (Addr)&vkuu->buffer_length, sizeof(vkuu->buffer_length));
6923 if (vkuu->endpoint & 0x80)
6924 PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
6925 else
6926 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
6927 PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).actual_length", (Addr)&vkuu->actual_length, sizeof(vkuu->actual_length));
6928 }
njn096ccdd2009-02-22 23:00:30 +00006929 }
tom8bb4d8f2011-07-06 14:11:56 +00006930 break;
njn6e10c6c2009-06-09 23:03:02 +00006931 case VKI_USBDEVFS_DISCARDURB:
6932 break;
njn096ccdd2009-02-22 23:00:30 +00006933 case VKI_USBDEVFS_REAPURB:
njn6e10c6c2009-06-09 23:03:02 +00006934 if ( ARG3 ) {
6935 PRE_MEM_WRITE( "ioctl(USBDEVFS_REAPURB)", ARG3, sizeof(struct vki_usbdevfs_urb **));
njn6e10c6c2009-06-09 23:03:02 +00006936 }
tom8bb4d8f2011-07-06 14:11:56 +00006937 break;
njn096ccdd2009-02-22 23:00:30 +00006938 case VKI_USBDEVFS_REAPURBNDELAY:
6939 if ( ARG3 ) {
njn6e10c6c2009-06-09 23:03:02 +00006940 PRE_MEM_WRITE( "ioctl(USBDEVFS_REAPURBNDELAY)", ARG3, sizeof(struct vki_usbdevfs_urb **));
njn096ccdd2009-02-22 23:00:30 +00006941 }
tom8bb4d8f2011-07-06 14:11:56 +00006942 break;
njn096ccdd2009-02-22 23:00:30 +00006943 case VKI_USBDEVFS_CONNECTINFO:
6944 PRE_MEM_WRITE( "ioctl(USBDEVFS_CONNECTINFO)", ARG3, sizeof(struct vki_usbdevfs_connectinfo));
6945 break;
6946 case VKI_USBDEVFS_IOCTL:
6947 if ( ARG3 ) {
6948 struct vki_usbdevfs_ioctl *vkui = (struct vki_usbdevfs_ioctl *)ARG3;
6949 UInt dir2, size2;
6950 PRE_MEM_READ("ioctl(USBDEVFS_IOCTL)", (Addr)vkui, sizeof(struct vki_usbdevfs_ioctl));
6951 dir2 = _VKI_IOC_DIR(vkui->ioctl_code);
6952 size2 = _VKI_IOC_SIZE(vkui->ioctl_code);
6953 if (size2 > 0) {
6954 if (dir2 & _VKI_IOC_WRITE)
6955 PRE_MEM_READ("ioctl(USBDEVFS_IOCTL).dataWrite", (Addr)vkui->data, size2);
6956 else if (dir2 & _VKI_IOC_READ)
6957 PRE_MEM_WRITE("ioctl(USBDEVFS_IOCTL).dataRead", (Addr)vkui->data, size2);
6958 }
6959 }
6960 break;
bart551fe932011-04-18 10:37:56 +00006961 case VKI_USBDEVFS_RESET:
6962 break;
njn096ccdd2009-02-22 23:00:30 +00006963
6964 /* I2C (/dev/i2c-*) ioctls */
6965 case VKI_I2C_SLAVE:
6966 case VKI_I2C_SLAVE_FORCE:
6967 case VKI_I2C_TENBIT:
6968 case VKI_I2C_PEC:
6969 break;
6970 case VKI_I2C_FUNCS:
6971 PRE_MEM_WRITE( "ioctl(I2C_FUNCS)", ARG3, sizeof(unsigned long) );
6972 break;
tomd543d742012-03-07 10:21:33 +00006973 case VKI_I2C_RDWR:
6974 if ( ARG3 ) {
6975 struct vki_i2c_rdwr_ioctl_data *vkui = (struct vki_i2c_rdwr_ioctl_data *)ARG3;
6976 UInt i;
6977 PRE_MEM_READ("ioctl(I2C_RDWR)", (Addr)vkui, sizeof(struct vki_i2c_rdwr_ioctl_data));
6978 for (i=0; i < vkui->nmsgs; i++) {
6979 struct vki_i2c_msg *msg = vkui->msgs + i;
6980 PRE_MEM_READ("ioctl(I2C_RDWR).msgs", (Addr)msg, sizeof(struct vki_i2c_msg));
6981 if (msg->flags & VKI_I2C_M_RD)
6982 PRE_MEM_WRITE("ioctl(I2C_RDWR).msgs.buf", (Addr)msg->buf, msg->len);
6983 else
6984 PRE_MEM_READ("ioctl(I2C_RDWR).msgs.buf", (Addr)msg->buf, msg->len);
6985 }
6986 }
6987 break;
sewardjf6f25a52015-02-05 15:52:46 +00006988 case VKI_I2C_SMBUS:
6989 if ( ARG3 ) {
6990 struct vki_i2c_smbus_ioctl_data *vkis
6991 = (struct vki_i2c_smbus_ioctl_data *) ARG3;
6992 PRE_MEM_READ("ioctl(VKI_I2C_SMBUS).i2c_smbus_ioctl_data.read_write",
6993 (Addr)&vkis->read_write, sizeof(vkis->read_write));
6994 PRE_MEM_READ("ioctl(VKI_I2C_SMBUS).i2c_smbus_ioctl_data.size",
6995 (Addr)&vkis->size, sizeof(vkis->size));
6996 PRE_MEM_READ("ioctl(VKI_I2C_SMBUS).i2c_smbus_ioctl_data.command",
6997 (Addr)&vkis->command, sizeof(vkis->command));
6998 /* i2c_smbus_write_quick hides its value in read_write, so
floriandd3b8662015-09-20 13:42:06 +00006999 this variable can have a different meaning */
sewardjf6f25a52015-02-05 15:52:46 +00007000 /* to make matters worse i2c_smbus_write_byte stores its
7001 value in command */
florian6bd97a92015-09-20 13:41:25 +00007002 if ( ! ((vkis->size == VKI_I2C_SMBUS_QUICK) ||
sewardjf6f25a52015-02-05 15:52:46 +00007003 ((vkis->size == VKI_I2C_SMBUS_BYTE)
7004 && (vkis->read_write == VKI_I2C_SMBUS_WRITE)))) {
7005 /* the rest uses the byte array to store the data,
7006 some the first byte for size */
7007 UInt size;
7008 switch(vkis->size) {
7009 case VKI_I2C_SMBUS_BYTE_DATA:
7010 size = 1;
7011 break;
7012 case VKI_I2C_SMBUS_WORD_DATA:
7013 case VKI_I2C_SMBUS_PROC_CALL:
7014 size = 2;
7015 break;
7016 case VKI_I2C_SMBUS_BLOCK_DATA:
7017 case VKI_I2C_SMBUS_I2C_BLOCK_BROKEN:
7018 case VKI_I2C_SMBUS_BLOCK_PROC_CALL:
7019 case VKI_I2C_SMBUS_I2C_BLOCK_DATA:
floriance82da22015-09-20 13:40:47 +00007020 size = 1 + vkis->data->block[0];
sewardjf6f25a52015-02-05 15:52:46 +00007021 break;
7022 default:
7023 size = 0;
7024 }
7025
7026 if ((vkis->read_write == VKI_I2C_SMBUS_READ)
7027 || (vkis->size == VKI_I2C_SMBUS_PROC_CALL)
7028 || (vkis->size == VKI_I2C_SMBUS_BLOCK_PROC_CALL))
7029 PRE_MEM_WRITE("ioctl(VKI_I2C_SMBUS)"
7030 ".i2c_smbus_ioctl_data.data",
7031 (Addr)&vkis->data->block[0], size);
7032 else
7033 PRE_MEM_READ("ioctl(VKI_I2C_SMBUS)."
7034 "i2c_smbus_ioctl_data.data",
7035 (Addr)&vkis->data->block[0], size);
7036 }
7037 }
7038 break;
njn096ccdd2009-02-22 23:00:30 +00007039
7040 /* Wireless extensions ioctls */
7041 case VKI_SIOCSIWCOMMIT:
7042 case VKI_SIOCSIWNWID:
7043 case VKI_SIOCSIWFREQ:
7044 case VKI_SIOCSIWMODE:
7045 case VKI_SIOCSIWSENS:
7046 case VKI_SIOCSIWRANGE:
7047 case VKI_SIOCSIWPRIV:
7048 case VKI_SIOCSIWSTATS:
7049 case VKI_SIOCSIWSPY:
7050 case VKI_SIOCSIWTHRSPY:
7051 case VKI_SIOCSIWAP:
7052 case VKI_SIOCSIWSCAN:
7053 case VKI_SIOCSIWESSID:
7054 case VKI_SIOCSIWRATE:
7055 case VKI_SIOCSIWNICKN:
7056 case VKI_SIOCSIWRTS:
7057 case VKI_SIOCSIWFRAG:
7058 case VKI_SIOCSIWTXPOW:
7059 case VKI_SIOCSIWRETRY:
7060 case VKI_SIOCSIWENCODE:
7061 case VKI_SIOCSIWPOWER:
7062 case VKI_SIOCSIWGENIE:
7063 case VKI_SIOCSIWMLME:
7064 case VKI_SIOCSIWAUTH:
7065 case VKI_SIOCSIWENCODEEXT:
7066 case VKI_SIOCSIWPMKSA:
7067 break;
7068 case VKI_SIOCGIWNAME:
7069 if (ARG3) {
7070 PRE_MEM_WRITE("ioctl(SIOCGIWNAME)",
7071 (Addr)((struct vki_iwreq *)ARG3)->u.name,
7072 sizeof(((struct vki_iwreq *)ARG3)->u.name));
7073 }
7074 break;
7075 case VKI_SIOCGIWNWID:
7076 case VKI_SIOCGIWSENS:
7077 case VKI_SIOCGIWRATE:
7078 case VKI_SIOCGIWRTS:
7079 case VKI_SIOCGIWFRAG:
7080 case VKI_SIOCGIWTXPOW:
7081 case VKI_SIOCGIWRETRY:
7082 case VKI_SIOCGIWPOWER:
7083 case VKI_SIOCGIWAUTH:
7084 if (ARG3) {
7085 PRE_MEM_WRITE("ioctl(SIOCGIW[NWID|SENS|RATE|RTS|FRAG|TXPOW|"
7086 "RETRY|PARAM|AUTH])",
7087 (Addr)&((struct vki_iwreq *)ARG3)->u.nwid,
7088 sizeof(struct vki_iw_param));
7089 }
7090 break;
7091 case VKI_SIOCGIWFREQ:
7092 if (ARG3) {
7093 PRE_MEM_WRITE("ioctl(SIOCGIWFREQ",
7094 (Addr)&((struct vki_iwreq *)ARG3)->u.freq,
7095 sizeof(struct vki_iw_freq));
7096 }
7097 break;
7098 case VKI_SIOCGIWMODE:
7099 if (ARG3) {
7100 PRE_MEM_WRITE("ioctl(SIOCGIWMODE",
7101 (Addr)&((struct vki_iwreq *)ARG3)->u.mode,
7102 sizeof(__vki_u32));
7103 }
7104 break;
7105 case VKI_SIOCGIWRANGE:
7106 case VKI_SIOCGIWPRIV:
7107 case VKI_SIOCGIWSTATS:
7108 case VKI_SIOCGIWSPY:
7109 case VKI_SIOCGIWTHRSPY:
7110 case VKI_SIOCGIWAPLIST:
7111 case VKI_SIOCGIWSCAN:
7112 case VKI_SIOCGIWESSID:
7113 case VKI_SIOCGIWNICKN:
7114 case VKI_SIOCGIWENCODE:
7115 case VKI_SIOCGIWGENIE:
7116 case VKI_SIOCGIWENCODEEXT:
7117 if (ARG3) {
7118 struct vki_iw_point* point;
7119 point = &((struct vki_iwreq *)ARG3)->u.data;
7120 PRE_MEM_WRITE("ioctl(SIOCGIW[RANGE|PRIV|STATS|SPY|THRSPY|"
7121 "APLIST|SCAN|ESSID|NICKN|ENCODE|GENIE|ENCODEEXT])",
7122 (Addr)point->pointer, point->length);
7123 }
7124 break;
7125 case VKI_SIOCGIWAP:
7126 if (ARG3) {
7127 PRE_MEM_WRITE("ioctl(SIOCGIWAP)",
7128 (Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
7129 sizeof(struct vki_sockaddr));
7130 }
7131 break;
7132
sewardjb6bf12c2012-07-13 13:15:10 +00007133 /* User input device creation */
7134 case VKI_UI_SET_EVBIT:
7135 case VKI_UI_SET_KEYBIT:
7136 case VKI_UI_SET_RELBIT:
7137 case VKI_UI_SET_ABSBIT:
7138 case VKI_UI_SET_MSCBIT:
7139 case VKI_UI_SET_LEDBIT:
7140 case VKI_UI_SET_SNDBIT:
7141 case VKI_UI_SET_FFBIT:
7142 case VKI_UI_SET_SWBIT:
7143 case VKI_UI_SET_PROPBIT:
7144 /* These just take an int by value */
7145 break;
7146
dejanj9c6b05d2013-12-27 09:06:55 +00007147# if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android) \
Elliott Hughesa0664b92017-04-18 17:46:52 -07007148 || defined(VGPV_mips32_linux_android) \
7149 || defined(VGPV_arm64_linux_android)
sewardja3e7a482011-09-27 10:26:52 +00007150 /* ashmem */
7151 case VKI_ASHMEM_GET_SIZE:
7152 case VKI_ASHMEM_SET_SIZE:
7153 case VKI_ASHMEM_GET_PROT_MASK:
7154 case VKI_ASHMEM_SET_PROT_MASK:
7155 case VKI_ASHMEM_GET_PIN_STATUS:
7156 case VKI_ASHMEM_PURGE_ALL_CACHES:
7157 break;
7158 case VKI_ASHMEM_GET_NAME:
7159 PRE_MEM_WRITE( "ioctl(ASHMEM_SET_NAME)", ARG3, VKI_ASHMEM_NAME_LEN );
7160 break;
7161 case VKI_ASHMEM_SET_NAME:
7162 PRE_MEM_RASCIIZ( "ioctl(ASHMEM_SET_NAME)", ARG3);
7163 break;
7164 case VKI_ASHMEM_PIN:
7165 case VKI_ASHMEM_UNPIN:
7166 PRE_MEM_READ( "ioctl(ASHMEM_PIN|ASHMEM_UNPIN)",
7167 ARG3, sizeof(struct vki_ashmem_pin) );
7168 break;
7169
7170 /* binder */
7171 case VKI_BINDER_WRITE_READ:
7172 if (ARG3) {
7173 struct vki_binder_write_read* bwr
7174 = (struct vki_binder_write_read*)ARG3;
7175
7176 PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_buffer",
7177 bwr->write_buffer);
7178 PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_size",
7179 bwr->write_size);
7180 PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_consumed",
7181 bwr->write_consumed);
7182 PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_buffer",
7183 bwr->read_buffer);
7184 PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_size",
7185 bwr->read_size);
7186 PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_consumed",
7187 bwr->read_consumed);
7188
7189 PRE_FIELD_WRITE("ioctl(BINDER_WRITE_READ).write_consumed",
7190 bwr->write_consumed);
7191 PRE_FIELD_WRITE("ioctl(BINDER_WRITE_READ).read_consumed",
7192 bwr->read_consumed);
7193
7194 if (bwr->read_size)
7195 PRE_MEM_WRITE("ioctl(BINDER_WRITE_READ).read_buffer[]",
7196 (Addr)bwr->read_buffer, bwr->read_size);
7197 if (bwr->write_size)
7198 PRE_MEM_READ("ioctl(BINDER_WRITE_READ).write_buffer[]",
7199 (Addr)bwr->write_buffer, bwr->write_size);
7200 }
7201 break;
7202
7203 case VKI_BINDER_SET_IDLE_TIMEOUT:
7204 case VKI_BINDER_SET_MAX_THREADS:
7205 case VKI_BINDER_SET_IDLE_PRIORITY:
7206 case VKI_BINDER_SET_CONTEXT_MGR:
7207 case VKI_BINDER_THREAD_EXIT:
7208 break;
7209 case VKI_BINDER_VERSION:
7210 if (ARG3) {
7211 struct vki_binder_version* bv = (struct vki_binder_version*)ARG3;
7212 PRE_FIELD_WRITE("ioctl(BINDER_VERSION)", bv->protocol_version);
7213 }
7214 break;
philippe5d5dd8e2012-08-05 00:08:25 +00007215# endif /* defined(VGPV_*_linux_android) */
sewardja3e7a482011-09-27 10:26:52 +00007216
tom5cc73ec2014-06-26 11:44:46 +00007217 case VKI_HCIGETDEVLIST:
7218 if (ARG3) {
7219 struct vki_hci_dev_list_req* dlr = (struct vki_hci_dev_list_req*)ARG3;
7220 PRE_MEM_READ("ioctl(HCIGETDEVLIST)",
7221 (Addr)ARG3, sizeof(struct vki_hci_dev_list_req));
7222 PRE_MEM_WRITE("ioctl(HCIGETDEVLIST)",
7223 (Addr)ARG3 + sizeof(struct vki_hci_dev_list_req),
7224 dlr->dev_num * sizeof(struct vki_hci_dev_req));
7225 }
7226 break;
7227
tom8236fe62012-03-07 11:22:42 +00007228 case VKI_HCIINQUIRY:
7229 if (ARG3) {
7230 struct vki_hci_inquiry_req* ir = (struct vki_hci_inquiry_req*)ARG3;
7231 PRE_MEM_READ("ioctl(HCIINQUIRY)",
7232 (Addr)ARG3, sizeof(struct vki_hci_inquiry_req));
7233 PRE_MEM_WRITE("ioctl(HCIINQUIRY)",
7234 (Addr)ARG3 + sizeof(struct vki_hci_inquiry_req),
7235 ir->num_rsp * sizeof(struct vki_inquiry_info));
7236 }
7237 break;
cborntra4ea8f142014-02-11 15:15:31 +00007238
tom5b8d6892014-07-10 14:56:48 +00007239 case VKI_DRM_IOCTL_VERSION:
7240 if (ARG3) {
7241 struct vki_drm_version *data = (struct vki_drm_version *)ARG3;
7242 PRE_MEM_WRITE("ioctl(DRM_VERSION).version_major", (Addr)&data->version_major, sizeof(data->version_major));
7243 PRE_MEM_WRITE("ioctl(DRM_VERSION).version_minor", (Addr)&data->version_minor, sizeof(data->version_minor));
7244 PRE_MEM_WRITE("ioctl(DRM_VERSION).version_patchlevel", (Addr)&data->version_patchlevel, sizeof(data->version_patchlevel));
7245 PRE_MEM_READ("ioctl(DRM_VERSION).name_len", (Addr)&data->name_len, sizeof(data->name_len));
7246 PRE_MEM_READ("ioctl(DRM_VERSION).name", (Addr)&data->name, sizeof(data->name));
7247 PRE_MEM_WRITE("ioctl(DRM_VERSION).name", (Addr)data->name, data->name_len);
7248 PRE_MEM_READ("ioctl(DRM_VERSION).date_len", (Addr)&data->date_len, sizeof(data->date_len));
7249 PRE_MEM_READ("ioctl(DRM_VERSION).date", (Addr)&data->date, sizeof(data->date));
7250 PRE_MEM_WRITE("ioctl(DRM_VERSION).date", (Addr)data->date, data->date_len);
7251 PRE_MEM_READ("ioctl(DRM_VERSION).desc_len", (Addr)&data->desc_len, sizeof(data->desc_len));
7252 PRE_MEM_READ("ioctl(DRM_VERSION).desc", (Addr)&data->desc, sizeof(data->desc));
7253 PRE_MEM_WRITE("ioctl(DRM_VERSION).desc", (Addr)data->desc, data->desc_len);
7254 }
7255 break;
7256 case VKI_DRM_IOCTL_GET_UNIQUE:
7257 if (ARG3) {
7258 struct vki_drm_unique *data = (struct vki_drm_unique *)ARG3;
7259 PRE_MEM_READ("ioctl(DRM_GET_UNIQUE).unique_len", (Addr)&data->unique_len, sizeof(data->unique_len));
7260 PRE_MEM_READ("ioctl(DRM_GET_UNIQUE).unique", (Addr)&data->unique, sizeof(data->unique));
7261 PRE_MEM_WRITE("ioctl(DRM_GET_UNIQUE).unique", (Addr)data->unique, data->unique_len);
7262 }
7263 break;
7264 case VKI_DRM_IOCTL_GET_MAGIC:
7265 if (ARG3) {
7266 struct vki_drm_auth *data = (struct vki_drm_auth *)ARG3;
7267 PRE_MEM_WRITE("ioctl(DRM_GET_MAGIC).magic", (Addr)&data->magic, sizeof(data->magic));
7268 }
7269 break;
7270 case VKI_DRM_IOCTL_WAIT_VBLANK:
7271 if (ARG3) {
7272 union vki_drm_wait_vblank *data = (union vki_drm_wait_vblank *)ARG3;
7273 PRE_MEM_READ("ioctl(DRM_WAIT_VBLANK).request.type", (Addr)&data->request.type, sizeof(data->request.type));
7274 PRE_MEM_READ("ioctl(DRM_WAIT_VBLANK).request.sequence", (Addr)&data->request.sequence, sizeof(data->request.sequence));
7275 /* XXX: It seems request.signal isn't used */
7276 PRE_MEM_WRITE("ioctl(DRM_WAIT_VBLANK).reply", (Addr)&data->reply, sizeof(data->reply));
7277 }
7278 break;
7279 case VKI_DRM_IOCTL_GEM_CLOSE:
7280 if (ARG3) {
7281 struct vki_drm_gem_close *data = (struct vki_drm_gem_close *)ARG3;
7282 PRE_MEM_READ("ioctl(DRM_GEM_CLOSE).handle", (Addr)&data->handle, sizeof(data->handle));
7283 }
7284 break;
7285 case VKI_DRM_IOCTL_GEM_FLINK:
7286 if (ARG3) {
7287 struct vki_drm_gem_flink *data = (struct vki_drm_gem_flink *)ARG3;
7288 PRE_MEM_READ("ioctl(DRM_GEM_FLINK).handle", (Addr)&data->handle, sizeof(data->handle));
7289 PRE_MEM_WRITE("ioctl(DRM_GEM_FLINK).name", (Addr)&data->name, sizeof(data->name));
7290 }
7291 break;
7292 case VKI_DRM_IOCTL_GEM_OPEN:
7293 if (ARG3) {
7294 struct vki_drm_gem_open *data = (struct vki_drm_gem_open *)ARG3;
7295 PRE_MEM_READ("ioctl(DRM_GEM_OPEN).name", (Addr)&data->name, sizeof(data->name));
7296 PRE_MEM_WRITE("ioctl(DRM_GEM_OPEN).handle", (Addr)&data->handle, sizeof(data->handle));
7297 PRE_MEM_WRITE("ioctl(DRM_GEM_OPEN).size", (Addr)&data->size, sizeof(data->size));
7298 }
7299 break;
7300 case VKI_DRM_IOCTL_I915_GETPARAM:
7301 if (ARG3) {
7302 vki_drm_i915_getparam_t *data = (vki_drm_i915_getparam_t *)ARG3;
7303 PRE_MEM_READ("ioctl(DRM_I915_GETPARAM).param", (Addr)&data->param, sizeof(data->param));
7304 PRE_MEM_WRITE("ioctl(DRM_I915_GETPARAM).value", (Addr)data->value, sizeof(int));
7305 }
7306 break;
7307 case VKI_DRM_IOCTL_I915_GEM_BUSY:
7308 if (ARG3) {
7309 struct vki_drm_i915_gem_busy *data = (struct vki_drm_i915_gem_busy *)ARG3;
7310 PRE_MEM_READ("ioctl(DRM_I915_GEM_BUSY).handle", (Addr)&data->handle, sizeof(data->handle));
7311 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_BUSY).busy", (Addr)&data->busy, sizeof(data->busy));
7312 }
7313 break;
7314 case VKI_DRM_IOCTL_I915_GEM_CREATE:
7315 if (ARG3) {
7316 struct vki_drm_i915_gem_create *data = (struct vki_drm_i915_gem_create *)ARG3;
7317 PRE_MEM_READ("ioctl(DRM_I915_GEM_CREATE).size", (Addr)&data->size, sizeof(data->size));
7318 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_CREATE).handle", (Addr)&data->handle, sizeof(data->handle));
7319 }
7320 break;
7321 case VKI_DRM_IOCTL_I915_GEM_PREAD:
7322 if (ARG3) {
7323 struct vki_drm_i915_gem_pread *data = (struct vki_drm_i915_gem_pread *)ARG3;
7324 PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).handle", (Addr)&data->handle, sizeof(data->handle));
7325 PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).offset", (Addr)&data->offset, sizeof(data->offset));
7326 PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).size", (Addr)&data->size, sizeof(data->size));
7327 PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).data_ptr", (Addr)&data->data_ptr, sizeof(data->data_ptr));
7328 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_PREAD).data_ptr", (Addr)data->data_ptr, data->size);
7329 }
7330 break;
7331 case VKI_DRM_IOCTL_I915_GEM_PWRITE:
7332 if (ARG3) {
7333 struct vki_drm_i915_gem_pwrite *data = (struct vki_drm_i915_gem_pwrite *)ARG3;
7334 PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).handle", (Addr)&data->handle, sizeof(data->handle));
7335 PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).offset", (Addr)&data->offset, sizeof(data->offset));
7336 PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).size", (Addr)&data->size, sizeof(data->size));
7337 PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).data_ptr", (Addr)&data->data_ptr, sizeof(data->data_ptr));
7338 /* PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).data_ptr", (Addr)data->data_ptr, data->size);
7339 * NB: the buffer is allowed to contain any amount of uninitialized data (e.g.
7340 * interleaved vertex attributes may have a wide stride with uninitialized data between
7341 * consecutive vertices) */
7342 }
7343 break;
7344 case VKI_DRM_IOCTL_I915_GEM_MMAP_GTT:
7345 if (ARG3) {
7346 struct vki_drm_i915_gem_mmap_gtt *data = (struct vki_drm_i915_gem_mmap_gtt *)ARG3;
7347 PRE_MEM_READ("ioctl(DRM_I915_GEM_MMAP_GTT).handle", (Addr)&data->handle, sizeof(data->handle));
7348 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_MMAP_GTT).offset", (Addr)&data->offset, sizeof(data->offset));
7349 }
7350 break;
7351 case VKI_DRM_IOCTL_I915_GEM_SET_DOMAIN:
7352 if (ARG3) {
7353 struct vki_drm_i915_gem_set_domain *data = (struct vki_drm_i915_gem_set_domain *)ARG3;
7354 PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_DOMAIN).handle", (Addr)&data->handle, sizeof(data->handle));
7355 PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_DOMAIN).read_domains", (Addr)&data->read_domains, sizeof(data->read_domains));
7356 PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_DOMAIN).write_domain", (Addr)&data->write_domain, sizeof(data->write_domain));
7357 }
7358 break;
7359 case VKI_DRM_IOCTL_I915_GEM_SET_TILING:
7360 if (ARG3) {
7361 struct vki_drm_i915_gem_set_tiling *data = (struct vki_drm_i915_gem_set_tiling *)ARG3;
7362 PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_TILING).handle", (Addr)&data->handle, sizeof(data->handle));
7363 PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_TILING).tiling_mode", (Addr)&data->tiling_mode, sizeof(data->tiling_mode));
7364 PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_TILING).stride", (Addr)&data->stride, sizeof(data->stride));
7365 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_SET_TILING).swizzle_mode", (Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
7366 }
7367 break;
7368 case VKI_DRM_IOCTL_I915_GEM_GET_TILING:
7369 if (ARG3) {
7370 struct vki_drm_i915_gem_get_tiling *data = (struct vki_drm_i915_gem_get_tiling *)ARG3;
7371 PRE_MEM_READ("ioctl(DRM_I915_GEM_GET_TILING).handle", (Addr)&data->handle, sizeof(data->handle));
7372 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_TILING).tiling_mode", (Addr)&data->tiling_mode, sizeof(data->tiling_mode));
7373 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_TILING).swizzle_mode", (Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
7374 }
7375 break;
7376 case VKI_DRM_IOCTL_I915_GEM_GET_APERTURE:
7377 if (ARG3) {
7378 struct vki_drm_i915_gem_get_aperture *data = (struct vki_drm_i915_gem_get_aperture *)ARG3;
7379 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_APERTURE).aper_size", (Addr)&data->aper_size, sizeof(data->aper_size));
7380 PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_APERTURE).aper_available_size", (Addr)&data->aper_available_size, sizeof(data->aper_available_size));
7381 }
7382 break;
7383
cborntra65bdbe42012-05-23 15:59:40 +00007384 /* KVM ioctls that check for a numeric value as parameter */
7385 case VKI_KVM_GET_API_VERSION:
7386 case VKI_KVM_CREATE_VM:
7387 case VKI_KVM_GET_VCPU_MMAP_SIZE:
7388 case VKI_KVM_CHECK_EXTENSION:
cborntra202148c2014-09-26 12:25:02 +00007389 case VKI_KVM_SET_TSS_ADDR:
cborntra65bdbe42012-05-23 15:59:40 +00007390 case VKI_KVM_CREATE_VCPU:
7391 case VKI_KVM_RUN:
7392 break;
tom8236fe62012-03-07 11:22:42 +00007393
cborntra1a6714b2015-06-12 10:54:12 +00007394 case VKI_KVM_S390_MEM_OP: {
7395 struct vki_kvm_s390_mem_op *args =
7396 (struct vki_kvm_s390_mem_op *)(ARG3);
7397 PRE_MEM_READ("ioctl(KVM_S390_MEM_OP)", ARG3,
7398 sizeof(struct vki_kvm_s390_mem_op));
7399 if (args->flags & VKI_KVM_S390_MEMOP_F_CHECK_ONLY)
7400 break;
7401 if (args->op == VKI_KVM_S390_MEMOP_LOGICAL_READ)
7402 PRE_MEM_WRITE("ioctl(KVM_S390_MEM_OP).buf", (Addr)args->buf, args->size);
7403 if (args->op == VKI_KVM_S390_MEMOP_LOGICAL_WRITE)
7404 PRE_MEM_READ("ioctl(KVM_S390_MEM_OP).buf", (Addr)args->buf, args->size);
7405 }
7406 break;
7407
7408
bart0ab84fe2012-09-09 18:30:17 +00007409#ifdef ENABLE_XEN
7410 case VKI_XEN_IOCTL_PRIVCMD_HYPERCALL: {
7411 SyscallArgs harrghs;
7412 struct vki_xen_privcmd_hypercall *args =
7413 (struct vki_xen_privcmd_hypercall *)(ARG3);
7414
7415 if (!args)
7416 break;
7417
7418 VG_(memset)(&harrghs, 0, sizeof(harrghs));
7419 harrghs.sysno = args->op;
7420 harrghs.arg1 = args->arg[0];
7421 harrghs.arg2 = args->arg[1];
7422 harrghs.arg3 = args->arg[2];
7423 harrghs.arg4 = args->arg[3];
7424 harrghs.arg5 = args->arg[4];
7425 harrghs.arg6 = harrghs.arg7 = harrghs.arg8 = 0;
7426
7427 WRAPPER_PRE_NAME(xen, hypercall) (tid, layout, &harrghs, status, flags);
7428
7429 /* HACK. arg8 is used to return the number of hypercall
7430 * arguments actually consumed! */
7431 PRE_MEM_READ("hypercall", ARG3, sizeof(args->op) +
7432 ( sizeof(args->arg[0]) * harrghs.arg8 ) );
7433
7434 break;
7435 }
7436
7437 case VKI_XEN_IOCTL_PRIVCMD_MMAP: {
7438 struct vki_xen_privcmd_mmap *args =
7439 (struct vki_xen_privcmd_mmap *)(ARG3);
bart77addcd2013-06-30 07:57:35 +00007440 PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAP(num)",
bart0ab84fe2012-09-09 18:30:17 +00007441 (Addr)&args->num, sizeof(args->num));
bart77addcd2013-06-30 07:57:35 +00007442 PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAP(dom)",
bart0ab84fe2012-09-09 18:30:17 +00007443 (Addr)&args->dom, sizeof(args->dom));
bart77addcd2013-06-30 07:57:35 +00007444 PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAP(entry)",
bart0ab84fe2012-09-09 18:30:17 +00007445 (Addr)args->entry, sizeof(*(args->entry)) * args->num);
7446 break;
7447 }
7448 case VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH: {
7449 struct vki_xen_privcmd_mmapbatch *args =
7450 (struct vki_xen_privcmd_mmapbatch *)(ARG3);
bart77addcd2013-06-30 07:57:35 +00007451 PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH(num)",
bart0ab84fe2012-09-09 18:30:17 +00007452 (Addr)&args->num, sizeof(args->num));
bart77addcd2013-06-30 07:57:35 +00007453 PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH(dom)",
bart0ab84fe2012-09-09 18:30:17 +00007454 (Addr)&args->dom, sizeof(args->dom));
bart77addcd2013-06-30 07:57:35 +00007455 PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH(addr)",
bart0ab84fe2012-09-09 18:30:17 +00007456 (Addr)&args->addr, sizeof(args->addr));
bart77addcd2013-06-30 07:57:35 +00007457 PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH(arr)",
bart0ab84fe2012-09-09 18:30:17 +00007458 (Addr)args->arr, sizeof(*(args->arr)) * args->num);
7459 break;
7460 }
7461 case VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2: {
7462 struct vki_xen_privcmd_mmapbatch_v2 *args =
7463 (struct vki_xen_privcmd_mmapbatch_v2 *)(ARG3);
bart77addcd2013-06-30 07:57:35 +00007464 PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(num)",
bart0ab84fe2012-09-09 18:30:17 +00007465 (Addr)&args->num, sizeof(args->num));
bart77addcd2013-06-30 07:57:35 +00007466 PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(dom)",
bart0ab84fe2012-09-09 18:30:17 +00007467 (Addr)&args->dom, sizeof(args->dom));
bart77addcd2013-06-30 07:57:35 +00007468 PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(addr)",
bart0ab84fe2012-09-09 18:30:17 +00007469 (Addr)&args->addr, sizeof(args->addr));
bart77addcd2013-06-30 07:57:35 +00007470 PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(arr)",
bart0ab84fe2012-09-09 18:30:17 +00007471 (Addr)args->arr, sizeof(*(args->arr)) * args->num);
7472 break;
7473 }
sewardj12d5abc2014-09-04 11:02:24 +00007474
7475 case VKI_XEN_IOCTL_EVTCHN_BIND_VIRQ: {
7476 struct vki_xen_ioctl_evtchn_bind_virq *args =
7477 (struct vki_xen_ioctl_evtchn_bind_virq *)(ARG3);
7478 PRE_MEM_READ("VKI_XEN_IOCTL_EVTCHN_BIND_VIRQ(virq)",
7479 (Addr)&args->virq, sizeof(args->virq));
7480 }
7481 break;
7482 case VKI_XEN_IOCTL_EVTCHN_BIND_INTERDOMAIN: {
7483 struct vki_xen_ioctl_evtchn_bind_interdomain *args =
7484 (struct vki_xen_ioctl_evtchn_bind_interdomain *)(ARG3);
7485 PRE_MEM_READ("VKI_XEN_IOCTL_EVTCHN_BIND_INTERDOMAIN(remote_domain)",
7486 (Addr)&args->remote_domain, sizeof(args->remote_domain));
7487 PRE_MEM_READ("VKI_XEN_IOCTL_EVTCHN_BIND_INTERDOMAIN(remote_port)",
7488 (Addr)&args->remote_port, sizeof(args->remote_port));
7489 }
7490 break;
7491 case VKI_XEN_IOCTL_EVTCHN_BIND_UNBOUND_PORT: {
7492 struct vki_xen_ioctl_evtchn_bind_unbound_port *args =
7493 (struct vki_xen_ioctl_evtchn_bind_unbound_port *)(ARG3);
7494 PRE_MEM_READ("VKI_XEN_IOCTL_EVTCHN_BIND_UNBOUND_PORT(remote_domain)",
7495 (Addr)&args->remote_domain, sizeof(args->remote_domain));
7496 }
7497 break;
7498 case VKI_XEN_IOCTL_EVTCHN_UNBIND: {
7499 struct vki_xen_ioctl_evtchn_unbind *args =
7500 (struct vki_xen_ioctl_evtchn_unbind *)(ARG3);
7501 PRE_MEM_READ("VKI_XEN_IOCTL_EVTCHN_UNBIND(port)",
7502 (Addr)&args->port, sizeof(args->port));
7503 }
7504 break;
7505 case VKI_XEN_IOCTL_EVTCHN_NOTIFY: {
7506 struct vki_xen_ioctl_evtchn_notify *args =
7507 (struct vki_xen_ioctl_evtchn_notify*)(ARG3);
7508 PRE_MEM_READ("VKI_XEN_IOCTL_EVTCHN_notify(port)",
7509 (Addr)&args->port, sizeof(args->port));
7510 }
7511 break;
7512 case VKI_XEN_IOCTL_EVTCHN_RESET:
7513 /* No input*/
7514 break;
bart0ab84fe2012-09-09 18:30:17 +00007515#endif
7516
bart2010b152015-04-21 17:46:52 +00007517 /* Lustre */
7518 case VKI_OBD_IOC_FID2PATH: {
7519 struct vki_getinfo_fid2path *gf = (struct vki_getinfo_fid2path *)ARG3;
7520 PRE_MEM_READ("VKI_OBD_IOC_FID2PATH(args)", ARG3, sizeof(struct vki_getinfo_fid2path));
7521 PRE_FIELD_WRITE("VKI_OBD_IOC_FID2PATH(args).gf_recno", gf->gf_recno);
7522 PRE_FIELD_WRITE("VKI_OBD_IOC_FID2PATH(args).gf_linkno", gf->gf_linkno);
7523 PRE_MEM_WRITE("VKI_OBD_IOC_FID2PATH(args)", (Addr)gf->gf_path, gf->gf_pathlen);
bart1fa9ee82014-08-05 12:01:26 +00007524 break;
bart2010b152015-04-21 17:46:52 +00007525 }
7526
7527 case VKI_LL_IOC_PATH2FID:
7528 PRE_MEM_WRITE("ioctl(VKI_LL_IOC_PATH2FID)", ARG3, sizeof(struct vki_lu_fid));
7529 break;
7530
7531 case VKI_LL_IOC_GETPARENT: {
7532 struct vki_getparent *gp = (struct vki_getparent *)ARG3;
7533 PRE_FIELD_READ("ioctl(VKI_LL_IOC_GETPARENT).gp_linkno", gp->gp_linkno);
7534 PRE_FIELD_READ("ioctl(VKI_LL_IOC_GETPARENT).gp_name_size", gp->gp_name_size);
7535 PRE_FIELD_WRITE("ioctl(VKI_LL_IOC_GETPARENT).gp_fid", gp->gp_fid);
7536 PRE_MEM_WRITE("ioctl(VKI_LL_IOC_GETPARENT).gp_name", (Addr)gp->gp_name, gp->gp_name_size);
7537 break;
7538 }
bart1fa9ee82014-08-05 12:01:26 +00007539
sewardj66fbb212014-09-04 11:08:45 +00007540 /* V4L2 */
7541 case VKI_V4L2_QUERYCAP: {
7542 struct vki_v4l2_capability *data = (struct vki_v4l2_capability *)ARG3;
7543 PRE_MEM_WRITE("ioctl(VKI_V4L2_QUERYCAP)", (Addr)data, sizeof(*data));
7544 break;
7545 }
7546 case VKI_V4L2_ENUM_FMT: {
7547 struct vki_v4l2_fmtdesc *data = (struct vki_v4l2_fmtdesc *)ARG3;
7548 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FMT).index", data->index);
7549 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FMT).type", data->type);
7550 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FMT).flags", data->flags);
7551 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FMT).description", data->description);
7552 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FMT).pixelformat", data->pixelformat);
7553 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FMT).reserved", data->reserved);
7554 break;
7555 }
7556 case VKI_V4L2_G_FMT: {
7557 struct vki_v4l2_format *data = (struct vki_v4l2_format *)ARG3;
7558 PRE_FIELD_READ("ioctl(VKI_V4L2_G_FMT).type", data->type);
7559 switch (data->type) {
7560 case VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE:
7561 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT:
7562 PRE_FIELD_READ("ioctl(VKI_V4L2_G_FMT).fmt.pix.priv", data->fmt.pix.priv);
7563 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FMT).fmt.pix", data->fmt.pix);
7564 PRE_MEM_READ("ioctl(VKI_V4L2_G_FMT)",
7565 (Addr)&data->type + sizeof(data->type) + sizeof(data->fmt.pix),
7566 sizeof(*data) - sizeof(data->type) - sizeof(data->fmt.pix));
7567 break;
7568 case VKI_V4L2_BUF_TYPE_VBI_CAPTURE:
7569 case VKI_V4L2_BUF_TYPE_VBI_OUTPUT:
7570 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FMT).fmt.vbi", data->fmt.vbi);
7571 break;
7572 case VKI_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
7573 case VKI_V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
7574 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FMT).fmt.sliced", data->fmt.sliced);
7575 break;
7576 case VKI_V4L2_BUF_TYPE_VIDEO_OVERLAY:
7577 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
7578 PRE_FIELD_READ("ioctl(VKI_V4L2_G_FMT).fmt.win.clips", data->fmt.win.clips);
7579 PRE_FIELD_READ("ioctl(VKI_V4L2_G_FMT).fmt.win.bitmap", data->fmt.win.bitmap);
7580 PRE_FIELD_READ("ioctl(VKI_V4L2_G_FMT).fmt.win.clipcount", data->fmt.win.clipcount);
7581 if (data->fmt.win.clipcount && data->fmt.win.clips)
7582 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_FMT).fmt.win.clips[]",
7583 (Addr)data->fmt.win.clips,
7584 data->fmt.win.clipcount * sizeof(data->fmt.win.clips[0]));
7585 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FMT).fmt.win.clipcount", data->fmt.win.clipcount);
7586 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FMT).fmt.win.w", data->fmt.win.w);
7587 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FMT).fmt.win.field", data->fmt.win.field);
7588 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FMT).fmt.win.chromakey", data->fmt.win.chromakey);
7589 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FMT).fmt.win.global_alpha", data->fmt.win.global_alpha);
7590 break;
7591 case VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
7592 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
7593 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FMT).fmt.pix_mp", data->fmt.pix_mp);
7594 break;
7595 case VKI_V4L2_BUF_TYPE_SDR_CAPTURE:
7596 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FMT).fmt.sdr", data->fmt.sdr);
7597 break;
7598 }
7599 break;
7600 }
7601 case VKI_V4L2_S_FMT: {
7602 struct vki_v4l2_format *data = (struct vki_v4l2_format *)ARG3;
7603 PRE_FIELD_READ("ioctl(VKI_V4L2_S_FMT).type", data->type);
7604 switch (data->type) {
7605 case VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE:
7606 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT:
7607 PRE_MEM_READ("ioctl(VKI_V4L2_S_FMT)",
7608 (Addr)&data->type + sizeof(data->type),
7609 sizeof(*data) - sizeof(data->type));
7610 break;
7611 case VKI_V4L2_BUF_TYPE_VBI_CAPTURE:
7612 case VKI_V4L2_BUF_TYPE_VBI_OUTPUT:
7613 PRE_FIELD_READ("ioctl(VKI_V4L2_S_FMT).fmt.vbi", data->fmt.vbi);
7614 break;
7615 case VKI_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
7616 case VKI_V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
7617 PRE_FIELD_READ("ioctl(VKI_V4L2_S_FMT).fmt.sliced", data->fmt.sliced);
7618 break;
7619 case VKI_V4L2_BUF_TYPE_VIDEO_OVERLAY:
7620 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
7621 PRE_FIELD_READ("ioctl(VKI_V4L2_S_FMT).fmt.win", data->fmt.win);
7622 if (data->fmt.win.clipcount && data->fmt.win.clips)
7623 PRE_MEM_READ("ioctl(VKI_V4L2_S_FMT).fmt.win.clips[]",
7624 (Addr)data->fmt.win.clips,
7625 data->fmt.win.clipcount * sizeof(data->fmt.win.clips[0]));
7626 if (data->fmt.win.bitmap)
7627 PRE_MEM_READ("ioctl(VKI_V4L2_S_FMT).fmt.win.bitmap[]",
7628 (Addr)data->fmt.win.bitmap,
7629 data->fmt.win.w.height * ((data->fmt.win.w.width + 7) / 8));
7630 break;
7631 case VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
7632 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
7633 PRE_FIELD_READ("ioctl(VKI_V4L2_S_FMT).fmt.pix_mp", data->fmt.pix_mp);
7634 break;
7635 case VKI_V4L2_BUF_TYPE_SDR_CAPTURE:
7636 PRE_FIELD_READ("ioctl(VKI_V4L2_S_FMT).fmt.sdr", data->fmt.sdr);
7637 break;
7638 }
7639 break;
7640 }
7641 case VKI_V4L2_TRY_FMT: {
7642 struct vki_v4l2_format *data = (struct vki_v4l2_format *)ARG3;
7643 PRE_FIELD_READ("ioctl(VKI_V4L2_TRY_FMT).type", data->type);
7644 switch (data->type) {
7645 case VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE:
7646 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT:
7647 PRE_MEM_READ("ioctl(VKI_V4L2_TRY_FMT)",
7648 (Addr)&data->type + sizeof(data->type),
7649 sizeof(*data) - sizeof(data->type));
7650 break;
7651 case VKI_V4L2_BUF_TYPE_VBI_CAPTURE:
7652 case VKI_V4L2_BUF_TYPE_VBI_OUTPUT:
7653 PRE_FIELD_READ("ioctl(VKI_V4L2_TRY_FMT).fmt.vbi", data->fmt.vbi);
7654 break;
7655 case VKI_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
7656 case VKI_V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
7657 PRE_FIELD_READ("ioctl(VKI_V4L2_TRY_FMT).fmt.sliced", data->fmt.sliced);
7658 break;
7659 case VKI_V4L2_BUF_TYPE_VIDEO_OVERLAY:
7660 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
7661 PRE_FIELD_READ("ioctl(VKI_V4L2_TRY_FMT).fmt.win", data->fmt.win);
7662 if (data->fmt.win.clipcount && data->fmt.win.clips)
7663 PRE_MEM_READ("ioctl(VKI_V4L2_TRY_FMT).fmt.win.clips[]",
7664 (Addr)data->fmt.win.clips,
7665 data->fmt.win.clipcount * sizeof(data->fmt.win.clips[0]));
7666 if (data->fmt.win.bitmap)
7667 PRE_MEM_READ("ioctl(VKI_V4L2_TRY_FMT).fmt.win.bitmap[]",
7668 (Addr)data->fmt.win.bitmap,
7669 data->fmt.win.w.height * ((data->fmt.win.w.width + 7) / 8));
7670 break;
7671 case VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
7672 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
7673 PRE_FIELD_READ("ioctl(VKI_V4L2_TRY_FMT).fmt.pix_mp", data->fmt.pix_mp);
7674 break;
7675 case VKI_V4L2_BUF_TYPE_SDR_CAPTURE:
7676 PRE_FIELD_READ("ioctl(VKI_V4L2_TRY_FMT).fmt.sdr", data->fmt.sdr);
7677 break;
7678 }
7679 break;
7680 }
7681 case VKI_V4L2_REQBUFS: {
7682 struct vki_v4l2_requestbuffers *data = (struct vki_v4l2_requestbuffers *)ARG3;
7683 PRE_MEM_READ("ioctl(VKI_V4L2_REQBUFS)", (Addr)data, sizeof(*data));
7684 break;
7685 }
7686 case VKI_V4L2_QUERYBUF: {
7687 struct vki_v4l2_buffer *data = (struct vki_v4l2_buffer *)ARG3;
7688 PRE_FIELD_READ("ioctl(VKI_V4L2_QUERYBUF).type", data->type);
7689 PRE_FIELD_READ("ioctl(VKI_V4L2_QUERYBUF).index", data->index);
7690 PRE_FIELD_READ("ioctl(VKI_V4L2_QUERYBUF).reserved", data->reserved);
7691 PRE_FIELD_READ("ioctl(VKI_V4L2_QUERYBUF).reserved2", data->reserved2);
7692 if (data->type == VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||
7693 data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
7694 unsigned i;
7695
7696 PRE_FIELD_READ("ioctl(VKI_V4L2_QUERYBUF).length", data->length);
7697 PRE_FIELD_READ("ioctl(VKI_V4L2_QUERYBUF).m.planes", data->m.planes);
7698 for (i = 0; i < data->length; i++) {
7699 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).m.planes[].bytesused", data->m.planes[i].bytesused);
7700 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).m.planes[].length", data->m.planes[i].length);
7701 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).m.planes[].m", data->m.planes[i].m);
7702 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).m.planes[].data_offset", data->m.planes[i].data_offset);
7703 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).m.planes[].reserved", data->m.planes[i].reserved);
7704 }
7705 } else {
7706 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).m", data->m);
7707 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).length", data->length);
7708 }
7709 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).bytesused", data->bytesused);
7710 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).flags", data->flags);
7711 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).field", data->field);
7712 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).timestamp", data->timestamp);
7713 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).timecode", data->timecode);
7714 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).sequence", data->sequence);
7715 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).memory", data->memory);
7716 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QUERYBUF).sequence", data->sequence);
7717 break;
7718 }
7719 case VKI_V4L2_G_FBUF: {
7720 struct vki_v4l2_framebuffer *data = (struct vki_v4l2_framebuffer *)ARG3;
7721 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_FBUF)", (Addr)data, sizeof(*data));
7722 break;
7723 }
7724 case VKI_V4L2_S_FBUF: {
7725 struct vki_v4l2_framebuffer *data = (struct vki_v4l2_framebuffer *)ARG3;
7726 PRE_FIELD_WRITE("ioctl(VKI_V4L2_S_FBUF).capability", data->capability);
7727 PRE_FIELD_READ("ioctl(VKI_V4L2_S_FBUF).flags", data->flags);
7728 PRE_FIELD_READ("ioctl(VKI_V4L2_S_FBUF).base", data->base);
7729 PRE_FIELD_READ("ioctl(VKI_V4L2_S_FBUF).fmt", data->fmt);
7730 break;
7731 }
7732 case VKI_V4L2_OVERLAY: {
7733 int *data = (int *)ARG3;
7734 PRE_MEM_READ("ioctl(VKI_V4L2_OVERLAY)", (Addr)data, sizeof(*data));
7735 break;
7736 }
7737 case VKI_V4L2_QBUF: {
7738 struct vki_v4l2_buffer *data = (struct vki_v4l2_buffer *)ARG3;
7739 int is_output = data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT ||
7740 data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ||
7741 data->type == VKI_V4L2_BUF_TYPE_VBI_OUTPUT ||
7742 data->type == VKI_V4L2_BUF_TYPE_SLICED_VBI_OUTPUT;
7743
7744 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).type", data->type);
7745 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).index", data->index);
7746 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).flags", data->flags);
7747 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).memory", data->memory);
7748 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).reserved", data->reserved);
7749 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).reserved2", data->reserved2);
7750 if (is_output) {
7751 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).bytesused", data->bytesused);
7752 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).field", data->field);
7753 }
7754 if (data->type == VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||
7755 data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
7756 unsigned i;
7757
7758 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).length", data->length);
7759 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).m.planes", data->m.planes);
7760 for (i = 0; i < data->length; i++) {
7761 if (is_output) {
7762 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).m.planes[].bytesused", data->m.planes[i].bytesused);
7763 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).m.planes[].data_offset", data->m.planes[i].data_offset);
7764 }
7765 if (data->memory == VKI_V4L2_MEMORY_MMAP)
7766 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QBUF).m.planes[].m", data->m.planes[i].m);
7767 else if (data->memory == VKI_V4L2_MEMORY_DMABUF)
7768 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).m.planes[].m.fd", data->m.planes[i].m.fd);
7769 else
7770 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).m.planes[].m", data->m.planes[i].m);
7771 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).m.planes[].reserved", data->m.planes[i].reserved);
7772 }
7773 } else {
7774 if (data->memory == VKI_V4L2_MEMORY_MMAP)
7775 PRE_FIELD_WRITE("ioctl(VKI_V4L2_QBUF).m", data->m);
7776 else if (data->memory == VKI_V4L2_MEMORY_DMABUF)
7777 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).m.fd", data->m.fd);
7778 else
7779 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).m", data->m);
7780 if (is_output) {
7781 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).bytesused", data->bytesused);
7782 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).field", data->field);
7783 }
7784 }
7785 if (is_output && (data->flags & VKI_V4L2_BUF_FLAG_TIMESTAMP_MASK) == VKI_V4L2_BUF_FLAG_TIMESTAMP_COPY) {
7786 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).timestamp", data->timestamp);
7787 PRE_FIELD_READ("ioctl(VKI_V4L2_QBUF).timecode", data->timecode);
7788 }
7789 break;
7790 }
7791 case VKI_V4L2_EXPBUF: {
7792 struct vki_v4l2_exportbuffer *data = (struct vki_v4l2_exportbuffer *)ARG3;
7793 PRE_FIELD_READ("ioctl(VKI_V4L2_EXPBUF).type", data->type);
7794 PRE_FIELD_READ("ioctl(VKI_V4L2_EXPBUF).index", data->index);
7795 PRE_FIELD_READ("ioctl(VKI_V4L2_EXPBUF).plane", data->plane);
7796 PRE_FIELD_READ("ioctl(VKI_V4L2_EXPBUF).flags", data->flags);
7797 PRE_FIELD_WRITE("ioctl(VKI_V4L2_EXPBUF).fd", data->fd);
7798 PRE_FIELD_READ("ioctl(VKI_V4L2_EXPBUF).reserved", data->reserved);
7799 break;
7800 }
7801 case VKI_V4L2_DQBUF: {
7802 struct vki_v4l2_buffer *data = (struct vki_v4l2_buffer *)ARG3;
7803 PRE_FIELD_READ("ioctl(VKI_V4L2_DQBUF).type", data->type);
7804 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).index", data->index);
7805 PRE_FIELD_READ("ioctl(VKI_V4L2_DQBUF).memory", data->memory);
7806 PRE_FIELD_READ("ioctl(VKI_V4L2_DQBUF).reserved", data->reserved);
7807 PRE_FIELD_READ("ioctl(VKI_V4L2_DQBUF).reserved2", data->reserved2);
7808 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).bytesused", data->bytesused);
7809 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).field", data->field);
7810 if (data->type == VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||
7811 data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
7812 unsigned i;
7813
7814 PRE_FIELD_READ("ioctl(VKI_V4L2_DQBUF).length", data->length);
7815 PRE_FIELD_READ("ioctl(VKI_V4L2_DQBUF).m.planes", data->m.planes);
7816 for (i = 0; i < data->length; i++) {
7817 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).m.planes[].bytesused", data->m.planes[i].bytesused);
7818 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).m.planes[].data_offset", data->m.planes[i].data_offset);
7819 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).m.planes[].length", data->m.planes[i].length);
7820 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).m.planes[].m", data->m.planes[i].m);
7821 PRE_FIELD_READ("ioctl(VKI_V4L2_DQBUF).m.planes[].reserved", data->m.planes[i].reserved);
7822 }
7823 } else {
7824 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).m", data->m);
7825 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).length", data->length);
7826 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).bytesused", data->bytesused);
7827 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).field", data->field);
7828 }
7829 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).timestamp", data->timestamp);
7830 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).timecode", data->timecode);
7831 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DQBUF).sequence", data->sequence);
7832 break;
7833 }
7834 case VKI_V4L2_STREAMON: {
7835 int *data = (int *)ARG3;
7836 PRE_MEM_READ("ioctl(VKI_V4L2_STREAMON)", (Addr)data, sizeof(*data));
7837 break;
7838 }
7839 case VKI_V4L2_STREAMOFF: {
7840 int *data = (int *)ARG3;
7841 PRE_MEM_READ("ioctl(VKI_V4L2_STREAMOFF)", (Addr)data, sizeof(*data));
7842 break;
7843 }
7844 case VKI_V4L2_G_PARM: {
7845 struct vki_v4l2_streamparm *data = (struct vki_v4l2_streamparm *)ARG3;
7846 int is_output = data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT ||
7847 data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ||
7848 data->type == VKI_V4L2_BUF_TYPE_VBI_OUTPUT ||
7849 data->type == VKI_V4L2_BUF_TYPE_SLICED_VBI_OUTPUT;
7850
7851 PRE_FIELD_READ("ioctl(VKI_V4L2_G_PARM).type", data->type);
7852 if (is_output) {
7853 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_PARM)", (Addr)&data->parm.output,
7854 sizeof(data->parm.output) - sizeof(data->parm.output.reserved));
7855 PRE_FIELD_READ("ioctl(VKI_V4L2_G_PARM).parm.output.reserved", data->parm.output.reserved);
7856 } else {
7857 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_PARM)", (Addr)&data->parm.capture,
7858 sizeof(data->parm.capture) - sizeof(data->parm.capture.reserved));
7859 PRE_FIELD_READ("ioctl(VKI_V4L2_G_PARM).parm.capture.reserved", data->parm.capture.reserved);
7860 }
7861 break;
7862 }
7863 case VKI_V4L2_S_PARM: {
7864 struct vki_v4l2_streamparm *data = (struct vki_v4l2_streamparm *)ARG3;
7865 int is_output = data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT ||
7866 data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ||
7867 data->type == VKI_V4L2_BUF_TYPE_VBI_OUTPUT ||
7868 data->type == VKI_V4L2_BUF_TYPE_SLICED_VBI_OUTPUT;
7869
7870 PRE_FIELD_READ("ioctl(VKI_V4L2_S_PARM).type", data->type);
7871 if (is_output)
7872 PRE_FIELD_READ("ioctl(VKI_V4L2_S_PARM).parm.output", data->parm.output);
7873 else
7874 PRE_FIELD_READ("ioctl(VKI_V4L2_S_PARM).parm.capture", data->parm.capture);
7875 break;
7876 }
7877 case VKI_V4L2_G_STD: {
7878 vki_v4l2_std_id *data = (vki_v4l2_std_id *)ARG3;
7879 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_STD)", (Addr)data, sizeof(*data));
7880 break;
7881 }
7882 case VKI_V4L2_S_STD: {
7883 vki_v4l2_std_id *data = (vki_v4l2_std_id *)ARG3;
7884 PRE_MEM_READ("ioctl(VKI_V4L2_S_STD)", (Addr)data, sizeof(*data));
7885 break;
7886 }
7887 case VKI_V4L2_ENUMSTD: {
7888 struct vki_v4l2_standard *data = (struct vki_v4l2_standard *)ARG3;
7889 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUMSTD).index", data->index);
7890 PRE_MEM_WRITE("ioctl(VKI_V4L2_ENUMSTD)", (Addr)&data->id, sizeof(*data) - sizeof(data->index));
7891 break;
7892 }
7893 case VKI_V4L2_ENUMINPUT: {
7894 struct vki_v4l2_input *data = (struct vki_v4l2_input *)ARG3;
7895 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUMINPUT).index", data->index);
7896 PRE_MEM_WRITE("ioctl(VKI_V4L2_ENUMINPUT)", (Addr)data->name, sizeof(*data) - sizeof(data->index));
7897 break;
7898 }
7899 case VKI_V4L2_G_CTRL: {
7900 struct vki_v4l2_control *data = (struct vki_v4l2_control *)ARG3;
7901 PRE_FIELD_READ("ioctl(VKI_V4L2_G_CTRL).id", data->id);
7902 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_CTRL).value", data->value);
7903 break;
7904 }
7905 case VKI_V4L2_S_CTRL: {
7906 struct vki_v4l2_control *data = (struct vki_v4l2_control *)ARG3;
7907 PRE_MEM_READ("ioctl(VKI_V4L2_S_CTRL)", (Addr)data, sizeof(*data));
7908 break;
7909 }
7910 case VKI_V4L2_G_TUNER: {
7911 struct vki_v4l2_tuner *data = (struct vki_v4l2_tuner *)ARG3;
7912 PRE_FIELD_READ("ioctl(VKI_V4L2_G_TUNER).index", data->index);
7913 PRE_FIELD_READ("ioctl(VKI_V4L2_G_TUNER).reserved", data->reserved);
7914 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_TUNER)", (Addr)data->name,
7915 sizeof(*data) - sizeof(data->index) - sizeof(data->reserved));
7916 break;
7917 }
7918 case VKI_V4L2_S_TUNER: {
7919 struct vki_v4l2_tuner *data = (struct vki_v4l2_tuner *)ARG3;
7920 PRE_FIELD_READ("ioctl(VKI_V4L2_S_TUNER).index", data->index);
7921 PRE_FIELD_READ("ioctl(VKI_V4L2_S_TUNER).audmode", data->audmode);
7922 PRE_FIELD_READ("ioctl(VKI_V4L2_S_TUNER).reserved", data->reserved);
7923 break;
7924 }
7925 case VKI_V4L2_G_AUDIO: {
7926 struct vki_v4l2_audio *data = (struct vki_v4l2_audio *)ARG3;
sewardj0b8252d2015-05-22 10:40:42 +00007927 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_AUDIO)", (Addr)data,
7928 sizeof(*data) - sizeof(data->reserved));
sewardj66fbb212014-09-04 11:08:45 +00007929 PRE_FIELD_READ("ioctl(VKI_V4L2_G_AUDIO).reserved", data->reserved);
7930 break;
7931 }
7932 case VKI_V4L2_S_AUDIO: {
7933 struct vki_v4l2_audio *data = (struct vki_v4l2_audio *)ARG3;
7934 PRE_FIELD_READ("ioctl(VKI_V4L2_S_AUDIO).index", data->index);
7935 PRE_FIELD_READ("ioctl(VKI_V4L2_S_AUDIO).mode", data->mode);
7936 PRE_FIELD_READ("ioctl(VKI_V4L2_S_AUDIO).reserved", data->reserved);
7937 break;
7938 }
7939 case VKI_V4L2_QUERYCTRL: {
7940 struct vki_v4l2_queryctrl *data = (struct vki_v4l2_queryctrl *)ARG3;
7941 PRE_FIELD_READ("ioctl(VKI_V4L2_QUERYCTRL).id", data->id);
7942 PRE_MEM_WRITE("ioctl(VKI_V4L2_QUERYCTRL)", (Addr)&data->type,
7943 sizeof(*data) - sizeof(data->id));
7944 break;
7945 }
7946 case VKI_V4L2_QUERYMENU: {
7947 struct vki_v4l2_querymenu *data = (struct vki_v4l2_querymenu *)ARG3;
7948 PRE_FIELD_READ("ioctl(VKI_V4L2_QUERYMENU).id", data->id);
7949 PRE_FIELD_READ("ioctl(VKI_V4L2_QUERYMENU).index", data->index);
7950 PRE_MEM_WRITE("ioctl(VKI_V4L2_QUERYMENU)", (Addr)data->name,
7951 sizeof(*data) - sizeof(data->id) - sizeof(data->index));
7952 break;
7953 }
7954 case VKI_V4L2_G_INPUT: {
7955 int *data = (int *)ARG3;
7956 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_INPUT)", (Addr)data, sizeof(*data));
7957 break;
7958 }
7959 case VKI_V4L2_S_INPUT: {
7960 int *data = (int *)ARG3;
7961 PRE_MEM_READ("ioctl(VKI_V4L2_S_INPUT)", (Addr)data, sizeof(*data));
7962 break;
7963 }
7964 case VKI_V4L2_G_EDID: {
7965 struct vki_v4l2_edid *data = (struct vki_v4l2_edid *)ARG3;
7966 PRE_MEM_READ("ioctl(VKI_V4L2_G_EDID)", (Addr)data, sizeof(*data));
7967 if (data->blocks && data->edid)
7968 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_EDID)", (Addr)data->edid, data->blocks * 128);
7969 break;
7970 }
7971 case VKI_V4L2_S_EDID: {
7972 struct vki_v4l2_edid *data = (struct vki_v4l2_edid *)ARG3;
7973 PRE_MEM_READ("ioctl(VKI_V4L2_S_EDID)", (Addr)data, sizeof(*data));
7974 if (data->blocks && data->edid)
7975 PRE_MEM_READ("ioctl(VKI_V4L2_S_EDID)", (Addr)data->edid, data->blocks * 128);
7976 break;
7977 }
7978 case VKI_V4L2_G_OUTPUT: {
7979 int *data = (int *)ARG3;
7980 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_OUTPUT)", (Addr)data, sizeof(*data));
7981 break;
7982 }
7983 case VKI_V4L2_S_OUTPUT: {
7984 int *data = (int *)ARG3;
7985 PRE_MEM_READ("ioctl(VKI_V4L2_S_OUTPUT)", (Addr)data, sizeof(*data));
7986 break;
7987 }
7988 case VKI_V4L2_ENUMOUTPUT: {
7989 struct vki_v4l2_output *data = (struct vki_v4l2_output *)ARG3;
7990 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUMOUTPUT).index", data->index);
7991 PRE_MEM_WRITE("ioctl(VKI_V4L2_ENUMOUTPUT)", (Addr)data->name, sizeof(*data) - sizeof(data->index));
7992 break;
7993 }
7994 case VKI_V4L2_G_AUDOUT: {
7995 struct vki_v4l2_audioout *data = (struct vki_v4l2_audioout *)ARG3;
sewardj0b8252d2015-05-22 10:40:42 +00007996 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_AUDOUT)", (Addr)data,
7997 sizeof(*data) - sizeof(data->reserved));
sewardj66fbb212014-09-04 11:08:45 +00007998 PRE_FIELD_READ("ioctl(VKI_V4L2_G_AUDOUT).reserved", data->reserved);
sewardj66fbb212014-09-04 11:08:45 +00007999 break;
8000 }
8001 case VKI_V4L2_S_AUDOUT: {
8002 struct vki_v4l2_audioout *data = (struct vki_v4l2_audioout *)ARG3;
8003 PRE_FIELD_READ("ioctl(VKI_V4L2_S_AUDOUT).index", data->index);
8004 PRE_FIELD_READ("ioctl(VKI_V4L2_S_AUDOUT).reserved", data->reserved);
8005 PRE_FIELD_READ("ioctl(VKI_V4L2_S_AUDOUT).mode", data->mode);
8006 break;
8007 }
8008 case VKI_V4L2_G_MODULATOR: {
8009 struct vki_v4l2_modulator *data = (struct vki_v4l2_modulator *)ARG3;
8010 PRE_FIELD_READ("ioctl(VKI_V4L2_G_MODULATOR).index", data->index);
8011 PRE_FIELD_READ("ioctl(VKI_V4L2_G_MODULATOR).reserved", data->reserved);
8012 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_MODULATOR)", (Addr)data->name,
8013 sizeof(*data) - sizeof(data->index) - sizeof(data->reserved));
8014 break;
8015 }
8016 case VKI_V4L2_S_MODULATOR: {
8017 struct vki_v4l2_modulator *data = (struct vki_v4l2_modulator *)ARG3;
8018 PRE_FIELD_READ("ioctl(VKI_V4L2_S_MODULATOR).index", data->index);
8019 PRE_FIELD_READ("ioctl(VKI_V4L2_S_MODULATOR).txsubchans", data->txsubchans);
8020 PRE_FIELD_READ("ioctl(VKI_V4L2_S_MODULATOR).reserved", data->reserved);
8021 break;
8022 }
8023 case VKI_V4L2_G_FREQUENCY: {
8024 struct vki_v4l2_frequency *data = (struct vki_v4l2_frequency *)ARG3;
8025 PRE_FIELD_READ("ioctl(VKI_V4L2_G_FREQUENCY).tuner", data->tuner);
8026 PRE_FIELD_READ("ioctl(VKI_V4L2_G_FREQUENCY).reserved", data->reserved);
8027 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FREQUENCY).type", data->type);
8028 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_FREQUENCY).frequency", data->frequency);
8029 break;
8030 }
8031 case VKI_V4L2_S_FREQUENCY: {
8032 struct vki_v4l2_frequency *data = (struct vki_v4l2_frequency *)ARG3;
8033 PRE_MEM_READ("ioctl(VKI_V4L2_S_FREQUENCY)", (Addr)data, sizeof(*data));
8034 break;
8035 }
8036 case VKI_V4L2_CROPCAP: {
8037 struct vki_v4l2_cropcap *data = (struct vki_v4l2_cropcap *)ARG3;
8038 PRE_FIELD_READ("ioctl(VKI_V4L2_CROPCAP)", data->type);
8039 PRE_MEM_WRITE("ioctl(VKI_V4L2_CROPCAP)", (Addr)&data->bounds, sizeof(*data) - sizeof(data->type));
8040 break;
8041 }
8042 case VKI_V4L2_G_CROP: {
8043 struct vki_v4l2_crop *data = (struct vki_v4l2_crop *)ARG3;
8044 PRE_FIELD_READ("ioctl(VKI_V4L2_G_CROP).type", data->type);
8045 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_CROP).c", data->c);
8046 break;
8047 }
8048 case VKI_V4L2_S_CROP: {
8049 struct vki_v4l2_crop *data = (struct vki_v4l2_crop *)ARG3;
8050 PRE_MEM_READ("ioctl(VKI_V4L2_S_CROP)", (Addr)data, sizeof(*data));
8051 break;
8052 }
8053 case VKI_V4L2_G_JPEGCOMP: {
8054 struct vki_v4l2_jpegcompression *data = (struct vki_v4l2_jpegcompression *)ARG3;
8055 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_JPEGCOMP)", (Addr)data, sizeof(*data));
8056 break;
8057 }
8058 case VKI_V4L2_S_JPEGCOMP: {
8059 struct vki_v4l2_jpegcompression *data = (struct vki_v4l2_jpegcompression *)ARG3;
8060 PRE_MEM_READ("ioctl(VKI_V4L2_S_JPEGCOMP)", (Addr)data, sizeof(*data));
8061 break;
8062 }
8063 case VKI_V4L2_QUERYSTD: {
8064 vki_v4l2_std_id *data = (vki_v4l2_std_id *)ARG3;
8065 PRE_MEM_WRITE("ioctl(VKI_V4L2_QUERYSTD)", (Addr)data, sizeof(*data));
8066 break;
8067 }
8068 case VKI_V4L2_ENUMAUDIO: {
8069 struct vki_v4l2_audio *data = (struct vki_v4l2_audio *)ARG3;
8070 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUMAUDIO).index", data->index);
8071 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUMAUDIO).reserved", data->reserved);
8072 PRE_MEM_WRITE("ioctl(VKI_V4L2_ENUMAUDIO)", (Addr)data->name,
8073 sizeof(*data) - sizeof(data->index) - sizeof(data->reserved));
8074 break;
8075 }
8076 case VKI_V4L2_ENUMAUDOUT: {
8077 struct vki_v4l2_audioout *data = (struct vki_v4l2_audioout *)ARG3;
8078 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUMAUDOUT).index", data->index);
8079 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUMAUDOUT).reserved", data->reserved);
8080 PRE_MEM_WRITE("ioctl(VKI_V4L2_ENUMAUDOUT)", (Addr)data->name,
8081 sizeof(*data) - sizeof(data->index) - sizeof(data->reserved));
8082 break;
8083 }
8084 case VKI_V4L2_G_PRIORITY: {
8085 __vki_u32 *data = (__vki_u32 *)ARG3;
8086 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_PRIORITY)", (Addr)data, sizeof(*data));
8087 break;
8088 }
8089 case VKI_V4L2_S_PRIORITY: {
8090 __vki_u32 *data = (__vki_u32 *)ARG3;
8091 PRE_MEM_READ("ioctl(VKI_V4L2_S_PRIORITY)", (Addr)data, sizeof(*data));
8092 break;
8093 }
8094 case VKI_V4L2_G_SLICED_VBI_CAP: {
8095 struct vki_v4l2_sliced_vbi_cap *data = (struct vki_v4l2_sliced_vbi_cap *)ARG3;
8096 PRE_FIELD_READ("ioctl(VKI_V4L2_G_SLICED_VBI_CAP).type", data->type);
8097 PRE_FIELD_READ("ioctl(VKI_V4L2_G_SLICED_VBI_CAP).reserved", data->reserved);
8098 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_SLICED_VBI_CAP)", (Addr)data,
8099 sizeof(*data) - sizeof(data->type) - sizeof(data->reserved));
8100 break;
8101 }
8102 case VKI_V4L2_G_EXT_CTRLS: {
8103 struct vki_v4l2_ext_controls *data = (struct vki_v4l2_ext_controls *)ARG3;
8104 PRE_FIELD_READ("ioctl(VKI_V4L2_G_EXT_CTRLS).ctrl_class", data->ctrl_class);
8105 PRE_FIELD_READ("ioctl(VKI_V4L2_G_EXT_CTRLS).count", data->count);
8106 if (data->count) {
8107 unsigned i;
8108
8109 PRE_FIELD_READ("ioctl(VKI_V4L2_G_EXT_CTRLS).controls", data->controls);
8110 for (i = 0; i < data->count; i++) {
8111 PRE_FIELD_READ("ioctl(VKI_V4L2_G_EXT_CTRLS).controls[].id", data->controls[i].id);
8112 PRE_FIELD_READ("ioctl(VKI_V4L2_G_EXT_CTRLS).controls[].size", data->controls[i].size);
8113 PRE_FIELD_READ("ioctl(VKI_V4L2_G_EXT_CTRLS).controls[].reserved2", data->controls[i].reserved2);
8114 if (data->controls[i].size) {
8115 PRE_FIELD_READ("ioctl(VKI_V4L2_G_EXT_CTRLS).controls[].ptr", data->controls[i].ptr);
8116 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_EXT_CTRLS).controls[].ptr[]",
8117 (Addr)data->controls[i].ptr, data->controls[i].size);
8118 } else {
8119 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_EXT_CTRLS).controls[].value64",
8120 data->controls[i].value64);
8121 }
8122 }
8123 }
8124 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_EXT_CTRLS).error_idx", data->error_idx);
8125 PRE_FIELD_READ("ioctl(VKI_V4L2_G_EXT_CTRLS).reserved", data->reserved);
8126 break;
8127 }
8128 case VKI_V4L2_S_EXT_CTRLS: {
8129 struct vki_v4l2_ext_controls *data = (struct vki_v4l2_ext_controls *)ARG3;
8130 PRE_FIELD_READ("ioctl(VKI_V4L2_S_EXT_CTRLS).ctrl_class", data->ctrl_class);
8131 PRE_FIELD_READ("ioctl(VKI_V4L2_S_EXT_CTRLS).count", data->count);
8132 if (data->count) {
8133 unsigned i;
8134
8135 PRE_FIELD_READ("ioctl(VKI_V4L2_S_EXT_CTRLS).controls", data->controls);
8136 PRE_MEM_READ("ioctl(VKI_V4L2_S_EXT_CTRLS)", (Addr)data->controls,
8137 data->count * sizeof(data->controls[0]));
8138 for (i = 0; i < data->count; i++) {
8139 if (data->controls[i].size) {
8140 PRE_MEM_READ("ioctl(VKI_V4L2_S_EXT_CTRLS).controls[].ptr[]",
8141 (Addr)data->controls[i].ptr, data->controls[i].size);
8142 }
8143 }
8144 }
8145 PRE_FIELD_WRITE("ioctl(VKI_V4L2_S_EXT_CTRLS).error_idx", data->error_idx);
8146 PRE_FIELD_READ("ioctl(VKI_V4L2_S_EXT_CTRLS).reserved", data->reserved);
8147 break;
8148 }
8149 case VKI_V4L2_TRY_EXT_CTRLS: {
8150 struct vki_v4l2_ext_controls *data = (struct vki_v4l2_ext_controls *)ARG3;
8151 PRE_FIELD_READ("ioctl(VKI_V4L2_TRY_EXT_CTRLS).ctrl_class", data->ctrl_class);
8152 PRE_FIELD_READ("ioctl(VKI_V4L2_TRY_EXT_CTRLS).count", data->count);
8153 if (data->count) {
8154 unsigned i;
8155
8156 PRE_FIELD_READ("ioctl(VKI_V4L2_TRY_EXT_CTRLS).controls", data->controls);
8157 PRE_MEM_READ("ioctl(VKI_V4L2_TRY_EXT_CTRLS)", (Addr)data->controls,
8158 data->count * sizeof(data->controls[0]));
8159 for (i = 0; i < data->count; i++) {
8160 if (data->controls[i].size) {
8161 PRE_MEM_READ("ioctl(VKI_V4L2_TRY_EXT_CTRLS).controls[].ptr[]",
8162 (Addr)data->controls[i].ptr, data->controls[i].size);
8163 }
8164 }
8165 }
8166 PRE_FIELD_WRITE("ioctl(VKI_V4L2_TRY_EXT_CTRLS).error_idx", data->error_idx);
8167 PRE_FIELD_READ("ioctl(VKI_V4L2_TRY_EXT_CTRLS).reserved", data->reserved);
8168 break;
8169 }
8170 case VKI_V4L2_ENUM_FRAMESIZES: {
8171 struct vki_v4l2_frmsizeenum *data = (struct vki_v4l2_frmsizeenum *)ARG3;
8172 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FRAMESIZES).index", data->index);
8173 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FRAMESIZES).pixel_format", data->pixel_format);
8174 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FRAMESIZES).reserved", data->reserved);
8175 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FRAMESIZES).type", data->type);
8176 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FRAMESIZES).stepwise", data->stepwise);
8177 break;
8178 }
8179 case VKI_V4L2_ENUM_FRAMEINTERVALS: {
8180 struct vki_v4l2_frmivalenum *data = (struct vki_v4l2_frmivalenum *)ARG3;
8181 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FRAMEINTERVALS).index", data->index);
8182 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FRAMEINTERVALS).pixel_format", data->pixel_format);
8183 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FRAMEINTERVALS).width", data->width);
8184 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FRAMEINTERVALS).height", data->height);
8185 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FRAMEINTERVALS).reserved", data->reserved);
8186 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FRAMEINTERVALS).type", data->type);
8187 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FRAMEINTERVALS).stepwise", data->stepwise);
8188 break;
8189 }
8190 case VKI_V4L2_G_ENC_INDEX: {
8191 struct vki_v4l2_enc_idx *data = (struct vki_v4l2_enc_idx *)ARG3;
sewardj220f0a92015-06-05 11:25:32 +00008192 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_ENC_INDEX)", (Addr)data, sizeof(*data));
sewardj66fbb212014-09-04 11:08:45 +00008193 break;
8194 }
8195 case VKI_V4L2_ENCODER_CMD: {
8196 struct vki_v4l2_encoder_cmd *data = (struct vki_v4l2_encoder_cmd *)ARG3;
8197 PRE_MEM_READ("ioctl(VKI_V4L2_ENCODER_CMD)", (Addr)data, sizeof(*data));
8198 break;
8199 }
8200 case VKI_V4L2_TRY_ENCODER_CMD: {
8201 struct vki_v4l2_encoder_cmd *data = (struct vki_v4l2_encoder_cmd *)ARG3;
8202 PRE_MEM_READ("ioctl(VKI_V4L2_TRY_ENCODER_CMD)", (Addr)data, sizeof(*data));
8203 break;
8204 }
8205 case VKI_V4L2_DBG_S_REGISTER: {
8206 struct vki_v4l2_dbg_register *data = (struct vki_v4l2_dbg_register *)ARG3;
8207 PRE_FIELD_READ("ioctl(VKI_V4L2_DBG_S_REGISTER).match.type", data->match.type);
8208 PRE_FIELD_READ("ioctl(VKI_V4L2_DBG_S_REGISTER).match.addr", data->match.addr);
8209 PRE_FIELD_READ("ioctl(VKI_V4L2_DBG_S_REGISTER).reg", data->reg);
8210 PRE_FIELD_READ("ioctl(VKI_V4L2_DBG_S_REGISTER).val", data->val);
8211 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DBG_S_REGISTER).size", data->size);
8212 break;
8213 }
8214 case VKI_V4L2_DBG_G_REGISTER: {
8215 struct vki_v4l2_dbg_register *data = (struct vki_v4l2_dbg_register *)ARG3;
8216 PRE_FIELD_READ("ioctl(VKI_V4L2_DBG_G_REGISTER).match.type", data->match.type);
8217 PRE_FIELD_READ("ioctl(VKI_V4L2_DBG_G_REGISTER).match.addr", data->match.addr);
8218 PRE_FIELD_READ("ioctl(VKI_V4L2_DBG_G_REGISTER).reg", data->reg);
8219 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DBG_G_REGISTER).val", data->val);
8220 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DBG_G_REGISTER).size", data->size);
8221 break;
8222 }
8223 case VKI_V4L2_S_HW_FREQ_SEEK: {
8224 struct vki_v4l2_hw_freq_seek *data = (struct vki_v4l2_hw_freq_seek *)ARG3;
8225 PRE_MEM_READ("ioctl(VKI_V4L2_S_HW_FREQ_SEEK)", (Addr)data, sizeof(*data));
8226 break;
8227 }
8228 case VKI_V4L2_S_DV_TIMINGS: {
8229 struct vki_v4l2_dv_timings *data = (struct vki_v4l2_dv_timings *)ARG3;
8230 PRE_FIELD_READ("ioctl(VKI_V4L2_S_DV_TIMINGS).type", data->type);
8231 PRE_FIELD_READ("ioctl(VKI_V4L2_S_DV_TIMINGS).bt", data->bt);
8232 break;
8233 }
8234 case VKI_V4L2_G_DV_TIMINGS: {
8235 struct vki_v4l2_dv_timings *data = (struct vki_v4l2_dv_timings *)ARG3;
8236 PRE_MEM_WRITE("ioctl(VKI_V4L2_G_DV_TIMINGS)", (Addr)data, sizeof(*data));
8237 break;
8238 }
8239 case VKI_V4L2_DQEVENT: {
8240 struct vki_v4l2_event *data = (struct vki_v4l2_event *)ARG3;
8241 PRE_MEM_WRITE("ioctl(VKI_V4L2_DQEVENT)", (Addr)data, sizeof(*data));
8242 break;
8243 }
8244 case VKI_V4L2_SUBSCRIBE_EVENT: {
8245 struct vki_v4l2_event_subscription *data = (struct vki_v4l2_event_subscription *)ARG3;
8246 PRE_MEM_READ("ioctl(VKI_V4L2_SUBSCRIBE_EVENT)", (Addr)data, sizeof(*data));
8247 break;
8248 }
8249 case VKI_V4L2_UNSUBSCRIBE_EVENT: {
8250 struct vki_v4l2_event_subscription *data = (struct vki_v4l2_event_subscription *)ARG3;
8251 PRE_MEM_READ("ioctl(VKI_V4L2_UNSUBSCRIBE_EVENT)", (Addr)data, sizeof(*data));
8252 break;
8253 }
8254 case VKI_V4L2_CREATE_BUFS: {
8255 struct vki_v4l2_create_buffers *data = (struct vki_v4l2_create_buffers *)ARG3;
8256 struct vki_v4l2_format *fmt = &data->format;
8257 PRE_FIELD_WRITE("ioctl(VKI_V4L2_CREATE_BUFS).index", data->index);
8258 PRE_FIELD_READ("ioctl(VKI_V4L2_CREATE_BUFS).count", data->count);
8259 PRE_FIELD_READ("ioctl(VKI_V4L2_CREATE_BUFS).memory", data->memory);
8260 PRE_FIELD_READ("ioctl(VKI_V4L2_CREATE_BUFS).reserved", data->reserved);
8261 PRE_FIELD_READ("ioctl(VKI_V4L2_CREATE_BUFS).format.type", fmt->type);
8262 switch (fmt->type) {
8263 case VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE:
8264 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT:
8265 PRE_FIELD_READ("ioctl(VKI_V4L2_CREATE_BUFS).format.pix", fmt->fmt.raw_data);
8266 break;
8267 case VKI_V4L2_BUF_TYPE_VBI_CAPTURE:
8268 case VKI_V4L2_BUF_TYPE_VBI_OUTPUT:
8269 PRE_FIELD_READ("ioctl(VKI_V4L2_CREATE_BUFS).format.vbi", fmt->fmt.vbi);
8270 break;
8271 case VKI_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
8272 case VKI_V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
8273 PRE_FIELD_READ("ioctl(VKI_V4L2_CREATE_BUFS).format.sliced", fmt->fmt.sliced);
8274 break;
8275 case VKI_V4L2_BUF_TYPE_VIDEO_OVERLAY:
8276 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
8277 PRE_FIELD_READ("ioctl(VKI_V4L2_CREATE_BUFS).format.win", fmt->fmt.win);
8278 break;
8279 case VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
8280 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
8281 PRE_FIELD_READ("ioctl(VKI_V4L2_CREATE_BUFS).format.pix_mp", fmt->fmt.pix_mp);
8282 break;
8283 case VKI_V4L2_BUF_TYPE_SDR_CAPTURE:
8284 PRE_FIELD_READ("ioctl(VKI_V4L2_CREATE_BUFS).format.sdr", fmt->fmt.sdr);
8285 break;
8286 }
8287 break;
8288 }
8289 case VKI_V4L2_PREPARE_BUF: {
8290 struct vki_v4l2_buffer *data = (struct vki_v4l2_buffer *)ARG3;
8291 PRE_FIELD_READ("ioctl(VKI_V4L2_PREPARE_BUF).index", data->index);
8292 PRE_FIELD_READ("ioctl(VKI_V4L2_PREPARE_BUF).type", data->type);
8293 PRE_FIELD_READ("ioctl(VKI_V4L2_PREPARE_BUF).memory", data->memory);
8294 PRE_FIELD_READ("ioctl(VKI_V4L2_PREPARE_BUF).reserved", data->reserved);
8295 PRE_FIELD_READ("ioctl(VKI_V4L2_PREPARE_BUF).reserved2", data->reserved2);
8296 if (data->type == VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||
8297 data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
8298 unsigned i;
8299
8300 PRE_FIELD_READ("ioctl(VKI_V4L2_PREPARE_BUF).length", data->length);
8301 PRE_FIELD_READ("ioctl(VKI_V4L2_PREPARE_BUF).m.planes", data->m.planes);
8302 for (i = 0; i < data->length; i++) {
8303 PRE_FIELD_READ("ioctl(VKI_V4L2_PREPARE_BUF).m.planes[].reserved", data->m.planes[i].reserved);
8304 }
8305 }
8306 break;
8307 }
8308 case VKI_V4L2_G_SELECTION: {
8309 struct vki_v4l2_selection *data = (struct vki_v4l2_selection *)ARG3;
8310 PRE_FIELD_READ("ioctl(VKI_V4L2_G_SELECTION).type", data->type);
8311 PRE_FIELD_READ("ioctl(VKI_V4L2_G_SELECTION).target", data->target);
8312 PRE_FIELD_READ("ioctl(VKI_V4L2_G_SELECTION).flags", data->flags);
8313 PRE_FIELD_READ("ioctl(VKI_V4L2_G_SELECTION).reserved", data->reserved);
8314 PRE_FIELD_WRITE("ioctl(VKI_V4L2_G_SELECTION).r", data->r);
8315 break;
8316 }
8317 case VKI_V4L2_S_SELECTION: {
8318 struct vki_v4l2_selection *data = (struct vki_v4l2_selection *)ARG3;
8319 PRE_MEM_READ("ioctl(VKI_V4L2_S_SELECTION)", (Addr)data, sizeof(*data));
8320 break;
8321 }
8322 case VKI_V4L2_DECODER_CMD: {
8323 struct vki_v4l2_decoder_cmd *data = (struct vki_v4l2_decoder_cmd *)ARG3;
8324 PRE_MEM_READ("ioctl(VKI_V4L2_DECODER_CMD)", (Addr)data, sizeof(*data));
8325 break;
8326 }
8327 case VKI_V4L2_TRY_DECODER_CMD: {
8328 struct vki_v4l2_decoder_cmd *data = (struct vki_v4l2_decoder_cmd *)ARG3;
8329 PRE_MEM_READ("ioctl(VKI_V4L2_TRY_DECODER_CMD)", (Addr)data, sizeof(*data));
8330 break;
8331 }
8332 case VKI_V4L2_ENUM_DV_TIMINGS: {
8333 struct vki_v4l2_enum_dv_timings *data = (struct vki_v4l2_enum_dv_timings *)ARG3;
8334 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_DV_TIMINGS).index", data->index);
8335 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_DV_TIMINGS).pad", data->pad);
8336 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_DV_TIMINGS).reserved", data->reserved);
8337 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_DV_TIMINGS).timings", data->timings);
8338 break;
8339 }
8340 case VKI_V4L2_QUERY_DV_TIMINGS: {
8341 struct vki_v4l2_dv_timings *data = (struct vki_v4l2_dv_timings *)ARG3;
8342 PRE_MEM_WRITE("ioctl(VKI_V4L2_QUERY_DV_TIMINGS)", (Addr)data, sizeof(*data));
8343 break;
8344 }
8345 case VKI_V4L2_DV_TIMINGS_CAP: {
8346 struct vki_v4l2_dv_timings_cap *data = (struct vki_v4l2_dv_timings_cap *)ARG3;
8347 PRE_MEM_WRITE("ioctl(VKI_V4L2_DV_TIMINGS_CAP)", (Addr)data, sizeof(*data));
8348 break;
8349 }
8350 case VKI_V4L2_ENUM_FREQ_BANDS: {
8351 struct vki_v4l2_frequency_band *data = (struct vki_v4l2_frequency_band *)ARG3;
8352 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FREQ_BANDS).tuner", data->tuner);
8353 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FREQ_BANDS).type", data->type);
8354 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FREQ_BANDS).index", data->index);
8355 PRE_FIELD_READ("ioctl(VKI_V4L2_ENUM_FREQ_BANDS).reserved", data->reserved);
8356 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FREQ_BANDS).capability", data->capability);
8357 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FREQ_BANDS).rangelow", data->rangelow);
8358 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FREQ_BANDS).rangehigh", data->rangehigh);
8359 PRE_FIELD_WRITE("ioctl(VKI_V4L2_ENUM_FREQ_BANDS).modulation", data->modulation);
8360 break;
8361 }
8362 case VKI_V4L2_DBG_G_CHIP_INFO: {
8363 struct vki_v4l2_dbg_chip_info *data = (struct vki_v4l2_dbg_chip_info *)ARG3;
8364 PRE_FIELD_READ("ioctl(VKI_V4L2_DBG_G_CHIP_INFO).match.type", data->match.type);
8365 PRE_FIELD_READ("ioctl(VKI_V4L2_DBG_G_CHIP_INFO).match.addr", data->match.addr);
8366 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DBG_G_CHIP_INFO).name", data->name);
8367 PRE_FIELD_WRITE("ioctl(VKI_V4L2_DBG_G_CHIP_INFO).flags", data->flags);
8368 PRE_FIELD_READ("ioctl(VKI_V4L2_DBG_G_CHIP_INFO).reserved", data->reserved);
8369 break;
8370 }
8371 case VKI_V4L2_QUERY_EXT_CTRL: {
8372 struct vki_v4l2_query_ext_ctrl *data = (struct vki_v4l2_query_ext_ctrl *)ARG3;
8373 PRE_FIELD_READ("ioctl(VKI_V4L2_QUERY_EXT_CTRL).id", data->id);
8374 PRE_FIELD_READ("ioctl(VKI_V4L2_QUERY_EXT_CTRL).reserved", data->reserved);
8375 PRE_MEM_WRITE("ioctl(VKI_V4L2_QUERY_EXT_CTRL)", (Addr)&data->type,
8376 sizeof(*data) - sizeof(data->id) - sizeof(data->reserved));
8377 break;
8378 }
8379 case VKI_V4L2_SUBDEV_G_FMT: {
8380 struct vki_v4l2_subdev_format *data = (struct vki_v4l2_subdev_format *)ARG3;
8381 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_FMT).pad", data->pad);
8382 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_FMT).which", data->which);
8383 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_FMT).reserved", data->reserved);
8384 PRE_FIELD_WRITE("ioctl(VKI_V4L2_SUBDEV_G_FMT).format", data->format);
8385 break;
8386 }
8387 case VKI_V4L2_SUBDEV_S_FMT: {
8388 struct vki_v4l2_subdev_format *data = (struct vki_v4l2_subdev_format *)ARG3;
8389 PRE_MEM_READ("ioctl(VKI_V4L2_SUBDEV_S_FMT)", (Addr)data, sizeof(*data));
8390 break;
8391 }
8392 case VKI_V4L2_SUBDEV_G_FRAME_INTERVAL: {
8393 struct vki_v4l2_subdev_frame_interval *data = (struct vki_v4l2_subdev_frame_interval *)ARG3;
8394 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_FRAME_SIZE).pad", data->pad);
8395 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_FRAME_SIZE).reserved", data->reserved);
8396 PRE_FIELD_WRITE("ioctl(VKI_V4L2_SUBDEV_G_FRAME_SIZE).interval", data->interval);
8397 break;
8398 }
8399 case VKI_V4L2_SUBDEV_S_FRAME_INTERVAL: {
8400 struct vki_v4l2_subdev_frame_interval *data = (struct vki_v4l2_subdev_frame_interval *)ARG3;
8401 PRE_MEM_READ("ioctl(VKI_V4L2_SUBDEV_S_FRAME_INTERVAL)", (Addr)data, sizeof(*data));
8402 break;
8403 }
8404 case VKI_V4L2_SUBDEV_ENUM_MBUS_CODE: {
8405 struct vki_v4l2_subdev_mbus_code_enum *data = (struct vki_v4l2_subdev_mbus_code_enum *)ARG3;
8406 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_MBUS_CODE).index", data->index);
8407 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_MBUS_CODE).pad", data->pad);
8408 PRE_FIELD_WRITE("ioctl(VKI_V4L2_SUBDEV_ENUM_MBUS_CODE).code", data->code);
sewardj629fd922015-06-05 11:23:35 +00008409 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_MBUS_CODE).which", data->which);
sewardj66fbb212014-09-04 11:08:45 +00008410 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_MBUS_CODE).reserved", data->reserved);
8411 break;
8412 }
8413 case VKI_V4L2_SUBDEV_ENUM_FRAME_SIZE: {
8414 struct vki_v4l2_subdev_frame_size_enum *data = (struct vki_v4l2_subdev_frame_size_enum *)ARG3;
8415 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_SIZE).index", data->index);
8416 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_SIZE).pad", data->pad);
8417 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_SIZE).code", data->code);
sewardj629fd922015-06-05 11:23:35 +00008418 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_SIZE).which", data->which);
sewardj66fbb212014-09-04 11:08:45 +00008419 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_SIZE).reserved", data->reserved);
8420 PRE_FIELD_WRITE("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_SIZE).min_width", data->min_width);
8421 PRE_FIELD_WRITE("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_SIZE).min_height", data->min_height);
8422 PRE_FIELD_WRITE("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_SIZE).max_width", data->max_width);
8423 PRE_FIELD_WRITE("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_SIZE).max_height", data->max_height);
8424 break;
8425 }
8426 case VKI_V4L2_SUBDEV_ENUM_FRAME_INTERVAL: {
8427 struct vki_v4l2_subdev_frame_interval_enum *data = (struct vki_v4l2_subdev_frame_interval_enum *)ARG3;
8428 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_INTERVAL).index", data->index);
8429 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_INTERVAL).pad", data->pad);
8430 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_INTERVAL).code", data->code);
8431 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_INTERVAL).width", data->width);
8432 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_INTERVAL).height", data->height);
sewardj629fd922015-06-05 11:23:35 +00008433 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_INTERVAL).which", data->which);
sewardj66fbb212014-09-04 11:08:45 +00008434 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_INTERVAL).reserved", data->reserved);
8435 PRE_FIELD_WRITE("ioctl(VKI_V4L2_SUBDEV_ENUM_FRAME_INTERVAL).interval", data->interval);
8436 break;
8437 }
8438 case VKI_V4L2_SUBDEV_G_CROP: {
8439 struct vki_v4l2_subdev_crop *data = (struct vki_v4l2_subdev_crop *)ARG3;
8440 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_CROP).pad", data->pad);
8441 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_CROP).which", data->which);
8442 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_CROP).reserved", data->reserved);
8443 PRE_FIELD_WRITE("ioctl(VKI_V4L2_SUBDEV_G_CROP).rect", data->rect);
8444 break;
8445 }
8446 case VKI_V4L2_SUBDEV_S_CROP: {
8447 struct vki_v4l2_subdev_crop *data = (struct vki_v4l2_subdev_crop *)ARG3;
8448 PRE_MEM_READ("ioctl(VKI_V4L2_SUBDEV_S_CROP)", (Addr)data, sizeof(*data));
8449 break;
8450 }
8451 case VKI_V4L2_SUBDEV_G_SELECTION: {
8452 struct vki_v4l2_subdev_selection *data = (struct vki_v4l2_subdev_selection *)ARG3;
8453 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_SELECTION).pad", data->pad);
8454 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_SELECTION).which", data->which);
8455 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_SELECTION).target", data->target);
8456 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_SELECTION).flags", data->flags);
8457 PRE_FIELD_READ("ioctl(VKI_V4L2_SUBDEV_G_SELECTION).reserved", data->reserved);
8458 PRE_FIELD_WRITE("ioctl(VKI_V4L2_SUBDEV_G_SELECTION).r", data->r);
8459 break;
8460 }
8461 case VKI_V4L2_SUBDEV_S_SELECTION: {
8462 struct vki_v4l2_subdev_selection *data = (struct vki_v4l2_subdev_selection *)ARG3;
8463 PRE_MEM_READ("ioctl(VKI_V4L2_SUBDEV_S_SELECTION)", (Addr)data, sizeof(*data));
8464 break;
8465 }
8466 case VKI_MEDIA_IOC_DEVICE_INFO: {
8467 struct vki_media_device_info *data = (struct vki_media_device_info *)ARG3;
8468 PRE_FIELD_READ("ioctl(VKI_MEDIA_IOC_DEVICE_INFO).reserved", data->reserved);
8469 PRE_MEM_WRITE("ioctl(VKI_MEDIA_IOC_DEVICE_INFO)",
8470 (Addr)data, sizeof(*data) - sizeof(data->reserved));
8471 break;
8472 }
8473 case VKI_MEDIA_IOC_ENUM_ENTITIES: {
8474 struct vki_media_entity_desc *data = (struct vki_media_entity_desc *)ARG3;
8475 PRE_FIELD_READ("ioctl(VKI_MEDIA_IOC_ENUM_ENTITIES).id", data->id);
8476 PRE_MEM_WRITE("ioctl(VKI_MEDIA_IOC_ENUM_ENTITIES)",
8477 (Addr)data->name, sizeof(*data) - sizeof(data->id));
8478 break;
8479 }
8480 case VKI_MEDIA_IOC_ENUM_LINKS: {
8481 struct vki_media_links_enum *data = (struct vki_media_links_enum *)ARG3;
8482 PRE_MEM_READ("ioctl(VKI_MEDIA_IOC_ENUM_LINKS)", (Addr)data, sizeof(*data));
8483 break;
8484 }
8485 case VKI_MEDIA_IOC_SETUP_LINK: {
8486 struct vki_media_link_desc *data = (struct vki_media_link_desc *)ARG3;
8487 PRE_MEM_READ("ioctl(VKI_MEDIA_IOC_SETUP_LINK)", (Addr)data, sizeof(*data));
8488 break;
8489 }
8490
sewardj55895372015-08-14 08:17:37 +00008491 /* Serial */
8492 case VKI_TIOCGSERIAL: {
8493 struct vki_serial_struct *data = (struct vki_serial_struct *)ARG3;
8494 PRE_MEM_WRITE("ioctl(VKI_TIOCGSERIAL)", (Addr)data, sizeof(*data));
8495 break;
8496 }
8497 case VKI_TIOCSSERIAL: {
8498 struct vki_serial_struct *data = (struct vki_serial_struct *)ARG3;
8499 PRE_MEM_READ("ioctl(VKI_TIOCSSERIAL)", (Addr)data, sizeof(*data));
8500 break;
8501 }
8502
Elliott Hughesa0664b92017-04-18 17:46:52 -07008503 case VKI_PERF_EVENT_IOC_RESET:
8504 case VKI_PERF_EVENT_IOC_REFRESH:
8505 case VKI_PERF_EVENT_IOC_SET_OUTPUT:
8506 case VKI_PERF_EVENT_IOC_SET_BPF:
8507 /* These take scalar arguments, so already handled above */
8508 break;
8509
8510 case VKI_PERF_EVENT_IOC_PERIOD:
8511 PRE_MEM_READ("ioctl(VKI_PERF_EVENT_IOC_PERIOD)", (Addr)ARG3, sizeof(__vki_u64));
8512 break;
8513
8514 case VKI_PERF_EVENT_IOC_SET_FILTER:
8515 PRE_MEM_RASCIIZ("ioctl(VKI_PERF_EVENT_IOC_SET_FILTER).filter", ARG3);
8516 break;
8517
8518 case VKI_PERF_EVENT_IOC_ID:
8519 PRE_MEM_WRITE("ioctl(VKI_PERF_EVENT_IOC_ID)", (Addr)ARG3, sizeof(__vki_u64));
8520 break;
8521
njn1be9cf62009-05-22 00:15:06 +00008522 default:
tom0ee313e2010-05-07 15:32:04 +00008523 /* EVIOC* are variable length and return size written on success */
8524 switch (ARG2 & ~(_VKI_IOC_SIZEMASK << _VKI_IOC_SIZESHIFT)) {
8525 case VKI_EVIOCGNAME(0):
8526 case VKI_EVIOCGPHYS(0):
8527 case VKI_EVIOCGUNIQ(0):
8528 case VKI_EVIOCGKEY(0):
8529 case VKI_EVIOCGLED(0):
8530 case VKI_EVIOCGSND(0):
8531 case VKI_EVIOCGSW(0):
8532 case VKI_EVIOCGBIT(VKI_EV_SYN,0):
8533 case VKI_EVIOCGBIT(VKI_EV_KEY,0):
8534 case VKI_EVIOCGBIT(VKI_EV_REL,0):
8535 case VKI_EVIOCGBIT(VKI_EV_ABS,0):
8536 case VKI_EVIOCGBIT(VKI_EV_MSC,0):
8537 case VKI_EVIOCGBIT(VKI_EV_SW,0):
8538 case VKI_EVIOCGBIT(VKI_EV_LED,0):
8539 case VKI_EVIOCGBIT(VKI_EV_SND,0):
8540 case VKI_EVIOCGBIT(VKI_EV_REP,0):
8541 case VKI_EVIOCGBIT(VKI_EV_FF,0):
8542 case VKI_EVIOCGBIT(VKI_EV_PWR,0):
8543 case VKI_EVIOCGBIT(VKI_EV_FF_STATUS,0):
tomaab8c762010-06-10 15:01:02 +00008544 PRE_MEM_WRITE("ioctl(EVIO*)", ARG3, _VKI_IOC_SIZE(ARG2));
tom0ee313e2010-05-07 15:32:04 +00008545 break;
8546 default:
8547 ML_(PRE_unknown_ioctl)(tid, ARG2, ARG3);
8548 break;
8549 }
njn096ccdd2009-02-22 23:00:30 +00008550 break;
njn096ccdd2009-02-22 23:00:30 +00008551 }
8552}
8553
8554POST(sys_ioctl)
8555{
8556 vg_assert(SUCCESS);
sewardj889ffa42011-09-27 11:40:24 +00008557
bart87da5fb2014-08-05 11:35:48 +00008558 ARG2 = (UInt)ARG2;
8559
sewardj889ffa42011-09-27 11:40:24 +00008560 /* --- BEGIN special IOCTL handlers for specific Android hardware --- */
8561
sewardj4450a0e2014-09-03 15:19:25 +00008562 /* BEGIN undocumented ioctls for PowerVR SGX 540 (the GPU on Nexus S) */
8563 if (KernelVariantiS(KernelVariant_android_gpu_sgx5xx,
8564 VG_(clo_kernel_variant))) {
sewardj889ffa42011-09-27 11:40:24 +00008565
sewardj4450a0e2014-09-03 15:19:25 +00008566 if (ARG2 >= 0xC01C6700 && ARG2 <= 0xC01C67FF && ARG3 >= 0x1000) {
8567 /* What's going on here: there appear to be a bunch of ioctls
8568 of the form 0xC01C67xx which are undocumented, and if
8569 unhandled give rise to a vast number of false positives in
8570 Memcheck.
sewardj889ffa42011-09-27 11:40:24 +00008571
sewardj4450a0e2014-09-03 15:19:25 +00008572 The "normal" interpretation of an ioctl of this form would
8573 be that the 3rd arg is a pointer to an area of size 0x1C
8574 (28 bytes) which is filled in by the kernel. Hence you
8575 might think that "POST_MEM_WRITE(ARG3, 28)" would fix it.
8576 But it doesn't.
sewardj889ffa42011-09-27 11:40:24 +00008577
sewardj4450a0e2014-09-03 15:19:25 +00008578 It requires POST_MEM_WRITE(ARG3, 256) to silence them.
8579 One interpretation of this is that ARG3 really does point
8580 to a 28 byte struct, but inside that are pointers to other
8581 areas also filled in by the kernel. If these happen to be
8582 allocated just back up the stack then the 256 byte paint
8583 might cover them too, somewhat indiscriminately.
sewardj889ffa42011-09-27 11:40:24 +00008584
sewardj4450a0e2014-09-03 15:19:25 +00008585 By printing out ARG3 and also the 28 bytes that it points
8586 at, it's possible to guess that the 7 word structure has
8587 this form
sewardj889ffa42011-09-27 11:40:24 +00008588
sewardj4450a0e2014-09-03 15:19:25 +00008589 0 1 2 3 4 5 6
8590 ioctl-number 0x1C ptr1 ptr1size ptr2 ptr2size aBitMask
sewardj889ffa42011-09-27 11:40:24 +00008591
sewardj4450a0e2014-09-03 15:19:25 +00008592 Unfortunately that doesn't seem to work for some reason,
8593 so stay with the blunt-instrument approach for the time
8594 being.
8595 */
8596 if (1) {
8597 /* blunt-instrument approach */
8598 POST_MEM_WRITE(ARG3, 256);
8599 } else {
8600 /* be a bit more sophisticated */
8601 POST_MEM_WRITE(ARG3, 28);
8602 UInt* word = (UInt*)ARG3;
8603 if (word && word[2] && word[3] < 0x200/*stay sane*/)
8604 POST_MEM_WRITE(word[2], word[3]); // "ptr1"
8605 if (word && word[4] && word[5] < 0x200/*stay sane*/)
8606 POST_MEM_WRITE(word[4], word[5]); // "ptr2"
sewardj889ffa42011-09-27 11:40:24 +00008607 }
sewardj4450a0e2014-09-03 15:19:25 +00008608 goto post_sys_ioctl__out;
sewardj889ffa42011-09-27 11:40:24 +00008609 }
sewardj889ffa42011-09-27 11:40:24 +00008610 }
sewardj4450a0e2014-09-03 15:19:25 +00008611 /* END undocumented ioctls for PowerVR SGX 540 (the GPU on Nexus S) */
sewardj889ffa42011-09-27 11:40:24 +00008612
sewardj4450a0e2014-09-03 15:19:25 +00008613 /* BEGIN undocumented ioctls for Qualcomm Adreno 3xx */
sewardj8e10f932015-03-05 11:22:41 +00008614 if (KernelVariantiS(KernelVariant_android_gpu_adreno3xx,
sewardj4450a0e2014-09-03 15:19:25 +00008615 VG_(clo_kernel_variant))) {
8616 if (ARG2 == 0xC00C0902) {
8617 POST_MEM_WRITE(ARG3, 24); // 16 is not enough
8618 goto post_sys_ioctl__out;
8619 }
8620 }
8621 /* END undocumented ioctls for Qualcomm Adreno 3xx */
sewardj889ffa42011-09-27 11:40:24 +00008622
8623 /* --- END special IOCTL handlers for specific Android hardware --- */
8624
8625 /* --- normal handling --- */
njn096ccdd2009-02-22 23:00:30 +00008626 switch (ARG2 /* request */) {
sewardj4450a0e2014-09-03 15:19:25 +00008627
8628 /* The Linux kernel "ion" memory allocator, used on Android. Note:
8629 this is pretty poor given that there's no pre-handling to check
8630 that writable areas are addressable. */
sewardj98a40072015-01-23 12:00:25 +00008631 case VKI_ION_IOC_ALLOC: {
8632 struct vki_ion_allocation_data* data
8633 = (struct vki_ion_allocation_data*)ARG3;
8634 POST_FIELD_WRITE(data->handle);
sewardj4450a0e2014-09-03 15:19:25 +00008635 break;
sewardj98a40072015-01-23 12:00:25 +00008636 }
8637 case VKI_ION_IOC_MAP: {
8638 struct vki_ion_fd_data* data = (struct vki_ion_fd_data*)ARG3;
8639 POST_FIELD_WRITE(data->fd);
sewardj4450a0e2014-09-03 15:19:25 +00008640 break;
sewardj98a40072015-01-23 12:00:25 +00008641 }
sewardj4450a0e2014-09-03 15:19:25 +00008642 case VKI_ION_IOC_FREE: // is this necessary?
8643 POST_MEM_WRITE(ARG3, sizeof(struct vki_ion_handle_data));
8644 break;
8645 case VKI_ION_IOC_SHARE:
8646 break;
sewardj98a40072015-01-23 12:00:25 +00008647 case VKI_ION_IOC_IMPORT: {
8648 struct vki_ion_fd_data* data = (struct vki_ion_fd_data*)ARG3;
8649 POST_FIELD_WRITE(data->handle);
sewardj4450a0e2014-09-03 15:19:25 +00008650 break;
sewardj98a40072015-01-23 12:00:25 +00008651 }
sewardj4450a0e2014-09-03 15:19:25 +00008652 case VKI_ION_IOC_SYNC:
8653 break;
8654 case VKI_ION_IOC_CUSTOM: // is this necessary?
8655 POST_MEM_WRITE(ARG3, sizeof(struct vki_ion_custom_data));
8656 break;
8657
sewardj98a40072015-01-23 12:00:25 +00008658 case VKI_SYNC_IOC_MERGE: {
8659 struct vki_sync_merge_data* data = (struct vki_sync_merge_data*)ARG3;
8660 POST_FIELD_WRITE(data->fence);
8661 break;
8662 }
8663
njn096ccdd2009-02-22 23:00:30 +00008664 case VKI_TCSETS:
8665 case VKI_TCSETSW:
8666 case VKI_TCSETSF:
bart9f2a3392013-02-14 17:10:01 +00008667 case VKI_IB_USER_MAD_ENABLE_PKEY:
njn096ccdd2009-02-22 23:00:30 +00008668 break;
8669 case VKI_TCGETS:
8670 POST_MEM_WRITE( ARG3, sizeof(struct vki_termios) );
8671 break;
8672 case VKI_TCSETA:
8673 case VKI_TCSETAW:
8674 case VKI_TCSETAF:
8675 break;
8676 case VKI_TCGETA:
8677 POST_MEM_WRITE( ARG3, sizeof(struct vki_termio) );
8678 break;
8679 case VKI_TCSBRK:
8680 case VKI_TCXONC:
8681 case VKI_TCSBRKP:
8682 case VKI_TCFLSH:
floriana9ccca32014-10-21 07:20:20 +00008683 case VKI_TIOCSIG:
njn096ccdd2009-02-22 23:00:30 +00008684 break;
8685 case VKI_TIOCGWINSZ:
8686 POST_MEM_WRITE( ARG3, sizeof(struct vki_winsize) );
8687 break;
8688 case VKI_TIOCSWINSZ:
8689 case VKI_TIOCMBIS:
8690 case VKI_TIOCMBIC:
8691 case VKI_TIOCMSET:
8692 break;
8693 case VKI_TIOCMGET:
8694 POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
8695 break;
8696 case VKI_TIOCLINUX:
8697 POST_MEM_WRITE( ARG3, sizeof(char *) );
8698 break;
8699 case VKI_TIOCGPGRP:
8700 /* Get process group ID for foreground processing group. */
8701 POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
8702 break;
8703 case VKI_TIOCSPGRP:
8704 /* Set a process group ID? */
8705 POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
8706 break;
8707 case VKI_TIOCGPTN: /* Get Pty Number (of pty-mux device) */
8708 POST_MEM_WRITE( ARG3, sizeof(int));
8709 break;
8710 case VKI_TIOCSCTTY:
8711 break;
8712 case VKI_TIOCSPTLCK: /* Lock/unlock Pty */
8713 break;
8714 case VKI_FIONBIO:
8715 break;
tom0c7ff332013-07-17 14:57:18 +00008716 case VKI_FIONCLEX:
8717 break;
8718 case VKI_FIOCLEX:
8719 break;
tom4efdae12014-06-26 11:03:32 +00008720 case VKI_TIOCNOTTY:
8721 break;
njn096ccdd2009-02-22 23:00:30 +00008722 case VKI_FIOASYNC:
8723 break;
8724 case VKI_FIONREAD: /* identical to SIOCINQ */
8725 POST_MEM_WRITE( ARG3, sizeof(int) );
8726 break;
tom6bf71ef2011-08-10 14:25:06 +00008727 case VKI_FIOQSIZE:
8728 POST_MEM_WRITE( ARG3, sizeof(vki_loff_t) );
8729 break;
njn096ccdd2009-02-22 23:00:30 +00008730
8731 case VKI_TIOCSERGETLSR:
8732 POST_MEM_WRITE( ARG3, sizeof(int) );
8733 break;
8734 case VKI_TIOCGICOUNT:
8735 POST_MEM_WRITE( ARG3, sizeof(struct vki_serial_icounter_struct) );
8736 break;
8737
8738 case VKI_SG_SET_COMMAND_Q:
8739 break;
8740 case VKI_SG_IO:
tom55d05382014-06-26 11:29:05 +00008741 {
8742 vki_sg_io_hdr_t *sgio = (vki_sg_io_hdr_t*)ARG3;
8743 if ( sgio->sbp ) {
8744 POST_MEM_WRITE( (Addr)sgio->sbp, sgio->sb_len_wr );
8745 }
8746 if ( sgio->dxfer_direction == VKI_SG_DXFER_FROM_DEV ||
8747 sgio->dxfer_direction == VKI_SG_DXFER_TO_FROM_DEV ) {
8748 int transferred = sgio->dxfer_len - sgio->resid;
8749 POST_MEM_WRITE( (Addr)sgio->dxferp, transferred );
8750 }
8751 }
njn096ccdd2009-02-22 23:00:30 +00008752 break;
8753 case VKI_SG_GET_SCSI_ID:
8754 POST_MEM_WRITE(ARG3, sizeof(vki_sg_scsi_id_t));
8755 break;
8756 case VKI_SG_SET_RESERVED_SIZE:
8757 break;
8758 case VKI_SG_SET_TIMEOUT:
8759 break;
8760 case VKI_SG_GET_RESERVED_SIZE:
8761 POST_MEM_WRITE(ARG3, sizeof(int));
8762 break;
8763 case VKI_SG_GET_TIMEOUT:
8764 break;
8765 case VKI_SG_GET_VERSION_NUM:
8766 POST_MEM_WRITE(ARG3, sizeof(int));
8767 break;
8768 case VKI_SG_EMULATED_HOST:
8769 POST_MEM_WRITE(ARG3, sizeof(int));
8770 break;
8771 case VKI_SG_GET_SG_TABLESIZE:
8772 POST_MEM_WRITE(ARG3, sizeof(int));
8773 break;
8774
8775 case VKI_IIOCGETCPS:
8776 POST_MEM_WRITE( ARG3, VKI_ISDN_MAX_CHANNELS * 2 * sizeof(unsigned long) );
8777 break;
8778 case VKI_IIOCNETGPN:
8779 POST_MEM_WRITE( ARG3, sizeof(vki_isdn_net_ioctl_phone) );
8780 break;
8781
8782 /* These all use struct ifreq AFAIK */
8783 case VKI_SIOCGIFINDEX: /* get iface index */
8784 POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_ifindex,
8785 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_ifindex) );
8786 break;
8787 case VKI_SIOCGIFFLAGS: /* get flags */
8788 POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
8789 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
8790 break;
8791 case VKI_SIOCGIFHWADDR: /* Get hardware address */
sewardj28d542d2015-10-19 11:21:33 +00008792 POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_hwaddr,
8793 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_hwaddr) );
njn096ccdd2009-02-22 23:00:30 +00008794 break;
8795 case VKI_SIOCGIFMTU: /* get MTU size */
8796 POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
8797 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
8798 break;
8799 case VKI_SIOCGIFADDR: /* get PA address */
8800 case VKI_SIOCGIFDSTADDR: /* get remote PA address */
8801 case VKI_SIOCGIFBRDADDR: /* get broadcast PA address */
8802 case VKI_SIOCGIFNETMASK: /* get network PA mask */
8803 POST_MEM_WRITE(
sewardj28d542d2015-10-19 11:21:33 +00008804 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_addr,
8805 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_addr) );
njn096ccdd2009-02-22 23:00:30 +00008806 break;
8807 case VKI_SIOCGIFMETRIC: /* get metric */
8808 POST_MEM_WRITE(
8809 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
8810 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
8811 break;
8812 case VKI_SIOCGIFMAP: /* Get device parameters */
8813 POST_MEM_WRITE(
sewardj28d542d2015-10-19 11:21:33 +00008814 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_map,
8815 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_map) );
njn096ccdd2009-02-22 23:00:30 +00008816 break;
8817 break;
8818 case VKI_SIOCGIFTXQLEN: /* Get the tx queue length */
8819 POST_MEM_WRITE(
sewardj28d542d2015-10-19 11:21:33 +00008820 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_qlen,
8821 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_qlen) );
njn096ccdd2009-02-22 23:00:30 +00008822 break;
8823 case VKI_SIOCGIFNAME: /* get iface name */
8824 POST_MEM_WRITE(
8825 (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_name,
8826 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_name) );
8827 break;
tomabc11112014-06-27 09:59:52 +00008828 case VKI_SIOCETHTOOL: { /* ethtool(8) interface */
8829 struct vki_ifreq *ir = (struct vki_ifreq *)ARG3;
8830 switch ( *(vki_u32 *)ir->vki_ifr_data ) {
8831 case VKI_ETHTOOL_GSET:
8832 POST_MEM_WRITE( (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_cmd));
8833 break;
8834 case VKI_ETHTOOL_SSET:
8835 break;
8836 case VKI_ETHTOOL_GDRVINFO:
8837 POST_MEM_WRITE( (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_drvinfo) );
8838 break;
8839 case VKI_ETHTOOL_GREGS:
8840 POST_MEM_WRITE( (Addr)((struct vki_ethtool_regs *)ir->vki_ifr_data)->data,
8841 ((struct vki_ethtool_regs *)ir->vki_ifr_data)->len );
8842 break;
8843 case VKI_ETHTOOL_GWOL:
8844 POST_MEM_WRITE( (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_wolinfo) );
8845 break;
8846 case VKI_ETHTOOL_SWOL:
8847 break;
8848 case VKI_ETHTOOL_GMSGLVL:
8849 case VKI_ETHTOOL_GLINK:
8850 case VKI_ETHTOOL_GRXCSUM:
8851 case VKI_ETHTOOL_GSG:
8852 case VKI_ETHTOOL_GTSO:
8853 case VKI_ETHTOOL_GUFO:
8854 case VKI_ETHTOOL_GGSO:
8855 case VKI_ETHTOOL_GFLAGS:
8856 case VKI_ETHTOOL_GGRO:
8857 POST_MEM_WRITE( (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_value));
8858 break;
8859 case VKI_ETHTOOL_SMSGLVL:
8860 case VKI_ETHTOOL_SRXCSUM:
8861 case VKI_ETHTOOL_SSG:
8862 case VKI_ETHTOOL_STSO:
8863 case VKI_ETHTOOL_SUFO:
8864 case VKI_ETHTOOL_SGSO:
8865 case VKI_ETHTOOL_SFLAGS:
8866 case VKI_ETHTOOL_SGRO:
8867 break;
8868 case VKI_ETHTOOL_NWAY_RST:
8869 break;
8870 case VKI_ETHTOOL_GRINGPARAM:
8871 POST_MEM_WRITE( (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_ringparam));
8872 break;
8873 case VKI_ETHTOOL_SRINGPARAM:
8874 break;
8875 case VKI_ETHTOOL_TEST:
8876 POST_MEM_WRITE( (Addr)((struct vki_ethtool_test *)ir->vki_ifr_data)->data,
8877 ((struct vki_ethtool_test *)ir->vki_ifr_data)->len * sizeof(__vki_u64) );
8878 break;
8879 case VKI_ETHTOOL_PHYS_ID:
8880 break;
8881 case VKI_ETHTOOL_GPERMADDR:
8882 POST_MEM_WRITE( (Addr)((struct vki_ethtool_perm_addr *)ir->vki_ifr_data)->data,
8883 ((struct vki_ethtool_perm_addr *)ir->vki_ifr_data)->size );
8884 break;
8885 case VKI_ETHTOOL_RESET:
8886 break;
8887 case VKI_ETHTOOL_GSSET_INFO:
8888 POST_MEM_WRITE( (Addr)((struct vki_ethtool_sset_info *)ir->vki_ifr_data)->data,
8889 __builtin_popcountll(((struct vki_ethtool_sset_info *)ir->vki_ifr_data)->sset_mask) * sizeof(__vki_u32) );
8890 break;
8891 case VKI_ETHTOOL_GFEATURES:
8892 POST_MEM_WRITE( (Addr)((struct vki_ethtool_gfeatures *)ir->vki_ifr_data)->features,
8893 ((struct vki_ethtool_gfeatures *)ir->vki_ifr_data)->size * sizeof(struct vki_ethtool_get_features_block) );
8894 break;
8895 case VKI_ETHTOOL_SFEATURES:
8896 break;
8897 case VKI_ETHTOOL_GCHANNELS:
8898 POST_MEM_WRITE( (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_channels) );
8899 break;
8900 case VKI_ETHTOOL_SCHANNELS:
8901 break;
8902 case VKI_ETHTOOL_GET_TS_INFO:
8903 POST_MEM_WRITE( (Addr)ir->vki_ifr_data, sizeof(struct vki_ethtool_ts_info) );
8904 break;
8905 }
8906 break;
8907 }
njn096ccdd2009-02-22 23:00:30 +00008908 case VKI_SIOCGMIIPHY: /* get hardware entry */
8909 POST_MEM_WRITE(
8910 (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id,
8911 sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->phy_id) );
8912 break;
8913 case VKI_SIOCGMIIREG: /* get hardware entry registers */
8914 POST_MEM_WRITE(
8915 (Addr)&((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_out,
8916 sizeof(((struct vki_mii_ioctl_data *)&((struct vki_ifreq *)ARG3)->vki_ifr_data)->val_out) );
8917 break;
cborntradfe0dae2013-03-01 12:56:07 +00008918
8919 /* tun/tap related ioctls */
8920 case VKI_TUNSETIFF:
8921 POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_name,
8922 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_name) );
8923 break;
tom5a5031e2014-09-02 12:54:29 +00008924 case VKI_TUNGETFEATURES:
8925 POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
8926 break;
cborntradfe0dae2013-03-01 12:56:07 +00008927 case VKI_TUNGETIFF:
8928 POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_name,
8929 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_name) );
8930 POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
8931 sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
8932 break;
tom5a5031e2014-09-02 12:54:29 +00008933 case VKI_TUNGETSNDBUF:
8934 POST_MEM_WRITE( ARG3, sizeof(int) );
8935 break;
8936 case VKI_TUNGETVNETHDRSZ:
8937 POST_MEM_WRITE( ARG3, sizeof(int) );
8938 break;
cborntradfe0dae2013-03-01 12:56:07 +00008939
njn096ccdd2009-02-22 23:00:30 +00008940 case VKI_SIOCGIFCONF: /* get iface list */
8941 /* WAS:
8942 PRE_MEM_WRITE("ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
8943 KERNEL_DO_SYSCALL(tid,RES);
8944 if (!VG_(is_kerror)(RES) && RES == 0)
8945 POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
8946 */
8947 if (RES == 0 && ARG3 ) {
8948 struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
8949 if (ifc->vki_ifc_buf != NULL)
8950 POST_MEM_WRITE( (Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
8951 }
8952 break;
8953 case VKI_SIOCGSTAMP:
8954 POST_MEM_WRITE( ARG3, sizeof(struct vki_timeval) );
8955 break;
toma2ec4f52009-03-31 10:36:58 +00008956 case VKI_SIOCGSTAMPNS:
8957 POST_MEM_WRITE( ARG3, sizeof(struct vki_timespec) );
8958 break;
njn096ccdd2009-02-22 23:00:30 +00008959 /* SIOCOUTQ is an ioctl that, when called on a socket, returns
8960 the number of bytes currently in that socket's send buffer.
8961 It writes this value as an int to the memory location
8962 indicated by the third argument of ioctl(2). */
8963 case VKI_SIOCOUTQ:
8964 POST_MEM_WRITE(ARG3, sizeof(int));
8965 break;
8966 case VKI_SIOCGRARP: /* get RARP table entry */
8967 case VKI_SIOCGARP: /* get ARP table entry */
8968 POST_MEM_WRITE(ARG3, sizeof(struct vki_arpreq));
8969 break;
8970
8971 case VKI_SIOCSIFFLAGS: /* set flags */
8972 case VKI_SIOCSIFMAP: /* Set device parameters */
toma7b9dfc2012-07-11 14:33:10 +00008973 case VKI_SIOCSHWTSTAMP: /* Set hardware time stamping */
njn096ccdd2009-02-22 23:00:30 +00008974 case VKI_SIOCSIFTXQLEN: /* Set the tx queue length */
8975 case VKI_SIOCSIFDSTADDR: /* set remote PA address */
8976 case VKI_SIOCSIFBRDADDR: /* set broadcast PA address */
8977 case VKI_SIOCSIFNETMASK: /* set network PA mask */
8978 case VKI_SIOCSIFMETRIC: /* set metric */
8979 case VKI_SIOCSIFADDR: /* set PA address */
8980 case VKI_SIOCSIFMTU: /* set MTU size */
8981 case VKI_SIOCSIFHWADDR: /* set hardware address */
8982 case VKI_SIOCSMIIREG: /* set hardware entry registers */
8983 break;
8984 /* Routing table calls. */
8985 case VKI_SIOCADDRT: /* add routing table entry */
8986 case VKI_SIOCDELRT: /* delete routing table entry */
8987 break;
8988
8989 /* RARP cache control calls. */
8990 case VKI_SIOCDRARP: /* delete RARP table entry */
8991 case VKI_SIOCSRARP: /* set RARP table entry */
8992 /* ARP cache control calls. */
8993 case VKI_SIOCSARP: /* set ARP table entry */
8994 case VKI_SIOCDARP: /* delete ARP table entry */
8995 break;
8996
8997 case VKI_SIOCGPGRP:
8998 POST_MEM_WRITE(ARG3, sizeof(int));
8999 break;
9000 case VKI_SIOCSPGRP:
9001 break;
9002
tom4f17e602014-06-26 13:14:56 +00009003 case VKI_SIOCATMARK:
9004 POST_MEM_WRITE(ARG3, sizeof(int));
9005 break;
9006
njn096ccdd2009-02-22 23:00:30 +00009007 /* linux/soundcard interface (OSS) */
9008 case VKI_SNDCTL_SEQ_GETOUTCOUNT:
9009 case VKI_SNDCTL_SEQ_GETINCOUNT:
9010 case VKI_SNDCTL_SEQ_PERCMODE:
9011 case VKI_SNDCTL_SEQ_TESTMIDI:
9012 case VKI_SNDCTL_SEQ_RESETSAMPLES:
9013 case VKI_SNDCTL_SEQ_NRSYNTHS:
9014 case VKI_SNDCTL_SEQ_NRMIDIS:
9015 case VKI_SNDCTL_SEQ_GETTIME:
tom55703df2010-02-18 15:54:45 +00009016 case VKI_SNDCTL_DSP_GETBLKSIZE:
njn096ccdd2009-02-22 23:00:30 +00009017 case VKI_SNDCTL_DSP_GETFMTS:
tom55703df2010-02-18 15:54:45 +00009018 case VKI_SNDCTL_DSP_SETFMT:
njn096ccdd2009-02-22 23:00:30 +00009019 case VKI_SNDCTL_DSP_GETTRIGGER:
9020 case VKI_SNDCTL_DSP_GETODELAY:
9021 case VKI_SNDCTL_DSP_GETSPDIF:
9022 case VKI_SNDCTL_DSP_GETCAPS:
9023 case VKI_SOUND_PCM_READ_RATE:
9024 case VKI_SOUND_PCM_READ_CHANNELS:
9025 case VKI_SOUND_PCM_READ_BITS:
njn096ccdd2009-02-22 23:00:30 +00009026 case VKI_SOUND_PCM_READ_FILTER:
9027 POST_MEM_WRITE(ARG3, sizeof(int));
9028 break;
9029 case VKI_SNDCTL_SEQ_CTRLRATE:
9030 case VKI_SNDCTL_DSP_SPEED:
9031 case VKI_SNDCTL_DSP_STEREO:
njn096ccdd2009-02-22 23:00:30 +00009032 case VKI_SNDCTL_DSP_CHANNELS:
9033 case VKI_SOUND_PCM_WRITE_FILTER:
9034 case VKI_SNDCTL_DSP_SUBDIVIDE:
9035 case VKI_SNDCTL_DSP_SETFRAGMENT:
9036 case VKI_SNDCTL_DSP_GETCHANNELMASK:
9037 case VKI_SNDCTL_DSP_BIND_CHANNEL:
9038 case VKI_SNDCTL_TMR_TIMEBASE:
9039 case VKI_SNDCTL_TMR_TEMPO:
9040 case VKI_SNDCTL_TMR_SOURCE:
9041 case VKI_SNDCTL_MIDI_PRETIME:
9042 case VKI_SNDCTL_MIDI_MPUMODE:
9043 break;
9044 case VKI_SNDCTL_DSP_GETOSPACE:
9045 case VKI_SNDCTL_DSP_GETISPACE:
9046 POST_MEM_WRITE(ARG3, sizeof(vki_audio_buf_info));
9047 break;
njn06605672009-06-09 22:31:00 +00009048 case VKI_SNDCTL_DSP_NONBLOCK:
9049 break;
njn096ccdd2009-02-22 23:00:30 +00009050 case VKI_SNDCTL_DSP_SETTRIGGER:
9051 break;
9052
9053 case VKI_SNDCTL_DSP_POST:
9054 case VKI_SNDCTL_DSP_RESET:
9055 case VKI_SNDCTL_DSP_SYNC:
9056 case VKI_SNDCTL_DSP_SETSYNCRO:
9057 case VKI_SNDCTL_DSP_SETDUPLEX:
9058 break;
9059
9060 /* linux/soundcard interface (ALSA) */
9061 case VKI_SNDRV_PCM_IOCTL_HW_FREE:
9062 case VKI_SNDRV_PCM_IOCTL_HWSYNC:
9063 case VKI_SNDRV_PCM_IOCTL_PREPARE:
9064 case VKI_SNDRV_PCM_IOCTL_RESET:
9065 case VKI_SNDRV_PCM_IOCTL_START:
9066 case VKI_SNDRV_PCM_IOCTL_DROP:
9067 case VKI_SNDRV_PCM_IOCTL_DRAIN:
9068 case VKI_SNDRV_PCM_IOCTL_RESUME:
9069 case VKI_SNDRV_PCM_IOCTL_XRUN:
9070 case VKI_SNDRV_PCM_IOCTL_UNLINK:
9071 case VKI_SNDRV_TIMER_IOCTL_START:
9072 case VKI_SNDRV_TIMER_IOCTL_STOP:
9073 case VKI_SNDRV_TIMER_IOCTL_CONTINUE:
9074 case VKI_SNDRV_TIMER_IOCTL_PAUSE:
tom9b150432014-06-26 12:53:23 +00009075 case VKI_SNDRV_CTL_IOCTL_PVERSION: {
9076 POST_MEM_WRITE( (Addr)ARG3, sizeof(int) );
9077 break;
9078 }
9079 case VKI_SNDRV_CTL_IOCTL_CARD_INFO:
9080 POST_MEM_WRITE( (Addr)ARG3, sizeof(struct vki_snd_ctl_card_info) );
9081 break;
9082 case VKI_SNDRV_CTL_IOCTL_ELEM_LIST: {
9083 struct vki_snd_ctl_elem_list *data = (struct vki_snd_ctl_elem_list *)ARG3;
9084 POST_MEM_WRITE( (Addr)&data->used, sizeof(data->used) );
9085 POST_MEM_WRITE( (Addr)&data->count, sizeof(data->count) );
9086 if (data->pids) {
9087 POST_MEM_WRITE( (Addr)data->pids, sizeof(struct vki_snd_ctl_elem_id) * data->used );
9088 }
9089 break;
9090 }
9091 case VKI_SNDRV_CTL_IOCTL_TLV_READ: {
9092 struct vki_snd_ctl_tlv *data = (struct vki_snd_ctl_tlv *)ARG3;
9093 POST_MEM_WRITE( (Addr)data->tlv, data->length );
9094 break;
9095 }
9096 case VKI_SNDRV_CTL_IOCTL_TLV_WRITE:
9097 case VKI_SNDRV_CTL_IOCTL_TLV_COMMAND:
9098 break;
tom8758e702012-02-10 10:41:07 +00009099
9100 /* SCSI no operand */
9101 case VKI_SCSI_IOCTL_DOORLOCK:
9102 case VKI_SCSI_IOCTL_DOORUNLOCK:
njn096ccdd2009-02-22 23:00:30 +00009103 break;
9104
9105 /* Real Time Clock (/dev/rtc) ioctls */
9106 case VKI_RTC_UIE_ON:
9107 case VKI_RTC_UIE_OFF:
9108 case VKI_RTC_AIE_ON:
9109 case VKI_RTC_AIE_OFF:
9110 case VKI_RTC_PIE_ON:
9111 case VKI_RTC_PIE_OFF:
9112 case VKI_RTC_IRQP_SET:
9113 break;
9114 case VKI_RTC_RD_TIME:
9115 case VKI_RTC_ALM_READ:
9116 POST_MEM_WRITE(ARG3, sizeof(struct vki_rtc_time));
9117 break;
9118 case VKI_RTC_ALM_SET:
9119 break;
9120 case VKI_RTC_IRQP_READ:
9121 POST_MEM_WRITE(ARG3, sizeof(unsigned long));
9122 break;
9123
9124 /* Block devices */
9125 case VKI_BLKROSET:
9126 break;
9127 case VKI_BLKROGET:
9128 POST_MEM_WRITE(ARG3, sizeof(int));
9129 break;
9130 case VKI_BLKGETSIZE:
9131 POST_MEM_WRITE(ARG3, sizeof(unsigned long));
9132 break;
9133 case VKI_BLKRASET:
9134 break;
9135 case VKI_BLKRAGET:
9136 POST_MEM_WRITE(ARG3, sizeof(long));
9137 break;
9138 case VKI_BLKFRASET:
9139 break;
9140 case VKI_BLKFRAGET:
9141 POST_MEM_WRITE(ARG3, sizeof(long));
9142 break;
9143 case VKI_BLKSECTGET:
9144 POST_MEM_WRITE(ARG3, sizeof(unsigned short));
9145 break;
9146 case VKI_BLKSSZGET:
9147 POST_MEM_WRITE(ARG3, sizeof(int));
9148 break;
9149 case VKI_BLKBSZGET:
9150 POST_MEM_WRITE(ARG3, sizeof(int));
9151 break;
9152 case VKI_BLKBSZSET:
9153 break;
9154 case VKI_BLKGETSIZE64:
9155 POST_MEM_WRITE(ARG3, sizeof(unsigned long long));
9156 break;
cborntra0e6d05e2012-11-09 16:01:38 +00009157 case VKI_BLKPBSZGET:
9158 POST_MEM_WRITE(ARG3, sizeof(int));
9159 break;
cborntrac6097322014-08-05 15:14:52 +00009160 case VKI_BLKDISCARDZEROES:
9161 POST_MEM_WRITE(ARG3, sizeof(vki_uint));
9162 break;
njn096ccdd2009-02-22 23:00:30 +00009163
9164 /* Hard disks */
9165 case VKI_HDIO_GETGEO: /* 0x0301 */
9166 POST_MEM_WRITE(ARG3, sizeof(struct vki_hd_geometry));
9167 break;
9168 case VKI_HDIO_GET_DMA: /* 0x030b */
9169 POST_MEM_WRITE(ARG3, sizeof(long));
9170 break;
9171 case VKI_HDIO_GET_IDENTITY: /* 0x030d */
9172 POST_MEM_WRITE(ARG3, VKI_SIZEOF_STRUCT_HD_DRIVEID );
9173 break;
9174
tom8758e702012-02-10 10:41:07 +00009175 /* SCSI */
9176 case VKI_SCSI_IOCTL_GET_IDLUN: /* 0x5382 */
9177 POST_MEM_WRITE(ARG3, sizeof(struct vki_scsi_idlun));
9178 break;
9179 case VKI_SCSI_IOCTL_GET_BUS_NUMBER: /* 0x5386 */
9180 POST_MEM_WRITE(ARG3, sizeof(int));
9181 break;
9182
njn096ccdd2009-02-22 23:00:30 +00009183 /* CD ROM stuff (??) */
tom96fb2c52014-06-26 11:11:56 +00009184 case VKI_CDROM_DISC_STATUS:
9185 break;
njn096ccdd2009-02-22 23:00:30 +00009186 case VKI_CDROMSUBCHNL:
9187 POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_subchnl));
9188 break;
9189 case VKI_CDROMREADTOCHDR:
9190 POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_tochdr));
9191 break;
9192 case VKI_CDROMREADTOCENTRY:
9193 POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_tocentry));
9194 break;
9195 case VKI_CDROMMULTISESSION:
9196 POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_multisession));
9197 break;
9198 case VKI_CDROMVOLREAD:
9199 POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_volctrl));
9200 break;
9201 case VKI_CDROMREADRAW:
9202 POST_MEM_WRITE(ARG3, VKI_CD_FRAMESIZE_RAW);
9203 break;
9204 case VKI_CDROMREADAUDIO:
9205 {
9206 struct vki_cdrom_read_audio *cra = (struct vki_cdrom_read_audio *) ARG3;
9207 POST_MEM_WRITE( (Addr)(cra->buf), cra->nframes * VKI_CD_FRAMESIZE_RAW);
9208 break;
9209 }
9210
9211 case VKI_CDROMPLAYMSF:
9212 break;
9213 /* The following two are probably bogus (should check args
9214 for readability). JRS 20021117 */
9215 case VKI_CDROM_DRIVE_STATUS: /* 0x5326 */
9216 case VKI_CDROM_CLEAR_OPTIONS: /* 0x5321 */
9217 break;
tom3fc99292012-07-11 12:02:06 +00009218 case VKI_CDROM_GET_CAPABILITY: /* 0x5331 */
9219 break;
njn096ccdd2009-02-22 23:00:30 +00009220
9221 case VKI_FIGETBSZ:
9222 POST_MEM_WRITE(ARG3, sizeof(unsigned long));
9223 break;
9224 case VKI_FIBMAP:
tomc1cc9632010-08-25 09:13:44 +00009225 POST_MEM_WRITE(ARG3, sizeof(int));
njn096ccdd2009-02-22 23:00:30 +00009226 break;
9227
9228 case VKI_FBIOGET_VSCREENINFO: //0x4600
9229 POST_MEM_WRITE(ARG3, sizeof(struct vki_fb_var_screeninfo));
9230 break;
9231 case VKI_FBIOGET_FSCREENINFO: //0x4602
9232 POST_MEM_WRITE(ARG3, sizeof(struct vki_fb_fix_screeninfo));
9233 break;
9234
9235 case VKI_PPCLAIM:
9236 case VKI_PPEXCL:
9237 case VKI_PPYIELD:
9238 case VKI_PPRELEASE:
9239 case VKI_PPSETMODE:
9240 case VKI_PPSETPHASE:
9241 case VKI_PPSETFLAGS:
9242 case VKI_PPWDATA:
9243 case VKI_PPWCONTROL:
9244 case VKI_PPFCONTROL:
9245 case VKI_PPDATADIR:
9246 case VKI_PPNEGOT:
9247 case VKI_PPWCTLONIRQ:
9248 case VKI_PPSETTIME:
9249 break;
9250 case VKI_PPGETMODE:
9251 POST_MEM_WRITE( ARG3, sizeof(int) );
9252 break;
9253 case VKI_PPGETPHASE:
9254 POST_MEM_WRITE( ARG3, sizeof(int) );
9255 break;
9256 case VKI_PPGETMODES:
9257 POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
9258 break;
9259 case VKI_PPGETFLAGS:
9260 POST_MEM_WRITE( ARG3, sizeof(int) );
9261 break;
9262 case VKI_PPRSTATUS:
9263 POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
9264 break;
9265 case VKI_PPRDATA:
9266 POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
9267 break;
9268 case VKI_PPRCONTROL:
9269 POST_MEM_WRITE( ARG3, sizeof(unsigned char) );
9270 break;
9271 case VKI_PPCLRIRQ:
9272 POST_MEM_WRITE( ARG3, sizeof(int) );
9273 break;
9274 case VKI_PPGETTIME:
9275 POST_MEM_WRITE( ARG3, sizeof(struct vki_timeval) );
9276 break;
9277
9278 case VKI_GIO_FONT:
9279 POST_MEM_WRITE( ARG3, 32 * 256 );
9280 break;
9281 case VKI_PIO_FONT:
9282 break;
9283
9284 case VKI_GIO_FONTX:
9285 POST_MEM_WRITE( (Addr)((struct vki_consolefontdesc *)ARG3)->chardata,
9286 32 * ((struct vki_consolefontdesc *)ARG3)->charcount );
9287 break;
9288 case VKI_PIO_FONTX:
9289 break;
9290
9291 case VKI_PIO_FONTRESET:
9292 break;
9293
9294 case VKI_GIO_CMAP:
9295 POST_MEM_WRITE( ARG3, 16 * 3 );
9296 break;
9297 case VKI_PIO_CMAP:
9298 break;
9299
9300 case VKI_KIOCSOUND:
9301 case VKI_KDMKTONE:
9302 break;
9303
9304 case VKI_KDGETLED:
9305 POST_MEM_WRITE( ARG3, sizeof(char) );
9306 break;
9307 case VKI_KDSETLED:
9308 break;
9309
9310 case VKI_KDGKBTYPE:
9311 POST_MEM_WRITE( ARG3, sizeof(char) );
9312 break;
9313
9314 case VKI_KDADDIO:
9315 case VKI_KDDELIO:
9316 case VKI_KDENABIO:
9317 case VKI_KDDISABIO:
9318 break;
9319
9320 case VKI_KDSETMODE:
9321 break;
9322 case VKI_KDGETMODE:
9323 POST_MEM_WRITE( ARG3, sizeof(int) );
9324 break;
9325
9326 case VKI_KDMAPDISP:
9327 case VKI_KDUNMAPDISP:
9328 break;
9329
9330 case VKI_GIO_SCRNMAP:
9331 POST_MEM_WRITE( ARG3, VKI_E_TABSZ );
9332 break;
9333 case VKI_PIO_SCRNMAP:
9334 break;
9335 case VKI_GIO_UNISCRNMAP:
9336 POST_MEM_WRITE( ARG3, VKI_E_TABSZ * sizeof(unsigned short) );
9337 break;
9338 case VKI_PIO_UNISCRNMAP:
9339 break;
9340
9341 case VKI_GIO_UNIMAP:
9342 if ( ARG3 ) {
9343 struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3;
9344 POST_MEM_WRITE( (Addr)&desc->entry_ct, sizeof(desc->entry_ct));
9345 POST_MEM_WRITE( (Addr)desc->entries,
9346 desc->entry_ct * sizeof(struct vki_unipair) );
9347 }
9348 break;
9349 case VKI_PIO_UNIMAP:
9350 break;
9351 case VKI_PIO_UNIMAPCLR:
9352 break;
9353
9354 case VKI_KDGKBMODE:
9355 POST_MEM_WRITE( ARG3, sizeof(int) );
9356 break;
9357 case VKI_KDSKBMODE:
9358 break;
9359
9360 case VKI_KDGKBMETA:
9361 POST_MEM_WRITE( ARG3, sizeof(int) );
9362 break;
9363 case VKI_KDSKBMETA:
9364 break;
9365
9366 case VKI_KDGKBLED:
9367 POST_MEM_WRITE( ARG3, sizeof(char) );
9368 break;
9369 case VKI_KDSKBLED:
9370 break;
9371
9372 case VKI_KDGKBENT:
9373 POST_MEM_WRITE( (Addr)&((struct vki_kbentry *)ARG3)->kb_value,
9374 sizeof(((struct vki_kbentry *)ARG3)->kb_value) );
9375 break;
9376 case VKI_KDSKBENT:
9377 break;
9378
9379 case VKI_KDGKBSENT:
9380 POST_MEM_WRITE( (Addr)((struct vki_kbsentry *)ARG3)->kb_string,
9381 sizeof(((struct vki_kbsentry *)ARG3)->kb_string) );
9382 break;
9383 case VKI_KDSKBSENT:
9384 break;
9385
9386 case VKI_KDGKBDIACR:
9387 POST_MEM_WRITE( ARG3, sizeof(struct vki_kbdiacrs) );
9388 break;
9389 case VKI_KDSKBDIACR:
9390 break;
9391
9392 case VKI_KDGETKEYCODE:
9393 POST_MEM_WRITE( (Addr)((struct vki_kbkeycode *)ARG3)->keycode,
9394 sizeof(((struct vki_kbkeycode *)ARG3)->keycode) );
9395 break;
9396 case VKI_KDSETKEYCODE:
9397 break;
9398
9399 case VKI_KDSIGACCEPT:
9400 break;
9401
9402 case VKI_KDKBDREP:
9403 break;
9404
9405 case VKI_KDFONTOP:
9406 if ( ARG3 ) {
9407 struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3;
9408 switch ( op->op ) {
9409 case VKI_KD_FONT_OP_SET:
9410 break;
9411 case VKI_KD_FONT_OP_GET:
9412 if ( op->data )
9413 POST_MEM_WRITE( (Addr) op->data,
9414 (op->width + 7) / 8 * 32 * op->charcount );
9415 break;
9416 case VKI_KD_FONT_OP_SET_DEFAULT:
9417 break;
9418 case VKI_KD_FONT_OP_COPY:
9419 break;
9420 }
9421 POST_MEM_WRITE( (Addr) op, sizeof(*op));
9422 }
9423 break;
9424
9425 case VKI_VT_OPENQRY:
9426 POST_MEM_WRITE( ARG3, sizeof(int) );
9427 break;
9428 case VKI_VT_GETMODE:
9429 POST_MEM_WRITE( ARG3, sizeof(struct vki_vt_mode) );
9430 break;
9431 case VKI_VT_SETMODE:
9432 break;
9433 case VKI_VT_GETSTATE:
9434 POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_active),
9435 sizeof(((struct vki_vt_stat*) ARG3)->v_active) );
9436 POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_state),
9437 sizeof(((struct vki_vt_stat*) ARG3)->v_state) );
9438 break;
9439 case VKI_VT_RELDISP:
9440 case VKI_VT_ACTIVATE:
9441 case VKI_VT_WAITACTIVE:
9442 case VKI_VT_DISALLOCATE:
9443 break;
9444 case VKI_VT_RESIZE:
9445 break;
9446 case VKI_VT_RESIZEX:
9447 break;
9448 case VKI_VT_LOCKSWITCH:
9449 case VKI_VT_UNLOCKSWITCH:
9450 break;
9451
9452 case VKI_USBDEVFS_CONTROL:
9453 if ( ARG3 ) {
9454 struct vki_usbdevfs_ctrltransfer *vkuc = (struct vki_usbdevfs_ctrltransfer *)ARG3;
9455 if (vkuc->bRequestType & 0x80)
9456 POST_MEM_WRITE((Addr)vkuc->data, RES);
njn096ccdd2009-02-22 23:00:30 +00009457 }
tom8bb4d8f2011-07-06 14:11:56 +00009458 break;
njn096ccdd2009-02-22 23:00:30 +00009459 case VKI_USBDEVFS_BULK:
9460 if ( ARG3 ) {
9461 struct vki_usbdevfs_bulktransfer *vkub = (struct vki_usbdevfs_bulktransfer *)ARG3;
9462 if (vkub->ep & 0x80)
9463 POST_MEM_WRITE((Addr)vkub->data, RES);
njn096ccdd2009-02-22 23:00:30 +00009464 }
tom8bb4d8f2011-07-06 14:11:56 +00009465 break;
njn096ccdd2009-02-22 23:00:30 +00009466 case VKI_USBDEVFS_GETDRIVER:
9467 if ( ARG3 ) {
9468 struct vki_usbdevfs_getdriver *vkugd = (struct vki_usbdevfs_getdriver *)ARG3;
9469 POST_MEM_WRITE((Addr)&vkugd->driver, sizeof(vkugd->driver));
njn096ccdd2009-02-22 23:00:30 +00009470 }
tom8bb4d8f2011-07-06 14:11:56 +00009471 break;
njn096ccdd2009-02-22 23:00:30 +00009472 case VKI_USBDEVFS_REAPURB:
9473 case VKI_USBDEVFS_REAPURBNDELAY:
9474 if ( ARG3 ) {
9475 struct vki_usbdevfs_urb **vkuu = (struct vki_usbdevfs_urb**)ARG3;
njn6e10c6c2009-06-09 23:03:02 +00009476 POST_MEM_WRITE((Addr)vkuu, sizeof(*vkuu));
njn096ccdd2009-02-22 23:00:30 +00009477 if (!*vkuu)
9478 break;
9479 POST_MEM_WRITE((Addr) &((*vkuu)->status),sizeof((*vkuu)->status));
njn6e10c6c2009-06-09 23:03:02 +00009480 if ((*vkuu)->type == VKI_USBDEVFS_URB_TYPE_CONTROL) {
9481 struct vki_usbdevfs_setuppacket *vkusp = (struct vki_usbdevfs_setuppacket *)(*vkuu)->buffer;
9482 if (vkusp->bRequestType & 0x80)
9483 POST_MEM_WRITE((Addr)(vkusp+1), (*vkuu)->buffer_length - sizeof(*vkusp));
9484 POST_MEM_WRITE((Addr)&(*vkuu)->actual_length, sizeof((*vkuu)->actual_length));
9485 } else if ((*vkuu)->type == VKI_USBDEVFS_URB_TYPE_ISO) {
9486 char *bp = (*vkuu)->buffer;
9487 int i;
9488 for(i=0; i<(*vkuu)->number_of_packets; i++) {
9489 POST_MEM_WRITE((Addr)&(*vkuu)->iso_frame_desc[i].actual_length, sizeof((*vkuu)->iso_frame_desc[i].actual_length));
9490 POST_MEM_WRITE((Addr)&(*vkuu)->iso_frame_desc[i].status, sizeof((*vkuu)->iso_frame_desc[i].status));
9491 if ((*vkuu)->endpoint & 0x80)
9492 POST_MEM_WRITE((Addr)bp, (*vkuu)->iso_frame_desc[i].actual_length);
9493 bp += (*vkuu)->iso_frame_desc[i].length; // FIXME: or actual_length??
9494 }
9495 POST_MEM_WRITE((Addr)&(*vkuu)->error_count, sizeof((*vkuu)->error_count));
9496 } else {
9497 if ((*vkuu)->endpoint & 0x80)
9498 POST_MEM_WRITE((Addr)(*vkuu)->buffer, (*vkuu)->actual_length);
9499 POST_MEM_WRITE((Addr)&(*vkuu)->actual_length, sizeof((*vkuu)->actual_length));
9500 }
njn096ccdd2009-02-22 23:00:30 +00009501 }
tom8bb4d8f2011-07-06 14:11:56 +00009502 break;
njn096ccdd2009-02-22 23:00:30 +00009503 case VKI_USBDEVFS_CONNECTINFO:
9504 POST_MEM_WRITE(ARG3, sizeof(struct vki_usbdevfs_connectinfo));
9505 break;
9506 case VKI_USBDEVFS_IOCTL:
9507 if ( ARG3 ) {
9508 struct vki_usbdevfs_ioctl *vkui = (struct vki_usbdevfs_ioctl *)ARG3;
9509 UInt dir2, size2;
9510 dir2 = _VKI_IOC_DIR(vkui->ioctl_code);
9511 size2 = _VKI_IOC_SIZE(vkui->ioctl_code);
9512 if (size2 > 0) {
9513 if (dir2 & _VKI_IOC_READ)
9514 POST_MEM_WRITE((Addr)vkui->data, size2);
9515 }
9516 }
9517 break;
9518
9519 /* I2C (/dev/i2c-*) ioctls */
9520 case VKI_I2C_SLAVE:
9521 case VKI_I2C_SLAVE_FORCE:
9522 case VKI_I2C_TENBIT:
9523 case VKI_I2C_PEC:
9524 break;
9525 case VKI_I2C_FUNCS:
9526 POST_MEM_WRITE( ARG3, sizeof(unsigned long) );
9527 break;
tomd543d742012-03-07 10:21:33 +00009528 case VKI_I2C_RDWR:
9529 if ( ARG3 ) {
9530 struct vki_i2c_rdwr_ioctl_data *vkui = (struct vki_i2c_rdwr_ioctl_data *)ARG3;
9531 UInt i;
9532 for (i=0; i < vkui->nmsgs; i++) {
9533 struct vki_i2c_msg *msg = vkui->msgs + i;
9534 if (msg->flags & VKI_I2C_M_RD)
9535 POST_MEM_WRITE((Addr)msg->buf, msg->len);
9536 }
9537 }
9538 break;
sewardjf6f25a52015-02-05 15:52:46 +00009539 case VKI_I2C_SMBUS:
9540 if ( ARG3 ) {
9541 struct vki_i2c_smbus_ioctl_data *vkis
9542 = (struct vki_i2c_smbus_ioctl_data *) ARG3;
9543 /* i2c_smbus_write_quick hides its value in read_write, so
floriandd3b8662015-09-20 13:42:06 +00009544 this variable can have a different meaning */
sewardjf6f25a52015-02-05 15:52:46 +00009545 if ((vkis->read_write == VKI_I2C_SMBUS_READ)
9546 || (vkis->size == VKI_I2C_SMBUS_PROC_CALL)
9547 || (vkis->size == VKI_I2C_SMBUS_BLOCK_PROC_CALL)) {
florian6bd97a92015-09-20 13:41:25 +00009548 if ( ! (vkis->size == VKI_I2C_SMBUS_QUICK)) {
sewardjf6f25a52015-02-05 15:52:46 +00009549 UInt size;
9550 switch(vkis->size) {
9551 case VKI_I2C_SMBUS_BYTE:
9552 case VKI_I2C_SMBUS_BYTE_DATA:
9553 size = 1;
9554 break;
9555 case VKI_I2C_SMBUS_WORD_DATA:
9556 case VKI_I2C_SMBUS_PROC_CALL:
9557 size = 2;
9558 break;
9559 case VKI_I2C_SMBUS_BLOCK_DATA:
9560 case VKI_I2C_SMBUS_I2C_BLOCK_BROKEN:
9561 case VKI_I2C_SMBUS_BLOCK_PROC_CALL:
9562 case VKI_I2C_SMBUS_I2C_BLOCK_DATA:
floriance82da22015-09-20 13:40:47 +00009563 size = 1 + vkis->data->block[0];
sewardjf6f25a52015-02-05 15:52:46 +00009564 break;
9565 default:
9566 size = 0;
9567 }
9568 POST_MEM_WRITE((Addr)&vkis->data->block[0], size);
9569 }
9570 }
9571 }
9572 break;
njn096ccdd2009-02-22 23:00:30 +00009573
9574 /* Wireless extensions ioctls */
9575 case VKI_SIOCSIWCOMMIT:
9576 case VKI_SIOCSIWNWID:
9577 case VKI_SIOCSIWFREQ:
9578 case VKI_SIOCSIWMODE:
9579 case VKI_SIOCSIWSENS:
9580 case VKI_SIOCSIWRANGE:
9581 case VKI_SIOCSIWPRIV:
9582 case VKI_SIOCSIWSTATS:
9583 case VKI_SIOCSIWSPY:
9584 case VKI_SIOCSIWTHRSPY:
9585 case VKI_SIOCSIWAP:
9586 case VKI_SIOCSIWSCAN:
9587 case VKI_SIOCSIWESSID:
9588 case VKI_SIOCSIWRATE:
9589 case VKI_SIOCSIWNICKN:
9590 case VKI_SIOCSIWRTS:
9591 case VKI_SIOCSIWFRAG:
9592 case VKI_SIOCSIWTXPOW:
9593 case VKI_SIOCSIWRETRY:
9594 case VKI_SIOCSIWENCODE:
9595 case VKI_SIOCSIWPOWER:
9596 case VKI_SIOCSIWGENIE:
9597 case VKI_SIOCSIWMLME:
9598 case VKI_SIOCSIWAUTH:
9599 case VKI_SIOCSIWENCODEEXT:
9600 case VKI_SIOCSIWPMKSA:
9601 break;
9602 case VKI_SIOCGIWNAME:
9603 if (ARG3) {
9604 POST_MEM_WRITE((Addr)((struct vki_iwreq *)ARG3)->u.name,
9605 sizeof(((struct vki_iwreq *)ARG3)->u.name));
9606 }
9607 break;
9608 case VKI_SIOCGIWNWID:
9609 case VKI_SIOCGIWSENS:
9610 case VKI_SIOCGIWRATE:
9611 case VKI_SIOCGIWRTS:
9612 case VKI_SIOCGIWFRAG:
9613 case VKI_SIOCGIWTXPOW:
9614 case VKI_SIOCGIWRETRY:
9615 case VKI_SIOCGIWPOWER:
9616 case VKI_SIOCGIWAUTH:
9617 if (ARG3) {
9618 POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.param,
9619 sizeof(struct vki_iw_param));
9620 }
9621 break;
9622 case VKI_SIOCGIWFREQ:
9623 if (ARG3) {
9624 POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.freq,
9625 sizeof(struct vki_iw_freq));
9626 }
9627 break;
9628 case VKI_SIOCGIWMODE:
9629 if (ARG3) {
9630 POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.mode,
9631 sizeof(__vki_u32));
9632 }
9633 break;
9634 case VKI_SIOCGIWRANGE:
9635 case VKI_SIOCGIWPRIV:
9636 case VKI_SIOCGIWSTATS:
9637 case VKI_SIOCGIWSPY:
9638 case VKI_SIOCGIWTHRSPY:
9639 case VKI_SIOCGIWAPLIST:
9640 case VKI_SIOCGIWSCAN:
9641 case VKI_SIOCGIWESSID:
9642 case VKI_SIOCGIWNICKN:
9643 case VKI_SIOCGIWENCODE:
9644 case VKI_SIOCGIWGENIE:
9645 case VKI_SIOCGIWENCODEEXT:
9646 if (ARG3) {
9647 struct vki_iw_point* point;
9648 point = &((struct vki_iwreq *)ARG3)->u.data;
9649 POST_MEM_WRITE((Addr)point->pointer, point->length);
9650 }
9651 break;
9652 case VKI_SIOCGIWAP:
9653 if (ARG3) {
9654 POST_MEM_WRITE((Addr)&((struct vki_iwreq *)ARG3)->u.ap_addr,
9655 sizeof(struct vki_sockaddr));
9656 }
9657 break;
9658
dejanj9c6b05d2013-12-27 09:06:55 +00009659# if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android) \
Elliott Hughesa0664b92017-04-18 17:46:52 -07009660 || defined(VGPV_mips32_linux_android) \
9661 || defined(VGPV_arm64_linux_android)
sewardja3e7a482011-09-27 10:26:52 +00009662 /* ashmem */
9663 case VKI_ASHMEM_GET_SIZE:
9664 case VKI_ASHMEM_SET_SIZE:
9665 case VKI_ASHMEM_GET_PROT_MASK:
9666 case VKI_ASHMEM_SET_PROT_MASK:
9667 case VKI_ASHMEM_GET_PIN_STATUS:
9668 case VKI_ASHMEM_PURGE_ALL_CACHES:
9669 case VKI_ASHMEM_SET_NAME:
9670 case VKI_ASHMEM_PIN:
9671 case VKI_ASHMEM_UNPIN:
9672 break;
9673 case VKI_ASHMEM_GET_NAME:
9674 POST_MEM_WRITE( ARG3, VKI_ASHMEM_NAME_LEN );
9675 break;
9676
9677 /* binder */
9678 case VKI_BINDER_WRITE_READ:
9679 if (ARG3) {
9680 struct vki_binder_write_read* bwr
9681 = (struct vki_binder_write_read*)ARG3;
9682 POST_FIELD_WRITE(bwr->write_consumed);
9683 POST_FIELD_WRITE(bwr->read_consumed);
9684
9685 if (bwr->read_size)
9686 POST_MEM_WRITE((Addr)bwr->read_buffer, bwr->read_consumed);
9687 }
9688 break;
9689
9690 case VKI_BINDER_SET_IDLE_TIMEOUT:
9691 case VKI_BINDER_SET_MAX_THREADS:
9692 case VKI_BINDER_SET_IDLE_PRIORITY:
9693 case VKI_BINDER_SET_CONTEXT_MGR:
9694 case VKI_BINDER_THREAD_EXIT:
9695 break;
9696 case VKI_BINDER_VERSION:
9697 if (ARG3) {
9698 struct vki_binder_version* bv = (struct vki_binder_version*)ARG3;
9699 POST_FIELD_WRITE(bv->protocol_version);
9700 }
9701 break;
philippe5d5dd8e2012-08-05 00:08:25 +00009702# endif /* defined(VGPV_*_linux_android) */
sewardja3e7a482011-09-27 10:26:52 +00009703
tom5cc73ec2014-06-26 11:44:46 +00009704 case VKI_HCIGETDEVLIST:
9705 if (ARG3) {
9706 struct vki_hci_dev_list_req* dlr = (struct vki_hci_dev_list_req*)ARG3;
9707 POST_MEM_WRITE((Addr)ARG3 + sizeof(struct vki_hci_dev_list_req),
9708 dlr->dev_num * sizeof(struct vki_hci_dev_req));
9709 }
9710 break;
9711
tom8236fe62012-03-07 11:22:42 +00009712 case VKI_HCIINQUIRY:
9713 if (ARG3) {
9714 struct vki_hci_inquiry_req* ir = (struct vki_hci_inquiry_req*)ARG3;
9715 POST_MEM_WRITE((Addr)ARG3 + sizeof(struct vki_hci_inquiry_req),
9716 ir->num_rsp * sizeof(struct vki_inquiry_info));
9717 }
9718 break;
9719
tom5b8d6892014-07-10 14:56:48 +00009720 case VKI_DRM_IOCTL_VERSION:
9721 if (ARG3) {
9722 struct vki_drm_version *data = (struct vki_drm_version *)ARG3;
9723 POST_MEM_WRITE((Addr)&data->version_major, sizeof(data->version_major));
9724 POST_MEM_WRITE((Addr)&data->version_minor, sizeof(data->version_minor));
9725 POST_MEM_WRITE((Addr)&data->version_patchlevel, sizeof(data->version_patchlevel));
9726 POST_MEM_WRITE((Addr)&data->name_len, sizeof(data->name_len));
9727 POST_MEM_WRITE((Addr)data->name, data->name_len);
9728 POST_MEM_WRITE((Addr)&data->date_len, sizeof(data->date_len));
9729 POST_MEM_WRITE((Addr)data->date, data->date_len);
9730 POST_MEM_WRITE((Addr)&data->desc_len, sizeof(data->desc_len));
9731 POST_MEM_WRITE((Addr)data->desc, data->desc_len);
9732 }
9733 break;
9734 case VKI_DRM_IOCTL_GET_UNIQUE:
9735 if (ARG3) {
9736 struct vki_drm_unique *data = (struct vki_drm_unique *)ARG3;
9737 POST_MEM_WRITE((Addr)data->unique, sizeof(data->unique_len));
9738 }
9739 break;
9740 case VKI_DRM_IOCTL_GET_MAGIC:
9741 if (ARG3) {
9742 struct vki_drm_auth *data = (struct vki_drm_auth *)ARG3;
9743 POST_MEM_WRITE((Addr)&data->magic, sizeof(data->magic));
9744 }
9745 break;
9746 case VKI_DRM_IOCTL_WAIT_VBLANK:
9747 if (ARG3) {
9748 union vki_drm_wait_vblank *data = (union vki_drm_wait_vblank *)ARG3;
9749 POST_MEM_WRITE((Addr)&data->reply, sizeof(data->reply));
9750 }
9751 break;
9752 case VKI_DRM_IOCTL_GEM_FLINK:
9753 if (ARG3) {
9754 struct vki_drm_gem_flink *data = (struct vki_drm_gem_flink *)ARG3;
9755 POST_MEM_WRITE((Addr)&data->name, sizeof(data->name));
9756 }
9757 break;
9758 case VKI_DRM_IOCTL_GEM_OPEN:
9759 if (ARG3) {
9760 struct vki_drm_gem_open *data = (struct vki_drm_gem_open *)ARG3;
9761 POST_MEM_WRITE((Addr)&data->handle, sizeof(data->handle));
9762 POST_MEM_WRITE((Addr)&data->size, sizeof(data->size));
9763 }
9764 break;
9765 case VKI_DRM_IOCTL_I915_GETPARAM:
9766 if (ARG3) {
9767 vki_drm_i915_getparam_t *data = (vki_drm_i915_getparam_t *)ARG3;
9768 POST_MEM_WRITE((Addr)data->value, sizeof(int));
9769 }
9770 break;
9771 case VKI_DRM_IOCTL_I915_GEM_BUSY:
9772 if (ARG3) {
9773 struct vki_drm_i915_gem_busy *data = (struct vki_drm_i915_gem_busy *)ARG3;
9774 POST_MEM_WRITE((Addr)&data->busy, sizeof(data->busy));
9775 }
9776 break;
9777 case VKI_DRM_IOCTL_I915_GEM_CREATE:
9778 if (ARG3) {
9779 struct vki_drm_i915_gem_create *data = (struct vki_drm_i915_gem_create *)ARG3;
9780 POST_MEM_WRITE((Addr)&data->handle, sizeof(data->handle));
9781 }
9782 break;
9783 case VKI_DRM_IOCTL_I915_GEM_PREAD:
9784 if (ARG3) {
9785 struct vki_drm_i915_gem_pread *data = (struct vki_drm_i915_gem_pread *)ARG3;
9786 POST_MEM_WRITE((Addr)data->data_ptr, data->size);
9787 }
9788 break;
9789 case VKI_DRM_IOCTL_I915_GEM_MMAP_GTT:
9790 if (ARG3) {
9791 struct vki_drm_i915_gem_mmap_gtt *data = (struct vki_drm_i915_gem_mmap_gtt *)ARG3;
9792 POST_MEM_WRITE((Addr)&data->offset, sizeof(data->offset));
9793 }
9794 break;
9795 case VKI_DRM_IOCTL_I915_GEM_SET_TILING:
9796 if (ARG3) {
9797 struct vki_drm_i915_gem_set_tiling *data = (struct vki_drm_i915_gem_set_tiling *)ARG3;
9798 POST_MEM_WRITE((Addr)&data->tiling_mode, sizeof(data->tiling_mode));
9799 POST_MEM_WRITE((Addr)&data->stride, sizeof(data->stride));
9800 POST_MEM_WRITE((Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
9801 }
9802 break;
9803 case VKI_DRM_IOCTL_I915_GEM_GET_TILING:
9804 if (ARG3) {
9805 struct vki_drm_i915_gem_get_tiling *data = (struct vki_drm_i915_gem_get_tiling *)ARG3;
9806 POST_MEM_WRITE((Addr)&data->tiling_mode, sizeof(data->tiling_mode));
9807 POST_MEM_WRITE((Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
9808 }
9809 break;
9810 case VKI_DRM_IOCTL_I915_GEM_GET_APERTURE:
9811 if (ARG3) {
9812 struct vki_drm_i915_gem_get_aperture *data = (struct vki_drm_i915_gem_get_aperture *)ARG3;
9813 POST_MEM_WRITE((Addr)&data->aper_size, sizeof(data->aper_size));
9814 POST_MEM_WRITE((Addr)&data->aper_available_size, sizeof(data->aper_available_size));
9815 }
9816 break;
9817
cborntra65bdbe42012-05-23 15:59:40 +00009818 /* KVM ioctls that only write the system call return value */
9819 case VKI_KVM_GET_API_VERSION:
9820 case VKI_KVM_CREATE_VM:
9821 case VKI_KVM_CHECK_EXTENSION:
9822 case VKI_KVM_GET_VCPU_MMAP_SIZE:
9823 case VKI_KVM_S390_ENABLE_SIE:
9824 case VKI_KVM_CREATE_VCPU:
cborntra202148c2014-09-26 12:25:02 +00009825 case VKI_KVM_SET_TSS_ADDR:
cborntra4ea8f142014-02-11 15:15:31 +00009826 case VKI_KVM_CREATE_IRQCHIP:
cborntra65bdbe42012-05-23 15:59:40 +00009827 case VKI_KVM_RUN:
9828 case VKI_KVM_S390_INITIAL_RESET:
cborntra9e431f02014-09-26 18:44:40 +00009829 case VKI_KVM_KVMCLOCK_CTRL:
cborntra65bdbe42012-05-23 15:59:40 +00009830 break;
9831
cborntra1a6714b2015-06-12 10:54:12 +00009832 case VKI_KVM_S390_MEM_OP: {
9833 struct vki_kvm_s390_mem_op *args =
9834 (struct vki_kvm_s390_mem_op *)(ARG3);
9835 if (args->flags & VKI_KVM_S390_MEMOP_F_CHECK_ONLY)
9836 break;
9837 if (args->op == VKI_KVM_S390_MEMOP_LOGICAL_READ)
9838 POST_MEM_WRITE((Addr)args->buf, args->size);
9839 }
9840 break;
9841
bart0ab84fe2012-09-09 18:30:17 +00009842#ifdef ENABLE_XEN
9843 case VKI_XEN_IOCTL_PRIVCMD_HYPERCALL: {
sewardj12d5abc2014-09-04 11:02:24 +00009844 SyscallArgs harrghs;
9845 struct vki_xen_privcmd_hypercall *args =
9846 (struct vki_xen_privcmd_hypercall *)(ARG3);
bart0ab84fe2012-09-09 18:30:17 +00009847
sewardj12d5abc2014-09-04 11:02:24 +00009848 if (!args)
9849 break;
bart0ab84fe2012-09-09 18:30:17 +00009850
sewardj12d5abc2014-09-04 11:02:24 +00009851 VG_(memset)(&harrghs, 0, sizeof(harrghs));
9852 harrghs.sysno = args->op;
9853 harrghs.arg1 = args->arg[0];
9854 harrghs.arg2 = args->arg[1];
9855 harrghs.arg3 = args->arg[2];
9856 harrghs.arg4 = args->arg[3];
9857 harrghs.arg5 = args->arg[4];
9858 harrghs.arg6 = harrghs.arg7 = harrghs.arg8 = 0;
bart0ab84fe2012-09-09 18:30:17 +00009859
sewardj12d5abc2014-09-04 11:02:24 +00009860 WRAPPER_POST_NAME(xen, hypercall) (tid, &harrghs, status);
9861 }
bart0ab84fe2012-09-09 18:30:17 +00009862 break;
bart0ab84fe2012-09-09 18:30:17 +00009863
9864 case VKI_XEN_IOCTL_PRIVCMD_MMAP:
9865 break;
9866 case VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH: {
9867 struct vki_xen_privcmd_mmapbatch *args =
9868 (struct vki_xen_privcmd_mmapbatch *)(ARG3);
9869 POST_MEM_WRITE((Addr)args->arr, sizeof(*(args->arr)) * args->num);
9870 }
9871 break;
9872 case VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2: {
9873 struct vki_xen_privcmd_mmapbatch_v2 *args =
9874 (struct vki_xen_privcmd_mmapbatch_v2 *)(ARG3);
9875 POST_MEM_WRITE((Addr)args->err, sizeof(*(args->err)) * args->num);
9876 }
9877 break;
sewardj12d5abc2014-09-04 11:02:24 +00009878
9879 case VKI_XEN_IOCTL_EVTCHN_BIND_VIRQ:
9880 case VKI_XEN_IOCTL_EVTCHN_BIND_INTERDOMAIN:
9881 case VKI_XEN_IOCTL_EVTCHN_BIND_UNBOUND_PORT:
9882 case VKI_XEN_IOCTL_EVTCHN_UNBIND:
9883 case VKI_XEN_IOCTL_EVTCHN_NOTIFY:
9884 case VKI_XEN_IOCTL_EVTCHN_RESET:
9885 /* No output */
9886 break;
bart0ab84fe2012-09-09 18:30:17 +00009887#endif
9888
bart2010b152015-04-21 17:46:52 +00009889 /* Lustre */
bart1fa9ee82014-08-05 12:01:26 +00009890 case VKI_OBD_IOC_FID2PATH: {
9891 struct vki_getinfo_fid2path *args = (void *)(ARG3);
bart2010b152015-04-21 17:46:52 +00009892 POST_FIELD_WRITE(args->gf_recno);
9893 POST_FIELD_WRITE(args->gf_linkno);
9894 POST_MEM_WRITE((Addr)args->gf_path, VG_(strlen)(args->gf_path)+1);
9895 break;
bart1fa9ee82014-08-05 12:01:26 +00009896 }
bart2010b152015-04-21 17:46:52 +00009897
9898 case VKI_LL_IOC_PATH2FID:
9899 POST_MEM_WRITE(ARG3, sizeof(struct vki_lu_fid));
bart1fa9ee82014-08-05 12:01:26 +00009900 break;
9901
bart2010b152015-04-21 17:46:52 +00009902 case VKI_LL_IOC_GETPARENT: {
9903 struct vki_getparent *gp = (struct vki_getparent *)ARG3;
9904 POST_FIELD_WRITE(gp->gp_fid);
9905 POST_MEM_WRITE((Addr)gp->gp_name, VG_(strlen)(gp->gp_name)+1);
9906 break;
9907 }
9908
sewardj66fbb212014-09-04 11:08:45 +00009909 /* V4L2 */
9910 case VKI_V4L2_S_FMT:
9911 case VKI_V4L2_TRY_FMT:
9912 case VKI_V4L2_REQBUFS:
9913 case VKI_V4L2_OVERLAY:
9914 case VKI_V4L2_STREAMON:
9915 case VKI_V4L2_STREAMOFF:
9916 case VKI_V4L2_S_PARM:
9917 case VKI_V4L2_S_STD:
9918 case VKI_V4L2_S_FREQUENCY:
9919 case VKI_V4L2_S_CTRL:
9920 case VKI_V4L2_S_TUNER:
9921 case VKI_V4L2_S_AUDIO:
9922 case VKI_V4L2_S_INPUT:
9923 case VKI_V4L2_S_EDID:
9924 case VKI_V4L2_S_OUTPUT:
9925 case VKI_V4L2_S_AUDOUT:
9926 case VKI_V4L2_S_MODULATOR:
9927 case VKI_V4L2_S_JPEGCOMP:
9928 case VKI_V4L2_S_CROP:
9929 case VKI_V4L2_S_PRIORITY:
sewardj66fbb212014-09-04 11:08:45 +00009930 case VKI_V4L2_S_HW_FREQ_SEEK:
9931 case VKI_V4L2_S_DV_TIMINGS:
9932 case VKI_V4L2_SUBSCRIBE_EVENT:
9933 case VKI_V4L2_UNSUBSCRIBE_EVENT:
9934 case VKI_V4L2_PREPARE_BUF:
9935 break;
9936 case VKI_V4L2_QUERYCAP: {
9937 struct vki_v4l2_capability *data = (struct vki_v4l2_capability *)ARG3;
9938 POST_MEM_WRITE((Addr)data, sizeof(*data));
9939 break;
9940 }
9941 case VKI_V4L2_ENUM_FMT: {
9942 struct vki_v4l2_fmtdesc *data = (struct vki_v4l2_fmtdesc *)ARG3;
9943 POST_FIELD_WRITE(data->flags);
9944 POST_FIELD_WRITE(data->description);
9945 POST_FIELD_WRITE(data->pixelformat);
9946 POST_FIELD_WRITE(data->reserved);
9947 break;
9948 }
9949 case VKI_V4L2_G_FMT: {
9950 struct vki_v4l2_format *data = (struct vki_v4l2_format *)ARG3;
9951 switch (data->type) {
9952 case VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE:
9953 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT:
9954 POST_FIELD_WRITE(data->fmt.pix);
9955 break;
9956 case VKI_V4L2_BUF_TYPE_VBI_CAPTURE:
9957 case VKI_V4L2_BUF_TYPE_VBI_OUTPUT:
9958 POST_FIELD_WRITE(data->fmt.vbi);
9959 break;
9960 case VKI_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
9961 case VKI_V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
9962 POST_FIELD_WRITE(data->fmt.sliced);
9963 break;
9964 case VKI_V4L2_BUF_TYPE_VIDEO_OVERLAY:
9965 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
9966 POST_FIELD_WRITE(data->fmt.win);
9967 break;
9968 case VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
9969 case VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
9970 POST_FIELD_WRITE(data->fmt.pix_mp);
9971 break;
9972 case VKI_V4L2_BUF_TYPE_SDR_CAPTURE:
9973 POST_FIELD_WRITE(data->fmt.sdr);
9974 break;
9975 }
9976 break;
9977 }
9978 case VKI_V4L2_QUERYBUF: {
9979 struct vki_v4l2_buffer *data = (struct vki_v4l2_buffer *)ARG3;
9980 if (data->type == VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||
9981 data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
9982 unsigned i;
9983
9984 for (i = 0; i < data->length; i++) {
9985 POST_FIELD_WRITE(data->m.planes[i].bytesused);
9986 POST_FIELD_WRITE(data->m.planes[i].length);
9987 POST_FIELD_WRITE(data->m.planes[i].m);
9988 POST_FIELD_WRITE(data->m.planes[i].data_offset);
9989 POST_FIELD_WRITE(data->m.planes[i].reserved);
9990 }
9991 } else {
9992 POST_FIELD_WRITE(data->m);
9993 POST_FIELD_WRITE(data->length);
9994 }
9995 POST_FIELD_WRITE(data->bytesused);
9996 POST_FIELD_WRITE(data->flags);
9997 POST_FIELD_WRITE(data->field);
9998 POST_FIELD_WRITE(data->timestamp);
9999 POST_FIELD_WRITE(data->timecode);
10000 POST_FIELD_WRITE(data->sequence);
10001 POST_FIELD_WRITE(data->memory);
10002 POST_FIELD_WRITE(data->sequence);
10003 break;
10004 }
10005 case VKI_V4L2_G_FBUF: {
10006 struct vki_v4l2_framebuffer *data = (struct vki_v4l2_framebuffer *)ARG3;
10007 POST_MEM_WRITE((Addr)data, sizeof(*data));
10008 break;
10009 }
10010 case VKI_V4L2_S_FBUF: {
10011 struct vki_v4l2_framebuffer *data = (struct vki_v4l2_framebuffer *)ARG3;
10012 POST_FIELD_WRITE(data->capability);
10013 POST_FIELD_WRITE(data->flags);
10014 POST_FIELD_WRITE(data->fmt);
10015 break;
10016 }
10017 case VKI_V4L2_QBUF: {
10018 struct vki_v4l2_buffer *data = (struct vki_v4l2_buffer *)ARG3;
10019
10020 if (data->type == VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||
10021 data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
10022 unsigned i;
10023
10024 for (i = 0; i < data->length; i++) {
10025 POST_FIELD_WRITE(data->m.planes[i].length);
10026 if (data->memory == VKI_V4L2_MEMORY_MMAP)
10027 POST_FIELD_WRITE(data->m.planes[i].m);
10028 }
10029 } else {
10030 if (data->memory == VKI_V4L2_MEMORY_MMAP)
10031 POST_FIELD_WRITE(data->m);
10032 POST_FIELD_WRITE(data->length);
10033 }
10034 break;
10035 }
10036 case VKI_V4L2_EXPBUF: {
10037 struct vki_v4l2_exportbuffer *data = (struct vki_v4l2_exportbuffer *)ARG3;
10038 POST_FIELD_WRITE(data->fd);
10039 break;
10040 }
10041 case VKI_V4L2_DQBUF: {
10042 struct vki_v4l2_buffer *data = (struct vki_v4l2_buffer *)ARG3;
10043 POST_FIELD_WRITE(data->index);
10044 POST_FIELD_WRITE(data->bytesused);
10045 POST_FIELD_WRITE(data->field);
10046 if (data->type == VKI_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||
10047 data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
10048 unsigned i;
10049
10050 for (i = 0; i < data->length; i++) {
10051 POST_FIELD_WRITE(data->m.planes[i].bytesused);
10052 POST_FIELD_WRITE(data->m.planes[i].data_offset);
10053 POST_FIELD_WRITE(data->m.planes[i].length);
10054 POST_FIELD_WRITE(data->m.planes[i].m);
10055 }
10056 } else {
10057 POST_FIELD_WRITE(data->m);
10058 POST_FIELD_WRITE(data->length);
10059 POST_FIELD_WRITE(data->bytesused);
10060 POST_FIELD_WRITE(data->field);
10061 }
10062 POST_FIELD_WRITE(data->timestamp);
10063 POST_FIELD_WRITE(data->timecode);
10064 POST_FIELD_WRITE(data->sequence);
10065 break;
10066 }
10067 case VKI_V4L2_G_PARM: {
10068 struct vki_v4l2_streamparm *data = (struct vki_v4l2_streamparm *)ARG3;
10069 int is_output = data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT ||
10070 data->type == VKI_V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ||
10071 data->type == VKI_V4L2_BUF_TYPE_VBI_OUTPUT ||
10072 data->type == VKI_V4L2_BUF_TYPE_SLICED_VBI_OUTPUT;
10073
10074 if (is_output)
10075 POST_MEM_WRITE((Addr)&data->parm.output,
10076 sizeof(data->parm.output) - sizeof(data->parm.output.reserved));
10077 else
10078 POST_MEM_WRITE((Addr)&data->parm.capture,
10079 sizeof(data->parm.capture) - sizeof(data->parm.capture.reserved));
10080 break;
10081 }
10082 case VKI_V4L2_G_STD: {
10083 vki_v4l2_std_id *data = (vki_v4l2_std_id *)ARG3;
10084 POST_MEM_WRITE((Addr)data, sizeof(*data));
10085 break;
10086 }
10087 case VKI_V4L2_ENUMSTD: {
10088 struct vki_v4l2_standard *data = (struct vki_v4l2_standard *)ARG3;
10089 POST_MEM_WRITE((Addr)&data->id, sizeof(*data) - sizeof(data->index));
10090 break;
10091 }
10092 case VKI_V4L2_ENUMINPUT: {
10093 struct vki_v4l2_input *data = (struct vki_v4l2_input *)ARG3;
10094 POST_MEM_WRITE((Addr)data->name, sizeof(*data) - sizeof(data->index));
10095 break;
10096 }
10097 case VKI_V4L2_G_CTRL: {
10098 struct vki_v4l2_control *data = (struct vki_v4l2_control *)ARG3;
10099 POST_FIELD_WRITE(data->value);
10100 break;
10101 }
10102 case VKI_V4L2_G_TUNER: {
10103 struct vki_v4l2_tuner *data = (struct vki_v4l2_tuner *)ARG3;
10104 POST_MEM_WRITE((Addr)data->name,
10105 sizeof(*data) - sizeof(data->index) - sizeof(data->reserved));
10106 break;
10107 }
10108 case VKI_V4L2_G_AUDIO: {
10109 struct vki_v4l2_audio *data = (struct vki_v4l2_audio *)ARG3;
sewardj0b8252d2015-05-22 10:40:42 +000010110 POST_MEM_WRITE((Addr)data,
10111 sizeof(*data) - sizeof(data->reserved));
sewardj66fbb212014-09-04 11:08:45 +000010112 break;
10113 }
10114 case VKI_V4L2_QUERYCTRL: {
10115 struct vki_v4l2_queryctrl *data = (struct vki_v4l2_queryctrl *)ARG3;
10116 POST_MEM_WRITE((Addr)&data->type,
10117 sizeof(*data) - sizeof(data->id));
10118 break;
10119 }
10120 case VKI_V4L2_QUERYMENU: {
10121 struct vki_v4l2_querymenu *data = (struct vki_v4l2_querymenu *)ARG3;
10122 POST_MEM_WRITE((Addr)data->name,
10123 sizeof(*data) - sizeof(data->id) - sizeof(data->index));
10124 break;
10125 }
10126 case VKI_V4L2_G_INPUT: {
10127 int *data = (int *)ARG3;
10128 POST_MEM_WRITE((Addr)data, sizeof(*data));
10129 break;
10130 }
10131 case VKI_V4L2_G_EDID: {
10132 struct vki_v4l2_edid *data = (struct vki_v4l2_edid *)ARG3;
10133 if (data->blocks && data->edid)
10134 POST_MEM_WRITE((Addr)data->edid, data->blocks * 128);
10135 break;
10136 }
10137 case VKI_V4L2_G_OUTPUT: {
10138 int *data = (int *)ARG3;
10139 POST_MEM_WRITE((Addr)data, sizeof(*data));
10140 break;
10141 }
10142 case VKI_V4L2_ENUMOUTPUT: {
10143 struct vki_v4l2_output *data = (struct vki_v4l2_output *)ARG3;
10144 POST_MEM_WRITE((Addr)data->name, sizeof(*data) - sizeof(data->index));
10145 break;
10146 }
10147 case VKI_V4L2_G_AUDOUT: {
10148 struct vki_v4l2_audioout *data = (struct vki_v4l2_audioout *)ARG3;
sewardj0b8252d2015-05-22 10:40:42 +000010149 POST_MEM_WRITE((Addr)data,
10150 sizeof(*data) - sizeof(data->reserved));
sewardj66fbb212014-09-04 11:08:45 +000010151 break;
10152 }
10153 case VKI_V4L2_G_MODULATOR: {
10154 struct vki_v4l2_modulator *data = (struct vki_v4l2_modulator *)ARG3;
10155 POST_MEM_WRITE((Addr)data->name,
10156 sizeof(*data) - sizeof(data->index) - sizeof(data->reserved));
10157 break;
10158 }
10159 case VKI_V4L2_G_FREQUENCY: {
10160 struct vki_v4l2_frequency *data = (struct vki_v4l2_frequency *)ARG3;
10161 POST_FIELD_WRITE(data->type);
10162 POST_FIELD_WRITE(data->frequency);
10163 break;
10164 }
10165 case VKI_V4L2_CROPCAP: {
10166 struct vki_v4l2_cropcap *data = (struct vki_v4l2_cropcap *)ARG3;
10167 POST_MEM_WRITE((Addr)&data->bounds, sizeof(*data) - sizeof(data->type));
10168 break;
10169 }
10170 case VKI_V4L2_G_CROP: {
10171 struct vki_v4l2_crop *data = (struct vki_v4l2_crop *)ARG3;
10172 POST_FIELD_WRITE(data->c);
10173 break;
10174 }
10175 case VKI_V4L2_G_JPEGCOMP: {
10176 struct vki_v4l2_jpegcompression *data = (struct vki_v4l2_jpegcompression *)ARG3;
10177 POST_MEM_WRITE((Addr)data, sizeof(*data));
10178 break;
10179 }
10180 case VKI_V4L2_QUERYSTD: {
10181 vki_v4l2_std_id *data = (vki_v4l2_std_id *)ARG3;
10182 POST_MEM_WRITE((Addr)data, sizeof(*data));
10183 break;
10184 }
10185 case VKI_V4L2_ENUMAUDIO: {
10186 struct vki_v4l2_audio *data = (struct vki_v4l2_audio *)ARG3;
10187 POST_MEM_WRITE((Addr)data->name,
10188 sizeof(*data) - sizeof(data->index) - sizeof(data->reserved));
10189 break;
10190 }
10191 case VKI_V4L2_ENUMAUDOUT: {
10192 struct vki_v4l2_audioout *data = (struct vki_v4l2_audioout *)ARG3;
10193 POST_MEM_WRITE((Addr)data->name,
10194 sizeof(*data) - sizeof(data->index) - sizeof(data->reserved));
10195 break;
10196 }
10197 case VKI_V4L2_G_PRIORITY: {
10198 __vki_u32 *data = (__vki_u32 *)ARG3;
10199 POST_MEM_WRITE((Addr)data, sizeof(*data));
10200 break;
10201 }
10202 case VKI_V4L2_G_SLICED_VBI_CAP: {
10203 struct vki_v4l2_sliced_vbi_cap *data = (struct vki_v4l2_sliced_vbi_cap *)ARG3;
10204 POST_MEM_WRITE((Addr)data,
10205 sizeof(*data) - sizeof(data->type) - sizeof(data->reserved));
10206 break;
10207 }
10208 case VKI_V4L2_G_EXT_CTRLS: {
10209 struct vki_v4l2_ext_controls *data = (struct vki_v4l2_ext_controls *)ARG3;
10210 if (data->count) {
10211 unsigned i;
10212
10213 for (i = 0; i < data->count; i++) {
10214 if (data->controls[i].size)
10215 POST_MEM_WRITE((Addr)data->controls[i].ptr, data->controls[i].size);
10216 else
10217 POST_FIELD_WRITE(data->controls[i].value64);
10218 }
10219 }
10220 POST_FIELD_WRITE(data->error_idx);
10221 break;
10222 }
10223 case VKI_V4L2_S_EXT_CTRLS: {
10224 struct vki_v4l2_ext_controls *data = (struct vki_v4l2_ext_controls *)ARG3;
10225 POST_FIELD_WRITE(data->error_idx);
10226 break;
10227 }
10228 case VKI_V4L2_TRY_EXT_CTRLS: {
10229 struct vki_v4l2_ext_controls *data = (struct vki_v4l2_ext_controls *)ARG3;
10230 POST_FIELD_WRITE(data->error_idx);
10231 break;
10232 }
10233 case VKI_V4L2_ENUM_FRAMESIZES: {
10234 struct vki_v4l2_frmsizeenum *data = (struct vki_v4l2_frmsizeenum *)ARG3;
10235 POST_FIELD_WRITE(data->type);
10236 POST_FIELD_WRITE(data->stepwise);
10237 break;
10238 }
10239 case VKI_V4L2_ENUM_FRAMEINTERVALS: {
10240 struct vki_v4l2_frmivalenum *data = (struct vki_v4l2_frmivalenum *)ARG3;
10241 POST_FIELD_WRITE(data->type);
10242 POST_FIELD_WRITE(data->stepwise);
10243 break;
10244 }
sewardj220f0a92015-06-05 11:25:32 +000010245 case VKI_V4L2_G_ENC_INDEX: {
10246 struct vki_v4l2_enc_idx *data = (struct vki_v4l2_enc_idx *)ARG3;
10247 POST_MEM_WRITE((Addr)data, sizeof(*data));
10248 break;
10249 }
sewardj66fbb212014-09-04 11:08:45 +000010250 case VKI_V4L2_ENCODER_CMD: {
10251 struct vki_v4l2_encoder_cmd *data = (struct vki_v4l2_encoder_cmd *)ARG3;
10252 POST_FIELD_WRITE(data->flags);
10253 break;
10254 }
10255 case VKI_V4L2_TRY_ENCODER_CMD: {
10256 struct vki_v4l2_encoder_cmd *data = (struct vki_v4l2_encoder_cmd *)ARG3;
10257 POST_FIELD_WRITE(data->flags);
10258 break;
10259 }
10260 case VKI_V4L2_DBG_S_REGISTER: {
10261 struct vki_v4l2_dbg_register *data = (struct vki_v4l2_dbg_register *)ARG3;
10262 POST_FIELD_WRITE(data->size);
10263 break;
10264 }
10265 case VKI_V4L2_DBG_G_REGISTER: {
10266 struct vki_v4l2_dbg_register *data = (struct vki_v4l2_dbg_register *)ARG3;
10267 POST_FIELD_WRITE(data->val);
10268 POST_FIELD_WRITE(data->size);
10269 break;
10270 }
10271 case VKI_V4L2_G_DV_TIMINGS: {
10272 struct vki_v4l2_dv_timings *data = (struct vki_v4l2_dv_timings *)ARG3;
10273 POST_MEM_WRITE((Addr)data, sizeof(*data));
10274 break;
10275 }
10276 case VKI_V4L2_DQEVENT: {
10277 struct vki_v4l2_event *data = (struct vki_v4l2_event *)ARG3;
10278 POST_MEM_WRITE((Addr)data, sizeof(*data));
10279 break;
10280 }
10281 case VKI_V4L2_CREATE_BUFS: {
10282 struct vki_v4l2_create_buffers *data = (struct vki_v4l2_create_buffers *)ARG3;
10283 POST_FIELD_WRITE(data->index);
10284 break;
10285 }
10286 case VKI_V4L2_G_SELECTION: {
10287 struct vki_v4l2_selection *data = (struct vki_v4l2_selection *)ARG3;
10288 POST_FIELD_WRITE(data->r);
10289 break;
10290 }
10291 case VKI_V4L2_S_SELECTION: {
10292 struct vki_v4l2_selection *data = (struct vki_v4l2_selection *)ARG3;
10293 POST_FIELD_WRITE(data->r);
10294 break;
10295 }
10296 case VKI_V4L2_DECODER_CMD: {
10297 struct vki_v4l2_decoder_cmd *data = (struct vki_v4l2_decoder_cmd *)ARG3;
10298 POST_FIELD_WRITE(data->flags);
10299 break;
10300 }
10301 case VKI_V4L2_TRY_DECODER_CMD: {
10302 struct vki_v4l2_decoder_cmd *data = (struct vki_v4l2_decoder_cmd *)ARG3;
10303 POST_FIELD_WRITE(data->flags);
10304 break;
10305 }
10306 case VKI_V4L2_ENUM_DV_TIMINGS: {
10307 struct vki_v4l2_enum_dv_timings *data = (struct vki_v4l2_enum_dv_timings *)ARG3;
10308 POST_FIELD_WRITE(data->timings);
10309 break;
10310 }
10311 case VKI_V4L2_QUERY_DV_TIMINGS: {
10312 struct vki_v4l2_dv_timings *data = (struct vki_v4l2_dv_timings *)ARG3;
10313 POST_MEM_WRITE((Addr)data, sizeof(*data));
10314 break;
10315 }
10316 case VKI_V4L2_DV_TIMINGS_CAP: {
10317 struct vki_v4l2_dv_timings_cap *data = (struct vki_v4l2_dv_timings_cap *)ARG3;
10318 POST_MEM_WRITE((Addr)data, sizeof(*data));
10319 break;
10320 }
10321 case VKI_V4L2_ENUM_FREQ_BANDS: {
10322 struct vki_v4l2_frequency_band *data = (struct vki_v4l2_frequency_band *)ARG3;
10323 POST_FIELD_WRITE(data->capability);
10324 POST_FIELD_WRITE(data->rangelow);
10325 POST_FIELD_WRITE(data->rangehigh);
10326 POST_FIELD_WRITE(data->modulation);
10327 break;
10328 }
10329 case VKI_V4L2_DBG_G_CHIP_INFO: {
10330 struct vki_v4l2_dbg_chip_info *data = (struct vki_v4l2_dbg_chip_info *)ARG3;
10331 POST_FIELD_WRITE(data->name);
10332 POST_FIELD_WRITE(data->flags);
10333 break;
10334 }
10335 case VKI_V4L2_QUERY_EXT_CTRL: {
10336 struct vki_v4l2_query_ext_ctrl *data = (struct vki_v4l2_query_ext_ctrl *)ARG3;
10337 POST_MEM_WRITE((Addr)&data->type,
10338 sizeof(*data) - sizeof(data->id) - sizeof(data->reserved));
10339 break;
10340 }
10341
10342 case VKI_V4L2_SUBDEV_S_FMT:
10343 case VKI_V4L2_SUBDEV_S_FRAME_INTERVAL:
10344 case VKI_V4L2_SUBDEV_S_CROP:
10345 case VKI_V4L2_SUBDEV_S_SELECTION:
10346 break;
10347
10348 case VKI_V4L2_SUBDEV_G_FMT: {
10349 struct vki_v4l2_subdev_format *data = (struct vki_v4l2_subdev_format *)ARG3;
10350 POST_FIELD_WRITE(data->format);
10351 break;
10352 }
10353 case VKI_V4L2_SUBDEV_G_FRAME_INTERVAL: {
10354 struct vki_v4l2_subdev_frame_interval *data = (struct vki_v4l2_subdev_frame_interval *)ARG3;
10355 POST_FIELD_WRITE(data->interval);
10356 break;
10357 }
10358 case VKI_V4L2_SUBDEV_ENUM_MBUS_CODE: {
10359 struct vki_v4l2_subdev_mbus_code_enum *data = (struct vki_v4l2_subdev_mbus_code_enum *)ARG3;
10360 POST_FIELD_WRITE(data->code);
10361 break;
10362 }
10363 case VKI_V4L2_SUBDEV_ENUM_FRAME_SIZE: {
10364 struct vki_v4l2_subdev_frame_size_enum *data = (struct vki_v4l2_subdev_frame_size_enum *)ARG3;
10365 POST_FIELD_WRITE(data->min_width);
10366 POST_FIELD_WRITE(data->min_height);
10367 POST_FIELD_WRITE(data->max_width);
10368 POST_FIELD_WRITE(data->max_height);
10369 break;
10370 }
10371 case VKI_V4L2_SUBDEV_ENUM_FRAME_INTERVAL: {
10372 struct vki_v4l2_subdev_frame_interval_enum *data = (struct vki_v4l2_subdev_frame_interval_enum *)ARG3;
10373 POST_FIELD_WRITE(data->interval);
10374 break;
10375 }
10376 case VKI_V4L2_SUBDEV_G_CROP: {
10377 struct vki_v4l2_subdev_crop *data = (struct vki_v4l2_subdev_crop *)ARG3;
10378 POST_FIELD_WRITE(data->rect);
10379 break;
10380 }
10381 case VKI_V4L2_SUBDEV_G_SELECTION: {
10382 struct vki_v4l2_subdev_selection *data = (struct vki_v4l2_subdev_selection *)ARG3;
10383 POST_FIELD_WRITE(data->r);
10384 break;
10385 }
10386 case VKI_MEDIA_IOC_DEVICE_INFO: {
10387 struct vki_media_device_info *data = (struct vki_media_device_info *)ARG3;
10388 POST_MEM_WRITE((Addr)data, sizeof(*data) - sizeof(data->reserved));
10389 break;
10390 }
10391 case VKI_MEDIA_IOC_ENUM_ENTITIES: {
10392 struct vki_media_entity_desc *data = (struct vki_media_entity_desc *)ARG3;
10393 POST_MEM_WRITE((Addr)data->name, sizeof(*data) - sizeof(data->id));
10394 break;
10395 }
10396 case VKI_MEDIA_IOC_ENUM_LINKS:
10397 /*
10398 * This ioctl does write to the provided pointers, but it's not
10399 * possible to deduce the size of the array those pointers point to.
10400 */
10401 break;
10402 case VKI_MEDIA_IOC_SETUP_LINK:
10403 break;
10404
sewardj55895372015-08-14 08:17:37 +000010405 /* Serial */
10406 case VKI_TIOCGSERIAL: {
10407 struct vki_serial_struct *data = (struct vki_serial_struct *)ARG3;
10408 POST_MEM_WRITE((Addr)data, sizeof(*data));
10409 break;
10410 }
10411 case VKI_TIOCSSERIAL:
10412 break;
10413
Elliott Hughesa0664b92017-04-18 17:46:52 -070010414 case VKI_PERF_EVENT_IOC_ENABLE:
10415 case VKI_PERF_EVENT_IOC_DISABLE:
10416 case VKI_PERF_EVENT_IOC_REFRESH:
10417 case VKI_PERF_EVENT_IOC_RESET:
10418 case VKI_PERF_EVENT_IOC_PERIOD:
10419 case VKI_PERF_EVENT_IOC_SET_OUTPUT:
10420 case VKI_PERF_EVENT_IOC_SET_FILTER:
10421 case VKI_PERF_EVENT_IOC_SET_BPF:
10422 break;
10423
10424 case VKI_PERF_EVENT_IOC_ID:
10425 POST_MEM_WRITE((Addr)ARG3, sizeof(__vki_u64));
10426 break;
10427
njn1be9cf62009-05-22 00:15:06 +000010428 default:
tom0ee313e2010-05-07 15:32:04 +000010429 /* EVIOC* are variable length and return size written on success */
10430 switch (ARG2 & ~(_VKI_IOC_SIZEMASK << _VKI_IOC_SIZESHIFT)) {
10431 case VKI_EVIOCGNAME(0):
10432 case VKI_EVIOCGPHYS(0):
10433 case VKI_EVIOCGUNIQ(0):
10434 case VKI_EVIOCGKEY(0):
10435 case VKI_EVIOCGLED(0):
10436 case VKI_EVIOCGSND(0):
10437 case VKI_EVIOCGSW(0):
10438 case VKI_EVIOCGBIT(VKI_EV_SYN,0):
10439 case VKI_EVIOCGBIT(VKI_EV_KEY,0):
10440 case VKI_EVIOCGBIT(VKI_EV_REL,0):
10441 case VKI_EVIOCGBIT(VKI_EV_ABS,0):
10442 case VKI_EVIOCGBIT(VKI_EV_MSC,0):
10443 case VKI_EVIOCGBIT(VKI_EV_SW,0):
10444 case VKI_EVIOCGBIT(VKI_EV_LED,0):
10445 case VKI_EVIOCGBIT(VKI_EV_SND,0):
10446 case VKI_EVIOCGBIT(VKI_EV_REP,0):
10447 case VKI_EVIOCGBIT(VKI_EV_FF,0):
10448 case VKI_EVIOCGBIT(VKI_EV_PWR,0):
10449 case VKI_EVIOCGBIT(VKI_EV_FF_STATUS,0):
10450 if (RES > 0)
10451 POST_MEM_WRITE(ARG3, RES);
10452 break;
10453 default:
10454 ML_(POST_unknown_ioctl)(tid, RES, ARG2, ARG3);
10455 break;
10456 }
njn096ccdd2009-02-22 23:00:30 +000010457 break;
10458 }
sewardj4450a0e2014-09-03 15:19:25 +000010459
10460 post_sys_ioctl__out:
10461 {} /* keep C compilers happy */
njn096ccdd2009-02-22 23:00:30 +000010462}
10463
10464/* ---------------------------------------------------------------------
njnf37a81b2009-02-17 00:23:30 +000010465 socketcall wrapper helpers
10466 ------------------------------------------------------------------ */
10467
10468void
10469ML_(linux_PRE_sys_getsockopt) ( ThreadId tid,
10470 UWord arg0, UWord arg1, UWord arg2,
10471 UWord arg3, UWord arg4 )
10472{
10473 /* int getsockopt(int s, int level, int optname,
10474 void *optval, socklen_t *optlen); */
10475 Addr optval_p = arg3;
10476 Addr optlen_p = arg4;
10477 /* vg_assert(sizeof(socklen_t) == sizeof(UInt)); */
10478 if (optval_p != (Addr)NULL) {
10479 ML_(buf_and_len_pre_check) ( tid, optval_p, optlen_p,
10480 "socketcall.getsockopt(optval)",
10481 "socketcall.getsockopt(optlen)" );
10482 if (arg1 == VKI_SOL_SCTP &&
10483 (arg2 == VKI_SCTP_GET_PEER_ADDRS ||
10484 arg2 == VKI_SCTP_GET_LOCAL_ADDRS))
10485 {
10486 struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
10487 int address_bytes = sizeof(struct vki_sockaddr_in6) * ga->addr_num;
10488 PRE_MEM_WRITE( "socketcall.getsockopt(optval.addrs)",
10489 (Addr)ga->addrs, address_bytes );
10490 }
10491 }
10492}
10493
10494void
10495ML_(linux_POST_sys_getsockopt) ( ThreadId tid,
10496 SysRes res,
10497 UWord arg0, UWord arg1, UWord arg2,
10498 UWord arg3, UWord arg4 )
10499{
10500 Addr optval_p = arg3;
10501 Addr optlen_p = arg4;
njncda2f0f2009-05-18 02:12:08 +000010502 vg_assert(!sr_isError(res)); /* guaranteed by caller */
njnf37a81b2009-02-17 00:23:30 +000010503 if (optval_p != (Addr)NULL) {
10504 ML_(buf_and_len_post_check) ( tid, res, optval_p, optlen_p,
10505 "socketcall.getsockopt(optlen_out)" );
10506 if (arg1 == VKI_SOL_SCTP &&
10507 (arg2 == VKI_SCTP_GET_PEER_ADDRS ||
10508 arg2 == VKI_SCTP_GET_LOCAL_ADDRS))
10509 {
10510 struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
10511 struct vki_sockaddr *a = ga->addrs;
10512 int i;
10513 for (i = 0; i < ga->addr_num; i++) {
10514 int sl = 0;
10515 if (a->sa_family == VKI_AF_INET)
10516 sl = sizeof(struct vki_sockaddr_in);
10517 else if (a->sa_family == VKI_AF_INET6)
10518 sl = sizeof(struct vki_sockaddr_in6);
10519 else {
sewardj738856f2009-07-15 14:48:32 +000010520 VG_(message)(Vg_UserMsg, "Warning: getsockopt: unhandled "
10521 "address type %d\n", a->sa_family);
njnf37a81b2009-02-17 00:23:30 +000010522 }
10523 a = (struct vki_sockaddr*)((char*)a + sl);
10524 }
10525 POST_MEM_WRITE( (Addr)ga->addrs, (char*)a - (char*)ga->addrs );
10526 }
10527 }
10528}
10529
tom70f71aa2013-07-17 14:36:57 +000010530void
10531ML_(linux_PRE_sys_setsockopt) ( ThreadId tid,
10532 UWord arg0, UWord arg1, UWord arg2,
10533 UWord arg3, UWord arg4 )
10534{
10535 /* int setsockopt(int s, int level, int optname,
10536 const void *optval, socklen_t optlen); */
10537 Addr optval_p = arg3;
10538 if (optval_p != (Addr)NULL) {
10539 /*
10540 * OK, let's handle at least some setsockopt levels and options
10541 * ourselves, so we don't get false claims of references to
10542 * uninitialized memory (such as padding in structures) and *do*
10543 * check what pointers in the argument point to.
10544 */
10545 if (arg1 == VKI_SOL_SOCKET && arg2 == VKI_SO_ATTACH_FILTER)
10546 {
10547 struct vki_sock_fprog *fp = (struct vki_sock_fprog *)optval_p;
10548
10549 /*
10550 * struct sock_fprog has a 16-bit count of instructions,
10551 * followed by a pointer to an array of those instructions.
10552 * There's padding between those two elements.
10553 *
10554 * So that we don't bogusly complain about the padding bytes,
10555 * we just report that we read len and and filter.
10556 *
10557 * We then make sure that what filter points to is valid.
10558 */
10559 PRE_MEM_READ( "setsockopt(SOL_SOCKET, SO_ATTACH_FILTER, &optval.len)",
10560 (Addr)&fp->len, sizeof(fp->len) );
10561 PRE_MEM_READ( "setsockopt(SOL_SOCKET, SO_ATTACH_FILTER, &optval.filter)",
10562 (Addr)&fp->filter, sizeof(fp->filter) );
10563
10564 /* len * sizeof (*filter) */
10565 if (fp->filter != NULL)
10566 {
10567 PRE_MEM_READ( "setsockopt(SOL_SOCKET, SO_ATTACH_FILTER, optval.filter)",
10568 (Addr)(fp->filter),
10569 fp->len * sizeof(*fp->filter) );
10570 }
10571 }
10572 else
10573 {
10574 PRE_MEM_READ( "socketcall.setsockopt(optval)",
10575 arg3, /* optval */
10576 arg4 /* optlen */ );
10577 }
10578 }
10579}
10580
mjwe3e61c52015-02-25 14:00:14 +000010581void
10582ML_(linux_PRE_sys_recvmmsg) ( ThreadId tid,
10583 UWord arg1, UWord arg2, UWord arg3,
10584 UWord arg4, UWord arg5 )
10585{
10586 struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)arg2;
10587 HChar name[40]; // large enough
10588 UInt i;
10589 for (i = 0; i < arg3; i++) {
10590 VG_(sprintf)(name, "mmsg[%u].msg_hdr", i);
10591 ML_(generic_PRE_sys_recvmsg)(tid, name, &mmsg[i].msg_hdr);
10592 VG_(sprintf)(name, "recvmmsg(mmsg[%u].msg_len)", i);
10593 PRE_MEM_WRITE( name, (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
10594 }
10595 if (arg5)
10596 PRE_MEM_READ( "recvmmsg(timeout)", arg5, sizeof(struct vki_timespec) );
10597}
10598
10599void
10600ML_(linux_POST_sys_recvmmsg) (ThreadId tid, UWord res,
10601 UWord arg1, UWord arg2, UWord arg3,
10602 UWord arg4, UWord arg5 )
10603{
10604 if (res > 0) {
10605 struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)arg2;
10606 HChar name[32]; // large enough
10607 UInt i;
10608 for (i = 0; i < res; i++) {
10609 VG_(sprintf)(name, "mmsg[%u].msg_hdr", i);
10610 ML_(generic_POST_sys_recvmsg)(tid, name, &mmsg[i].msg_hdr, mmsg[i].msg_len);
10611 POST_MEM_WRITE( (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
10612 }
10613 }
10614}
10615
10616void
10617ML_(linux_PRE_sys_sendmmsg) ( ThreadId tid,
10618 UWord arg1, UWord arg2, UWord arg3, UWord arg4 )
10619{
10620 struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)arg2;
10621 HChar name[40]; // large enough
10622 UInt i;
10623 for (i = 0; i < arg3; i++) {
10624 VG_(sprintf)(name, "mmsg[%u].msg_hdr", i);
10625 ML_(generic_PRE_sys_sendmsg)(tid, name, &mmsg[i].msg_hdr);
10626 VG_(sprintf)(name, "sendmmsg(mmsg[%u].msg_len)", i);
10627 PRE_MEM_WRITE( name, (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
10628 }
10629}
10630
10631void
10632ML_(linux_POST_sys_sendmmsg) (ThreadId tid, UWord res,
10633 UWord arg1, UWord arg2, UWord arg3, UWord arg4 )
10634{
10635 if (res > 0) {
10636 struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)arg2;
10637 UInt i;
10638 for (i = 0; i < res; i++) {
10639 POST_MEM_WRITE( (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
10640 }
10641 }
10642}
10643
cborntrae48a4442012-11-08 20:10:10 +000010644/* ---------------------------------------------------------------------
10645 ptrace wrapper helpers
10646 ------------------------------------------------------------------ */
10647
10648void
10649ML_(linux_PRE_getregset) ( ThreadId tid, long arg3, long arg4 )
10650{
10651 struct vki_iovec *iov = (struct vki_iovec *) arg4;
10652
10653 PRE_MEM_READ("ptrace(getregset iovec->iov_base)",
10654 (unsigned long) &iov->iov_base, sizeof(iov->iov_base));
10655 PRE_MEM_READ("ptrace(getregset iovec->iov_len)",
10656 (unsigned long) &iov->iov_len, sizeof(iov->iov_len));
10657 PRE_MEM_WRITE("ptrace(getregset *(iovec->iov_base))",
10658 (unsigned long) iov->iov_base, iov->iov_len);
10659}
10660
10661void
10662ML_(linux_PRE_setregset) ( ThreadId tid, long arg3, long arg4 )
10663{
10664 struct vki_iovec *iov = (struct vki_iovec *) arg4;
10665
10666 PRE_MEM_READ("ptrace(setregset iovec->iov_base)",
10667 (unsigned long) &iov->iov_base, sizeof(iov->iov_base));
10668 PRE_MEM_READ("ptrace(setregset iovec->iov_len)",
10669 (unsigned long) &iov->iov_len, sizeof(iov->iov_len));
10670 PRE_MEM_READ("ptrace(setregset *(iovec->iov_base))",
10671 (unsigned long) iov->iov_base, iov->iov_len);
10672}
10673
10674void
10675ML_(linux_POST_getregset) ( ThreadId tid, long arg3, long arg4 )
10676{
10677 struct vki_iovec *iov = (struct vki_iovec *) arg4;
10678
10679 /* XXX: The actual amount of data written by the kernel might be
10680 less than iov_len, depending on the regset (arg3). */
10681 POST_MEM_WRITE((unsigned long) iov->iov_base, iov->iov_len);
10682}
10683
sewardj2fee8702014-09-04 10:17:08 +000010684PRE(sys_kcmp)
10685{
florianb26101c2015-08-08 21:45:33 +000010686 PRINT("kcmp ( %ld, %ld, %ld, %lu, %lu )", SARG1, SARG2, SARG3, ARG4, ARG5);
sewardj01385052014-09-05 21:11:18 +000010687 switch (ARG3) {
10688 case VKI_KCMP_VM: case VKI_KCMP_FILES: case VKI_KCMP_FS:
10689 case VKI_KCMP_SIGHAND: case VKI_KCMP_IO: case VKI_KCMP_SYSVSEM:
10690 /* Most of the comparison types don't look at |idx1| or
10691 |idx2|. */
10692 PRE_REG_READ3(long, "kcmp",
10693 vki_pid_t, pid1, vki_pid_t, pid2, int, type);
10694 break;
10695 case VKI_KCMP_FILE:
10696 default:
10697 PRE_REG_READ5(long, "kcmp",
10698 vki_pid_t, pid1, vki_pid_t, pid2, int, type,
10699 unsigned long, idx1, unsigned long, idx2);
10700 break;
10701 }
sewardj2fee8702014-09-04 10:17:08 +000010702}
10703
sewardje6d5e722005-06-10 10:27:55 +000010704#undef PRE
10705#undef POST
nethercotefd453532004-11-17 17:21:12 +000010706
njn8b68b642009-06-24 00:37:09 +000010707#endif // defined(VGO_linux)
10708
nethercotefd453532004-11-17 17:21:12 +000010709/*--------------------------------------------------------------------*/
10710/*--- end ---*/
10711/*--------------------------------------------------------------------*/