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