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