1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Platform-specific syscalls stuff. syswrap-amd64-linux.c ---*/ 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This file is part of Valgrind, a dynamic binary instrumentation 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown framework. 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Copyright (C) 2000-2011 Nicholas Nethercote 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown njn@valgrind.org 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is free software; you can redistribute it and/or 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown modify it under the terms of the GNU General Public License as 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown published by the Free Software Foundation; either version 2 of the 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown License, or (at your option) any later version. 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is distributed in the hope that it will be useful, but 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown WITHOUT ANY WARRANTY; without even the implied warranty of 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown General Public License for more details. 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown You should have received a copy of the GNU General Public License 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown along with this program; if not, write to the Free Software 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 02111-1307, USA. 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The GNU General Public License is contained in the file COPYING. 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_amd64_linux) 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_basics.h" 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vki.h" 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vkiscnums.h" 36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_threadstate.h" 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_aspacemgr.h" 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_debuglog.h" 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_options.h" 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcbase.h" 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcassert.h" 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcprint.h" 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcproc.h" 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcsignal.h" 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_scheduler.h" 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_sigframe.h" 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_signals.h" 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syscall.h" 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syswrap.h" 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_tooliface.h" 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_stacks.h" // VG_(register_stack) 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_types_n_macros.h" 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-generic.h" /* for decls of generic wrappers */ 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-linux.h" /* for decls of linux-ish wrappers */ 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-linux-variants.h" /* decls of linux variant wrappers */ 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-main.h" 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown clone() handling 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Call f(arg1), but first switch stacks, using 'stack' as the new 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stack, and use 'retaddr' as f's return-to address. Also, clear all 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the integer registers before entering f. */ 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noreturn)) 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ML_(call_on_new_stack_0_1) ( Addr stack, 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr retaddr, 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*f)(Word), 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Word arg1 ); 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// %rdi == stack 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// %rsi == retaddr 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// %rdx == f 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// %rcx == arg1 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm( 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".text\n" 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".globl vgModuleLocal_call_on_new_stack_0_1\n" 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"vgModuleLocal_call_on_new_stack_0_1:\n" 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %rdi, %rsp\n" // set stack 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" pushq %rsi\n" // retaddr to stack 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" pushq %rdx\n" // f to stack 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" pushq %rcx\n" // arg1 to stack 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %rax\n" // zero all GP regs 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %rbx\n" 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %rcx\n" 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %rdx\n" 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %rsi\n" 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %rdi\n" 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %rbp\n" 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %r8\n" 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %r9\n" 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %r10\n" 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %r11\n" 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %r12\n" 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %r13\n" 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %r14\n" 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $0, %r15\n" 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" popq %rdi\n" // arg1 to correct arg reg 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ret\n" // jump to f 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ud2\n" // should never get here 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".previous\n" 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown); 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Perform a clone system call. clone is strange because it has 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fork()-like return-twice semantics, so it needs special 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown handling here. 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Upon entry, we have: 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int (*fn)(void*) in %rdi 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* child_stack in %rsi 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int flags in %rdx 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* arg in %rcx 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pid_t* child_tid in %r8 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pid_t* parent_tid in %r9 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* tls_ptr at 8(%rsp) 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown System call requires: 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int $__NR_clone in %rax 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int flags in %rdi 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* child_stack in %rsi 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pid_t* parent_tid in %rdx 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pid_t* child_tid in %r10 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* tls_ptr in %r8 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Returns a Long encoded in the linux-amd64 way, not a SysRes. 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_CLONE VG_STRINGIFY(__NR_clone) 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_EXIT VG_STRINGIFY(__NR_exit) 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownLong do_syscall_clone_amd64_linux ( Word (*fn)(void *), 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* stack, 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long flags, 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* arg, 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long* child_tid, 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long* parent_tid, 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vki_modify_ldt_t * ); 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm( 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".text\n" 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"do_syscall_clone_amd64_linux:\n" 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // set up child stack, temporarily preserving fn and arg 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" subq $16, %rsi\n" // make space on stack 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %rcx, 8(%rsi)\n" // save arg 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %rdi, 0(%rsi)\n" // save fn 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // setup syscall 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $"__NR_CLONE", %rax\n" // syscall number 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %rdx, %rdi\n" // syscall arg1: flags 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // %rsi already setup // syscall arg2: child_stack 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %r9, %rdx\n" // syscall arg3: parent_tid 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %r8, %r10\n" // syscall arg4: child_tid 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq 8(%rsp), %r8\n" // syscall arg5: tls_ptr 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" syscall\n" // clone() 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" testq %rax, %rax\n" // child if retval == 0 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" jnz 1f\n" 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // CHILD - call thread function 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" pop %rax\n" // pop fn 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" pop %rdi\n" // pop fn arg1: arg 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" call *%rax\n" // call fn 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // exit with result 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %rax, %rdi\n" // arg1: return value from fn 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $"__NR_EXIT", %rax\n" 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" syscall\n" 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Exit returned?! 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ud2\n" 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"1:\n" // PARENT or ERROR 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ret\n" 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".previous\n" 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown); 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_CLONE 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_EXIT 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// forward declaration 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void setup_child ( ThreadArchState*, ThreadArchState* ); 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown When a client clones, we need to keep track of the new thread. This means: 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1. allocate a ThreadId+ThreadState+stack for the the thread 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2. initialize the thread's new VCPU state 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3. create the thread using the same args as the client requested, 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown but using the scheduler entrypoint for EIP, and a separate stack 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for ESP. 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes do_clone ( ThreadId ptid, 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong flags, Addr rsp, 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long* parent_tidptr, 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long* child_tidptr, 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr tlsaddr ) 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static const Bool debug = False; 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadId ctid = VG_(alloc_ThreadState)(); 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* ptst = VG_(get_ThreadState)(ptid); 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* ctst = VG_(get_ThreadState)(ctid); 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UWord* stack; 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NSegment const* seg; 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes res; 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long rax; 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vki_sigset_t blockall, savedmask; 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigfillset)(&blockall); 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_running_thread)(ptid)); 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_valid_tid)(ctid)); 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stack = (UWord*)ML_(allocstack)(ctid); 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (stack == NULL) { 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown res = VG_(mk_SysRes_Error)( VKI_ENOMEM ); 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto out; 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Copy register state 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Both parent and child return to the same place, and the code 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown following the clone syscall works out which is which, so we 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown don't need to worry about it. 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The parent gets the child's new tid returned from clone, but the 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child gets 0. 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown If the clone call specifies a NULL rsp for the new thread, then 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown it actually gets a copy of the parent's rsp. 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown setup_child( &ctst->arch, &ptst->arch ); 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Make sys_clone appear to have returned Success(0) in the 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child. */ 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->arch.vex.guest_RAX = 0; 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (rsp != 0) 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->arch.vex.guest_RSP = rsp; 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->os_state.parent = ptid; 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* inherit signal mask */ 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->sig_mask = ptst->sig_mask; 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->tmp_sig_mask = ptst->sig_mask; 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Start the child with its threadgroup being the same as the 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown parent's. This is so that any exit_group calls that happen 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown after the child is created but before it sets its 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown os_state.threadgroup field for real (in thread_wrapper in 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown syswrap-linux.c), really kill the new thread. a.k.a this avoids 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown a race condition in which the thread is unkillable (via 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit_group) because its threadgroup is not set. The race window 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is probably only a few hundred or a few thousand cycles long. 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown See #226116. */ 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->os_state.threadgroup = ptst->os_state.threadgroup; 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* We don't really know where the client stack is, because its 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown allocated by the client. The best we can do is look at the 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memory mappings and try to derive some useful information. We 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assume that esp starts near its highest possible value, and can 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown only go down to the start of the mmaped segment. */ 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown seg = VG_(am_find_nsegment)((Addr)rsp); 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (seg && seg->kind != SkResvn) { 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(rsp); 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start; 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(register_stack)(seg->start, ctst->client_stack_highest_word); 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (debug) 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n", 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctid, seg->start, VG_PGROUNDUP(rsp)); 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "!? New thread %d starts with RSP(%#lx) unmapped\n", 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctid, rsp); 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_szB = 0; 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Assume the clone will succeed, and tell any tool that wants to 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown know that this thread has come into existence. If the clone 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fails, we'll send out a ll_exit notification for it at the out: 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown label below, to clean up. */ 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_TRACK ( pre_thread_ll_create, ptid, ctid ); 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (flags & VKI_CLONE_SETTLS) { 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (debug) 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(printf)("clone child has SETTLS: tls at %#lx\n", tlsaddr); 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->arch.vex.guest_FS_ZERO = tlsaddr; 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown flags &= ~VKI_CLONE_SETTLS; 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* start the thread with everything blocked */ 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask); 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Create the new thread */ 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rax = do_syscall_clone_amd64_linux( 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid], 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child_tidptr, parent_tidptr, NULL 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ); 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown res = VG_(mk_SysRes_amd64_linux)( rax ); 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL); 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown out: 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sr_isError(res)) { 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* clone failed */ 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(cleanup_thread)(&ctst->arch); 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->status = VgTs_Empty; 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* oops. Better tell the tool the thread exited in a hurry :-) */ 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_TRACK( pre_thread_ll_exit, ctid ); 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return res; 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown More thread stuff 329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(cleanup_thread) ( ThreadArchState *arch ) 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid setup_child ( /*OUT*/ ThreadArchState *child, 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*IN*/ ThreadArchState *parent ) 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* We inherit our parent's guest state. */ 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex = parent->vex; 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex_shadow1 = parent->vex_shadow1; 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex_shadow2 = parent->vex_shadow2; 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE/POST wrappers for AMD64/Linux-specific syscalls 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE(name) DEFN_PRE_TEMPLATE(amd64_linux, name) 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST(name) DEFN_POST_TEMPLATE(amd64_linux, name) 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add prototypes for the wrappers declared here, so that gcc doesn't 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown harass us for not having prototypes. Really this is a kludge -- 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the right thing to do is to make these wrappers 'static' since they 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown aren't visible outside this file, but that requires even more macro 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown magic. */ 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_clone); 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_rt_sigreturn); 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_socket); 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_setsockopt); 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_getsockopt); 362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_connect); 363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_accept); 364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_accept4); 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_sendto); 366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_recvfrom); 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_sendmsg); 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_recvmsg); 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_shutdown); 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_bind); 371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_listen); 372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_getsockname); 373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_getpeername); 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_socketpair); 375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_semget); 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_semop); 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_semtimedop); 378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_semctl); 379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_msgget); 380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_msgrcv); 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_msgsnd); 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_msgctl); 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_shmget); 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, wrap_sys_shmat); 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_shmdt); 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_shmdt); 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_shmctl); 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_arch_prctl); 389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_ptrace); 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_fadvise64); 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_mmap); 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_syscall184); 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clone) 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong cloneflags; 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5); 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ5(int, "clone", 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, flags, 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *, child_stack, 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int *, parent_tidptr, 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int *, child_tidptr, 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *, tlsaddr); 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & VKI_CLONE_PARENT_SETTID) { 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int)); 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int), VKI_PROT_WRITE)) { 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EFAULT ); 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) { 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE("clone(child_tidptr)", ARG4, sizeof(Int)); 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!VG_(am_is_valid_for_client)(ARG4, sizeof(Int), VKI_PROT_WRITE)) { 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EFAULT ); 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags = ARG1; 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) { 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EINVAL ); 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Only look at the flags we really care about */ 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown | VKI_CLONE_FILES | VKI_CLONE_VFORK)) { 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES: 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* thread creation */ 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes( 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do_clone(tid, 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1, /* flags */ 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Addr)ARG2, /* child ESP */ 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Long *)ARG3, /* parent_tidptr */ 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Long *)ARG4, /* child_tidptr */ 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Addr)ARG5)); /* set_tls */ 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */ 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* FALLTHROUGH - assume vfork == fork */ 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM); 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 0: /* plain fork */ 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes( 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(do_fork_clone)(tid, 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags, /* flags */ 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG3, /* parent_tidptr */ 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG4)); /* child_tidptr */ 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* should we just ENOSYS? */ 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "Unsupported clone() flags: 0x%lx\n", ARG1); 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n"); 461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "The only supported clone() uses are:\n"); 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown " - via a threads library (LinuxThreads or NPTL)\n"); 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown " - via the implementation of fork or vfork\n"); 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(unimplemented) 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ("Valgrind does not support general clone()."); 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (SUCCESS) { 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & VKI_CLONE_PARENT_SETTID) 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE(ARG3, sizeof(Int)); 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE(ARG4, sizeof(Int)); 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Thread creation was successful; let the child have the chance 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown to run */ 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfYieldAfter; 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigreturn) 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* This isn't really a syscall at all - it's a misuse of the 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown syscall mechanism by m_sigframe. VG_(sigframe_create) sets the 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return address of the signal frames it creates to be a short 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown piece of code which does this "syscall". The only purpose of 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the syscall is to call VG_(sigframe_destroy), which restores the 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown thread's registers from the frame and then removes it. 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Consequently we must ask the syswrap driver logic not to write 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown back the syscall "result" as that would overwrite the 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown just-restored register state. */ 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* tst; 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_rt_sigreturn ( )"); 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_valid_tid)(tid)); 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(tid >= 1 && tid < VG_N_THREADS); 500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_running_thread)(tid)); 501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Adjust RSP to point to start of frame; skip back up over handler 503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ret addr */ 504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tst = VG_(get_ThreadState)(tid); 505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tst->arch.vex.guest_RSP -= sizeof(Addr); 506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* This is only so that the RIP is (might be) useful to report if 508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown something goes wrong in the sigreturn. JRS 20070318: no idea 509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown what this is for */ 510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(fixup_guest_state_to_restart_syscall)(&tst->arch); 511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Restore register state from frame and remove it, as 513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown described above */ 514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigframe_destroy)(tid, True); 515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Tell the driver not to update the guest state with the "result", 517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and set a bogus result to keep it happy. */ 518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfNoWriteResult; 519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Success(0); 520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Check to see if any signals arose as a result of this. */ 522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfPollAfter; 523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_arch_prctl) 526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* tst; 528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT( "arch_prctl ( %ld, %lx )", ARG1, ARG2 ); 529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_valid_tid)(tid)); 531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(tid >= 1 && tid < VG_N_THREADS); 532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_running_thread)(tid)); 533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Nb: can't use "ARG2".."ARG5" here because that's our own macro... 535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(long, "arch_prctl", 536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, option, unsigned long, arg2); 537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // XXX: totally wrong... we need to look at the 'option' arg, and do 538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // PRE_MEM_READs/PRE_MEM_WRITEs as necessary... 539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* "do" the syscall ourselves; the kernel never sees it */ 541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 == VKI_ARCH_SET_FS) { 542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tst = VG_(get_ThreadState)(tid); 543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tst->arch.vex.guest_FS_ZERO = ARG2; 544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else if (ARG1 == VKI_ARCH_GET_FS) { 546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE("arch_prctl(addr)", ARG2, sizeof(unsigned long)); 547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tst = VG_(get_ThreadState)(tid); 548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *(unsigned long *)ARG2 = tst->arch.vex.guest_FS_ZERO; 549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE(ARG2, sizeof(unsigned long)); 550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else { 552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(core_panic)("Unsupported arch_prtctl option"); 553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Note; the Status writeback to guest state that happens after 556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown this wrapper returns does not change guest_FS_ZERO; hence that 557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown direct assignment to the guest state is safe here. */ 558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Success( 0 ); 559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Parts of this are amd64-specific, but the *PEEK* cases are generic. 562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// ARG3 is only used for pointers into the traced process's address 564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// space and for offsets into the traced process's struct 565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// user_regs_struct. It is never a pointer into this process's memory 566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// space, and we should therefore not check anything it points to. 567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_ptrace) 568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4); 570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(int, "ptrace", 571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown long, request, long, pid, long, addr, long, data); 572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (ARG1) { 573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKTEXT: 574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKDATA: 575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKUSR: 576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "ptrace(peek)", ARG4, 577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sizeof (long)); 578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETREGS: 580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "ptrace(getregs)", ARG4, 581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sizeof (struct vki_user_regs_struct)); 582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETFPREGS: 584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4, 585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sizeof (struct vki_user_i387_struct)); 586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_SETREGS: 588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "ptrace(setregs)", ARG4, 589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sizeof (struct vki_user_regs_struct)); 590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_SETFPREGS: 592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "ptrace(setfpregs)", ARG4, 593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sizeof (struct vki_user_i387_struct)); 594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETEVENTMSG: 596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long)); 597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETSIGINFO: 599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t)); 600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_SETSIGINFO: 602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t)); 603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_ptrace) 610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (ARG1) { 612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKTEXT: 613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKDATA: 614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKUSR: 615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG4, sizeof (long)); 616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETREGS: 618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct)); 619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETFPREGS: 621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct)); 622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETEVENTMSG: 624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG4, sizeof(unsigned long)); 625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETSIGINFO: 627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* XXX: This is a simplification. Different parts of the 628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * siginfo_t are valid depending on the type of signal. 629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t)); 631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_socket) 638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_socket ( %ld, %ld, %ld )",ARG1,ARG2,ARG3); 640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "socket", int, domain, int, type, int, protocol); 641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_socket) 643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes r; 645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_POST_sys_socket)(tid, VG_(mk_SysRes_Success)(RES)); 647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setsockopt) 651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_setsockopt ( %ld, %ld, %ld, %#lx, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5); 653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ5(long, "setsockopt", 654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, int, level, int, optname, 655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const void *, optval, int, optlen); 656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_setsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5); 657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getsockopt) 660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_getsockopt ( %ld, %ld, %ld, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5); 662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ5(long, "getsockopt", 663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, int, level, int, optname, 664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *, optval, int, *optlen); 665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_PRE_sys_getsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5); 666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getsockopt) 668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_POST_sys_getsockopt)(tid, VG_(mk_SysRes_Success)(RES), 671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3,ARG4,ARG5); 672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_connect) 675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_connect ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "connect", 679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, sockfd, struct sockaddr *, serv_addr, int, addrlen); 680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_connect)(tid, ARG1,ARG2,ARG3); 681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_accept) 684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_accept ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "accept", 688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, struct sockaddr *, addr, int, *addrlen); 689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3); 690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_accept) 692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes r; 694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES), 696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3); 697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_accept4) 701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_accept4 ( %ld, %#lx, %ld, %ld )",ARG1,ARG2,ARG3,ARG4); 704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "accept4", 705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, struct sockaddr *, addr, int, *addrlen, int, flags); 706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3); 707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_accept4) 709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes r; 711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES), 713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3); 714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sendto) 718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_sendto ( %ld, %#lx, %ld, %lu, %#lx, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5,ARG6); 721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ6(long, "sendto", 722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, const void *, msg, int, len, 723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned int, flags, 724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const struct sockaddr *, to, int, tolen); 725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_sendto)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6); 726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_recvfrom) 729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_recvfrom ( %ld, %#lx, %ld, %lu, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5,ARG6); 732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ6(long, "recvfrom", 733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, void *, buf, int, len, unsigned int, flags, 734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct sockaddr *, from, int *, fromlen); 735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_recvfrom)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6); 736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_recvfrom) 738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_recvfrom)(tid, VG_(mk_SysRes_Success)(RES), 741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3,ARG4,ARG5,ARG6); 742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sendmsg) 745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_sendmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "sendmsg", 749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, const struct msghdr *, msg, int, flags); 750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_sendmsg)(tid, ARG1,ARG2); 751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_recvmsg) 754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_recvmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "recvmsg", int, s, struct msghdr *, msg, int, flags); 758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_recvmsg)(tid, ARG1,ARG2); 759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_recvmsg) 761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_recvmsg)(tid, ARG1,ARG2); 763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shutdown) 766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_shutdown ( %ld, %ld )",ARG1,ARG2); 769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(int, "shutdown", int, s, int, how); 770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_bind) 773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_bind ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "bind", 776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, sockfd, struct sockaddr *, my_addr, int, addrlen); 777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_bind)(tid, ARG1,ARG2,ARG3); 778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_listen) 781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_listen ( %ld, %ld )",ARG1,ARG2); 783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(long, "listen", int, s, int, backlog); 784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getsockname) 787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_getsockname ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3); 789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "getsockname", 790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, struct sockaddr *, name, int *, namelen); 791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_getsockname)(tid, ARG1,ARG2,ARG3); 792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getsockname) 794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_getsockname)(tid, VG_(mk_SysRes_Success)(RES), 797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3); 798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getpeername) 801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_getpeername ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3); 803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "getpeername", 804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, s, struct sockaddr *, name, int *, namelen); 805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_getpeername)(tid, ARG1,ARG2,ARG3); 806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getpeername) 808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_getpeername)(tid, VG_(mk_SysRes_Success)(RES), 811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3); 812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_socketpair) 815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_socketpair ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4); 817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "socketpair", 818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, d, int, type, int, protocol, int*, sv); 819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_socketpair)(tid, ARG1,ARG2,ARG3,ARG4); 820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_socketpair) 822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(SUCCESS); 824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_socketpair)(tid, VG_(mk_SysRes_Success)(RES), 825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1,ARG2,ARG3,ARG4); 826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semget) 829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3); 831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "semget", vki_key_t, key, int, nsems, int, semflg); 832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semop) 835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semop ( %ld, %#lx, %lu )",ARG1,ARG2,ARG3); 838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "semop", 839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, struct sembuf *, sops, unsigned, nsoops); 840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_semop)(tid, ARG1,ARG2,ARG3); 841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semtimedop) 844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semtimedop ( %ld, %#lx, %lu, %#lx )",ARG1,ARG2,ARG3,ARG4); 847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "semtimedop", 848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, struct sembuf *, sops, unsigned, nsoops, 849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct timespec *, timeout); 850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_semtimedop)(tid, ARG1,ARG2,ARG3,ARG4); 851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semctl) 854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (ARG3 & ~VKI_IPC_64) { 856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_IPC_INFO: 857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SEM_INFO: 858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4); 859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "semctl", 860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, int, semnum, int, cmd, struct seminfo *, arg); 861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_IPC_STAT: 863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SEM_STAT: 864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_IPC_SET: 865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4); 866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "semctl", 867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, int, semnum, int, cmd, struct semid_ds *, arg); 868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_GETALL: 870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_SETALL: 871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4); 872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "semctl", 873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, int, semnum, int, cmd, unsigned short *, arg); 874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_semctl ( %ld, %ld, %ld )",ARG1,ARG2,ARG3); 877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "semctl", 878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, semid, int, semnum, int, cmd); 879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_semctl)(tid, ARG1,ARG2,ARG3|VKI_IPC_64,ARG4); 882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_semctl) 884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_semctl)(tid, RES,ARG1,ARG2,ARG3|VKI_IPC_64,ARG4); 886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgget) 889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_msgget ( %ld, %ld )",ARG1,ARG2); 891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(long, "msgget", vki_key_t, key, int, msgflg); 892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgsnd) 895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_msgsnd ( %ld, %#lx, %ld, %ld )",ARG1,ARG2,ARG3,ARG4); 897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "msgsnd", 898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz, int, msgflg); 899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_PRE_sys_msgsnd)(tid, ARG1,ARG2,ARG3,ARG4); 900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((ARG4 & VKI_IPC_NOWAIT) == 0) 901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgrcv) 905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_msgrcv ( %ld, %#lx, %ld, %ld, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5); 907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ5(long, "msgrcv", 908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz, 909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown long, msgytp, int, msgflg); 910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_PRE_sys_msgrcv)(tid, ARG1,ARG2,ARG3,ARG4,ARG5); 911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((ARG4 & VKI_IPC_NOWAIT) == 0) 912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; 913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_msgrcv) 915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_POST_sys_msgrcv)(tid, RES,ARG1,ARG2,ARG3,ARG4,ARG5); 917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgctl) 920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_msgctl ( %ld, %ld, %#lx )",ARG1,ARG2,ARG3); 922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "msgctl", 923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, msqid, int, cmd, struct msqid_ds *, buf); 924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_PRE_sys_msgctl)(tid, ARG1,ARG2,ARG3); 925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_msgctl) 927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_POST_sys_msgctl)(tid, RES,ARG1,ARG2,ARG3); 929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmget) 932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_shmget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3); 934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "shmget", vki_key_t, key, vki_size_t, size, int, shmflg); 935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(wrap_sys_shmat) 938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UWord arg2tmp; 940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("wrap_sys_shmat ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3); 941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "shmat", 942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, shmid, const void *, shmaddr, int, shmflg); 943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown arg2tmp = ML_(generic_PRE_sys_shmat)(tid, ARG1,ARG2,ARG3); 944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (arg2tmp == 0) 945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EINVAL ); 946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG2 = arg2tmp; // used in POST 948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(wrap_sys_shmat) 950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_shmat)(tid, RES,ARG1,ARG2,ARG3); 952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmdt) 955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_shmdt ( %#lx )",ARG1); 957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ1(long, "shmdt", const void *, shmaddr); 958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!ML_(generic_PRE_sys_shmdt)(tid, ARG1)) 959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EINVAL ); 960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_shmdt) 962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_shmdt)(tid, RES,ARG1); 964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmctl) 967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_shmctl ( %ld, %ld, %#lx )",ARG1,ARG2,ARG3); 969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ3(long, "shmctl", 970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, shmid, int, cmd, struct shmid_ds *, buf); 971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_PRE_sys_shmctl)(tid, ARG1,ARG2|VKI_IPC_64,ARG3); 972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_shmctl) 974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(generic_POST_sys_shmctl)(tid, RES,ARG1,ARG2|VKI_IPC_64,ARG3); 976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fadvise64) 979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_fadvise64 ( %ld, %ld, %lu, %ld )", ARG1,ARG2,ARG3,ARG4); 981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "fadvise64", 982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, fd, vki_loff_t, offset, vki_size_t, len, int, advice); 983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mmap) 986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes r; 988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %d, %ld )", 990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1, (ULong)ARG2, ARG3, ARG4, (Int)ARG5, ARG6 ); 991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ6(long, "mmap", 992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, start, unsigned long, length, 993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, prot, unsigned long, flags, 994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, fd, unsigned long, offset); 995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 ); 997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------- 1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE/POST wrappers for AMD64/Linux-variant specific syscalls 1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------ */ 1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_syscall184) 1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int err; 1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* 184 is used by sys_bproc. If we're not on a declared bproc 1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown variant, fail in the usual way, since it is otherwise unused. */ 1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!VG_(strstr)(VG_(clo_kernel_variant), "bproc")) { 1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("non-existent syscall! (syscall 184)"); 1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ0(long, "ni_syscall(184)"); 1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_ENOSYS ); 1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown err = ML_(linux_variant_PRE_sys_bproc)( ARG1, ARG2, ARG3, 1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG4, ARG5, ARG6 ); 1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (err) { 1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( err ); 1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Let it go through. */ 1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; /* who knows? play safe. */ 1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_syscall184) 1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_variant_POST_sys_bproc)( ARG1, ARG2, ARG3, 1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG4, ARG5, ARG6 ); 1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef PRE 1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef POST 1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The AMD64/Linux syscall table 1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add an amd64-linux specific wrapper to a syscall table. */ 1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAX_(const, name) WRAPPER_ENTRY_X_(amd64_linux, const, name) 1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAXY(const, name) WRAPPER_ENTRY_XY(amd64_linux, const, name) 1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This table maps from __NR_xxx syscall numbers (from 1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/include/asm-x86_64/unistd.h) to the appropriate PRE/POST sys_foo() 1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// wrappers on AMD64 (as per sys_call_table in 1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/arch/x86_64/kernel/entry.S). 1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// When implementing these wrappers, you need to work out if the wrapper is 1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// generic, Linux-only (but arch-independent), or AMD64/Linux only. 1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry syscall_table[] = { 1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_read, sys_read), // 0 1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_write, sys_write), // 1 1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_open, sys_open), // 2 1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_close, sys_close), // 3 1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_stat, sys_newstat), // 4 1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_fstat, sys_newfstat), // 5 1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_lstat, sys_newlstat), // 6 1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_poll, sys_poll), // 7 1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_lseek, sys_lseek), // 8 1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_mmap, sys_mmap), // 9 1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_mprotect, sys_mprotect), // 10 1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_munmap, sys_munmap), // 11 1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_brk, sys_brk), // 12 1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 13 1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 14 1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 15 1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_ioctl, sys_ioctl), // 16 1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_pread64, sys_pread64), // 17 1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_pwrite64, sys_pwrite64), // 18 1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_readv, sys_readv), // 19 1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_writev, sys_writev), // 20 1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_access, sys_access), // 21 1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_pipe, sys_pipe), // 22 1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_select, sys_select), // 23 1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_yield, sys_sched_yield), // 24 1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mremap, sys_mremap), // 25 1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_msync, sys_msync), // 26 1088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_mincore, sys_mincore), // 27 1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_madvise, sys_madvise), // 28 1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_shmget, sys_shmget), // 29 1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_shmat, wrap_sys_shmat), // 30 1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_shmctl, sys_shmctl), // 31 1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_dup, sys_dup), // 32 1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_dup2, sys_dup2), // 33 1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_pause, sys_pause), // 34 1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_nanosleep, sys_nanosleep), // 35 1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getitimer, sys_getitimer), // 36 1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_alarm, sys_alarm), // 37 1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_setitimer, sys_setitimer), // 38 1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpid, sys_getpid), // 39 1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sendfile, sys_sendfile), // 40 1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_socket, sys_socket), // 41 1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_connect, sys_connect), // 42 1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_accept, sys_accept), // 43 1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_sendto, sys_sendto), // 44 1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_recvfrom, sys_recvfrom), // 45 1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_sendmsg, sys_sendmsg), // 46 1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_recvmsg, sys_recvmsg), // 47 1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_shutdown, sys_shutdown), // 48 1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_bind, sys_bind), // 49 1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_listen, sys_listen), // 50 1117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_getsockname, sys_getsockname), // 51 1118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_getpeername, sys_getpeername), // 52 1119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_socketpair, sys_socketpair), // 53 1120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_setsockopt, sys_setsockopt), // 54 1121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_getsockopt, sys_getsockopt), // 55 1123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_clone, sys_clone), // 56 1124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fork, sys_fork), // 57 1125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_vfork, sys_fork), // 58 treat as fork 1126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_execve, sys_execve), // 59 1127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_exit, sys_exit), // 60 1129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_wait4, sys_wait4), // 61 1130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_kill, sys_kill), // 62 1131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_uname, sys_newuname), // 63 1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_semget, sys_semget), // 64 1133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_semop, sys_semop), // 65 1135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_semctl, sys_semctl), // 66 1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_shmdt, sys_shmdt), // 67 1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_msgget, sys_msgget), // 68 1138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_msgsnd, sys_msgsnd), // 69 1139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_msgrcv, sys_msgrcv), // 70 1141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_msgctl, sys_msgctl), // 71 1142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_fcntl, sys_fcntl), // 72 1143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_flock, sys_flock), // 73 1144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fsync, sys_fsync), // 74 1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fdatasync, sys_fdatasync), // 75 1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_truncate, sys_truncate), // 76 1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_ftruncate, sys_ftruncate), // 77 1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getdents, sys_getdents), // 78 1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getcwd, sys_getcwd), // 79 1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chdir, sys_chdir), // 80 1153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchdir, sys_fchdir), // 81 1154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_rename, sys_rename), // 82 1155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mkdir, sys_mkdir), // 83 1156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_rmdir, sys_rmdir), // 84 1157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_creat, sys_creat), // 85 1159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_link, sys_link), // 86 1160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_unlink, sys_unlink), // 87 1161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_symlink, sys_symlink), // 88 1162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_readlink, sys_readlink), // 89 1163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chmod, sys_chmod), // 90 1165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchmod, sys_fchmod), // 91 1166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chown, sys_chown), // 92 1167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchown, sys_fchown), // 93 1168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_lchown, sys_lchown), // 94 1169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_umask, sys_umask), // 95 1171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_gettimeofday, sys_gettimeofday), // 96 1172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getrlimit, sys_getrlimit), // 97 1173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getrusage, sys_getrusage), // 98 1174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sysinfo, sys_sysinfo), // 99 1175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_times, sys_times), // 100 1177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_ptrace, sys_ptrace), // 101 1178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getuid, sys_getuid), // 102 1179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_syslog, sys_syslog), // 103 1180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getgid, sys_getgid), // 104 1181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setuid, sys_setuid), // 105 1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setgid, sys_setgid), // 106 1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_geteuid, sys_geteuid), // 107 1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getegid, sys_getegid), // 108 1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setpgid, sys_setpgid), // 109 1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getppid, sys_getppid), // 110 1189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpgrp, sys_getpgrp), // 111 1190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setsid, sys_setsid), // 112 1191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setreuid, sys_setreuid), // 113 1192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setregid, sys_setregid), // 114 1193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getgroups, sys_getgroups), // 115 1195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setgroups, sys_setgroups), // 116 1196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setresuid, sys_setresuid), // 117 1197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getresuid, sys_getresuid), // 118 1198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setresgid, sys_setresgid), // 119 1199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getresgid, sys_getresgid), // 120 1201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpgid, sys_getpgid), // 121 1202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setfsuid, sys_setfsuid), // 122 1203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setfsgid, sys_setfsgid), // 123 1204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getsid, sys_getsid), // 124 1205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_capget, sys_capget), // 125 1207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_capset, sys_capset), // 126 1208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 127 1209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait),// 128 1210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),// 129 1211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 130 1213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_sigaltstack, sys_sigaltstack), // 131 1214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_utime, sys_utime), // 132 1215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mknod, sys_mknod), // 133 1216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_uselib, sys_uselib), // 134 1217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_personality, sys_personality), // 135 1219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_ustat, sys_ustat), // 136 1220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_statfs, sys_statfs), // 137 1221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_fstatfs, sys_fstatfs), // 138 1222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_sysfs, sys_sysfs), // 139 1223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpriority, sys_getpriority), // 140 1225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setpriority, sys_setpriority), // 141 1226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_setparam, sys_sched_setparam), // 142 1227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_getparam, sys_sched_getparam), // 143 1228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 144 1229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 145 1231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max), // 146 1232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min), // 147 1233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 148 1234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mlock, sys_mlock), // 149 1235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_munlock, sys_munlock), // 150 1237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mlockall, sys_mlockall), // 151 1238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_munlockall, sys_munlockall), // 152 1239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_vhangup, sys_vhangup), // 153 1240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_modify_ldt, sys_modify_ldt), // 154 1241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_pivot_root, sys_pivot_root), // 155 1243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR__sysctl, sys_sysctl), // 156 1244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_prctl, sys_prctl), // 157 1245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_arch_prctl, sys_arch_prctl), // 158 1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_adjtimex, sys_adjtimex), // 159 1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setrlimit, sys_setrlimit), // 160 1249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chroot, sys_chroot), // 161 1250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_sync, sys_sync), // 162 1251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_acct, sys_acct), // 163 1252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_settimeofday, sys_settimeofday), // 164 1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mount, sys_mount), // 165 1255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_umount2, sys_umount), // 166 1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_swapon, sys_swapon), // 167 1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_swapoff, sys_swapoff), // 168 1258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_reboot, sys_reboot), // 169 1259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_sethostname, sys_sethostname), // 170 1261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_setdomainname, sys_setdomainname), // 171 1262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_iopl, sys_iopl), // 172 1263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_ioperm, sys_ioperm), // 173 1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_create_module, sys_ni_syscall), // 174 1265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_init_module, sys_init_module), // 175 1267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_delete_module, sys_delete_module), // 176 1268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_get_kernel_syms, sys_ni_syscall), // 177 1269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_query_module, sys_ni_syscall), // 178 1270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_quotactl, sys_quotactl), // 179 1271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_nfsservctl, sys_nfsservctl), // 180 1273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_getpmsg, sys_ni_syscall), // 181 1274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_putpmsg, sys_ni_syscall), // 182 1275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_afs_syscall, sys_ni_syscall), // 183 1276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(184, sys_syscall184), // 184 // sys_bproc? 1277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_security, sys_ni_syscall), // 185 1279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_gettid, sys_gettid), // 186 1280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_readahead, sys_readahead), // 187 1281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setxattr, sys_setxattr), // 188 1282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_lsetxattr, sys_lsetxattr), // 189 1283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fsetxattr, sys_fsetxattr), // 190 1285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getxattr, sys_getxattr), // 191 1286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_lgetxattr, sys_lgetxattr), // 192 1287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_fgetxattr, sys_fgetxattr), // 193 1288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_listxattr, sys_listxattr), // 194 1289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_llistxattr, sys_llistxattr), // 195 1291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_flistxattr, sys_flistxattr), // 196 1292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_removexattr, sys_removexattr), // 197 1293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_lremovexattr, sys_lremovexattr), // 198 1294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fremovexattr, sys_fremovexattr), // 199 1295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_tkill, sys_tkill), // 200 1297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_time, sys_time), /*was sys_time64*/ // 201 1298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_futex, sys_futex), // 202 1299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 203 1300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 204 1301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_set_thread_area, sys_ni_syscall), // 205 1303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_io_setup, sys_io_setup), // 206 1304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_io_destroy, sys_io_destroy), // 207 1305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_io_getevents, sys_io_getevents), // 208 1306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_io_submit, sys_io_submit), // 209 1307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_io_cancel, sys_io_cancel), // 210 1309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_get_thread_area, sys_ni_syscall), // 211 1310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 212 1311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_create, sys_epoll_create), // 213 1312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_epoll_ctl_old, sys_ni_syscall), // 214 1313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_epoll_wait_old, sys_ni_syscall), // 215 1315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_remap_file_pages, sys_remap_file_pages)// 216 1316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getdents64, sys_getdents64), // 217 1317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_set_tid_address, sys_set_tid_address),// 218 1318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_restart_syscall, sys_restart_syscall),// 219 1319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_semtimedop, sys_semtimedop), // 220 1321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_fadvise64, sys_fadvise64), // 221 1322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_create, sys_timer_create), // 222 1323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_settime, sys_timer_settime), // 223 1324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_gettime, sys_timer_gettime), // 224 1325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_timer_getoverrun, sys_timer_getoverrun), // 225 1327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_timer_delete, sys_timer_delete), // 226 1328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_clock_settime, sys_clock_settime), // 227 1329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_gettime, sys_clock_gettime), // 228 1330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_getres, sys_clock_getres), // 229 1331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_nanosleep, sys_clock_nanosleep),// 230 1333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_exit_group, sys_exit_group), // 231 1334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_wait, sys_epoll_wait), // 232 1335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 233 1336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_tgkill, sys_tgkill), // 234 1337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_utimes, sys_utimes), // 235 1339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_vserver, sys_ni_syscall), // 236 1340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mbind, sys_mbind), // 237 1341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 238 1342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 239 1343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_open, sys_mq_open), // 240 1345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_unlink, sys_mq_unlink), // 241 1346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 242 1347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_timedreceive, sys_mq_timedreceive),// 243 1348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_notify, sys_mq_notify), // 244 1349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 245 1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_kexec_load, sys_ni_syscall), // 246 1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_waitid, sys_waitid), // 247 1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_add_key, sys_add_key), // 248 1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_request_key, sys_request_key), // 249 1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_keyctl, sys_keyctl), // 250 1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_ioprio_set, sys_ioprio_set), // 251 1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_ioprio_get, sys_ioprio_get), // 252 1359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_init, sys_inotify_init), // 253 1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 254 1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 255 1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_migrate_pages, sys_migrate_pages), // 256 1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_openat, sys_openat), // 257 1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mkdirat, sys_mkdirat), // 258 1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mknodat, sys_mknodat), // 259 1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fchownat, sys_fchownat), // 260 1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_futimesat, sys_futimesat), // 261 1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_newfstatat, sys_newfstatat), // 262 1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_unlinkat, sys_unlinkat), // 263 1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_renameat, sys_renameat), // 264 1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_linkat, sys_linkat), // 265 1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_symlinkat, sys_symlinkat), // 266 1376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_readlinkat, sys_readlinkat), // 267 1377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fchmodat, sys_fchmodat), // 268 1378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_faccessat, sys_faccessat), // 269 1379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_pselect6, sys_pselect6), // 270 1381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_ppoll, sys_ppoll), // 271 1382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_unshare, sys_unshare), // 272 1383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_set_robust_list, sys_set_robust_list), // 273 1384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_get_robust_list, sys_get_robust_list), // 274 1385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_splice, sys_splice), // 275 1387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_tee, sys_ni_syscall), // 276 1388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sync_file_range, sys_sync_file_range), // 277 1389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_vmsplice, sys_ni_syscall), // 278 1390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_move_pages, sys_ni_syscall), // 279 1391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_utimensat, sys_utimensat), // 280 1393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 281 1394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_signalfd, sys_signalfd), // 282 1395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_create, sys_timerfd_create), // 283 1396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_eventfd, sys_eventfd), // 284 1397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fallocate, sys_fallocate), // 285 1399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 286 1400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 287 1401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_accept4, sys_accept4), // 288 1402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_signalfd4, sys_signalfd4), // 289 1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_eventfd2, sys_eventfd2), // 290 1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_create1, sys_epoll_create1), // 291 1406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_dup3, sys_dup3), // 292 1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_pipe2, sys_pipe2), // 293 1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_inotify_init1, sys_inotify_init1), // 294 1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_preadv, sys_preadv), // 295 1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_pwritev, sys_pwritev), // 296 1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 297 1413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_perf_event_open, sys_perf_event_open), // 298 1414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINX_(__NR_recvmmsg, sys_ni_syscall), // 299 1415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINX_(__NR_fanotify_init, sys_ni_syscall), // 300 1417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINX_(__NR_fanotify_mark, sys_ni_syscall), // 301 1418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_prlimit64, sys_prlimit64) // 302 1419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINX_(__NR_name_to_handle_at, sys_ni_syscall), // 303 1420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINX_(__NR_open_by_handle_at, sys_ni_syscall), // 304 1421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINX_(__NR_clock_adjtime, sys_ni_syscall), // 305 1423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINX_(__NR_syncfs, sys_ni_syscall), // 306 1424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINX_(__NR_sendmmsg, sys_ni_syscall), // 307 1425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINX_(__NR_setns, sys_ni_syscall), // 308 1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) 1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const UInt syscall_table_size 1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown = sizeof(syscall_table) / sizeof(syscall_table[0]); 1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Is it in the contiguous initial section of the table? */ 1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sysno < syscall_table_size) { 1435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SyscallTableEntry* sys = &syscall_table[sysno]; 1436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sys->before == NULL) 1437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return NULL; /* no entry */ 1438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 1439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return sys; 1440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Can't find a wrapper */ 1443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return NULL; 1444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_amd64_linux) 1447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 1449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end ---*/ 1450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 1451