1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------------------*/ 3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Platform-specific syscalls stuff. syswrap-s390x-linux.c ---*/ 4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------------------*/ 5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* 7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov This file is part of Valgrind, a dynamic binary instrumentation 8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov framework. 9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Copyright IBM Corp. 2010-2011 11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov This program is free software; you can redistribute it and/or 13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov modify it under the terms of the GNU General Public License as 14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov published by the Free Software Foundation; either version 2 of the 15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov License, or (at your option) any later version. 16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov This program is distributed in the hope that it will be useful, but 18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov WITHOUT ANY WARRANTY; without even the implied warranty of 19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov General Public License for more details. 21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov You should have received a copy of the GNU General Public License 23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov along with this program; if not, write to the Free Software 24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 02111-1307, USA. 26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov The GNU General Public License is contained in the file COPYING. 28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/ 29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Contributed by Christian Borntraeger */ 31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if defined(VGP_s390x_linux) 33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_basics.h" 35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_vki.h" 36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_vkiscnums.h" 37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy 38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_threadstate.h" 39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_aspacemgr.h" 40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_debuglog.h" 41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcbase.h" 42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcassert.h" 43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcprint.h" 44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcproc.h" 45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcsignal.h" 46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_mallocfree.h" 47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_options.h" 48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_scheduler.h" 49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_sigframe.h" // For VG_(sigframe_destroy)() 50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_signals.h" 51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_syscall.h" 52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_syswrap.h" 53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_tooliface.h" 54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_stacks.h" // VG_(register_stack) 55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "priv_types_n_macros.h" 57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "priv_syswrap-generic.h" /* for decls of generic wrappers */ 58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "priv_syswrap-linux.h" /* for decls of linux-ish wrappers */ 59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "priv_syswrap-linux-variants.h" /* decls of linux variant wrappers */ 60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "priv_syswrap-main.h" 61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* --------------------------------------------------------------------- 64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov clone() handling 65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ------------------------------------------------------------------ */ 66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Call f(arg1), but first switch stacks, using 'stack' as the new 68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stack, and use 'retaddr' as f's return-to address. Also, clear all 69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov the integer registers before entering f. 70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Thought: Why are we clearing the GPRs ? The callee pointed to by f 71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov is a regular C function which will play by the ABI rules. So there is 72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov no need to zero out the GPRs. If we assumed that f accesses registers at 73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov will, then it would make sense to create a defined register state. 74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov But then, why only for the GPRs and not the FPRs ? */ 75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov__attribute__((noreturn)) 76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid ML_(call_on_new_stack_0_1) ( Addr stack, 77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Addr retaddr, 78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void (*f)(Word), 79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Word arg1 ); 80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Upon entering this function we have the following setup: 81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r2 = stack 82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r3 = retaddr 83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r4 = f_desc 84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r5 = arg1 85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/ 86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovasm( 87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ".text\n" 88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ".align 4\n" 89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ".globl vgModuleLocal_call_on_new_stack_0_1\n" 90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ".type vgModuleLocal_call_on_new_stack_0_1, @function\n" 91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "vgModuleLocal_call_on_new_stack_0_1:\n" 92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lgr %r15,%r2\n" // stack to r15 93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lgr %r14,%r3\n" // retaddr to r14 94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lgr %r2,%r5\n" // arg1 to r2 95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // zero all gprs to get a defined state 96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r0,0\n" 97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r1,0\n" 98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // r2 holds the argument for the callee 99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r3,0\n" 100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // r4 holds the callee address 101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r5,0\n" 102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r6,0\n" 103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r7,0\n" 104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r8,0\n" 105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r9,0\n" 106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r10,0\n" 107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r11,0\n" 108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r12,0\n" 109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lghi %r13,0\n" 110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // r14 holds the return address for the callee 111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // r15 is the stack pointer 112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " br %r4\n" // jump to f 113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ".previous\n" 114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ); 115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* 117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Perform a clone system call. clone is strange because it has 118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fork()-like return-twice semantics, so it needs special 119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov handling here. 120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Upon entry, we have: 122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void* child_stack in r2 123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov long flags in r3 124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int* parent_tid in r4 125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int* child_tid in r5 126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int* child_tid in r6 127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Word (*fn)(void *) 160(r15) 128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void *arg 168(r15) 129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov System call requires: 131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void* child_stack in r2 (sc arg1) 132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov long flags in r3 (sc arg2) 133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int* parent_tid in r4 (sc arg3) 134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int* child_tid in r5 (sc arg4) 135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void* tlsaddr in r6 (sc arg5) 136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Returns a ULong encoded as: top half is %cr following syscall, 138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov low half is syscall return value (r3). 139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */ 140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define __NR_CLONE VG_STRINGIFY(__NR_clone) 141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define __NR_EXIT VG_STRINGIFY(__NR_exit) 142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern 144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovULong do_syscall_clone_s390x_linux ( void *stack, 145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ULong flags, 146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Int *child_tid, 147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Int *parent_tid, 148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Addr tlsaddr, 149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Word (*fn)(void *), 150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void *arg); 151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovasm( 152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " .text\n" 153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " .align 4\n" 154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "do_syscall_clone_s390x_linux:\n" 155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lg %r1, 160(%r15)\n" // save fn from parent stack into r1 156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lg %r0, 168(%r15)\n" // save arg from parent stack into r0 157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " aghi %r2, -160\n" // create stack frame for child 158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // all syscall parameters are already in place (r2-r6) 159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " svc " __NR_CLONE"\n" // clone() 160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " ltgr %r2,%r2\n" // child if retval == 0 161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " jne 1f\n" 162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // CHILD - call thread function 164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " lgr %r2, %r0\n" // get arg from r0 165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " basr %r14,%r1\n" // call fn 166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // exit. The result is already in r2 168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " svc " __NR_EXIT"\n" 169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // Exit returned?! 171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " j +2\n" 172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "1:\n" // PARENT or ERROR 174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " br %r14\n" 175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ".previous\n" 176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov); 177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef __NR_CLONE 179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef __NR_EXIT 180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid VG_(cleanup_thread) ( ThreadArchState* arch ) 182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* only used on x86 for descriptor tables */ 184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void setup_child ( /*OUT*/ ThreadArchState *child, 187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /*IN*/ ThreadArchState *parent ) 188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* We inherit our parent's guest state. */ 190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov child->vex = parent->vex; 191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov child->vex_shadow1 = parent->vex_shadow1; 192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov child->vex_shadow2 = parent->vex_shadow2; 193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* 197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov When a client clones, we need to keep track of the new thread. This means: 198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1. allocate a ThreadId+ThreadState+stack for the the thread 199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 2. initialize the thread's new VCPU state 201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 3. create the thread using the same args as the client requested, 203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov but using the scheduler entrypoint for IP, and a separate stack 204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for SP. 205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */ 206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic SysRes do_clone ( ThreadId ptid, 207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Addr sp, ULong flags, 208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Int *parent_tidptr, 209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Int *child_tidptr, 210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Addr tlsaddr) 211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov static const Bool debug = False; 213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ThreadId ctid = VG_(alloc_ThreadState)(); 215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ThreadState* ptst = VG_(get_ThreadState)(ptid); 216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ThreadState* ctst = VG_(get_ThreadState)(ctid); 217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UWord* stack; 218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov NSegment const* seg; 219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SysRes res; 220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ULong r2; 221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vki_sigset_t blockall, savedmask; 222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(sigfillset)(&blockall); 224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(VG_(is_running_thread)(ptid)); 226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(VG_(is_valid_tid)(ctid)); 227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stack = (UWord*)ML_(allocstack)(ctid); 229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (stack == NULL) { 230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov res = VG_(mk_SysRes_Error)( VKI_ENOMEM ); 231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto out; 232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Copy register state 235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Both parent and child return to the same place, and the code 237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov following the clone syscall works out which is which, so we 238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov don't need to worry about it. 239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov The parent gets the child's new tid returned from clone, but the 241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov child gets 0. 242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov If the clone call specifies a NULL sp for the new thread, then 244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov it actually gets a copy of the parent's sp. 245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */ 246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov setup_child( &ctst->arch, &ptst->arch ); 247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Make sys_clone appear to have returned Success(0) in the 249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov child. */ 250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->arch.vex.guest_r2 = 0; 251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (sp != 0) 253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->arch.vex.guest_r15 = sp; 254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->os_state.parent = ptid; 256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* inherit signal mask */ 258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->sig_mask = ptst->sig_mask; 259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->tmp_sig_mask = ptst->sig_mask; 260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* have the parents thread group */ 262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->os_state.threadgroup = ptst->os_state.threadgroup; 263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* We don't really know where the client stack is, because its 265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov allocated by the client. The best we can do is look at the 266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov memory mappings and try to derive some useful information. We 267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov assume that esp starts near its highest possible value, and can 268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov only go down to the start of the mmaped segment. */ 269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov seg = VG_(am_find_nsegment)((Addr)sp); 270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (seg && seg->kind != SkResvn) { 271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp); 272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start; 273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(register_stack)(seg->start, ctst->client_stack_highest_word); 275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (debug) 277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n", 278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctid, seg->start, VG_PGROUNDUP(sp)); 279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(message)(Vg_UserMsg, 281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "!? New thread %d starts with SP(%#lx) unmapped\n", 282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctid, sp); 283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->client_stack_szB = 0; 284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Assume the clone will succeed, and tell any tool that wants to 287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov know that this thread has come into existence. If the clone 288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fails, we'll send out a ll_exit notification for it at the out: 289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov label below, to clean up. */ 290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_TRACK ( pre_thread_ll_create, ptid, ctid ); 291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (flags & VKI_CLONE_SETTLS) { 293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (debug) 294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(printf)("clone child has SETTLS: tls at %#lx\n", tlsaddr); 295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->arch.vex.guest_a0 = (UInt) (tlsaddr >> 32); 296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->arch.vex.guest_a1 = (UInt) tlsaddr; 297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags &= ~VKI_CLONE_SETTLS; 299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* start the thread with everything blocked */ 301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask); 302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Create the new thread */ 304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r2 = do_syscall_clone_s390x_linux( 305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stack, flags, child_tidptr, parent_tidptr, tlsaddr, 306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(start_thread_NORETURN), &VG_(threads)[ctid]); 307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov res = VG_(mk_SysRes_s390x_linux)( r2 ); 309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL); 311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov out: 313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (sr_isError(res)) { 314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* clone failed */ 315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ctst->status = VgTs_Empty; 316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* oops. Better tell the tool the thread exited in a hurry :-) */ 317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_TRACK( pre_thread_ll_exit, ctid ); 318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return res; 321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* --------------------------------------------------------------------- 327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE/POST wrappers for s390x/Linux-specific syscalls 328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ------------------------------------------------------------------ */ 329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define PRE(name) DEFN_PRE_TEMPLATE(s390x_linux, name) 331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define POST(name) DEFN_POST_TEMPLATE(s390x_linux, name) 332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Add prototypes for the wrappers declared here, so that gcc doesn't 334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov harass us for not having prototypes. Really this is a kludge -- 335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov the right thing to do is to make these wrappers 'static' since they 336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov aren't visible outside this file, but that requires even more macro 337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov magic. */ 338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_ptrace); 340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_socketcall); 341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_mmap); 342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_ipc); 343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_clone); 344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_sigreturn); 345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_rt_sigreturn); 346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_fadvise64); 347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// PEEK TEXT,DATA and USER are common to all architectures 349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// PEEKUSR_AREA and POKEUSR_AREA are special, having a memory area 350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// containing the real addr, data, and len field pointed to by ARG3 351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// instead of ARG4 352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_ptrace) 353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4); 355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_REG_READ4(int, "ptrace", 356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov long, request, long, pid, long, addr, long, data); 357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (ARG1) { 358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKTEXT: 359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKDATA: 360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKUSR: 361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(peek)", ARG4, 362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof (long)); 363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETEVENTMSG: 365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long)); 366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETSIGINFO: 368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t)); 369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_SETSIGINFO: 371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t)); 372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKUSR_AREA: 374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { 375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vki_ptrace_area *pa; 376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Reads a part of the user area into memory at pa->process_addr */ 378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov pa = (vki_ptrace_area *) ARG3; 379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ("ptrace(peekusrarea ptrace_area->len)", 380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (unsigned long) &pa->vki_len, sizeof(pa->vki_len)); 381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ("ptrace(peekusrarea ptrace_area->kernel_addr)", 382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (unsigned long) &pa->vki_kernel_addr, sizeof(pa->vki_kernel_addr)); 383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ("ptrace(peekusrarea ptrace_area->process_addr)", 384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (unsigned long) &pa->vki_process_addr, sizeof(pa->vki_process_addr)); 385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE("ptrace(peekusrarea *(ptrace_area->process_addr))", 386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov pa->vki_process_addr, pa->vki_len); 387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_POKEUSR_AREA: 390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { 391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vki_ptrace_area *pa; 392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Updates a part of the user area from memory at pa->process_addr */ 394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov pa = (vki_ptrace_area *) ARG3; 395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->len)", 396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (unsigned long) &pa->vki_len, sizeof(pa->vki_len)); 397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->kernel_addr)", 398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (unsigned long) &pa->vki_kernel_addr, 399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof(pa->vki_kernel_addr)); 400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->process_addr)", 401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (unsigned long) &pa->vki_process_addr, 402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sizeof(pa->vki_process_addr)); 403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ("ptrace(pokeusrarea *(ptrace_area->process_addr))", 404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov pa->vki_process_addr, pa->vki_len); 405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: 408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(sys_ptrace) 413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (ARG1) { 415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKTEXT: 416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKDATA: 417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKUSR: 418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, sizeof (long)); 419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETEVENTMSG: 421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, sizeof(unsigned long)); 422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_GETSIGINFO: 424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* XXX: This is a simplification. Different parts of the 425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * siginfo_t are valid depending on the type of signal. 426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */ 427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t)); 428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_PTRACE_PEEKUSR_AREA: 430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { 431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vki_ptrace_area *pa; 432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov pa = (vki_ptrace_area *) ARG3; 434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE(pa->vki_process_addr, pa->vki_len); 435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: 437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_socketcall) 443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_0 (((UWord*)ARG2)[0]) 445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_1 (((UWord*)ARG2)[1]) 446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_2 (((UWord*)ARG2)[2]) 447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_3 (((UWord*)ARG2)[3]) 448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_4 (((UWord*)ARG2)[4]) 449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_5 (((UWord*)ARG2)[5]) 450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *flags |= SfMayBlock; 452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2); 453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args); 454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (ARG1 /* request */) { 456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SOCKETPAIR: 458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int socketpair(int d, int type, int protocol, int sv[2]); */ 459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) ); 460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) { 461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 ); 465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SOCKET: 468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int socket(int domain, int type, int protocol); */ 469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) ); 470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) { 471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_BIND: 477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int bind(int sockfd, struct sockaddr *my_addr, 478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int addrlen); */ 479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) ); 480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) { 481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 ); 485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_LISTEN: 488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int listen(int s, int backlog); */ 489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) ); 490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 2*sizeof(Addr), tid, NULL)) { 491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_ACCEPT: { 497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int accept(int s, struct sockaddr *addr, int *addrlen); */ 498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) ); 499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) { 500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 ); 504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SENDTO: 508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int sendto(int s, const void *msg, int len, 509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned int flags, 510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov const struct sockaddr *to, int tolen); */ 511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) ); 512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 6*sizeof(Addr), tid, NULL)) { 513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2, 517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_3, ARG2_4, ARG2_5 ); 518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SEND: 521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int send(int s, const void *msg, size_t len, int flags); */ 522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) ); 523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) { 524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 ); 528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_RECVFROM: 531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int recvfrom(int s, void *buf, int len, unsigned int flags, 532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov struct sockaddr *from, int *fromlen); */ 533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) ); 534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 6*sizeof(Addr), tid, NULL)) { 535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2, 539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_3, ARG2_4, ARG2_5 ); 540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_RECV: 543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int recv(int s, void *buf, int len, unsigned int flags); */ 544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* man 2 recv says: 545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov The recv call is normally used only on a connected socket 546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (see connect(2)) and is identical to recvfrom with a NULL 547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov from parameter. 548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */ 549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) ); 550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) { 551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 ); 555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_CONNECT: 558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int connect(int sockfd, 559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov struct sockaddr *serv_addr, int addrlen ); */ 560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) ); 561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) { 562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 ); 566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SETSOCKOPT: 569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int setsockopt(int s, int level, int optname, 570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov const void *optval, int optlen); */ 571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) ); 572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 5*sizeof(Addr), tid, NULL)) { 573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2, 577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_3, ARG2_4 ); 578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_GETSOCKOPT: 581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int getsockopt(int s, int level, int optname, 582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void *optval, socklen_t *optlen); */ 583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) ); 584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 5*sizeof(Addr), tid, NULL)) { 585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2, 589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_3, ARG2_4 ); 590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_GETSOCKNAME: 593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int getsockname(int s, struct sockaddr* name, int* namelen) */ 594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) ); 595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) { 596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 ); 600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_GETPEERNAME: 603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int getpeername(int s, struct sockaddr* name, int* namelen) */ 604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) ); 605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) { 606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 ); 610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SHUTDOWN: 613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int shutdown(int s, int how); */ 614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) ); 615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 2*sizeof(Addr), tid, NULL)) { 616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SENDMSG: { 622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int sendmsg(int s, const struct msghdr *msg, int flags); */ 623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) ); 624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) { 625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 ); 629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_RECVMSG: { 633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int recvmsg(int s, struct msghdr *msg, int flags); */ 634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) ); 635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) { 636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 ); 640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: 644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1); 645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EINVAL ); 646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_0 649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_1 650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_2 651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_3 652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_4 653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_5 654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(sys_socketcall) 657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_0 (((UWord*)ARG2)[0]) 659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_1 (((UWord*)ARG2)[1]) 660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_2 (((UWord*)ARG2)[2]) 661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_3 (((UWord*)ARG2)[3]) 662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_4 (((UWord*)ARG2)[4]) 663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# define ARG2_5 (((UWord*)ARG2)[5]) 664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SysRes r; 666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(SUCCESS); 667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (ARG1 /* request */) { 668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SOCKETPAIR: 670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = ML_(generic_POST_sys_socketpair)( 671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov tid, VG_(mk_SysRes_Success)(RES), 672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_0, ARG2_1, ARG2_2, ARG2_3 673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ); 674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_from_SysRes(r); 675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SOCKET: 678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) ); 679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_from_SysRes(r); 680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_BIND: 683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int bind(int sockfd, struct sockaddr *my_addr, 684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int addrlen); */ 685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_LISTEN: 688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int listen(int s, int backlog); */ 689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_ACCEPT: 692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* int accept(int s, struct sockaddr *addr, int *addrlen); */ 693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES), 694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_0, ARG2_1, ARG2_2 ); 695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_from_SysRes(r); 696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SENDTO: 699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SEND: 702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_RECVFROM: 705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES), 706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_0, ARG2_1, ARG2_2, 707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_3, ARG2_4, ARG2_5 ); 708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_RECV: 711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 ); 712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_CONNECT: 715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SETSOCKOPT: 718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_GETSOCKOPT: 721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES), 722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_0, ARG2_1, 723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_2, ARG2_3, ARG2_4 ); 724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_GETSOCKNAME: 727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES), 728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_0, ARG2_1, ARG2_2 ); 729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_GETPEERNAME: 732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES), 733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2_0, ARG2_1, ARG2_2 ); 734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SHUTDOWN: 737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_SENDMSG: 740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SYS_RECVMSG: 743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 ); 744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: 747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1); 748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(core_panic)("... bye!\n"); 749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; /*NOTREACHED*/ 750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_0 752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_1 753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_2 754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_3 755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_4 756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# undef ARG2_5 757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_mmap) 760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UWord a0, a1, a2, a3, a4, a5; 762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SysRes r; 763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UWord* args = (UWord*)ARG1; 765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_REG_READ1(long, "sys_mmap", struct mmap_arg_struct *, args); 766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( "sys_mmap(args)", (Addr) args, 6*sizeof(UWord) ); 767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov a0 = args[0]; 769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov a1 = args[1]; 770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov a2 = args[2]; 771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov a3 = args[3]; 772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov a4 = args[4]; 773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov a5 = args[5]; 774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %ld, %ld )", 776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov a0, (ULong)a1, a2, a3, a4, a5 ); 777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = ML_(generic_PRE_sys_mmap)( tid, a0, a1, a2, a3, a4, (Off64T)a5 ); 779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_from_SysRes(r); 780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Addr deref_Addr ( ThreadId tid, Addr a, Char* s ) 783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Addr* a_p = (Addr*)a; 785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) ); 786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return *a_p; 787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_ipc) 790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRINT("sys_ipc ( %ld, %ld, %ld, %ld, %#lx, %ld )", 792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG1,ARG2,ARG3,ARG4,ARG5,ARG6); 793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // XXX: this is simplistic -- some args are not used in all circumstances. 794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_REG_READ6(int, "ipc", 795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vki_uint, call, int, first, int, second, int, third, 796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void *, ptr, long, fifth) 797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (ARG1 /* call */) { 799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SEMOP: 800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 ); 801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *flags |= SfMayBlock; 802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SEMGET: 804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SEMCTL: 806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { 807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" ); 808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg ); 809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SEMTIMEDOP: 812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 ); 813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *flags |= SfMayBlock; 814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_MSGSND: 816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 ); 817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if ((ARG4 & VKI_IPC_NOWAIT) == 0) 818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *flags |= SfMayBlock; 819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_MSGRCV: 821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { 822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Addr msgp; 823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Word msgtyp; 824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov msgp = deref_Addr( tid, 826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp), 827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "msgrcv(msgp)" ); 828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov msgtyp = deref_Addr( tid, 829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp), 830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "msgrcv(msgp)" ); 831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 ); 833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if ((ARG4 & VKI_IPC_NOWAIT) == 0) 835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *flags |= SfMayBlock; 836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_MSGGET: 839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_MSGCTL: 841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 ); 842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SHMAT: 844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { 845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UWord w; 846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) ); 847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 ); 848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (w == 0) 849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EINVAL ); 850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG5 = w; 852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SHMDT: 855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5)) 856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EINVAL ); 857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SHMGET: 859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SHMCTL: /* IPCOP_shmctl */ 861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 ); 862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: 864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %ld", ARG1 ); 865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(core_panic)("... bye!\n"); 866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; /*NOTREACHED*/ 867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(sys_ipc) 871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(SUCCESS); 873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (ARG1 /* call */) { 874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SEMOP: 875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SEMGET: 876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SEMCTL: 878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { 879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" ); 880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg ); 881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SEMTIMEDOP: 884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_MSGSND: 885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_MSGRCV: 887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { 888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Addr msgp; 889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Word msgtyp; 890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov msgp = deref_Addr( tid, 892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp), 893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "msgrcv(msgp)" ); 894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov msgtyp = deref_Addr( tid, 895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp), 896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "msgrcv(msgp)" ); 897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 ); 899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_MSGGET: 902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_MSGCTL: 904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 ); 905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SHMAT: 907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { 908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Addr addr; 909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* force readability. before the syscall it is 911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * indeed uninitialized, as can be seen in 912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * glibc/sysdeps/unix/sysv/linux/shmat.c */ 913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE( ARG4, sizeof( Addr ) ); 914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov addr = deref_Addr ( tid, ARG4, "shmat(addr)" ); 916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 ); 917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SHMDT: 920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 ); 921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SHMGET: 923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_SHMCTL: 925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 ); 926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: 928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(message)(Vg_DebugMsg, 929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "FATAL: unhandled syscall(ipc) %ld", 930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG1 ); 931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(core_panic)("... bye!\n"); 932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; /*NOTREACHED*/ 933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_clone) 937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UInt cloneflags; 939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4, ARG5); 941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_REG_READ2(int, "clone", 942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void *, child_stack, 943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned long, flags); 944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (ARG2 & VKI_CLONE_PARENT_SETTID) { 946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (VG_(tdict).track_pre_reg_read) 947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRA3("clone(parent_tidptr)", int *, parent_tidptr); 948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int)); 949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int), 950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VKI_PROT_WRITE)) { 951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return; 953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (ARG2 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) { 956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (VG_(tdict).track_pre_reg_read) 957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRA4("clone(child_tidptr)", int *, child_tidptr); 958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_MEM_WRITE("clone(child_tidptr)", ARG4, sizeof(Int)); 959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!VG_(am_is_valid_for_client)(ARG4, sizeof(Int), 960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VKI_PROT_WRITE)) { 961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EFAULT ); 962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return; 963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov cloneflags = ARG2; 967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (!ML_(client_signal_OK)(ARG2 & VKI_CSIGNAL)) { 969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Failure( VKI_EINVAL ); 970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return; 971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Only look at the flags we really care about */ 974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS 975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | VKI_CLONE_FILES | VKI_CLONE_VFORK)) { 976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES: 977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* thread creation */ 978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_from_SysRes( 979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov do_clone(tid, 980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (Addr)ARG1, /* child SP */ 981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ARG2, /* flags */ 982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (Int *)ARG3, /* parent_tidptr */ 983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (Int *)ARG4, /* child_tidptr */ 984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (Addr)ARG5)); /* tlsaddr */ 985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */ 988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* FALLTHROUGH - assume vfork == fork */ 989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM); 990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 0: /* plain fork */ 992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_from_SysRes( 993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(do_fork_clone)(tid, 994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov cloneflags, /* flags */ 995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (Int *)ARG3, /* parent_tidptr */ 996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (Int *)ARG4)); /* child_tidptr */ 997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: 1000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* should we just ENOSYS? */ 1001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx", ARG2); 1002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(message)(Vg_UserMsg, ""); 1003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(message)(Vg_UserMsg, "The only supported clone() uses are:"); 1004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(message)(Vg_UserMsg, " - via a threads library (NPTL)"); 1005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork"); 1006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(unimplemented) 1007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ("Valgrind does not support general clone()."); 1008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 1009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (SUCCESS) { 1011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (ARG2 & VKI_CLONE_PARENT_SETTID) 1012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE(ARG3, sizeof(Int)); 1013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (ARG2 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) 1014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov POST_MEM_WRITE(ARG4, sizeof(Int)); 1015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Thread creation was successful; let the child have the chance 1017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov to run */ 1018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *flags |= SfYieldAfter; 1019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 1020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 1021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_sigreturn) 1023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 1024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ThreadState* tst; 1025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRINT("sys_sigreturn ( )"); 1026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(VG_(is_valid_tid)(tid)); 1028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(tid >= 1 && tid < VG_N_THREADS); 1029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(VG_(is_running_thread)(tid)); 1030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov tst = VG_(get_ThreadState)(tid); 1032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* This is only so that the IA is (might be) useful to report if 1034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov something goes wrong in the sigreturn */ 1035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(fixup_guest_state_to_restart_syscall)(&tst->arch); 1036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Restore register state from frame and remove it */ 1038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(sigframe_destroy)(tid, False); 1039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Tell the driver not to update the guest state with the "result", 1041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov and set a bogus result to keep it happy. */ 1042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *flags |= SfNoWriteResult; 1043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Success(0); 1044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Check to see if any signals arose as a result of this. */ 1046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *flags |= SfPollAfter; 1047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 1048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_rt_sigreturn) 1051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 1052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for 1053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov an explanation of what follows. */ 1054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ThreadState* tst; 1056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRINT("sys_rt_sigreturn ( )"); 1057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(VG_(is_valid_tid)(tid)); 1059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(tid >= 1 && tid < VG_N_THREADS); 1060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(VG_(is_running_thread)(tid)); 1061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov tst = VG_(get_ThreadState)(tid); 1063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* This is only so that the IA is (might be) useful to report if 1065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov something goes wrong in the sigreturn */ 1066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ML_(fixup_guest_state_to_restart_syscall)(&tst->arch); 1067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Restore register state from frame and remove it */ 1069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VG_(sigframe_destroy)(tid, True); 1070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Tell the driver not to update the guest state with the "result", 1072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov and set a bogus result to keep it happy. */ 1073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *flags |= SfNoWriteResult; 1074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SET_STATUS_Success(0); 1075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Check to see if any signals arose as a result of this. */ 1077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *flags |= SfPollAfter; 1078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 1079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* we cant use the LINX_ version for 64 bit */ 1081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_fadvise64) 1082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 1083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRINT("sys_fadvise64 ( %ld, %ld, %ld, %ld )", ARG1,ARG2,ARG3,ARG4); 1084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PRE_REG_READ4(long, "fadvise64", 1085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int, fd, vki_loff_t, offset, vki_loff_t, len, int, advice); 1086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 1087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef PRE 1089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef POST 1090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* --------------------------------------------------------------------- 1092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov The s390x/Linux syscall table 1093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ------------------------------------------------------------------ */ 1094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Add an s390x-linux specific wrapper to a syscall table. */ 1096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define PLAX_(sysno, name) WRAPPER_ENTRY_X_(s390x_linux, sysno, name) 1097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define PLAXY(sysno, name) WRAPPER_ENTRY_XY(s390x_linux, sysno, name) 1098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// This table maps from __NR_xxx syscall numbers from 1100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// linux/arch/s390/kernel/syscalls.S to the appropriate PRE/POST sys_foo() 1101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// wrappers on s390x. There are several unused numbers, which are only 1102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// defined on s390 (31bit mode) but no longer available on s390x (64 bit). 1103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// For those syscalls not handled by Valgrind, the annotation indicate its 1104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/? 1105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// (unknown). 1106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic SyscallTableEntry syscall_table[] = { 1108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(0, sys_ni_syscall), /* unimplemented (by the kernel) */ // 0 1109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_exit, sys_exit), // 1 1110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_fork, sys_fork), // 2 1111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_read, sys_read), // 3 1112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_write, sys_write), // 4 1113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_open, sys_open), // 5 1115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_close, sys_close), // 6 1116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_restart_syscall, ), // 7 1117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_creat, sys_creat), // 8 1118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_link, sys_link), // 9 1119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_unlink, sys_unlink), // 10 1121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_execve, sys_execve), // 11 1122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_chdir, sys_chdir), // 12 1123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(13, sys_ni_syscall), /* unimplemented (by the kernel) */ // 13 1124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_mknod, sys_mknod), // 14 1125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_chmod, sys_chmod), // 15 1127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(16, sys_ni_syscall), /* unimplemented (by the kernel) */ // 16 1128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(17, sys_ni_syscall), /* unimplemented (by the kernel) */ // 17 1129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(18, sys_ni_syscall), /* unimplemented (by the kernel) */ // 18 1130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_lseek, sys_lseek), // 19 1131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_getpid, sys_getpid), // 20 1133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_mount, sys_mount), // 21 1134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_umount, sys_oldumount), // 22 1135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(23, sys_ni_syscall), /* unimplemented (by the kernel) */ // 23 1136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(24, sys_ni_syscall), /* unimplemented (by the kernel) */ // 24 1137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(25, sys_ni_syscall), /* unimplemented (by the kernel) */ // 25 1139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PLAXY(__NR_ptrace, sys_ptrace), // 26 1140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_alarm, sys_alarm), // 27 1141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(28, sys_ni_syscall), /* unimplemented (by the kernel) */ // 28 1142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_pause, sys_pause), // 29 1143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_utime, sys_utime), // 30 1145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(31, sys_ni_syscall), /* unimplemented (by the kernel) */ // 31 1146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(32, sys_ni_syscall), /* unimplemented (by the kernel) */ // 32 1147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_access, sys_access), // 33 1148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_nice, sys_nice), // 34 1149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(35, sys_ni_syscall), /* unimplemented (by the kernel) */ // 35 1151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_sync, sys_sync), // 36 1152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_kill, sys_kill), // 37 1153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_rename, sys_rename), // 38 1154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_mkdir, sys_mkdir), // 39 1155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_rmdir, sys_rmdir), // 40 1157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_dup, sys_dup), // 41 1158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_pipe, sys_pipe), // 42 1159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_times, sys_times), // 43 1160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(44, sys_ni_syscall), /* unimplemented (by the kernel) */ // 44 1161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_brk, sys_brk), // 45 1163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(46, sys_ni_syscall), /* unimplemented (by the kernel) */ // 46 1164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(47, sys_ni_syscall), /* unimplemented (by the kernel) */ // 47 1165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_signal, ), // 48 1166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(49, sys_ni_syscall), /* unimplemented (by the kernel) */ // 49 1167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(50, sys_ni_syscall), /* unimplemented (by the kernel) */ // 50 1169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_acct, sys_acct), // 51 1170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_umount2, sys_umount), // 52 1171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(53, sys_ni_syscall), /* unimplemented (by the kernel) */ // 53 1172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_ioctl, sys_ioctl), // 54 1173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_fcntl, sys_fcntl), // 55 1175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(56, sys_ni_syscall), /* unimplemented (by the kernel) */ // 56 1176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_setpgid, sys_setpgid), // 57 1177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(58, sys_ni_syscall), /* unimplemented (by the kernel) */ // 58 1178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(59, sys_ni_syscall), /* unimplemented (by the kernel) */ // 59 1179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_umask, sys_umask), // 60 1181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_chroot, sys_chroot), // 61 1182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_ustat, sys_ustat), /* deprecated in favor of statfs */ // 62 1183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_dup2, sys_dup2), // 63 1184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_getppid, sys_getppid), // 64 1185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_getpgrp, sys_getpgrp), // 65 1187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_setsid, sys_setsid), // 66 1188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sigaction, ), /* userspace uses rt_sigaction */ // 67 1189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(68, sys_ni_syscall), /* unimplemented (by the kernel) */ // 68 1190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(69, sys_ni_syscall), /* unimplemented (by the kernel) */ // 69 1191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(70, sys_ni_syscall), /* unimplemented (by the kernel) */ // 70 1193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(71, sys_ni_syscall), /* unimplemented (by the kernel) */ // 71 1194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sigsuspend, ), // 72 1195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sigpending, ), // 73 1196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sethostname, ), // 74 1197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_setrlimit, sys_setrlimit), // 75 1199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(76, sys_getrlimit), /* see also 191 */ // 76 1200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_getrusage, sys_getrusage), // 77 1201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_gettimeofday, sys_gettimeofday), // 78 1202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_settimeofday, sys_settimeofday), // 79 1203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(80, sys_ni_syscall), /* unimplemented (by the kernel) */ // 80 1205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(81, sys_ni_syscall), /* unimplemented (by the kernel) */ // 81 1206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(82, sys_ni_syscall), /* unimplemented (by the kernel) */ // 82 1207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_symlink, sys_symlink), // 83 1208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(84, sys_ni_syscall), /* unimplemented (by the kernel) */ // 84 1209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_readlink, sys_readlink), // 85 1211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_uselib, ), // 86 1212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_swapon, ), // 87 1213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_reboot, ), // 88 1214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(89, sys_ni_syscall), /* unimplemented (by the kernel) */ // 89 1215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PLAX_(__NR_mmap, sys_mmap ), // 90 1217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_munmap, sys_munmap), // 91 1218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_truncate, sys_truncate), // 92 1219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_ftruncate, sys_ftruncate), // 93 1220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_fchmod, sys_fchmod), // 94 1221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(95, sys_ni_syscall), /* unimplemented (by the kernel) */ // 95 1223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_getpriority, sys_getpriority), // 96 1224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_setpriority, sys_setpriority), // 97 1225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(98, sys_ni_syscall), /* unimplemented (by the kernel) */ // 98 1226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_statfs, sys_statfs), // 99 1227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_fstatfs, sys_fstatfs), // 100 1229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(101, sys_ni_syscall), /* unimplemented (by the kernel) */ // 101 1230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PLAXY(__NR_socketcall, sys_socketcall), // 102 1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_syslog, sys_syslog), // 103 1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_setitimer, sys_setitimer), // 104 1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_getitimer, sys_getitimer), // 105 1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_stat, sys_newstat), // 106 1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_lstat, sys_newlstat), // 107 1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_fstat, sys_newfstat), // 108 1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(109, sys_ni_syscall), /* unimplemented (by the kernel) */ // 109 1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 110 1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_vhangup, sys_vhangup), // 111 1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(112, sys_ni_syscall), /* unimplemented (by the kernel) */ // 112 1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(113, sys_ni_syscall), /* unimplemented (by the kernel) */ // 113 1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_wait4, sys_wait4), // 114 1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_swapoff, ), // 115 1247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_sysinfo, sys_sysinfo), // 116 1248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PLAXY(__NR_ipc, sys_ipc), // 117 1249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_fsync, sys_fsync), // 118 1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PLAX_(__NR_sigreturn, sys_sigreturn), // 119 1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PLAX_(__NR_clone, sys_clone), // 120 1253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_setdomainname, ), // 121 1254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_uname, sys_newuname), // 122 1255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(123, sys_ni_syscall), /* unimplemented (by the kernel) */ // 123 1256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_adjtimex, ), // 124 1257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_mprotect, sys_mprotect), // 125 1259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINXY(__NR_sigprocmask, sys_sigprocmask), // 126 1260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(127, sys_ni_syscall), /* unimplemented (by the kernel) */ // 127 1261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_init_module, sys_init_module), // 128 1262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_delete_module, sys_delete_module), // 129 1263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(130, sys_ni_syscall), /* unimplemented (by the kernel) */ // 130 1265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_quotactl, sys_quotactl), // 131 1266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_getpgid, sys_getpgid), // 132 1267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_fchdir, sys_fchdir), // 133 1268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_bdflush, ), // 134 1269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sysfs, ), // 135 1271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_personality, sys_personality), // 136 1272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(137, sys_ni_syscall), /* unimplemented (by the kernel) */ // 137 1273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(138, sys_ni_syscall), /* unimplemented (by the kernel) */ // 138 1274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(139, sys_ni_syscall), /* unimplemented (by the kernel) */ // 139 1275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINXY(__NR__llseek, sys_llseek), /* 64 bit --> lseek */ // 140 1277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_getdents, sys_getdents), // 141 1278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_select, sys_select), // 142 1279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_flock, sys_flock), // 143 1280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_msync, sys_msync), // 144 1281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_readv, sys_readv), // 145 1283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_writev, sys_writev), // 146 1284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_getsid, sys_getsid), // 147 1285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_fdatasync, sys_fdatasync), // 148 1286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR__sysctl, sys_sysctl), // 149 1287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_mlock, sys_mlock), // 150 1289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_munlock, sys_munlock), // 151 1290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_mlockall, sys_mlockall), // 152 1291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_munlockall, sys_munlockall), // 153 1292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_sched_setparam, sys_sched_setparam), // 154 1293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_sched_getparam, sys_sched_getparam), // 155 1295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156 1296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157 1297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_sched_yield, sys_sched_yield), // 158 1298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max), // 159 1299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min), // 160 1301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sched_rr_get_interval, ), // 161 1302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_nanosleep, sys_nanosleep), // 162 1303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_mremap, sys_mremap), // 163 1304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(164, sys_ni_syscall), /* unimplemented (by the kernel) */ // 164 1305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(165, sys_ni_syscall), /* unimplemented (by the kernel) */ // 165 1307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(166, sys_ni_syscall), /* unimplemented (by the kernel) */ // 166 1308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(167, sys_ni_syscall), /* unimplemented (by the kernel) */ // 167 1309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_poll, sys_poll), // 168 1310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_nfsservctl, ), // 169 1311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(170, sys_ni_syscall), /* unimplemented (by the kernel) */ // 170 1313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(171, sys_ni_syscall), /* unimplemented (by the kernel) */ // 171 1314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_prctl, sys_prctl), // 172 1315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 173 1316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 174 1317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 175 1319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 176 1320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 177 1321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 178 1322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 179 1323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_pread64, sys_pread64), // 180 1325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_pwrite64, sys_pwrite64), // 181 1326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(182, sys_ni_syscall), /* unimplemented (by the kernel) */ // 182 1327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_getcwd, sys_getcwd), // 183 1328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_capget, sys_capget), // 184 1329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_capset, sys_capset), // 185 1331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_sigaltstack, sys_sigaltstack), // 186 1332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_sendfile, sys_sendfile), // 187 1333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(188, sys_ni_syscall), /* unimplemented (by the kernel) */ // 188 1334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(189, sys_ni_syscall), /* unimplemented (by the kernel) */ // 189 1335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_vfork, sys_fork), // 190 1337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_getrlimit, sys_getrlimit), // 191 1338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(192, sys_ni_syscall), /* not exported on 64bit*/ // 192 1339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(193, sys_ni_syscall), /* unimplemented (by the kernel) */ // 193 1340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(194, sys_ni_syscall), /* unimplemented (by the kernel) */ // 194 1341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(195, sys_ni_syscall), /* unimplemented (by the kernel) */ // 195 1343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(196, sys_ni_syscall), /* unimplemented (by the kernel) */ // 196 1344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(197, sys_ni_syscall), /* unimplemented (by the kernel) */ // 197 1345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_lchown, sys_lchown), // 198 1346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_getuid, sys_getuid), // 199 1347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_getgid, sys_getgid), // 200 1349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_geteuid, sys_geteuid), // 201 1350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_getegid, sys_getegid), // 202 1351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_setreuid, sys_setreuid), // 203 1352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_setregid, sys_setregid), // 204 1353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_getgroups, sys_getgroups), // 205 1355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_setgroups, sys_setgroups), // 206 1356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_fchown, sys_fchown), // 207 1357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_setresuid, sys_setresuid), // 208 1358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_getresuid, sys_getresuid), // 209 1359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_setresgid, sys_setresgid), // 210 1361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_getresgid, sys_getresgid), // 211 1362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_chown, sys_chown), // 212 1363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_setuid, sys_setuid), // 213 1364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_setgid, sys_setgid), // 214 1365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_setfsuid, sys_setfsuid), // 215 1367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_setfsgid, sys_setfsgid), // 216 1368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_pivot_root, ), 1369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_mincore, sys_mincore), // 218 1370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_madvise, sys_madvise), // 219 1371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_getdents64, sys_getdents64), // 220 1373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(221, sys_ni_syscall), /* unimplemented (by the kernel) */ // 221 1374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_readahead, sys_readahead), // 222 1375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(223, sys_ni_syscall), /* unimplemented (by the kernel) */ // 223 1376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_setxattr, sys_setxattr), // 224 1377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_lsetxattr, sys_lsetxattr), // 225 1379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_fsetxattr, sys_fsetxattr), // 226 1380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_getxattr, sys_getxattr), // 227 1381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_lgetxattr, sys_lgetxattr), // 228 1382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_fgetxattr, sys_fgetxattr), // 229 1383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_listxattr, sys_listxattr), // 230 1385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_llistxattr, sys_llistxattr), // 231 1386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_flistxattr, sys_flistxattr), // 232 1387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_removexattr, sys_removexattr), // 233 1388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_lremovexattr, sys_lremovexattr), // 234 1389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_fremovexattr, sys_fremovexattr), // 235 1391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_gettid, sys_gettid), // 236 1392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_tkill, sys_tkill), // 237 1393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_futex, sys_futex), // 238 1394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 239 1395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 240 1397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_tgkill, sys_tgkill), // 241 1398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(242, sys_ni_syscall), /* unimplemented (by the kernel) */ // 242 1399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_io_setup, sys_io_setup), // 243 1400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_io_destroy, sys_io_destroy), // 244 1401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_io_getevents, sys_io_getevents), // 245 1403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_io_submit, sys_io_submit), // 246 1404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_io_cancel, sys_io_cancel), // 247 1405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_exit_group, sys_exit_group), // 248 1406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_epoll_create, sys_epoll_create), // 249 1407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 250 1409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_epoll_wait, sys_epoll_wait), // 251 1410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_set_tid_address, sys_set_tid_address), // 252 1411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PLAX_(__NR_fadvise64, sys_fadvise64), // 253 1412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_timer_create, sys_timer_create), // 254 1413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_timer_settime, sys_timer_settime), // 255 1415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_timer_gettime, sys_timer_gettime), // 256 1416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_timer_getoverrun, sys_timer_getoverrun), // 257 1417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_timer_delete, sys_timer_delete), // 258 1418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_clock_settime, sys_clock_settime), // 259 1419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_clock_gettime, sys_clock_gettime), // 260 1421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_clock_getres, sys_clock_getres), // 261 1422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_clock_nanosleep, sys_clock_nanosleep), // 262 1423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(263, sys_ni_syscall), /* unimplemented (by the kernel) */ // 263 1424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(264, sys_ni_syscall), /* unimplemented (by the kernel) */ // 264 1425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_statfs64, sys_statfs64), // 265 1427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_fstatfs64, sys_fstatfs64), // 266 1428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_remap_file_pages, ), 1429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(268, sys_ni_syscall), /* unimplemented (by the kernel) */ // 268 1430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(269, sys_ni_syscall), /* unimplemented (by the kernel) */ // 269 1431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(270, sys_ni_syscall), /* unimplemented (by the kernel) */ // 270 1433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_mq_open, sys_mq_open), // 271 1434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_mq_unlink, sys_mq_unlink), // 272 1435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 273 1436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_mq_timedreceive, sys_mq_timedreceive), // 274 1437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_mq_notify, sys_mq_notify), // 275 1439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 276 1440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_kexec_load, ), 1441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_add_key, sys_add_key), // 278 1442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_request_key, sys_request_key), // 279 1443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_keyctl, sys_keyctl), // 280 1445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_waitid, sys_waitid), // 281 1446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_ioprio_set, sys_ioprio_set), // 282 1447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_ioprio_get, sys_ioprio_get), // 283 1448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_inotify_init, sys_inotify_init), // 284 1449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 285 1451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 286 1452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(287, sys_ni_syscall), /* unimplemented (by the kernel) */ // 287 1453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_openat, sys_openat), // 288 1454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_mkdirat, sys_mkdirat), // 289 1455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_mknodat, sys_mknodat), // 290 1457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_fchownat, sys_fchownat), // 291 1458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_futimesat, sys_futimesat), // 292 1459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_newfstatat, sys_newfstatat), // 293 1460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_unlinkat, sys_unlinkat), // 294 1461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_renameat, sys_renameat), // 295 1463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_linkat, sys_linkat), // 296 1464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_symlinkat, sys_symlinkat), // 297 1465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_readlinkat, sys_readlinkat), // 298 1466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_fchmodat, sys_fchmodat), // 299 1467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_faccessat, sys_faccessat), // 300 1469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_pselect6, sys_pselect6), // 301 1470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_ppoll, sys_ppoll), // 302 1471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_unshare, ), 1472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_set_robust_list, sys_set_robust_list), // 304 1473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_get_robust_list, sys_get_robust_list), // 305 1475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_splice, ), 1476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_sync_file_range, sys_sync_file_range), // 307 1477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_tee, ), 1478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_vmsplice, ), 1479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(310, sys_ni_syscall), /* unimplemented (by the kernel) */ // 310 1481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_getcpu, ), 1482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 312 1483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_utimes, sys_utimes), // 313 1484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_fallocate, sys_fallocate), // 314 1485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_utimensat, sys_utimensat), // 315 1487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_signalfd, sys_signalfd), // 316 1488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(317, sys_ni_syscall), /* unimplemented (by the kernel) */ // 317 1489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_eventfd, sys_eventfd), // 318 1490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_timerfd_create, sys_timerfd_create), // 319 1491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 320 1493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 321 1494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_signalfd4, sys_signalfd4), // 322 1495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_eventfd2, sys_eventfd2), // 323 1496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_inotify_init1, sys_inotify_init1), // 324 1497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_pipe2, sys_pipe2), // 325 1499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // (__NR_dup3, ), 1500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_epoll_create1, sys_epoll_create1), // 327 1501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_preadv, sys_preadv), // 328 1502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_pwritev, sys_pwritev), // 329 1503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_rt_tgsigqueueinfo, ), 1505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_perf_event_open, sys_perf_event_open), // 331 1506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}; 1507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovSyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) 1509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 1510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov const UInt syscall_table_size 1511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov = sizeof(syscall_table) / sizeof(syscall_table[0]); 1512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Is it in the contiguous initial section of the table? */ 1514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (sysno < syscall_table_size) { 1515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov SyscallTableEntry* sys = &syscall_table[sysno]; 1516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (sys->before == NULL) 1517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return NULL; /* no entry */ 1518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 1519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return sys; 1520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 1521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Can't find a wrapper */ 1523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return NULL; 1524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 1525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 1527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------------------*/ 1529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- end ---*/ 1530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------------------*/ 1531