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 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Copyright (C) 2000-2013 Nicholas Nethercote 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown njn@valgrind.org 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is free software; you can redistribute it and/or 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown modify it under the terms of the GNU General Public License as 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown published by the Free Software Foundation; either version 2 of the 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown License, or (at your option) any later version. 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is distributed in the hope that it will be useful, but 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown WITHOUT ANY WARRANTY; without even the implied warranty of 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown General Public License for more details. 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown You should have received a copy of the GNU General Public License 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown along with this program; if not, write to the Free Software 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 02111-1307, USA. 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The GNU General Public License is contained in the file COPYING. 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(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" 145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng".globl do_syscall_clone_amd64_linux\n" 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"do_syscall_clone_amd64_linux:\n" 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // set up child stack, temporarily preserving fn and arg 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" subq $16, %rsi\n" // make space on stack 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %rcx, 8(%rsi)\n" // save arg 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %rdi, 0(%rsi)\n" // save fn 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // setup syscall 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $"__NR_CLONE", %rax\n" // syscall number 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %rdx, %rdi\n" // syscall arg1: flags 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // %rsi already setup // syscall arg2: child_stack 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %r9, %rdx\n" // syscall arg3: parent_tid 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %r8, %r10\n" // syscall arg4: child_tid 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq 8(%rsp), %r8\n" // syscall arg5: tls_ptr 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" syscall\n" // clone() 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" testq %rax, %rax\n" // child if retval == 0 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" jnz 1f\n" 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // CHILD - call thread function 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" pop %rax\n" // pop fn 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" pop %rdi\n" // pop fn arg1: arg 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" call *%rax\n" // call fn 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // exit with result 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq %rax, %rdi\n" // arg1: return value from fn 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" movq $"__NR_EXIT", %rax\n" 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" syscall\n" 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Exit returned?! 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ud2\n" 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"1:\n" // PARENT or ERROR 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ret\n" 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".previous\n" 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown); 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_CLONE 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_EXIT 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// forward declaration 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void setup_child ( ThreadArchState*, ThreadArchState* ); 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown When a client clones, we need to keep track of the new thread. This means: 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1. allocate a ThreadId+ThreadState+stack for the the thread 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2. initialize the thread's new VCPU state 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3. create the thread using the same args as the client requested, 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown but using the scheduler entrypoint for EIP, and a separate stack 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for ESP. 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes do_clone ( ThreadId ptid, 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong flags, Addr rsp, 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long* parent_tidptr, 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long* child_tidptr, 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr tlsaddr ) 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static const Bool debug = False; 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadId ctid = VG_(alloc_ThreadState)(); 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* ptst = VG_(get_ThreadState)(ptid); 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* ctst = VG_(get_ThreadState)(ctid); 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UWord* stack; 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NSegment const* seg; 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes res; 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long rax; 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vki_sigset_t blockall, savedmask; 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigfillset)(&blockall); 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_running_thread)(ptid)); 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_valid_tid)(ctid)); 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stack = (UWord*)ML_(allocstack)(ctid); 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (stack == NULL) { 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown res = VG_(mk_SysRes_Error)( VKI_ENOMEM ); 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto out; 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Copy register state 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Both parent and child return to the same place, and the code 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown following the clone syscall works out which is which, so we 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown don't need to worry about it. 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The parent gets the child's new tid returned from clone, but the 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child gets 0. 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown If the clone call specifies a NULL rsp for the new thread, then 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown it actually gets a copy of the parent's rsp. 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown setup_child( &ctst->arch, &ptst->arch ); 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Make sys_clone appear to have returned Success(0) in the 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child. */ 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->arch.vex.guest_RAX = 0; 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (rsp != 0) 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->arch.vex.guest_RSP = rsp; 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->os_state.parent = ptid; 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* inherit signal mask */ 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->sig_mask = ptst->sig_mask; 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->tmp_sig_mask = ptst->sig_mask; 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Start the child with its threadgroup being the same as the 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown parent's. This is so that any exit_group calls that happen 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown after the child is created but before it sets its 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown os_state.threadgroup field for real (in thread_wrapper in 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown syswrap-linux.c), really kill the new thread. a.k.a this avoids 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown a race condition in which the thread is unkillable (via 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit_group) because its threadgroup is not set. The race window 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is probably only a few hundred or a few thousand cycles long. 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown See #226116. */ 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->os_state.threadgroup = ptst->os_state.threadgroup; 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* We don't really know where the client stack is, because its 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown allocated by the client. The best we can do is look at the 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memory mappings and try to derive some useful information. We 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assume that esp starts near its highest possible value, and can 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown only go down to the start of the mmaped segment. */ 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown seg = VG_(am_find_nsegment)((Addr)rsp); 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (seg && seg->kind != SkResvn) { 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(rsp); 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start; 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(register_stack)(seg->start, ctst->client_stack_highest_word); 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (debug) 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n", 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctid, seg->start, VG_PGROUNDUP(rsp)); 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "!? New thread %d starts with RSP(%#lx) unmapped\n", 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctid, rsp); 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_szB = 0; 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Assume the clone will succeed, and tell any tool that wants to 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown know that this thread has come into existence. If the clone 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fails, we'll send out a ll_exit notification for it at the out: 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown label below, to clean up. */ 293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vg_assert(VG_(owns_BigLock_LL)(ptid)); 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_TRACK ( pre_thread_ll_create, ptid, ctid ); 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (flags & VKI_CLONE_SETTLS) { 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (debug) 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(printf)("clone child has SETTLS: tls at %#lx\n", tlsaddr); 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->arch.vex.guest_FS_ZERO = tlsaddr; 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown flags &= ~VKI_CLONE_SETTLS; 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* start the thread with everything blocked */ 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask); 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Create the new thread */ 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rax = do_syscall_clone_amd64_linux( 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid], 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child_tidptr, parent_tidptr, NULL 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ); 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown res = VG_(mk_SysRes_amd64_linux)( rax ); 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL); 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown out: 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sr_isError(res)) { 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* clone failed */ 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(cleanup_thread)(&ctst->arch); 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->status = VgTs_Empty; 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* oops. Better tell the tool the thread exited in a hurry :-) */ 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_TRACK( pre_thread_ll_exit, ctid ); 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return res; 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown More thread stuff 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(cleanup_thread) ( ThreadArchState *arch ) 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid setup_child ( /*OUT*/ ThreadArchState *child, 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*IN*/ ThreadArchState *parent ) 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* We inherit our parent's guest state. */ 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex = parent->vex; 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex_shadow1 = parent->vex_shadow1; 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex_shadow2 = parent->vex_shadow2; 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE/POST wrappers for AMD64/Linux-specific syscalls 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE(name) DEFN_PRE_TEMPLATE(amd64_linux, name) 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST(name) DEFN_POST_TEMPLATE(amd64_linux, name) 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add prototypes for the wrappers declared here, so that gcc doesn't 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown harass us for not having prototypes. Really this is a kludge -- 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the right thing to do is to make these wrappers 'static' since they 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown aren't visible outside this file, but that requires even more macro 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown magic. */ 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_clone); 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_rt_sigreturn); 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_arch_prctl); 362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_ptrace); 363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_fadvise64); 364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_mmap); 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_syscall184); 366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clone) 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong cloneflags; 371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5); 373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PRE_REG_READ2(int, "clone", 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, flags, 375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void *, child_stack); 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & VKI_CLONE_PARENT_SETTID) { 378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (VG_(tdict).track_pre_reg_read) { 379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PRA3("clone", int *, parent_tidptr); 380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int)); 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int), VKI_PROT_WRITE)) { 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EFAULT ); 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (ARG1 & VKI_CLONE_SETTLS) { 388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (VG_(tdict).track_pre_reg_read) { 389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PRA4("clone", vki_modify_ldt_t *, tlsinfo); 390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PRE_MEM_READ("clone(tlsinfo)", ARG4, sizeof(vki_modify_ldt_t)); 392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!VG_(am_is_valid_for_client)(ARG4, sizeof(vki_modify_ldt_t), 393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VKI_PROT_READ)) { 394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_STATUS_Failure( VKI_EFAULT ); 395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) { 399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (VG_(tdict).track_pre_reg_read) { 400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PRA5("clone", int *, child_tidptr); 401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE("clone(child_tidptr)", ARG4, sizeof(Int)); 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!VG_(am_is_valid_for_client)(ARG4, sizeof(Int), VKI_PROT_WRITE)) { 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EFAULT ); 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags = ARG1; 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) { 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EINVAL ); 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Only look at the flags we really care about */ 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown | VKI_CLONE_FILES | VKI_CLONE_VFORK)) { 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES: 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* thread creation */ 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes( 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do_clone(tid, 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1, /* flags */ 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Addr)ARG2, /* child ESP */ 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Long *)ARG3, /* parent_tidptr */ 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Long *)ARG4, /* child_tidptr */ 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Addr)ARG5)); /* set_tls */ 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */ 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* FALLTHROUGH - assume vfork == fork */ 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM); 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 0: /* plain fork */ 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes( 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(do_fork_clone)(tid, 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags, /* flags */ 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG3, /* parent_tidptr */ 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG4)); /* child_tidptr */ 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* should we just ENOSYS? */ 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "Unsupported clone() flags: 0x%lx\n", ARG1); 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n"); 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "The only supported clone() uses are:\n"); 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown " - via a threads library (LinuxThreads or NPTL)\n"); 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown " - via the implementation of fork or vfork\n"); 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(unimplemented) 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ("Valgrind does not support general clone()."); 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (SUCCESS) { 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & VKI_CLONE_PARENT_SETTID) 460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE(ARG3, sizeof(Int)); 461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE(ARG4, sizeof(Int)); 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Thread creation was successful; let the child have the chance 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown to run */ 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfYieldAfter; 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigreturn) 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* This isn't really a syscall at all - it's a misuse of the 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown syscall mechanism by m_sigframe. VG_(sigframe_create) sets the 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return address of the signal frames it creates to be a short 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown piece of code which does this "syscall". The only purpose of 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the syscall is to call VG_(sigframe_destroy), which restores the 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown thread's registers from the frame and then removes it. 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Consequently we must ask the syswrap driver logic not to write 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown back the syscall "result" as that would overwrite the 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown just-restored register state. */ 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* tst; 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_rt_sigreturn ( )"); 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_valid_tid)(tid)); 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(tid >= 1 && tid < VG_N_THREADS); 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_running_thread)(tid)); 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Adjust RSP to point to start of frame; skip back up over handler 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ret addr */ 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tst = VG_(get_ThreadState)(tid); 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tst->arch.vex.guest_RSP -= sizeof(Addr); 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* This is only so that the RIP is (might be) useful to report if 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown something goes wrong in the sigreturn. JRS 20070318: no idea 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown what this is for */ 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(fixup_guest_state_to_restart_syscall)(&tst->arch); 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Restore register state from frame and remove it, as 500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown described above */ 501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigframe_destroy)(tid, True); 502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Tell the driver not to update the guest state with the "result", 504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and set a bogus result to keep it happy. */ 505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfNoWriteResult; 506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Success(0); 507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Check to see if any signals arose as a result of this. */ 509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfPollAfter; 510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_arch_prctl) 513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* tst; 515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT( "arch_prctl ( %ld, %lx )", ARG1, ARG2 ); 516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_valid_tid)(tid)); 518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(tid >= 1 && tid < VG_N_THREADS); 519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_running_thread)(tid)); 520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Nb: can't use "ARG2".."ARG5" here because that's our own macro... 522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ2(long, "arch_prctl", 523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, option, unsigned long, arg2); 524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // XXX: totally wrong... we need to look at the 'option' arg, and do 525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // PRE_MEM_READs/PRE_MEM_WRITEs as necessary... 526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* "do" the syscall ourselves; the kernel never sees it */ 528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 == VKI_ARCH_SET_FS) { 529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tst = VG_(get_ThreadState)(tid); 530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tst->arch.vex.guest_FS_ZERO = ARG2; 531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else if (ARG1 == VKI_ARCH_GET_FS) { 533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE("arch_prctl(addr)", ARG2, sizeof(unsigned long)); 534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tst = VG_(get_ThreadState)(tid); 535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *(unsigned long *)ARG2 = tst->arch.vex.guest_FS_ZERO; 536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE(ARG2, sizeof(unsigned long)); 537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else { 539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(core_panic)("Unsupported arch_prtctl option"); 540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Note; the Status writeback to guest state that happens after 543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown this wrapper returns does not change guest_FS_ZERO; hence that 544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown direct assignment to the guest state is safe here. */ 545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Success( 0 ); 546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Parts of this are amd64-specific, but the *PEEK* cases are generic. 549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// ARG3 is only used for pointers into the traced process's address 551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// space and for offsets into the traced process's struct 552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// user_regs_struct. It is never a pointer into this process's memory 553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// space, and we should therefore not check anything it points to. 554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_ptrace) 555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4); 557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(int, "ptrace", 558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown long, request, long, pid, long, addr, long, data); 559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (ARG1) { 560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKTEXT: 561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKDATA: 562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKUSR: 563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "ptrace(peek)", ARG4, 564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sizeof (long)); 565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETREGS: 567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "ptrace(getregs)", ARG4, 568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sizeof (struct vki_user_regs_struct)); 569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETFPREGS: 571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4, 572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sizeof (struct vki_user_i387_struct)); 573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_SETREGS: 575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "ptrace(setregs)", ARG4, 576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sizeof (struct vki_user_regs_struct)); 577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_SETFPREGS: 579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "ptrace(setfpregs)", ARG4, 580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sizeof (struct vki_user_i387_struct)); 581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETEVENTMSG: 583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long)); 584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETSIGINFO: 586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t)); 587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_SETSIGINFO: 589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t)); 590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case VKI_PTRACE_GETREGSET: 592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ML_(linux_PRE_getregset)(tid, ARG3, ARG4); 593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case VKI_PTRACE_SETREGSET: 595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ML_(linux_PRE_setregset)(tid, ARG3, ARG4); 596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_ptrace) 603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (ARG1) { 605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKTEXT: 606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKDATA: 607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_PEEKUSR: 608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG4, sizeof (long)); 609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETREGS: 611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct)); 612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETFPREGS: 614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct)); 615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETEVENTMSG: 617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG4, sizeof(unsigned long)); 618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_PTRACE_GETSIGINFO: 620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* XXX: This is a simplification. Different parts of the 621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * siginfo_t are valid depending on the type of signal. 622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t)); 624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case VKI_PTRACE_GETREGSET: 626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ML_(linux_POST_getregset)(tid, ARG3, ARG4); 627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fadvise64) 634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_fadvise64 ( %ld, %ld, %lu, %ld )", ARG1,ARG2,ARG3,ARG4); 636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "fadvise64", 637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, fd, vki_loff_t, offset, vki_size_t, len, int, advice); 638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mmap) 641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes r; 643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %d, %ld )", 645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1, (ULong)ARG2, ARG3, ARG4, (Int)ARG5, ARG6 ); 646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ6(long, "mmap", 647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, start, unsigned long, length, 648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, prot, unsigned long, flags, 649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, fd, unsigned long, offset); 650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 ); 652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------- 657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE/POST wrappers for AMD64/Linux-variant specific syscalls 658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------ */ 659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_syscall184) 661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int err; 663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* 184 is used by sys_bproc. If we're not on a declared bproc 665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown variant, fail in the usual way, since it is otherwise unused. */ 666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!VG_(strstr)(VG_(clo_kernel_variant), "bproc")) { 668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("non-existent syscall! (syscall 184)"); 669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ0(long, "ni_syscall(184)"); 670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_ENOSYS ); 671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown err = ML_(linux_variant_PRE_sys_bproc)( ARG1, ARG2, ARG3, 675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG4, ARG5, ARG6 ); 676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (err) { 677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( err ); 678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Let it go through. */ 681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfMayBlock; /* who knows? play safe. */ 682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_syscall184) 685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(linux_variant_POST_sys_bproc)( ARG1, ARG2, ARG3, 687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG4, ARG5, ARG6 ); 688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef PRE 691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef POST 692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The AMD64/Linux syscall table 696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add an amd64-linux specific wrapper to a syscall table. */ 699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAX_(const, name) WRAPPER_ENTRY_X_(amd64_linux, const, name) 700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAXY(const, name) WRAPPER_ENTRY_XY(amd64_linux, const, name) 701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This table maps from __NR_xxx syscall numbers (from 703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/include/asm-x86_64/unistd.h) to the appropriate PRE/POST sys_foo() 704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// wrappers on AMD64 (as per sys_call_table in 705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/arch/x86_64/kernel/entry.S). 706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// When implementing these wrappers, you need to work out if the wrapper is 708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// generic, Linux-only (but arch-independent), or AMD64/Linux only. 709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry syscall_table[] = { 711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_read, sys_read), // 0 712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_write, sys_write), // 1 713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_open, sys_open), // 2 714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_close, sys_close), // 3 715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_stat, sys_newstat), // 4 716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_fstat, sys_newfstat), // 5 718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_lstat, sys_newlstat), // 6 719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_poll, sys_poll), // 7 720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_lseek, sys_lseek), // 8 721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_mmap, sys_mmap), // 9 722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_mprotect, sys_mprotect), // 10 724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_munmap, sys_munmap), // 11 725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_brk, sys_brk), // 12 726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 13 727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 14 728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 15 730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_ioctl, sys_ioctl), // 16 731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_pread64, sys_pread64), // 17 732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_pwrite64, sys_pwrite64), // 18 733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_readv, sys_readv), // 19 734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_writev, sys_writev), // 20 736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_access, sys_access), // 21 737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_pipe, sys_pipe), // 22 738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_select, sys_select), // 23 739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_yield, sys_sched_yield), // 24 740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mremap, sys_mremap), // 25 742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_msync, sys_msync), // 26 743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENXY(__NR_mincore, sys_mincore), // 27 744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_madvise, sys_madvise), // 28 745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_shmget, sys_shmget), // 29 746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_shmat, wrap_sys_shmat), // 30 748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_shmctl, sys_shmctl), // 31 749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_dup, sys_dup), // 32 750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_dup2, sys_dup2), // 33 751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_pause, sys_pause), // 34 752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_nanosleep, sys_nanosleep), // 35 754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getitimer, sys_getitimer), // 36 755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_alarm, sys_alarm), // 37 756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_setitimer, sys_setitimer), // 38 757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpid, sys_getpid), // 39 758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sendfile, sys_sendfile), // 40 760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_socket, sys_socket), // 41 761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_connect, sys_connect), // 42 762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_accept, sys_accept), // 43 763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_sendto, sys_sendto), // 44 764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_recvfrom, sys_recvfrom), // 45 766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_sendmsg, sys_sendmsg), // 46 767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_recvmsg, sys_recvmsg), // 47 768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_shutdown, sys_shutdown), // 48 769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_bind, sys_bind), // 49 770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_listen, sys_listen), // 50 772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_getsockname, sys_getsockname), // 51 773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_getpeername, sys_getpeername), // 52 774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_socketpair, sys_socketpair), // 53 775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_setsockopt, sys_setsockopt), // 54 776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_getsockopt, sys_getsockopt), // 55 778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_clone, sys_clone), // 56 779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fork, sys_fork), // 57 780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_vfork, sys_fork), // 58 treat as fork 781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_execve, sys_execve), // 59 782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_exit, sys_exit), // 60 784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_wait4, sys_wait4), // 61 785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_kill, sys_kill), // 62 786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_uname, sys_newuname), // 63 787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_semget, sys_semget), // 64 788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_semop, sys_semop), // 65 790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_semctl, sys_semctl), // 66 791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_shmdt, sys_shmdt), // 67 792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_msgget, sys_msgget), // 68 793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_msgsnd, sys_msgsnd), // 69 794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_msgrcv, sys_msgrcv), // 70 796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_msgctl, sys_msgctl), // 71 797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_fcntl, sys_fcntl), // 72 798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_flock, sys_flock), // 73 799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fsync, sys_fsync), // 74 800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fdatasync, sys_fdatasync), // 75 802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_truncate, sys_truncate), // 76 803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_ftruncate, sys_ftruncate), // 77 804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getdents, sys_getdents), // 78 805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getcwd, sys_getcwd), // 79 806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chdir, sys_chdir), // 80 808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchdir, sys_fchdir), // 81 809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_rename, sys_rename), // 82 810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mkdir, sys_mkdir), // 83 811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_rmdir, sys_rmdir), // 84 812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_creat, sys_creat), // 85 814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_link, sys_link), // 86 815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_unlink, sys_unlink), // 87 816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_symlink, sys_symlink), // 88 817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_readlink, sys_readlink), // 89 818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chmod, sys_chmod), // 90 820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchmod, sys_fchmod), // 91 821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chown, sys_chown), // 92 822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchown, sys_fchown), // 93 823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_lchown, sys_lchown), // 94 824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_umask, sys_umask), // 95 826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_gettimeofday, sys_gettimeofday), // 96 827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getrlimit, sys_getrlimit), // 97 828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getrusage, sys_getrusage), // 98 829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sysinfo, sys_sysinfo), // 99 830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_times, sys_times), // 100 832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(__NR_ptrace, sys_ptrace), // 101 833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getuid, sys_getuid), // 102 834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_syslog, sys_syslog), // 103 835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getgid, sys_getgid), // 104 836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setuid, sys_setuid), // 105 838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setgid, sys_setgid), // 106 839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_geteuid, sys_geteuid), // 107 840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getegid, sys_getegid), // 108 841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setpgid, sys_setpgid), // 109 842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getppid, sys_getppid), // 110 844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpgrp, sys_getpgrp), // 111 845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setsid, sys_setsid), // 112 846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setreuid, sys_setreuid), // 113 847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setregid, sys_setregid), // 114 848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getgroups, sys_getgroups), // 115 850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setgroups, sys_setgroups), // 116 851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setresuid, sys_setresuid), // 117 852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getresuid, sys_getresuid), // 118 853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setresgid, sys_setresgid), // 119 854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getresgid, sys_getresgid), // 120 856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpgid, sys_getpgid), // 121 857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setfsuid, sys_setfsuid), // 122 858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setfsgid, sys_setfsgid), // 123 859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getsid, sys_getsid), // 124 860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_capget, sys_capget), // 125 862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_capset, sys_capset), // 126 863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 127 864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait),// 128 865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),// 129 866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 130 868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_sigaltstack, sys_sigaltstack), // 131 869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_utime, sys_utime), // 132 870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mknod, sys_mknod), // 133 871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_uselib, sys_uselib), // 134 872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_personality, sys_personality), // 135 874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_ustat, sys_ustat), // 136 875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_statfs, sys_statfs), // 137 876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_fstatfs, sys_fstatfs), // 138 877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_sysfs, sys_sysfs), // 139 878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpriority, sys_getpriority), // 140 880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setpriority, sys_setpriority), // 141 881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_setparam, sys_sched_setparam), // 142 882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_getparam, sys_sched_getparam), // 143 883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 144 884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 145 886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max), // 146 887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min), // 147 888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 148 889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mlock, sys_mlock), // 149 890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_munlock, sys_munlock), // 150 892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mlockall, sys_mlockall), // 151 893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_munlockall, sys_munlockall), // 152 894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_vhangup, sys_vhangup), // 153 895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_modify_ldt, sys_modify_ldt), // 154 896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_pivot_root, sys_pivot_root), // 155 898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR__sysctl, sys_sysctl), // 156 899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_prctl, sys_prctl), // 157 900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_arch_prctl, sys_arch_prctl), // 158 901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_adjtimex, sys_adjtimex), // 159 902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setrlimit, sys_setrlimit), // 160 904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chroot, sys_chroot), // 161 905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_sync, sys_sync), // 162 906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_acct, sys_acct), // 163 907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_settimeofday, sys_settimeofday), // 164 908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mount, sys_mount), // 165 910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_umount2, sys_umount), // 166 911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_swapon, sys_swapon), // 167 912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_swapoff, sys_swapoff), // 168 913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_reboot, sys_reboot), // 169 914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov GENX_(__NR_sethostname, sys_sethostname), // 170 916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_setdomainname, sys_setdomainname), // 171 917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_iopl, sys_iopl), // 172 918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_ioperm, sys_ioperm), // 173 919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_create_module, sys_ni_syscall), // 174 920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_init_module, sys_init_module), // 175 922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_delete_module, sys_delete_module), // 176 923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_get_kernel_syms, sys_ni_syscall), // 177 924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_query_module, sys_ni_syscall), // 178 925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_quotactl, sys_quotactl), // 179 926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_nfsservctl, sys_nfsservctl), // 180 928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_getpmsg, sys_ni_syscall), // 181 929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_putpmsg, sys_ni_syscall), // 182 930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_afs_syscall, sys_ni_syscall), // 183 931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAXY(184, sys_syscall184), // 184 // sys_bproc? 932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_security, sys_ni_syscall), // 185 934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_gettid, sys_gettid), // 186 935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_readahead, sys_readahead), // 187 936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setxattr, sys_setxattr), // 188 937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_lsetxattr, sys_lsetxattr), // 189 938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fsetxattr, sys_fsetxattr), // 190 940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getxattr, sys_getxattr), // 191 941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_lgetxattr, sys_lgetxattr), // 192 942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_fgetxattr, sys_fgetxattr), // 193 943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_listxattr, sys_listxattr), // 194 944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_llistxattr, sys_llistxattr), // 195 946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_flistxattr, sys_flistxattr), // 196 947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_removexattr, sys_removexattr), // 197 948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_lremovexattr, sys_lremovexattr), // 198 949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fremovexattr, sys_fremovexattr), // 199 950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_tkill, sys_tkill), // 200 952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_time, sys_time), /*was sys_time64*/ // 201 953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_futex, sys_futex), // 202 954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 203 955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 204 956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_set_thread_area, sys_ni_syscall), // 205 958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_io_setup, sys_io_setup), // 206 959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_io_destroy, sys_io_destroy), // 207 960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_io_getevents, sys_io_getevents), // 208 961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_io_submit, sys_io_submit), // 209 962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_io_cancel, sys_io_cancel), // 210 964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_get_thread_area, sys_ni_syscall), // 211 965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 212 966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_create, sys_epoll_create), // 213 967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_epoll_ctl_old, sys_ni_syscall), // 214 968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_epoll_wait_old, sys_ni_syscall), // 215 970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_remap_file_pages, sys_remap_file_pages)// 216 971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getdents64, sys_getdents64), // 217 972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_set_tid_address, sys_set_tid_address),// 218 973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_restart_syscall, sys_restart_syscall),// 219 974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_semtimedop, sys_semtimedop), // 220 976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_fadvise64, sys_fadvise64), // 221 977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_create, sys_timer_create), // 222 978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_settime, sys_timer_settime), // 223 979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_gettime, sys_timer_gettime), // 224 980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_timer_getoverrun, sys_timer_getoverrun), // 225 982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_timer_delete, sys_timer_delete), // 226 983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_clock_settime, sys_clock_settime), // 227 984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_gettime, sys_clock_gettime), // 228 985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_getres, sys_clock_getres), // 229 986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_nanosleep, sys_clock_nanosleep),// 230 988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_exit_group, sys_exit_group), // 231 989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_wait, sys_epoll_wait), // 232 990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 233 991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_tgkill, sys_tgkill), // 234 992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_utimes, sys_utimes), // 235 994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_vserver, sys_ni_syscall), // 236 995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mbind, sys_mbind), // 237 996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 238 997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 239 998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_open, sys_mq_open), // 240 1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_unlink, sys_mq_unlink), // 241 1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 242 1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_timedreceive, sys_mq_timedreceive),// 243 1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_notify, sys_mq_notify), // 244 1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 245 1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (__NR_kexec_load, sys_ni_syscall), // 246 1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_waitid, sys_waitid), // 247 1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_add_key, sys_add_key), // 248 1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_request_key, sys_request_key), // 249 1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_keyctl, sys_keyctl), // 250 1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_ioprio_set, sys_ioprio_set), // 251 1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_ioprio_get, sys_ioprio_get), // 252 1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_init, sys_inotify_init), // 253 1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 254 1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 255 1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_migrate_pages, sys_migrate_pages), // 256 1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_openat, sys_openat), // 257 1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mkdirat, sys_mkdirat), // 258 1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mknodat, sys_mknodat), // 259 1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fchownat, sys_fchownat), // 260 1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_futimesat, sys_futimesat), // 261 1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_newfstatat, sys_newfstatat), // 262 1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_unlinkat, sys_unlinkat), // 263 1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_renameat, sys_renameat), // 264 1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_linkat, sys_linkat), // 265 1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_symlinkat, sys_symlinkat), // 266 1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_readlinkat, sys_readlinkat), // 267 1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fchmodat, sys_fchmodat), // 268 1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_faccessat, sys_faccessat), // 269 1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_pselect6, sys_pselect6), // 270 1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_ppoll, sys_ppoll), // 271 1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINX_(__NR_unshare, sys_unshare), // 272 1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_set_robust_list, sys_set_robust_list), // 273 1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_get_robust_list, sys_get_robust_list), // 274 1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_splice, sys_splice), // 275 1042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINX_(__NR_tee, sys_tee), // 276 1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sync_file_range, sys_sync_file_range), // 277 1044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINXY(__NR_vmsplice, sys_vmsplice), // 278 1045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINXY(__NR_move_pages, sys_move_pages), // 279 1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_utimensat, sys_utimensat), // 280 1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 281 1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_signalfd, sys_signalfd), // 282 1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_create, sys_timerfd_create), // 283 1051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_eventfd, sys_eventfd), // 284 1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fallocate, sys_fallocate), // 285 1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 286 1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 287 1056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_accept4, sys_accept4), // 288 1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_signalfd4, sys_signalfd4), // 289 1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_eventfd2, sys_eventfd2), // 290 1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_create1, sys_epoll_create1), // 291 1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_dup3, sys_dup3), // 292 1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_pipe2, sys_pipe2), // 293 1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_inotify_init1, sys_inotify_init1), // 294 1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_preadv, sys_preadv), // 295 1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_pwritev, sys_pwritev), // 296 1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 297 1068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_perf_event_open, sys_perf_event_open), // 298 1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINXY(__NR_recvmmsg, sys_recvmmsg), // 299 1070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_fanotify_init, sys_fanotify_init), // 300 1072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_fanotify_mark, sys_fanotify_mark), // 301 1073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINXY(__NR_prlimit64, sys_prlimit64), // 302 1074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 303 1075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 304 1076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 305 1078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINX_(__NR_syncfs, sys_ni_syscall), // 306 1079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINXY(__NR_sendmmsg, sys_sendmmsg), // 307 1080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINX_(__NR_setns, sys_ni_syscall), // 308 1081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINXY(__NR_getcpu, sys_getcpu), // 309 1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 310 1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINX_(__NR_process_vm_writev, sys_process_vm_writev) // 311 1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) 1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const UInt syscall_table_size 1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown = sizeof(syscall_table) / sizeof(syscall_table[0]); 1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Is it in the contiguous initial section of the table? */ 1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sysno < syscall_table_size) { 1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SyscallTableEntry* sys = &syscall_table[sysno]; 1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sys->before == NULL) 1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return NULL; /* no entry */ 1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return sys; 1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Can't find a wrapper */ 1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return NULL; 1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_amd64_linux) 1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end ---*/ 1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 1110