1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Platform-specific syscalls stuff. syswrap-arm-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 12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Copyright (C) 2008-2011 Evan Geller 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gaze@bea.ms 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is free software; you can redistribute it and/or 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown modify it under the terms of the GNU General Public License as 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown published by the Free Software Foundation; either version 2 of the 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown License, or (at your option) any later version. 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is distributed in the hope that it will be useful, but 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown WITHOUT ANY WARRANTY; without even the implied warranty of 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown General Public License for more details. 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown You should have received a copy of the GNU General Public License 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown along with this program; if not, write to the Free Software 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 02111-1307, USA. 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The GNU General Public License is contained in the file COPYING. 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_arm_linux) 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_basics.h" 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vki.h" 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vkiscnums.h" 38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_threadstate.h" 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_aspacemgr.h" 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_debuglog.h" 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcbase.h" 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcassert.h" 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcprint.h" 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcproc.h" 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcsignal.h" 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_options.h" 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_scheduler.h" 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_sigframe.h" // For VG_(sigframe_destroy)() 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_signals.h" 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syscall.h" 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syswrap.h" 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_tooliface.h" 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_stacks.h" // VG_(register_stack) 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_transtab.h" // VG_(discard_translations) 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_types_n_macros.h" 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-generic.h" /* for decls of generic wrappers */ 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-linux.h" /* for decls of linux-ish wrappers */ 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-main.h" 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown clone() handling 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Call f(arg1), but first switch stacks, using 'stack' as the new 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stack, and use 'retaddr' as f's return-to address. Also, clear all 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the integer registers before entering f.*/ 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noreturn)) 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ML_(call_on_new_stack_0_1) ( Addr stack, 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr retaddr, 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*f)(Word), 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Word arg1 ); 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// r0 = stack 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// r1 = retaddr 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// r2 = f 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// r3 = arg1 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm( 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".text\n" 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".globl vgModuleLocal_call_on_new_stack_0_1\n" 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"vgModuleLocal_call_on_new_stack_0_1:\n" 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov sp,r0\n\t" /* Stack pointer */ 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov lr,r1\n\t" /* Return address */ 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r0,r3\n\t" /* First argument */ 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" push {r2}\n\t" /* So we can ret to the new dest */ 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r1, #0\n\t" /* Clear our GPRs */ 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r2, #0\n\t" 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r3, #0\n\t" 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r4, #0\n\t" 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r5, #0\n\t" 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r6, #0\n\t" 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r7, #0\n\t" 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r8, #0\n\t" 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r9, #0\n\t" 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r10, #0\n\t" 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r11, #0\n\t" 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r12, #0\n\t" 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" pop {pc}\n\t" /* Herrre we go! */ 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".previous\n" 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown); 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_CLONE VG_STRINGIFY(__NR_clone) 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_EXIT VG_STRINGIFY(__NR_exit) 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong do_syscall_clone_arm_linux ( Word (*fn)(void *), 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* stack, 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int flags, 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* arg, 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int* child_tid, 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int* parent_tid, 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* tls ); 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm( 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".text\n" 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"do_syscall_clone_arm_linux:\n" 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*Setup child stack */ 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" str r0, [r1, #-4]!\n" 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" str r3, [r1, #-4]!\n" 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" push {r4,r7}\n" 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r0, r2\n" /* arg1: flags */ 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* r1 (arg2) is already our child's stack */ 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ldr r2, [sp, #12]\n" // parent tid 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ldr r3, [sp, #16]\n" // tls 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ldr r4, [sp, #8]\n" // Child tid 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r7, #"__NR_CLONE"\n" 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" svc 0x00000000\n" 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" cmp r0, #0\n" 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" beq 1f\n" 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Parent */ 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" pop {r4,r7}\n" 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" bx lr\n" 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"1:\n" /*child*/ 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov lr, pc\n" 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" pop {r0,pc}\n" 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Retval from child is already in r0 */ 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mov r7, #"__NR_EXIT"\n" 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" svc 0x00000000\n" 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Urh.. why did exit return? */ 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .long 0\n" 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .previous\n" 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown); 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_CLONE 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_EXIT 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// forward declarations 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void setup_child ( ThreadArchState*, ThreadArchState* ); 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes sys_set_tls ( ThreadId tid, Addr tlsptr ); 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown When a client clones, we need to keep track of the new thread. This means: 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1. allocate a ThreadId+ThreadState+stack for the the thread 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2. initialize the thread's new VCPU state 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3. create the thread using the same args as the client requested, 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown but using the scheduler entrypoint for IP, and a separate stack 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for SP. 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes do_clone ( ThreadId ptid, 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt flags, Addr sp, 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int *parent_tidptr, 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int *child_tidptr, 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr child_tls) 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const Bool debug = False; 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadId ctid = VG_(alloc_ThreadState)(); 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* ptst = VG_(get_ThreadState)(ptid); 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* ctst = VG_(get_ThreadState)(ctid); 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r0; 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UWord *stack; 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NSegment const* seg; 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes res; 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vki_sigset_t blockall, savedmask; 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigfillset)(&blockall); 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_running_thread)(ptid)); 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_valid_tid)(ctid)); 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stack = (UWord*)ML_(allocstack)(ctid); 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if(stack == NULL) { 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown res = VG_(mk_SysRes_Error)( VKI_ENOMEM ); 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto out; 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown setup_child( &ctst->arch, &ptst->arch ); 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->arch.vex.guest_R0 = 0; 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if(sp != 0) 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->arch.vex.guest_R13 = sp; 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->os_state.parent = ptid; 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->sig_mask = ptst->sig_mask; 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->tmp_sig_mask = ptst->sig_mask; 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Start the child with its threadgroup being the same as the 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown parent's. This is so that any exit_group calls that happen 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown after the child is created but before it sets its 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown os_state.threadgroup field for real (in thread_wrapper in 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown syswrap-linux.c), really kill the new thread. a.k.a this avoids 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown a race condition in which the thread is unkillable (via 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit_group) because its threadgroup is not set. The race window 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is probably only a few hundred or a few thousand cycles long. 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown See #226116. */ 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->os_state.threadgroup = ptst->os_state.threadgroup; 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown seg = VG_(am_find_nsegment)((Addr)sp); 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (seg && seg->kind != SkResvn) { 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp); 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start; 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(register_stack)(seg->start, ctst->client_stack_highest_word); 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (debug) 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n", 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctid, seg->start, VG_PGROUNDUP(sp)); 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, "!? New thread %d starts with sp+%#lx) unmapped\n", ctid, sp); 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_szB = 0; 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_TRACK ( pre_thread_ll_create, ptid, ctid ); 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (flags & VKI_CLONE_SETTLS) { 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown res = sys_set_tls(ctid, child_tls); 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sr_isError(res)) 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto out; 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown flags &= ~VKI_CLONE_SETTLS; 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask); 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r0 = do_syscall_clone_arm_linux( 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid], 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child_tidptr, parent_tidptr, NULL 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ); 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //VG_(printf)("AFTER SYSCALL, %x and %x CHILD: %d PARENT: %d\n",child_tidptr, parent_tidptr,*child_tidptr,*parent_tidptr); 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown res = VG_(mk_SysRes_arm_linux)( r0 ); 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL); 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownout: 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sr_isError(res)) { 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(cleanup_thread)(&ctst->arch); 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->status = VgTs_Empty; 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_TRACK( pre_thread_ll_exit, ctid ); 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return res; 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown More thread stuff 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// ARM doesn't have any architecture specific thread stuff that 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// needs to be cleaned up 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(cleanup_thread) ( ThreadArchState* arch ) 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid setup_child ( /*OUT*/ ThreadArchState *child, 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*IN*/ ThreadArchState *parent ) 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex = parent->vex; 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex_shadow1 = parent->vex_shadow1; 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex_shadow2 = parent->vex_shadow2; 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes sys_set_tls ( ThreadId tid, Addr tlsptr ) 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(threads)[tid].arch.vex.guest_TPIDRURO = tlsptr; 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return VG_(mk_SysRes_Success)( 0 ); 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE/POST wrappers for arm/Linux-specific syscalls 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE(name) DEFN_PRE_TEMPLATE(arm_linux, name) 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST(name) DEFN_POST_TEMPLATE(arm_linux, name) 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add prototypes for the wrappers declared here, so that gcc doesn't 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown harass us for not having prototypes. Really this is a kludge -- 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the right thing to do is to make these wrappers 'static' since they 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown aren't visible outside this file, but that requires even more macro 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown magic. */ 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_socketcall); 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_socket); 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_setsockopt); 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_getsockopt); 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_connect); 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_accept); 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_sendto); 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_recvfrom); 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//XXX: Semaphore code ripped from AMD64. 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_semget); 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_semop); 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_semctl); 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_semtimedop); 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//XXX: Shared memory code ripped from AMD64 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, wrap_sys_shmat); 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_shmget); 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_shmdt); 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_shmctl); 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_sendmsg); 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_recvmsg); 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//msg* code from AMD64 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_msgget); 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_msgrcv); 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_msgsnd); 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_msgctl); 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_shutdown); 329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_bind); 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_listen); 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_getsockname); 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_getpeername); 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_socketpair); 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_send); 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_recv); 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_mmap2); 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_stat64); 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_lstat64); 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_fstatat64); 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_fstat64); 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_clone); 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_sigreturn); 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_rt_sigreturn); 344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(arm_linux, sys_sigsuspend); 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_set_tls); 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_cacheflush); 347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(arm_linux, sys_ptrace); 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_socketcall) 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_0 (((UWord*)ARG2)[0]) 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_1 (((UWord*)ARG2)[1]) 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_2 (((UWord*)ARG2)[2]) 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_3 (((UWord*)ARG2)[3]) 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_4 (((UWord*)ARG2)[4]) 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_5 (((UWord*)ARG2)[5]) 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2); 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args); 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (ARG1 /* request */) { 363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SOCKETPAIR: 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int socketpair(int d, int type, int protocol, int sv[2]); */ 366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) ); 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 ); 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SOCKET: 371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int socket(int domain, int type, int protocol); */ 372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) ); 373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_BIND: 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int bind(int sockfd, struct sockaddr *my_addr, 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int addrlen); */ 378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) ); 379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 ); 380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_LISTEN: 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int listen(int s, int backlog); */ 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) ); 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_ACCEPT: { 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int accept(int s, struct sockaddr *addr, int *addrlen); */ 389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) ); 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 ); 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SENDTO: 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int sendto(int s, const void *msg, int len, 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned int flags, 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const struct sockaddr *to, int tolen); */ 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) ); 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2, 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_3, ARG2_4, ARG2_5 ); 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SEND: 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int send(int s, const void *msg, size_t len, int flags); */ 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) ); 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 ); 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_RECVFROM: 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int recvfrom(int s, void *buf, int len, unsigned int flags, 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct sockaddr *from, int *fromlen); */ 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) ); 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2, 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_3, ARG2_4, ARG2_5 ); 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_RECV: 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int recv(int s, void *buf, int len, unsigned int flags); */ 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* man 2 recv says: 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The recv call is normally used only on a connected socket 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (see connect(2)) and is identical to recvfrom with a NULL 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown from parameter. 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) ); 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 ); 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_CONNECT: 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int connect(int sockfd, 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct sockaddr *serv_addr, int addrlen ); */ 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) ); 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 ); 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SETSOCKOPT: 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int setsockopt(int s, int level, int optname, 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const void *optval, int optlen); */ 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) ); 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2, 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_3, ARG2_4 ); 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_GETSOCKOPT: 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int getsockopt(int s, int level, int optname, 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *optval, socklen_t *optlen); */ 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) ); 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2, 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_3, ARG2_4 ); 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_GETSOCKNAME: 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int getsockname(int s, struct sockaddr* name, int* namelen) */ 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) ); 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 ); 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_GETPEERNAME: 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int getpeername(int s, struct sockaddr* name, int* namelen) */ 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) ); 460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 ); 461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SHUTDOWN: 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int shutdown(int s, int how); */ 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) ); 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SENDMSG: { 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int sendmsg(int s, const struct msghdr *msg, int flags); */ 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* this causes warnings, and I don't get why. glibc bug? 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * (after all it's glibc providing the arguments array) 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) ); 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 ); 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_RECVMSG: { 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int recvmsg(int s, struct msghdr *msg, int flags); */ 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* this causes warnings, and I don't get why. glibc bug? 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * (after all it's glibc providing the arguments array) 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) ); 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 ); 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx",ARG1); 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EINVAL ); 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_0 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_1 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_2 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_3 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_4 500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_5 501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_socketcall) 504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_0 (((UWord*)ARG2)[0]) 506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_1 (((UWord*)ARG2)[1]) 507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_2 (((UWord*)ARG2)[2]) 508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_3 (((UWord*)ARG2)[3]) 509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_4 (((UWord*)ARG2)[4]) 510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define ARG2_5 (((UWord*)ARG2)[5]) 511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes r; 513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (ARG1 /* request */) { 515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SOCKETPAIR: 517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_POST_sys_socketpair)( 518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tid, VG_(mk_SysRes_Success)(RES), 519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_0, ARG2_1, ARG2_2, ARG2_3 520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ); 521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SOCKET: 525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) ); 526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_BIND: 530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int bind(int sockfd, struct sockaddr *my_addr, 531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int addrlen); */ 532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_LISTEN: 535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int listen(int s, int backlog); */ 536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_ACCEPT: 539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* int accept(int s, struct sockaddr *addr, int *addrlen); */ 540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES), 541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_0, ARG2_1, ARG2_2 ); 542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SENDTO: 546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SEND: 549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_RECVFROM: 552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES), 553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_0, ARG2_1, ARG2_2, 554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_3, ARG2_4, ARG2_5 ); 555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_RECV: 558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 ); 559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_CONNECT: 562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SETSOCKOPT: 565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_GETSOCKOPT: 568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES), 569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_0, ARG2_1, 570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_2, ARG2_3, ARG2_4 ); 571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_GETSOCKNAME: 574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES), 575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_0, ARG2_1, ARG2_2 ); 576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_GETPEERNAME: 579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES), 580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2_0, ARG2_1, ARG2_2 ); 581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SHUTDOWN: 584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_SENDMSG: 587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SYS_RECVMSG: 590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 ); 591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx",ARG1); 595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(core_panic)("... bye!\n"); 596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; /*NOTREACHED*/ 597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_0 599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_1 600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_2 601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_3 602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_4 603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# undef ARG2_5 604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_socket) 607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_socket ( %ld, %ld, %ld )",ARG1,ARG2,ARG3); 609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "socket", int, domain, int, type, int, protocol); 610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_socket) 612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes r; 614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_POST_sys_socket)(tid, VG_(mk_SysRes_Success)(RES)); 616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setsockopt) 620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_setsockopt ( %ld, %ld, %ld, %#lx, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5); 622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ5(long, "setsockopt", 623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, int, level, int, optname, 624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const void *, optval, int, optlen); 625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_setsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5); 626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getsockopt) 629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_getsockopt ( %ld, %ld, %ld, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5); 631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ5(long, "getsockopt", 632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, int, level, int, optname, 633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *, optval, int, *optlen); 634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_PRE_sys_getsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5); 635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getsockopt) 637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_POST_sys_getsockopt)(tid, VG_(mk_SysRes_Success)(RES), 640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3,ARG4,ARG5); 641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_connect) 644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_connect ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "connect", 648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, sockfd, struct sockaddr *, serv_addr, int, addrlen); 649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_connect)(tid, ARG1,ARG2,ARG3); 650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_accept) 653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_accept ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "accept", 657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, struct sockaddr *, addr, int, *addrlen); 658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3); 659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_accept) 661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes r; 663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES), 665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3); 666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sendto) 670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_sendto ( %ld, %#lx, %ld, %lu, %#lx, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5,ARG6); 673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ6(long, "sendto", 674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, const void *, msg, int, len, 675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned int, flags, 676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const struct sockaddr *, to, int, tolen); 677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_sendto)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6); 678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_recvfrom) 681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_recvfrom ( %ld, %#lx, %ld, %lu, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5,ARG6); 684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ6(long, "recvfrom", 685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, void *, buf, int, len, unsigned int, flags, 686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct sockaddr *, from, int *, fromlen); 687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_recvfrom)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6); 688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_recvfrom) 690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_recvfrom)(tid, VG_(mk_SysRes_Success)(RES), 693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3,ARG4,ARG5,ARG6); 694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sendmsg) 697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_sendmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "sendmsg", 701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, const struct msghdr *, msg, int, flags); 702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_sendmsg)(tid, ARG1,ARG2); 703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_recvmsg) 706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_recvmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "recvmsg", int, s, struct msghdr *, msg, int, flags); 710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_recvmsg)(tid, ARG1,ARG2); 711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_recvmsg) 713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_recvmsg)(tid, ARG1,ARG2); 715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//XXX: Semaphore code ripped from AMD64. 718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semget) 719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3); 721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "semget", vki_key_t, key, int, nsems, int, semflg); 722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semop) 725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semop ( %ld, %#lx, %lu )",ARG1,ARG2,ARG3); 728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "semop", 729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, struct sembuf *, sops, unsigned, nsoops); 730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_semop)(tid, ARG1,ARG2,ARG3); 731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semctl) 734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (ARG3 & ~VKI_IPC_64) { 736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_IPC_INFO: 737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SEM_INFO: 738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4); 739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "semctl", 740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, int, semnum, int, cmd, struct seminfo *, arg); 741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_IPC_STAT: 743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SEM_STAT: 744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_IPC_SET: 745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4); 746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "semctl", 747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, int, semnum, int, cmd, struct semid_ds *, arg); 748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_GETALL: 750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SETALL: 751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4); 752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "semctl", 753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, int, semnum, int, cmd, unsigned short *, arg); 754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semctl ( %ld, %ld, %ld )",ARG1,ARG2,ARG3); 757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "semctl", 758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, int, semnum, int, cmd); 759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_semctl)(tid, ARG1,ARG2,ARG3,ARG4); 762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_semctl) 765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_semctl)(tid, RES,ARG1,ARG2,ARG3,ARG4); 767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semtimedop) 770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semtimedop ( %ld, %#lx, %lu, %#lx )",ARG1,ARG2,ARG3,ARG4); 773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "semtimedop", 774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, struct sembuf *, sops, unsigned, nsoops, 775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct timespec *, timeout); 776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_semtimedop)(tid, ARG1,ARG2,ARG3,ARG4); 777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//amd64 780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgget) 781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_msgget ( %ld, %ld )",ARG1,ARG2); 783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(long, "msgget", vki_key_t, key, int, msgflg); 784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgsnd) 787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_msgsnd ( %ld, %#lx, %ld, %ld )",ARG1,ARG2,ARG3,ARG4); 789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "msgsnd", 790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz, int, msgflg); 791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_PRE_sys_msgsnd)(tid, ARG1,ARG2,ARG3,ARG4); 792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((ARG4 & VKI_IPC_NOWAIT) == 0) 793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgrcv) 797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_msgrcv ( %ld, %#lx, %ld, %ld, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5); 799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ5(long, "msgrcv", 800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz, 801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown long, msgytp, int, msgflg); 802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_PRE_sys_msgrcv)(tid, ARG1,ARG2,ARG3,ARG4,ARG5); 803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((ARG4 & VKI_IPC_NOWAIT) == 0) 804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_msgrcv) 807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_POST_sys_msgrcv)(tid, RES,ARG1,ARG2,ARG3,ARG4,ARG5); 809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgctl) 813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_msgctl ( %ld, %ld, %#lx )",ARG1,ARG2,ARG3); 815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "msgctl", 816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, msqid, int, cmd, struct msqid_ds *, buf); 817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_PRE_sys_msgctl)(tid, ARG1,ARG2,ARG3); 818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_msgctl) 820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_POST_sys_msgctl)(tid, RES,ARG1,ARG2,ARG3); 822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//shared memory code from AMD64 825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmget) 826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_shmget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3); 828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "shmget", vki_key_t, key, vki_size_t, size, int, shmflg); 829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(wrap_sys_shmat) 832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UWord arg2tmp; 834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("wrap_sys_shmat ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "shmat", 836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, shmid, const void *, shmaddr, int, shmflg); 837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Round the attach address down to an VKI_SHMLBA boundary if the 838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown client requested rounding. See #222545. This is necessary only 839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown on arm-linux because VKI_SHMLBA is 4 * VKI_PAGE size; on all 840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown other linux targets it is the same as the page size. */ 841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG3 & VKI_SHM_RND) 842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2 = VG_ROUNDDN(ARG2, VKI_SHMLBA); 843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown arg2tmp = ML_(generic_PRE_sys_shmat)(tid, ARG1,ARG2,ARG3); 844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (arg2tmp == 0) 845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EINVAL ); 846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2 = arg2tmp; 848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(wrap_sys_shmat) 851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_shmat)(tid, RES,ARG1,ARG2,ARG3); 853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmdt) 856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_shmdt ( %#lx )",ARG1); 858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ1(long, "shmdt", const void *, shmaddr); 859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!ML_(generic_PRE_sys_shmdt)(tid, ARG1)) 860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EINVAL ); 861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_shmdt) 864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_shmdt)(tid, RES,ARG1); 866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmctl) 869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_shmctl ( %ld, %ld, %#lx )",ARG1,ARG2,ARG3); 871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "shmctl", 872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, shmid, int, cmd, struct shmid_ds *, buf); 873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_shmctl)(tid, ARG1,ARG2,ARG3); 874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_shmctl) 877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_shmctl)(tid, RES,ARG1,ARG2,ARG3); 879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shutdown) 882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_shutdown ( %ld, %ld )",ARG1,ARG2); 885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(int, "shutdown", int, s, int, how); 886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_bind) 889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_bind ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "bind", 892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, sockfd, struct sockaddr *, my_addr, int, addrlen); 893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_bind)(tid, ARG1,ARG2,ARG3); 894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_listen) 897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_listen ( %ld, %ld )",ARG1,ARG2); 899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(long, "listen", int, s, int, backlog); 900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getsockname) 903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_getsockname ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3); 905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "getsockname", 906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, struct sockaddr *, name, int *, namelen); 907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_getsockname)(tid, ARG1,ARG2,ARG3); 908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getsockname) 910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_getsockname)(tid, VG_(mk_SysRes_Success)(RES), 913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3); 914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getpeername) 917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_getpeername ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3); 919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "getpeername", 920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, struct sockaddr *, name, int *, namelen); 921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_getpeername)(tid, ARG1,ARG2,ARG3); 922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getpeername) 924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_getpeername)(tid, VG_(mk_SysRes_Success)(RES), 927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3); 928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_socketpair) 931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_socketpair ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4); 933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "socketpair", 934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, d, int, type, int, protocol, int*, sv); 935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_socketpair)(tid, ARG1,ARG2,ARG3,ARG4); 936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_socketpair) 938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_socketpair)(tid, VG_(mk_SysRes_Success)(RES), 941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3,ARG4); 942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_send) 945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_send ( %ld, %#lx, %ld, %lu )",ARG1,ARG2,ARG3,ARG4); 948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "send", 949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, const void *, msg, int, len, 950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned int, flags); 951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_send)( tid, ARG1, ARG2, ARG3 ); 953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_recv) 956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_recv ( %ld, %#lx, %ld, %lu )",ARG1,ARG2,ARG3,ARG4); 959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "recv", 960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, void *, buf, int, len, unsigned int, flags); 961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_recv)( tid, ARG1, ARG2, ARG3 ); 962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_recv) 965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_recv)( tid, RES, ARG1, ARG2, ARG3 ); 967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mmap2) 970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes r; 972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Exactly like old_mmap() except: 974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // - all 6 args are passed in regs, rather than in a memory-block. 975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // - the file offset is specified in pagesize units rather than bytes, 976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // so that it can be used for files bigger than 2^32 bytes. 977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // pagesize or 4K-size units in offset? For ppc32/64-linux, this is 978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // 4K-sized. Assert that the page size is 4K here for safety. 979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VKI_PAGE_SIZE == 4096); 980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_mmap2 ( %#lx, %llu, %ld, %ld, %ld, %ld )", 981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 ); 982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ6(long, "mmap2", 983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, start, unsigned long, length, 984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, prot, unsigned long, flags, 985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, fd, unsigned long, offset); 986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, 988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4096 * (Off64T)ARG6 ); 989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// XXX: lstat64/fstat64/stat64 are generic, but not necessarily 993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// applicable to every architecture -- I think only to 32-bit archs. 994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// We're going to need something like linux/core_os32.h for such 995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// things, eventually, I think. --njn 996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_lstat64) 997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_lstat64 ( %#lx(%s), %#lx )",ARG1,(char*)ARG1,ARG2); 999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf); 1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 ); 1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) ); 1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_lstat64) 1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (RES == 0) { 1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_stat64) 1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_stat64 ( %#lx(%s), %#lx )",ARG1,(char*)ARG1,ARG2); 1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf); 1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 ); 1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) ); 1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_stat64) 1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fstatat64) 1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_fstatat64 ( %ld, %#lx(%s), %#lx )",ARG1,ARG2,(char*)ARG2,ARG3); 1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "fstatat64", 1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, dfd, char *, file_name, struct stat64 *, buf); 1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_RASCIIZ( "fstatat64(file_name)", ARG2 ); 1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "fstatat64(buf)", ARG3, sizeof(struct vki_stat64) ); 1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_fstatat64) 1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) ); 1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fstat64) 1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_fstat64 ( %ld, %#lx )",ARG1,ARG2); 1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf); 1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) ); 1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_fstat64) 1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clone) 1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt cloneflags; 1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5); 1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ5(int, "clone", 1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, flags, 1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *, child_stack, 1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int *, parent_tidptr, 1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *, child_tls, 1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int *, child_tidptr); 1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & VKI_CLONE_PARENT_SETTID) { 1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int)); 1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int), 1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VKI_PROT_WRITE)) { 1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EFAULT ); 1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) { 1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int)); 1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int), 1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VKI_PROT_WRITE)) { 1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EFAULT ); 1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & VKI_CLONE_SETTLS) { 1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ("clone(tls_user_desc)", ARG4, sizeof(vki_modify_ldt_t)); 1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!VG_(am_is_valid_for_client)(ARG4, sizeof(vki_modify_ldt_t), 1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VKI_PROT_READ)) { 1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EFAULT ); 1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags = ARG1; 1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) { 1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EINVAL ); 1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Only look at the flags we really care about */ 1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS 1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown | VKI_CLONE_FILES | VKI_CLONE_VFORK)) { 1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES: 1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* thread creation */ 1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes( 1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do_clone(tid, 1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1, /* flags */ 1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Addr)ARG2, /* child ESP */ 1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG3, /* parent_tidptr */ 1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG5, /* child_tidptr */ 1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Addr)ARG4)); /* set_tls */ 1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */ 1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* FALLTHROUGH - assume vfork == fork */ 1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM); 1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 0: /* plain fork */ 1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes( 1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(do_fork_clone)(tid, 1116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags, /* flags */ 1117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG3, /* parent_tidptr */ 1118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG5)); /* child_tidptr */ 1119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 1120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 1122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* should we just ENOSYS? */ 1123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, ""); 1124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx", ARG1); 1125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, ""); 1126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, "The only supported clone() uses are:"); 1127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)"); 1128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork"); 1129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, " - for the Quadrics Elan3 user-space driver"); 1130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(unimplemented) 1131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ("Valgrind does not support general clone()."); 1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (SUCCESS) { 1135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & VKI_CLONE_PARENT_SETTID) 1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE(ARG3, sizeof(Int)); 1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) 1138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE(ARG5, sizeof(Int)); 1139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Thread creation was successful; let the child have the chance 1141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown to run */ 1142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfYieldAfter; 1143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sigreturn) 1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for 1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown an explanation of what follows. */ 1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_sigreturn ( )"); 1152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_valid_tid)(tid)); 1154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(tid >= 1 && tid < VG_N_THREADS); 1155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_running_thread)(tid)); 1156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Restore register state from frame and remove it */ 1158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigframe_destroy)(tid, False); 1159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Tell the driver not to update the guest state with the "result", 1161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and set a bogus result to keep it happy. */ 1162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfNoWriteResult; 1163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Success(0); 1164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Check to see if any signals arose as a result of this. */ 1166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfPollAfter; 1167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigreturn) 1170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for 1172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown an explanation of what follows. */ 1173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("rt_sigreturn ( )"); 1175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_valid_tid)(tid)); 1177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(tid >= 1 && tid < VG_N_THREADS); 1178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_running_thread)(tid)); 1179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Restore register state from frame and remove it */ 1181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigframe_destroy)(tid, True); 1182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Tell the driver not to update the guest state with the "result", 1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and set a bogus result to keep it happy. */ 1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfNoWriteResult; 1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Success(0); 1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Check to see if any signals arose as a result of this. */ 1189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfPollAfter; 1190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* NB: clone of x86-linux version, and ppc32-linux has an almost 1193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov identical one. */ 1194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_sigsuspend) 1195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 1196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* The C library interface to sigsuspend just takes a pointer to 1197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov a signal mask but this system call has three arguments - the first 1198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov two don't appear to be used by the kernel and are always passed as 1199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov zero by glibc and the third is the first word of the signal mask 1200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov so only 32 signals are supported. 1201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov In fact glibc normally uses rt_sigsuspend if it is available as 1203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov that takes a pointer to the signal mask so supports more signals. 1204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */ 1205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *flags |= SfMayBlock; 1206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRINT("sys_sigsuspend ( %ld, %ld, %ld )", ARG1,ARG2,ARG3 ); 1207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_REG_READ3(int, "sigsuspend", 1208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int, history0, int, history1, 1209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vki_old_sigset_t, mask); 1210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 1211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Very much ARM specific */ 1213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_set_tls) 1215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ1(long, "set_tls", unsigned long, addr); 1217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes( sys_set_tls( tid, ARG1 ) ); 1219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_cacheflush) 1222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("cacheflush (%lx, %#lx, %#lx)",ARG1,ARG2,ARG3); 1224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "cacheflush", void*, addrlow,void*, addrhigh,int, flags); 1225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(discard_translations)( (Addr64)ARG1, 1226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ((ULong)ARG2) - ((ULong)ARG1) + 1ULL/*paranoia*/, 1227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "PRE(sys_cacheflush)" ); 1228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Success(0); 1229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ARG3 is only used for pointers into the traced process's address 1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// space and for offsets into the traced process's struct 1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// user_regs_struct. It is never a pointer into this process's memory 1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// space, and we should therefore not check anything it points to. 1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_ptrace) 1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4); 1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_REG_READ4(int, "ptrace", 1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov long, request, long, pid, long, addr, long, data); 1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (ARG1) { 1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKTEXT: 1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKDATA: 1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKUSR: 1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(peek)", ARG4, 1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof (long)); 1246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETREGS: 1248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(getregs)", ARG4, 1249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof (struct vki_user_regs_struct)); 1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETFPREGS: 1252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4, 1253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof (struct vki_user_fp)); 1254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETWMMXREGS: 1256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(getwmmxregs)", ARG4, 1257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VKI_IWMMXT_SIZE); 1258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETCRUNCHREGS: 1260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(getcrunchregs)", ARG4, 1261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VKI_CRUNCH_SIZE); 1262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETVFPREGS: 1264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(getvfpregs)", ARG4, 1265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof (struct vki_user_vfp) ); 1266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETHBPREGS: 1268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(gethbpregs)", ARG4, 1269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof (unsigned long) ); 1270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_SETREGS: 1272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "ptrace(setregs)", ARG4, 1273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof (struct vki_user_regs_struct)); 1274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_SETFPREGS: 1276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "ptrace(setfpregs)", ARG4, 1277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof (struct vki_user_fp)); 1278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_SETWMMXREGS: 1280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "ptrace(setwmmxregs)", ARG4, 1281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VKI_IWMMXT_SIZE); 1282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_SETCRUNCHREGS: 1284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "ptrace(setcrunchregs)", ARG4, 1285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VKI_CRUNCH_SIZE); 1286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_SETVFPREGS: 1288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "ptrace(setvfpregs)", ARG4, 1289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof (struct vki_user_vfp)); 1290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_SETHBPREGS: 1292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "ptrace(sethbpregs)", ARG4, sizeof(unsigned long)); 1293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GET_THREAD_AREA: 1295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(get_thread_area)", ARG4, sizeof(unsigned long)); 1296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETEVENTMSG: 1298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long)); 1299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETSIGINFO: 1301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t)); 1302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_SETSIGINFO: 1304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t)); 1305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: 1307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 1309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 1310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(sys_ptrace) 1312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 1313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (ARG1) { 1314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKTEXT: 1315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKDATA: 1316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKUSR: 1317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, sizeof (long)); 1318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETREGS: 1320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct)); 1321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETFPREGS: 1323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, sizeof (struct vki_user_fp)); 1324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETWMMXREGS: 1326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, VKI_IWMMXT_SIZE); 1327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETCRUNCHREGS: 1329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, VKI_CRUNCH_SIZE); 1330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETVFPREGS: 1332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, sizeof(struct vki_user_vfp)); 1333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GET_THREAD_AREA: 1335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETHBPREGS: 1336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETEVENTMSG: 1337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, sizeof(unsigned long)); 1338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETSIGINFO: 1340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* XXX: This is a simplification. Different parts of the 1341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * siginfo_t are valid depending on the type of signal. 1342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */ 1343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t)); 1344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: 1346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 1348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 1349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef PRE 1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef POST 1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The arm/Linux syscall table 1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0 1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_OABI_SYSCALL_BASE 0x900000 1359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else 1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_OABI_SYSCALL_BASE 0x0 1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAX_(sysno, name) WRAPPER_ENTRY_X_(arm_linux, sysno, name) 1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAXY(sysno, name) WRAPPER_ENTRY_XY(arm_linux, sysno, name) 1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This table maps from __NR_xxx syscall numbers (from 1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/include/asm-arm/unistd.h) to the appropriate PRE/POST sys_foo() 1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// wrappers on arm (as per sys_call_table in linux/arch/arm/kernel/entry.S). 1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// For those syscalls not handled by Valgrind, the annotation indicate its 1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/? 1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// (unknown). 1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry syscall_main_table[] = { 1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (restart_syscall) // 0 1376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_exit, sys_exit), // 1 1377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fork, sys_fork), // 2 1378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_read, sys_read), // 3 1379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_write, sys_write), // 4 1380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_open, sys_open), // 5 1382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_close, sys_close), // 6 1383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENXY(__NR_waitpid, sys_waitpid), // 7 1384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_creat, sys_creat), // 8 1385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_link, sys_link), // 9 1386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_unlink, sys_unlink), // 10 1388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_execve, sys_execve), // 11 1389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chdir, sys_chdir), // 12 1390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_time, sys_time), // 13 1391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mknod, sys_mknod), // 14 1392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chmod, sys_chmod), // 15 1394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz LINX_(__NR_lchown, sys_lchown16), // 16 1395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_break, sys_ni_syscall), // 17 1396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_oldstat, sys_stat), // 18 (obsolete) 1397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_lseek, sys_lseek), // 19 1398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpid, sys_getpid), // 20 1400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mount, sys_mount), // 21 1401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_umount, sys_oldumount), // 22 1402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setuid, sys_setuid16), // 23 ## P 1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_getuid, sys_getuid16), // 24 ## P 1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN) 1406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PLAXY(__NR_ptrace, sys_ptrace), // 26 1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_alarm, sys_alarm), // 27 1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete 1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_pause, sys_pause), // 29 1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_utime, sys_utime), // 30 1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_stty, sys_ni_syscall), // 31 1413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_gtty, sys_ni_syscall), // 32 1414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_access, sys_access), // 33 1415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_nice, sys_nice), // 34 1416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_ftime, sys_ni_syscall), // 35 1418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_sync, sys_sync), // 36 1419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_kill, sys_kill), // 37 1420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_rename, sys_rename), // 38 1421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mkdir, sys_mkdir), // 39 1422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_rmdir, sys_rmdir), // 40 1424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_dup, sys_dup), // 41 1425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_pipe, sys_pipe), // 42 1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_times, sys_times), // 43 1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_prof, sys_ni_syscall), // 44 1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_brk, sys_brk), // 45 1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setgid, sys_setgid16), // 46 1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_getgid, sys_getgid16), // 47 1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_signal, sys_signal), // 48 */* (ANSI C) 1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_geteuid, sys_geteuid16), // 49 1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_getegid, sys_getegid16), // 50 1436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_acct, sys_acct), // 51 1437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_umount2, sys_umount), // 52 1438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_lock, sys_ni_syscall), // 53 1439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_ioctl, sys_ioctl), // 54 1440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_fcntl, sys_fcntl), // 55 1442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_mpx, sys_ni_syscall), // 56 1443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setpgid, sys_setpgid), // 57 1444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_ulimit, sys_ni_syscall), // 58 1445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_oldolduname, sys_olduname), // 59 Linux -- obsolete 1446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_umask, sys_umask), // 60 1448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chroot, sys_chroot), // 61 1449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_ustat, sys_ustat) // 62 SVr4 -- deprecated 1450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_dup2, sys_dup2), // 63 1451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getppid, sys_getppid), // 64 1452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpgrp, sys_getpgrp), // 65 1454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setsid, sys_setsid), // 66 1455d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root LINXY(__NR_sigaction, sys_sigaction), // 67 1456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_sgetmask, sys_sgetmask), // 68 */* (ANSI C) 1457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_ssetmask, sys_ssetmask), // 69 */* (ANSI C) 1458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setreuid, sys_setreuid16), // 70 1460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setregid, sys_setregid16), // 71 1461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PLAX_(__NR_sigsuspend, sys_sigsuspend), // 72 1462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sigpending, sys_sigpending), // 73 1463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_sethostname, sys_sethostname), // 74 */* 1464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setrlimit, sys_setrlimit), // 75 1466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getrlimit, sys_old_getrlimit), // 76 1467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getrusage, sys_getrusage), // 77 1468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_gettimeofday, sys_gettimeofday), // 78 1469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_settimeofday, sys_settimeofday), // 79 1470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getgroups, sys_getgroups16), // 80 1472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setgroups, sys_setgroups16), // 81 1473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// PLAX_(__NR_select, old_select), // 82 1474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_symlink, sys_symlink), // 83 1475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_oldlstat, sys_lstat), // 84 -- obsolete 1476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_readlink, sys_readlink), // 85 1478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_uselib, sys_uselib), // 86 */Linux 1479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_swapon, sys_swapon), // 87 */Linux 1480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_reboot, sys_reboot), // 88 */Linux 1481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_readdir, old_readdir), // 89 -- superseded 1482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_mmap, old_mmap), // 90 1484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_munmap, sys_munmap), // 91 1485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_truncate, sys_truncate), // 92 1486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_ftruncate, sys_ftruncate), // 93 1487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchmod, sys_fchmod), // 94 1488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fchown, sys_fchown16), // 95 1490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpriority, sys_getpriority), // 96 1491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setpriority, sys_setpriority), // 97 1492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_profil, sys_ni_syscall), // 98 1493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_statfs, sys_statfs), // 99 1494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_fstatfs, sys_fstatfs), // 100 1496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_ioperm, sys_ioperm), // 101 1497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_socketcall, sys_socketcall), // 102 1498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_syslog, sys_syslog), // 103 1499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_setitimer, sys_setitimer), // 104 1500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getitimer, sys_getitimer), // 105 1502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_stat, sys_newstat), // 106 1503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_lstat, sys_newlstat), // 107 1504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_fstat, sys_newfstat), // 108 1505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_olduname, sys_uname), // 109 -- obsolete 1506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_iopl, sys_iopl), // 110 1508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_vhangup, sys_vhangup), // 111 1509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_idle, sys_ni_syscall), // 112 1510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// PLAXY(__NR_vm86old, sys_vm86old), // 113 __NR_syscall... weird 1511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_wait4, sys_wait4), // 114 1512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_swapoff, sys_swapoff), // 115 */Linux 1514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sysinfo, sys_sysinfo), // 116 1515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ipc, sys_ipc), // 117 1516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fsync, sys_fsync), // 118 1517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_sigreturn, sys_sigreturn), // 119 ?/Linux 1518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_clone, sys_clone), // 120 1520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_setdomainname, sys_setdomainname), // 121 */*(?) 1521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_uname, sys_newuname), // 122 1522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// PLAX_(__NR_modify_ldt, sys_modify_ldt), // 123 1523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz LINXY(__NR_adjtimex, sys_adjtimex), // 124 1524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_mprotect, sys_mprotect), // 125 1526d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root LINXY(__NR_sigprocmask, sys_sigprocmask), // 126 1527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // Nb: create_module() was removed 2.4-->2.6 1528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_create_module, sys_ni_syscall), // 127 1529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_init_module, sys_init_module), // 128 1530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_delete_module, sys_delete_module), // 129 1531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // Nb: get_kernel_syms() was removed 2.4-->2.6 1533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130 1534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_quotactl, sys_quotactl), // 131 1535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpgid, sys_getpgid), // 132 1536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchdir, sys_fchdir), // 133 1537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_bdflush, sys_bdflush), // 134 */Linux 1538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_sysfs, sys_sysfs), // 135 SVr4 1540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_personality, sys_personality), // 136 1541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_afs_syscall, sys_ni_syscall), // 137 1542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setfsuid, sys_setfsuid16), // 138 1543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setfsgid, sys_setfsgid16), // 139 1544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR__llseek, sys_llseek), // 140 1546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getdents, sys_getdents), // 141 1547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR__newselect, sys_select), // 142 1548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_flock, sys_flock), // 143 1549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_msync, sys_msync), // 144 1550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_readv, sys_readv), // 145 1552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_writev, sys_writev), // 146 1553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getsid, sys_getsid), // 147 1554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fdatasync, sys_fdatasync), // 148 1555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR__sysctl, sys_sysctl), // 149 1556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mlock, sys_mlock), // 150 1558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_munlock, sys_munlock), // 151 1559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mlockall, sys_mlockall), // 152 1560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_munlockall, sys_munlockall), // 153 1561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_setparam, sys_sched_setparam), // 154 1562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_getparam, sys_sched_getparam), // 155 1564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156 1565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157 1566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_yield, sys_sched_yield), // 158 1567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159 1568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160 1570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz //LINX?(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 */* 1571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_nanosleep, sys_nanosleep), // 162 1572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mremap, sys_mremap), // 163 1573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setresuid, sys_setresuid16), // 164 1574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getresuid, sys_getresuid16), // 165 1576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// PLAXY(__NR_vm86, sys_vm86), // 166 x86/Linux-only 1577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_query_module, sys_ni_syscall), // 167 1578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_poll, sys_poll), // 168 1579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_nfsservctl, sys_nfsservctl), // 169 */Linux 1580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 1581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setresgid, sys_setresgid16), // 170 1582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getresgid, sys_getresgid16), // 171 1583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_prctl, sys_prctl), // 172 1584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 173 1585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 174 1586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 175 1588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 176 1589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait),// 177 1590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),// 178 1591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 179 1592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_pread64, sys_pread64), // 180 1594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_pwrite64, sys_pwrite64), // 181 1595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_chown, sys_chown16), // 182 1596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getcwd, sys_getcwd), // 183 1597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_capget, sys_capget), // 184 1598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_capset, sys_capset), // 185 1600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_sigaltstack, sys_sigaltstack), // 186 1601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sendfile, sys_sendfile), // 187 1602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENXY(__NR_getpmsg, sys_getpmsg), // 188 1603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(__NR_putpmsg, sys_putpmsg), // 189 1604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Nb: we treat vfork as fork 1606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_vfork, sys_fork), // 190 1607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_ugetrlimit, sys_getrlimit), // 191 1608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_mmap2, sys_mmap2), // 192 1609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_truncate64, sys_truncate64), // 193 1610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_ftruncate64, sys_ftruncate64), // 194 1611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_stat64, sys_stat64), // 195 1613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_lstat64, sys_lstat64), // 196 1614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_fstat64, sys_fstat64), // 197 1615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_lchown32, sys_lchown), // 198 1616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getuid32, sys_getuid), // 199 1617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getgid32, sys_getgid), // 200 1619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_geteuid32, sys_geteuid), // 201 1620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getegid32, sys_getegid), // 202 1621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setreuid32, sys_setreuid), // 203 1622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setregid32, sys_setregid), // 204 1623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getgroups32, sys_getgroups), // 205 1625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setgroups32, sys_setgroups), // 206 1626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchown32, sys_fchown), // 207 1627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setresuid32, sys_setresuid), // 208 1628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getresuid32, sys_getresuid), // 209 1629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setresgid32, sys_setresgid), // 210 1631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getresgid32, sys_getresgid), // 211 1632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chown32, sys_chown), // 212 1633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setuid32, sys_setuid), // 213 1634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setgid32, sys_setgid), // 214 1635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setfsuid32, sys_setfsuid), // 215 1637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setfsgid32, sys_setfsgid), // 216 1638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_pivot_root, sys_pivot_root), // 217 */Linux 1639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_mincore, sys_mincore), // 218 1640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_madvise, sys_madvise), // 219 1641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getdents64, sys_getdents64), // 220 1643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_fcntl64, sys_fcntl64), // 221 1644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENX_(222, sys_ni_syscall), // 222 1645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// PLAXY(223, sys_syscall223), // 223 // sys_bproc? 1646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_gettid, sys_gettid), // 224 1647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_readahead, sys_readahead), // 225 */Linux 1649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setxattr, sys_setxattr), // 226 1650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_lsetxattr, sys_lsetxattr), // 227 1651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fsetxattr, sys_fsetxattr), // 228 1652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getxattr, sys_getxattr), // 229 1653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_lgetxattr, sys_lgetxattr), // 230 1655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_fgetxattr, sys_fgetxattr), // 231 1656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_listxattr, sys_listxattr), // 232 1657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_llistxattr, sys_llistxattr), // 233 1658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_flistxattr, sys_flistxattr), // 234 1659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_removexattr, sys_removexattr), // 235 1661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_lremovexattr, sys_lremovexattr), // 236 1662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fremovexattr, sys_fremovexattr), // 237 1663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_tkill, sys_tkill), // 238 */Linux 1664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sendfile64, sys_sendfile64), // 239 1665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_futex, sys_futex), // 240 1667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 241 1668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 242 1669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// PLAX_(__NR_set_thread_area, sys_set_thread_area), // 243 1670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// PLAX_(__NR_get_thread_area, sys_get_thread_area), // 244 1671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_io_setup, sys_io_setup), // 245 1673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_io_destroy, sys_io_destroy), // 246 1674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_io_getevents, sys_io_getevents), // 247 1675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_io_submit, sys_io_submit), // 248 1676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_io_cancel, sys_io_cancel), // 249 1677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_fadvise64, sys_fadvise64), // 250 */(Linux?) 1679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(251, sys_ni_syscall), // 251 1680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_exit_group, sys_exit_group), // 252 1681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GENXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 253 1682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_create, sys_epoll_create), // 254 1683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 255 1685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_wait, sys_epoll_wait), // 256 1686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // (__NR_remap_file_pages, sys_remap_file_pages), // 257 */Linux 1687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_set_tid_address, sys_set_tid_address), // 258 1688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_create, sys_timer_create), // 259 1689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_settime, sys_timer_settime), // (timer_create+1) 1691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_gettime, sys_timer_gettime), // (timer_create+2) 1692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_timer_getoverrun, sys_timer_getoverrun),//(timer_create+3) 1693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_timer_delete, sys_timer_delete), // (timer_create+4) 1694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_clock_settime, sys_clock_settime), // (timer_create+5) 1695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_gettime, sys_clock_gettime), // (timer_create+6) 1697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_getres, sys_clock_getres), // (timer_create+7) 1698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_nanosleep, sys_clock_nanosleep),// (timer_create+8) */* 1699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_statfs64, sys_statfs64), // 268 1700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_fstatfs64, sys_fstatfs64), // 269 1701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_tgkill, sys_tgkill), // 270 */Linux 1703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_utimes, sys_utimes), // 271 1704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_fadvise64_64, sys_fadvise64_64), // 272 */(Linux?) 1705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_vserver, sys_ni_syscall), // 273 1706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mbind, sys_mbind), // 274 ?/? 1707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 275 ?/? 1709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 276 ?/? 1710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_open, sys_mq_open), // 277 1711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_unlink, sys_mq_unlink), // (mq_open+1) 1712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_timedsend, sys_mq_timedsend), // (mq_open+2) 1713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_timedreceive, sys_mq_timedreceive),// (mq_open+3) 1715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_notify, sys_mq_notify), // (mq_open+4) 1716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // (mq_open+5) 1717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_waitid, sys_waitid), // 280 1718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_socket, sys_socket), // 281 1720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_bind, sys_bind), // 282 1721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_connect, sys_connect), // 283 1722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_listen, sys_listen), // 284 1723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_accept, sys_accept), // 285 1724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_getsockname, sys_getsockname), // 286 1725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_getpeername, sys_getpeername), // 287 1726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_socketpair, sys_socketpair), // 288 1727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_send, sys_send), 1728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_sendto, sys_sendto), // 290 1729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_recv, sys_recv), 1730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_recvfrom, sys_recvfrom), // 292 1731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_shutdown, sys_shutdown), // 293 1732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_setsockopt, sys_setsockopt), // 294 1733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_getsockopt, sys_getsockopt), // 295 1734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_sendmsg, sys_sendmsg), // 296 1735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_recvmsg, sys_recvmsg), // 297 1736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_semop, sys_semop), // 298 1737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_semget, sys_semget), // 299 1738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_semctl, sys_semctl), // 300 1739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_msgget, sys_msgget), 1740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_msgsnd, sys_msgsnd), 1741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_msgrcv, sys_msgrcv), 1742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_msgctl, sys_msgctl), // 304 1743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_semtimedop, sys_semtimedop), // 312 1744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_add_key, sys_add_key), // 286 1746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_request_key, sys_request_key), // 287 1747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_keyctl, sys_keyctl), // not 288... 1748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_ioprio_set, sys_ioprio_set), // 289 1749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_ioprio_get, sys_ioprio_get), // 290 1751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_init, sys_inotify_init), // 291 1752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 292 1753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 293 1754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_migrate_pages, sys_migrate_pages), // 294 1755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_openat, sys_openat), // 295 1757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mkdirat, sys_mkdirat), // 296 1758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mknodat, sys_mknodat), // 297 1759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fchownat, sys_fchownat), // 298 1760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_futimesat, sys_futimesat), // 326 on arm 1761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_fstatat64, sys_fstatat64), // 300 1763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_unlinkat, sys_unlinkat), // 301 1764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_renameat, sys_renameat), // 302 1765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_linkat, sys_linkat), // 303 1766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_symlinkat, sys_symlinkat), // 304 1767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_readlinkat, sys_readlinkat), // 1769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fchmodat, sys_fchmodat), // 1770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_faccessat, sys_faccessat), // 1771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_shmat, wrap_sys_shmat), //305 1772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_shmdt, sys_shmdt), //306 1773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_shmget, sys_shmget), //307 1774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_shmctl, sys_shmctl), // 308 1775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_pselect6, sys_pselect6), // 1776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_unshare, sys_unshare), // 310 1778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_set_robust_list, sys_set_robust_list), // 311 1779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_get_robust_list, sys_get_robust_list), // 312 1780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_splice, sys_ni_syscall), // 313 1781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_sync_file_range, sys_sync_file_range), // 314 1782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_tee, sys_ni_syscall), // 315 1784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_vmsplice, sys_ni_syscall), // 316 1785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_move_pages, sys_ni_syscall), // 317 1786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_getcpu, sys_ni_syscall), // 318 1787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_utimensat, sys_utimensat), // 320 1789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_signalfd, sys_signalfd), // 321 1790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_create, sys_timerfd_create), // 322 1791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_eventfd, sys_eventfd), // 323 1792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_fallocate, sys_ni_syscall), // 324 1793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 325 1794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 326 1795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /////////////// 1797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // JRS 2010-Jan-03: I believe that all the numbers listed 1799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // in comments in the table prior to this point (eg "// 326", 1800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // etc) are bogus since it looks to me like they are copied 1801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // verbatim from syswrap-x86-linux.c and they certainly do not 1802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // correspond to what's in include/vki/vki-scnums-arm-linux.h. 1803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // From here onwards, please ensure the numbers are correct. 1804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_pselect6, sys_pselect6), // 335 1806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_ppoll, sys_ppoll), // 336 1807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 346 1809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_signalfd4, sys_signalfd4), // 355 1811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_eventfd2, sys_eventfd2), // 356 1812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_pipe2, sys_pipe2), // 359 1814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_inotify_init1, sys_inotify_init1) // 360 1815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 1816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* These are not in the main table because there indexes are not small 1819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown integers, but rather values close to one million. So their 1820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown inclusion would force the main table to be huge (about 8 MB). */ 1821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry ste___ARM_set_tls 1823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown = { WRAPPER_PRE_NAME(arm_linux,sys_set_tls), NULL }; 1824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry ste___ARM_cacheflush 1826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown = { WRAPPER_PRE_NAME(arm_linux,sys_cacheflush), NULL }; 1827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) 1829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const UInt syscall_main_table_size 1831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown = sizeof(syscall_main_table) / sizeof(syscall_main_table[0]); 1832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Is it in the contiguous initial section of the table? */ 1834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sysno < syscall_main_table_size) { 1835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SyscallTableEntry* sys = &syscall_main_table[sysno]; 1836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sys->before == NULL) 1837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return NULL; /* no entry */ 1838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 1839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return sys; 1840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Check if it's one of the out-of-line entries. */ 1843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (sysno) { 1844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case __NR_ARM_set_tls: return &ste___ARM_set_tls; 1845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case __NR_ARM_cacheflush: return &ste___ARM_cacheflush; 1846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: break; 1847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Can't find a wrapper */ 1850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return NULL; 1851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_arm_linux) 1854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 1856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end syswrap-arm-linux.c ---*/ 1857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 1858