1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Platform-specific syscalls stuff. syswrap-ppc64-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) 2005-2013 Nicholas Nethercote <njn@valgrind.org> 11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Copyright (C) 2005-2013 Cerion Armour-Brown <cerion@open-works.co.uk> 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_ppc64_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_libcbase.h" 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcassert.h" 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcprint.h" 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcproc.h" 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcsignal.h" 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_options.h" 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_scheduler.h" 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_sigframe.h" // For VG_(sigframe_destroy)() 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-main.h" 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown clone() handling 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Call f(arg1), but first switch stacks, using 'stack' as the new 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stack, and use 'retaddr' as f's return-to address. Also, clear all 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the integer registers before entering f.*/ 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noreturn)) 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ML_(call_on_new_stack_0_1) ( Addr stack, 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr retaddr, 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*f_desc)(Word), 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Word arg1 ); 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// r3 = stack 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// r4 = retaddr 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// r5 = function descriptor 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// r6 = arg1 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* On PPC64, a func ptr is represented by a TOC entry ptr. 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This TOC entry contains three words; the first word is the function 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown address, the second word is the TOC ptr (r2), and the third word is 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the static chain value. */ 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm( 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .align 2\n" 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .globl vgModuleLocal_call_on_new_stack_0_1\n" 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .section \".opd\",\"aw\"\n" 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .align 3\n" 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"vgModuleLocal_call_on_new_stack_0_1:\n" 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .quad .vgModuleLocal_call_on_new_stack_0_1,.TOC.@tocbase,0\n" 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .previous\n" 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .type .vgModuleLocal_call_on_new_stack_0_1,@function\n" 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .globl .vgModuleLocal_call_on_new_stack_0_1\n" 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".vgModuleLocal_call_on_new_stack_0_1:\n" 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr %r1,%r3\n\t" // stack to %sp 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mtlr %r4\n\t" // retaddr to %lr 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ld 5,0(5)\n\t" // load f_ptr from f_desc[0] 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mtctr %r5\n\t" // f_ptr to count reg 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr %r3,%r6\n\t" // arg1 to %r3 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 0,0\n\t" // zero all GP regs 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 4,0\n\t" 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 5,0\n\t" 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 6,0\n\t" 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 7,0\n\t" 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 8,0\n\t" 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 9,0\n\t" 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 10,0\n\t" 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 11,0\n\t" 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 12,0\n\t" 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 13,0\n\t" 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 14,0\n\t" 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 15,0\n\t" 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 16,0\n\t" 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 17,0\n\t" 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 18,0\n\t" 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 19,0\n\t" 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 20,0\n\t" 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 21,0\n\t" 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 22,0\n\t" 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 23,0\n\t" 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 24,0\n\t" 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 25,0\n\t" 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 26,0\n\t" 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 27,0\n\t" 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 28,0\n\t" 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 29,0\n\t" 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 30,0\n\t" 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 31,0\n\t" 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mtxer 0\n\t" // CAB: Need this? 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mtcr 0\n\t" // CAB: Need this? 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" bctr\n\t" // jump to dst 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" trap\n" // should never get here 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown); 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Perform a clone system call. clone is strange because it has 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fork()-like return-twice semantics, so it needs special 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown handling here. 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Upon entry, we have: 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown word (fn)(void*) in r3 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* child_stack in r4 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown word flags in r5 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* arg in r6 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pid_t* child_tid in r7 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pid_t* parent_tid in r8 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* ??? in r9 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Note: r3 contains fn desc ptr, not fn ptr -- p_fn = p_fn_desc[0] 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown System call requires: 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int $__NR_clone in r0 (sc number) 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int flags in r3 (sc arg1) 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* child_stack in r4 (sc arg2) 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pid_t* parent_tid in r5 (sc arg3) 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ?? child_tls in r6 (sc arg4) 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pid_t* child_tid in r7 (sc arg5) 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* ??? in r8 (sc arg6) 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Returns a ULong encoded as: top half is %cr following syscall, 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown low half is syscall return value (r3). 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_CLONE VG_STRINGIFY(__NR_clone) 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_EXIT VG_STRINGIFY(__NR_exit) 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong do_syscall_clone_ppc64_linux ( Word (*fn)(void *), 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* stack, 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int flags, 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* arg, 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int* child_tid, 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int* parent_tid, 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void/*vki_modify_ldt_t*/ * ); 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm( 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .align 2\n" 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .globl do_syscall_clone_ppc64_linux\n" 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .section \".opd\",\"aw\"\n" 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .align 3\n" 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"do_syscall_clone_ppc64_linux:\n" 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .quad .do_syscall_clone_ppc64_linux,.TOC.@tocbase,0\n" 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .previous\n" 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .type .do_syscall_clone_ppc64_linux,@function\n" 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .globl .do_syscall_clone_ppc64_linux\n" 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".do_syscall_clone_ppc64_linux:\n" 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" stdu 1,-64(1)\n" 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" std 29,40(1)\n" 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" std 30,48(1)\n" 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" std 31,56(1)\n" 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr 30,3\n" // preserve fn 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr 31,6\n" // preserve arg 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // setup child stack 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" rldicr 4,4, 0,59\n" // trim sp to multiple of 16 bytes 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // (r4 &= ~0xF) 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 0,0\n" 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" stdu 0,-32(4)\n" // make initial stack frame 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr 29,4\n" // preserve sp 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // setup syscall 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 0,"__NR_CLONE"\n" // syscall number 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr 3,5\n" // syscall arg1: flags 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // r4 already setup // syscall arg2: child_stack 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr 5,8\n" // syscall arg3: parent_tid 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr 6,13\n" // syscall arg4: REAL THREAD tls 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr 7,7\n" // syscall arg5: child_tid 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr 8,8\n" // syscall arg6: ???? 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr 9,9\n" // syscall arg7: ???? 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" sc\n" // clone() 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mfcr 4\n" // CR now in low half r4 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" sldi 4,4,32\n" // CR now in hi half r4 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" sldi 3,3,32\n" 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" srdi 3,3,32\n" // zero out hi half r3 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" or 3,3,4\n" // r3 = CR : syscall-retval 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" cmpwi 3,0\n" // child if retval == 0 (note, cmpw) 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" bne 1f\n" // jump if !child 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* CHILD - call thread function */ 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Note: 2.4 kernel doesn't set the child stack pointer, 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown so we do it here. 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown That does leave a small window for a signal to be delivered 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown on the wrong stack, unfortunately. */ 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr 1,29\n" 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ld 30, 0(30)\n" // convert fn desc ptr to fn ptr 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mtctr 30\n" // ctr reg = fn 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" mr 3,31\n" // r3 = arg 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" bctrl\n" // call fn() 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // exit with result 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" li 0,"__NR_EXIT"\n" 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" sc\n" 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Exit returned?! 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" .long 0\n" 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // PARENT or ERROR - return 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"1: ld 29,40(1)\n" 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ld 30,48(1)\n" 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" ld 31,56(1)\n" 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" addi 1,1,64\n" 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown" blr\n" 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown); 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_CLONE 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_EXIT 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// forward declarations 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void setup_child ( ThreadArchState*, ThreadArchState* ); 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown When a client clones, we need to keep track of the new thread. This means: 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1. allocate a ThreadId+ThreadState+stack for the the thread 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2. initialize the thread's new VCPU state 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3. create the thread using the same args as the client requested, 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown but using the scheduler entrypoint for IP, and a separate stack 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for SP. 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes do_clone ( ThreadId ptid, 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt flags, Addr sp, 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int *parent_tidptr, 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int *child_tidptr, 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr child_tls) 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const Bool debug = False; 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadId ctid = VG_(alloc_ThreadState)(); 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* ptst = VG_(get_ThreadState)(ptid); 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadState* ctst = VG_(get_ThreadState)(ctid); 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong word64; 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UWord* stack; 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NSegment const* seg; 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes res; 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vki_sigset_t blockall, savedmask; 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigfillset)(&blockall); 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_running_thread)(ptid)); 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_valid_tid)(ctid)); 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stack = (UWord*)ML_(allocstack)(ctid); 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (stack == NULL) { 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown res = VG_(mk_SysRes_Error)( VKI_ENOMEM ); 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto out; 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//? /* make a stack frame */ 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//? stack -= 16; 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//? *(UWord *)stack = 0; 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Copy register state 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Both parent and child return to the same place, and the code 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown following the clone syscall works out which is which, so we 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown don't need to worry about it. 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The parent gets the child's new tid returned from clone, but the 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child gets 0. 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown If the clone call specifies a NULL SP for the new thread, then 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown it actually gets a copy of the parent's SP. 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The child's TLS register (r2) gets set to the tlsaddr argument 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if the CLONE_SETTLS flag is set. 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown setup_child( &ctst->arch, &ptst->arch ); 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Make sys_clone appear to have returned Success(0) in the 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child. */ 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { UInt old_cr = LibVEX_GuestPPC64_get_CR( &ctst->arch.vex ); 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* %r3 = 0 */ 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->arch.vex.guest_GPR3 = 0; 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* %cr0.so = 0 */ 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LibVEX_GuestPPC64_put_CR( old_cr & ~(1<<28), &ctst->arch.vex ); 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sp != 0) 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->arch.vex.guest_GPR1 = sp; 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->os_state.parent = ptid; 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* inherit signal mask */ 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->sig_mask = ptst->sig_mask; 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->tmp_sig_mask = ptst->sig_mask; 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Start the child with its threadgroup being the same as the 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown parent's. This is so that any exit_group calls that happen 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown after the child is created but before it sets its 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown os_state.threadgroup field for real (in thread_wrapper in 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown syswrap-linux.c), really kill the new thread. a.k.a this avoids 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown a race condition in which the thread is unkillable (via 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit_group) because its threadgroup is not set. The race window 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is probably only a few hundred or a few thousand cycles long. 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown See #226116. */ 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->os_state.threadgroup = ptst->os_state.threadgroup; 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* We don't really know where the client stack is, because its 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown allocated by the client. The best we can do is look at the 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memory mappings and try to derive some useful information. We 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assume that esp starts near its highest possible value, and can 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown only go down to the start of the mmaped segment. */ 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown seg = VG_(am_find_nsegment)(sp); 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (seg && seg->kind != SkResvn) { 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp); 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start; 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(register_stack)(seg->start, ctst->client_stack_highest_word); 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (debug) 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(printf)("\ntid %d: guessed client stack range %#lx-%#lx\n", 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctid, seg->start, VG_PGROUNDUP(sp)); 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "!? New thread %d starts with R1(%#lx) unmapped\n", 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctid, sp); 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->client_stack_szB = 0; 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Assume the clone will succeed, and tell any tool that wants to 363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown know that this thread has come into existence. If the clone 364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fails, we'll send out a ll_exit notification for it at the out: 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown label below, to clean up. */ 366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vg_assert(VG_(owns_BigLock_LL)(ptid)); 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_TRACK ( pre_thread_ll_create, ptid, ctid ); 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (flags & VKI_CLONE_SETTLS) { 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (debug) 371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(printf)("clone child has SETTLS: tls at %#lx\n", child_tls); 372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->arch.vex.guest_GPR13 = child_tls; 373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown flags &= ~VKI_CLONE_SETTLS; 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* start the thread with everything blocked */ 378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask); 379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Create the new thread */ 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown word64 = do_syscall_clone_ppc64_linux( 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(start_thread_NORETURN), 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stack, flags, &VG_(threads)[ctid], 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child_tidptr, parent_tidptr, NULL 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ); 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Low half word64 is syscall return value. Hi half is 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the entire CR, from which we need to extract CR0.SO. */ 389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* VG_(printf)("word64 = 0x%llx\n", word64); */ 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown res = VG_(mk_SysRes_ppc64_linux)( 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*val*/(UInt)(word64 & 0xFFFFFFFFULL), 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*errflag*/ (UInt)((word64 >> (32+28)) & 1) 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ); 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL); 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown out: 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sr_isError(res)) { 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* clone failed */ 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(cleanup_thread)(&ctst->arch); 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctst->status = VgTs_Empty; 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* oops. Better tell the tool the thread exited in a hurry :-) */ 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_TRACK( pre_thread_ll_exit, ctid ); 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return res; 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown More thread stuff 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(cleanup_thread) ( ThreadArchState* arch ) 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid setup_child ( /*OUT*/ ThreadArchState *child, 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*IN*/ ThreadArchState *parent ) 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* We inherit our parent's guest state. */ 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex = parent->vex; 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex_shadow1 = parent->vex_shadow1; 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown child->vex_shadow2 = parent->vex_shadow2; 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE/POST wrappers for ppc64/Linux-specific syscalls 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE(name) DEFN_PRE_TEMPLATE(ppc64_linux, name) 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST(name) DEFN_POST_TEMPLATE(ppc64_linux, name) 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add prototypes for the wrappers declared here, so that gcc doesn't 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown harass us for not having prototypes. Really this is a kludge -- 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the right thing to do is to make these wrappers 'static' since they 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown aren't visible outside this file, but that requires even more macro 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown magic. */ 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(ppc64_linux, sys_mmap); 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz DECL_TEMPLATE(ppc64_linux, sys_mmap2); 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz DECL_TEMPLATE(ppc64_linux, sys_stat64); 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz DECL_TEMPLATE(ppc64_linux, sys_lstat64); 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz DECL_TEMPLATE(ppc64_linux, sys_fstat64); 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(ppc64_linux, sys_clone); 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz DECL_TEMPLATE(ppc64_linux, sys_sigreturn); 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(ppc64_linux, sys_rt_sigreturn); 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(ppc64_linux, sys_fadvise64); 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mmap) 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SysRes r; 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %ld, %ld )", 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 ); 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ6(long, "mmap", 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, start, unsigned long, length, 460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, prot, unsigned long, flags, 461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, fd, unsigned long, offset); 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Off64T)ARG6 ); 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes(r); 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE(sys_mmap2) 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz { 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz SysRes r; 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // Exactly like old_mmap() except: 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // - the file offset is specified in 4K units rather than bytes, 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // so that it can be used for files bigger than 2^32 bytes. 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )", 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 ); 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE_REG_READ6(long, "mmap2", 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz unsigned long, start, unsigned long, length, 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz unsigned long, prot, unsigned long, flags, 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz unsigned long, fd, unsigned long, offset); 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 4096 * (Off64T)ARG6 ); 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz SET_STATUS_from_SysRes(r); 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz } 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // XXX: lstat64/fstat64/stat64 are generic, but not necessarily 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // applicable to every architecture -- I think only to 32-bit archs. 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // We're going to need something like linux/core_os32.h for such 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz // things, eventually, I think. --njn 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE(sys_stat64) 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz { 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRINT("sys_stat64 ( %p, %p )",ARG1,ARG2); 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf); 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 ); 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) ); 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz } 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz POST(sys_stat64) 500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz { 501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz } 503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE(sys_lstat64) 505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz { 506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRINT("sys_lstat64 ( %p(%s), %p )",ARG1,ARG1,ARG2); 507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf); 508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 ); 509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) ); 510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz } 511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz POST(sys_lstat64) 513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz { 514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz vg_assert(SUCCESS); 515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz if (RES == 0) { 516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz } 518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz } 519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE(sys_fstat64) 521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz { 522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRINT("sys_fstat64 ( %d, %p )",ARG1,ARG2); 523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf); 524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) ); 525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz } 526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz 527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz POST(sys_fstat64) 528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz { 529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz } 531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clone) 534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt cloneflags; 536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5); 538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ5(int, "clone", 539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned long, flags, 540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *, child_stack, 541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int *, parent_tidptr, 542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *, child_tls, 543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int *, child_tidptr); 544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & VKI_CLONE_PARENT_SETTID) { 546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int)); 547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int), 548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VKI_PROT_WRITE)) { 549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EFAULT ); 550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) { 554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int)); 555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int), 556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VKI_PROT_WRITE)) { 557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EFAULT ); 558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags = ARG1; 563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) { 565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Failure( VKI_EINVAL ); 566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Only look at the flags we really care about */ 570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS 571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown | VKI_CLONE_FILES | VKI_CLONE_VFORK)) { 572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES: 573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* thread creation */ 574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes( 575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do_clone(tid, 576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ARG1, /* flags */ 577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Addr)ARG2, /* child SP */ 578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG3, /* parent_tidptr */ 579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG5, /* child_tidptr */ 580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Addr)ARG4)); /* child_tls */ 581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */ 584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* FALLTHROUGH - assume vfork == fork */ 585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM); 586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 0: /* plain fork */ 588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_from_SysRes( 589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ML_(do_fork_clone)(tid, 590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cloneflags, /* flags */ 591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG3, /* parent_tidptr */ 592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Int *)ARG5)); /* child_tidptr */ 593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* should we just ENOSYS? */ 597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx\n", ARG1); 598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, "\n"); 599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, "The only supported clone() uses are:\n"); 600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)\n"); 601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork\n"); 602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(unimplemented) 603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ("Valgrind does not support general clone()."); 604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (SUCCESS) { 607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & VKI_CLONE_PARENT_SETTID) 608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE(ARG3, sizeof(Int)); 609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) 610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POST_MEM_WRITE(ARG5, sizeof(Int)); 611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Thread creation was successful; let the child have the chance 613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown to run */ 614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfYieldAfter; 615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fadvise64) 619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_fadvise64 ( %ld, %ld, %lu, %ld )", ARG1,ARG2,ARG3,ARG4); 621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRE_REG_READ4(long, "fadvise64", 622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int, fd, vki_loff_t, offset, vki_size_t, len, int, advice); 623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigreturn) 626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for 628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown an explanation of what follows. */ 629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov //ThreadState* tst; 631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PRINT("sys_rt_sigreturn ( )"); 632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_valid_tid)(tid)); 634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(tid >= 1 && tid < VG_N_THREADS); 635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(VG_(is_running_thread)(tid)); 636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ///* Adjust esp to point to start of frame; skip back up over handler 638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // ret addr */ 639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov //tst = VG_(get_ThreadState)(tid); 640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //tst->arch.vex.guest_ESP -= sizeof(Addr); 641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Should we do something equivalent on ppc64-linux? Who knows. 642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ///* This is only so that the EIP is (might be) useful to report if 644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // something goes wrong in the sigreturn */ 645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch); 646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Should we do something equivalent on ppc64? Who knows. 647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Restore register state from frame and remove it */ 649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(sigframe_destroy)(tid, True); 650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Tell the driver not to update the guest state with the "result", 652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and set a bogus result to keep it happy. */ 653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfNoWriteResult; 654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SET_STATUS_Success(0); 655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Check to see if any signals arose as a result of this. */ 657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *flags |= SfPollAfter; 658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef PRE 661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef POST 662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------------------------------------------------------------- 664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The ppc64/Linux syscall table 665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ------------------------------------------------------------------ */ 666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add an ppc64-linux specific wrapper to a syscall table. */ 668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAX_(sysno, name) WRAPPER_ENTRY_X_(ppc64_linux, sysno, name) 669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAXY(sysno, name) WRAPPER_ENTRY_XY(ppc64_linux, sysno, name) 670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This table maps from __NR_xxx syscall numbers (from 672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/include/asm-ppc/unistd.h) to the appropriate PRE/POST sys_foo() 673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// wrappers on ppc64 (as per sys_call_table in linux/arch/ppc/kernel/entry.S). 674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// For those syscalls not handled by Valgrind, the annotation indicate its 676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/? 677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// (unknown). 678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry syscall_table[] = { 680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_restart_syscall, sys_restart_syscall), // 0 681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_exit, sys_exit), // 1 682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fork, sys_fork), // 2 683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_read, sys_read), // 3 684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_write, sys_write), // 4 685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_open, sys_open), // 5 687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_close, sys_close), // 6 688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_waitpid, sys_waitpid), // 7 689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_creat, sys_creat), // 8 690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_link, sys_link), // 9 691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_unlink, sys_unlink), // 10 693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_execve, sys_execve), // 11 694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chdir, sys_chdir), // 12 695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_time, sys_time), // 13 696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mknod, sys_mknod), // 14 697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chmod, sys_chmod), // 15 699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_lchown, sys_lchown), // 16 700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_break, sys_break), // 17 701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_oldstat, sys_oldstat), // 18 702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_lseek, sys_lseek), // 19 703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpid, sys_getpid), // 20 705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mount, sys_mount), // 21 706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_umount, sys_umount), // 22 707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setuid, sys_setuid), // 23 708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getuid, sys_getuid), // 24 709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_stime, sys_stime), // 25 711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ptrace, sys_ptrace), // 26 712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_alarm, sys_alarm), // 27 713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_oldfstat, sys_oldfstat), // 28 714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_pause, sys_pause), // 29 715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_utime, sys_utime), // 30 717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_stty, sys_stty), // 31 718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_gtty, sys_gtty), // 32 719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_access, sys_access), // 33 720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_nice, sys_nice), // 34 721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ftime, sys_ftime), // 35 723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_sync, sys_sync), // 36 724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_kill, sys_kill), // 37 725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_rename, sys_rename), // 38 726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mkdir, sys_mkdir), // 39 727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_rmdir, sys_rmdir), // 40 729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_dup, sys_dup), // 41 730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_pipe, sys_pipe), // 42 731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_times, sys_times), // 43 732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_prof, sys_prof), // 44 733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_brk, sys_brk), // 45 735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setgid, sys_setgid), // 46 736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getgid, sys_getgid), // 47 737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_signal, sys_signal), // 48 738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_geteuid, sys_geteuid), // 49 739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getegid, sys_getegid), // 50 741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_acct, sys_acct), // 51 742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_umount2, sys_umount), // 52 743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_lock, sys_lock), // 53 744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_ioctl, sys_ioctl), // 54 745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_fcntl, sys_fcntl), // 55 747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_mpx, sys_mpx), // 56 748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setpgid, sys_setpgid), // 57 749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ulimit, sys_ulimit), // 58 750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_oldolduname, sys_oldolduname), // 59 751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_umask, sys_umask), // 60 753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chroot, sys_chroot), // 61 754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ustat, sys_ustat), // 62 755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_dup2, sys_dup2), // 63 756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getppid, sys_getppid), // 64 757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpgrp, sys_getpgrp), // 65 759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setsid, sys_setsid), // 66 760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_sigaction, sys_sigaction), // 67 761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_sgetmask, sys_sgetmask), // 68 762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ssetmask, sys_ssetmask), // 69 763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setreuid, sys_setreuid), // 70 765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setregid, sys_setregid), // 71 766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_sigsuspend, sys_sigsuspend), // 72 767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_sigpending, sys_sigpending), // 73 768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_sethostname, sys_sethostname), // 74 769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setrlimit, sys_setrlimit), // 75 771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_getrlimit, sys_getrlimit), // 76 772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getrusage, sys_getrusage), // 77 773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_gettimeofday, sys_gettimeofday), // 78 774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_settimeofday, sys_settimeofday), // 79 775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getgroups, sys_getgroups), // 80 777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_setgroups, sys_setgroups), // 81 778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_select, sys_select), // 82 779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_symlink, sys_symlink), // 83 780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_oldlstat, sys_oldlstat), // 84 781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_readlink, sys_readlink), // 85 783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_uselib, sys_uselib), // 86 784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_swapon, sys_swapon), // 87 785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_reboot, sys_reboot), // 88 786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_readdir, sys_readdir), // 89 787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_mmap, sys_mmap), // 90 789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_munmap, sys_munmap), // 91 790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_truncate, sys_truncate), // 92 791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_ftruncate, sys_ftruncate), // 93 792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchmod, sys_fchmod), // 94 793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchown, sys_fchown), // 95 7952ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov GENX_(__NR_getpriority, sys_getpriority), // 96 7962ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov GENX_(__NR_setpriority, sys_setpriority), // 97 797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_profil, sys_profil), // 98 798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_statfs, sys_statfs), // 99 799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_fstatfs, sys_fstatfs), // 100 801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ioperm, sys_ioperm), // 101 802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_socketcall, sys_socketcall), // 102 803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_syslog, sys_syslog), // 103 804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_setitimer, sys_setitimer), // 104 805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getitimer, sys_getitimer), // 105 807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_stat, sys_newstat), // 106 808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_lstat, sys_newlstat), // 107 809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_fstat, sys_newfstat), // 108 810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_olduname, sys_olduname), // 109 811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_iopl, sys_iopl), // 110 813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_vhangup, sys_vhangup), // 111 814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_idle, sys_idle), // 112 815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_vm86, sys_vm86), // 113 816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_wait4, sys_wait4), // 114 817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_swapoff, sys_swapoff), // 115 819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sysinfo, sys_sysinfo), // 116 820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_ipc, sys_ipc), // 117 821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fsync, sys_fsync), // 118 822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_sigreturn, sys_sigreturn), // 119 823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_clone, sys_clone), // 120 825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setdomainname, sys_setdomainname), // 121 826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_uname, sys_newuname), // 122 827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_modify_ldt, sys_modify_ldt), // 123 828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_adjtimex, sys_adjtimex), // 124 829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_mprotect, sys_mprotect), // 125 831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_sigprocmask, sys_sigprocmask), // 126 832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_create_module, sys_ni_syscall), // 127 833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_init_module, sys_init_module), // 128 834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_delete_module, sys_delete_module), // 129 835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_get_kernel_syms, sys_get_kernel_syms), // 130 837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_quotactl, sys_quotactl), // 131 838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_getpgid, sys_getpgid), // 132 839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fchdir, sys_fchdir), // 133 840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_bdflush, sys_bdflush), // 134 841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_sysfs, sys_sysfs), // 135 843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_personality, sys_personality), // 136 844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_afs_syscall, sys_afs_syscall), // 137 845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setfsuid, sys_setfsuid), // 138 846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_setfsgid, sys_setfsgid), // 139 847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR__llseek, sys_llseek), // 140 849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getdents, sys_getdents), // 141 850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR__newselect, sys_select), // 142 851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_flock, sys_flock), // 143 852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_msync, sys_msync), // 144 853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_readv, sys_readv), // 145 855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_writev, sys_writev), // 146 856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_getsid, sys_getsid), // 147 857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_fdatasync, sys_fdatasync), // 148 858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR__sysctl, sys_sysctl), // 149 859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mlock, sys_mlock), // 150 861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_munlock, sys_munlock), // 151 862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mlockall, sys_mlockall), // 152 863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_munlockall, sys_munlockall), // 153 864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_setparam, sys_sched_setparam), // 154 865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_getparam, sys_sched_getparam), // 155 867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156 868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157 869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_yield, sys_sched_yield), // 158 870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159 871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160 873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_nanosleep, sys_nanosleep), // 162 875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_mremap, sys_mremap), // 163 876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_setresuid, sys_setresuid), // 164 877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getresuid, sys_getresuid), // 165 879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_query_module, sys_query_module), // 166 880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_poll, sys_poll), // 167 881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_nfsservctl, sys_nfsservctl), // 168 882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_setresgid, sys_setresgid), // 169 883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getresgid, sys_getresgid), // 170 885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_prctl, sys_prctl), // 171 886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 172 887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 173 888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 174 889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_rt_sigpending, sys_rt_sigpending), // 175 891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 176 892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 177 893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 178 894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_pread64, sys_pread64), // 179 895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov GENX_(__NR_pwrite64, sys_pwrite64), // 180 897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_chown, sys_chown), // 181 898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getcwd, sys_getcwd), // 182 899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_capget, sys_capget), // 183 900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_capset, sys_capset), // 184 901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_sigaltstack, sys_sigaltstack), // 185 903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sendfile, sys_sendfile), // 186 904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_getpmsg, sys_getpmsg), // 187 905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_putpmsg, sys_putpmsg), // 188 906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_vfork, sys_fork), // 189 treat as fork 907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_ugetrlimit, sys_getrlimit), // 190 909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_readahead, sys_readahead), // 191 910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* #define __NR_mmap2 192 32bit only */ 911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* #define __NR_truncate64 193 32bit only */ 912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* #define __NR_ftruncate64 194 32bit only */ 913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* #define __NR_stat64 195 32bit only */ 915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* #define __NR_lstat64 196 32bit only */ 916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* #define __NR_fstat64 197 32bit only */ 917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_pciconfig_read, sys_pciconfig_read), // 198 918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_pciconfig_write, sys_pciconfig_write), // 199 919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_pciconfig_iobase, sys_pciconfig_iobase), // 200 921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_multiplexer, sys_multiplexer), // 201 922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENXY(__NR_getdents64, sys_getdents64), // 202 923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_pivot_root, sys_pivot_root), // 203 924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_fcntl64, sys_fcntl64), // 204 !!!!?? 32bit only */ 925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown GENX_(__NR_madvise, sys_madvise), // 205 927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_mincore, sys_mincore), // 206 928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_gettid, sys_gettid), // 207 929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_tkill, sys_tkill), // 208 930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_setxattr, sys_setxattr), // 209 931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_lsetxattr, sys_lsetxattr), // 210 933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_fsetxattr, sys_fsetxattr), // 211 934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getxattr, sys_getxattr), // 212 935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_lgetxattr, sys_lgetxattr), // 213 936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_fgetxattr, sys_fgetxattr), // 214 937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_listxattr, sys_listxattr), // 215 938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_llistxattr, sys_llistxattr), // 216 939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_flistxattr, sys_flistxattr), // 217 940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_removexattr, sys_removexattr), // 218 941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_lremovexattr, sys_lremovexattr), // 219 942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fremovexattr, sys_fremovexattr), // 220 943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_futex, sys_futex), // 221 945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 222 946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 223 947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* 224 currently unused */ 948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_tuxcall, sys_tuxcall), // 225 950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* #define __NR_sendfile64 226 32bit only */ 951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_io_setup, sys_io_setup), // 227 952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_io_destroy, sys_io_destroy), // 228 953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_io_getevents, sys_io_getevents), // 229 954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_io_submit, sys_io_submit), // 230 955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_io_cancel, sys_io_cancel), // 231 956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_set_tid_address, sys_set_tid_address), // 232 957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PLAX_(__NR_fadvise64, sys_fadvise64), // 233 958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_exit_group, sys_exit_group), // 234 959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_lookup_dcookie, sys_lookup_dcookie), // 235 961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_create, sys_epoll_create), // 236 962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 237 963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_wait, sys_epoll_wait), // 238 964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_remap_file_pages, sys_remap_file_pages), // 239 965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_create, sys_timer_create), // 240 967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_settime, sys_timer_settime), // 241 968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timer_gettime, sys_timer_gettime), // 242 969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_timer_getoverrun, sys_timer_getoverrun), // 243 970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_timer_delete, sys_timer_delete), // 244 971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_clock_settime, sys_clock_settime), // 245 972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_gettime, sys_clock_gettime), // 246 973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_getres, sys_clock_getres), // 247 974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_clock_nanosleep, sys_clock_nanosleep), // 248 975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_swapcontext, sys_swapcontext), // 249 977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_tgkill, sys_tgkill), // 250 979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_utimes, sys_utimes), // 251 980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_statfs64, sys_statfs64), // 252 981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_fstatfs64, sys_fstatfs64), // 253 982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* #define __NR_fadvise64_64 254 32bit only */ 983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_rtas, sys_rtas), // 255 985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* Number 256 is reserved for sys_debug_setcontext */ 986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* Number 257 is reserved for vserver */ 987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// /* 258 currently unused */ 988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_mbind, sys_mbind), // 259 989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 260 991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 261 992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_open, sys_mq_open), // 262 993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_unlink, sys_mq_unlink), // 263 994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 264 995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_timedreceive, sys_mq_timedreceive), // 265 997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mq_notify, sys_mq_notify), // 266 998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 267 999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_kexec_load, sys_kexec_load), // 268 1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_add_key, sys_add_key), // 269 1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_request_key, sys_request_key), // 270 1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_keyctl, sys_keyctl), // 271 1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_waitid, sys_waitid), // 272 1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_ioprio_set, sys_ioprio_set), // 273 1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_ioprio_get, sys_ioprio_get), // 274 1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_init, sys_inotify_init), // 275 1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 276 1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 277 1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINX_(__NR_pselect6, sys_pselect6), // 280 1013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_ppoll, sys_ppoll), // 281 1014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_openat, sys_openat), // 286 1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mkdirat, sys_mkdirat), // 287 1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_mknodat, sys_mknodat), // 288 1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fchownat, sys_fchownat), // 289 1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_futimesat, sys_futimesat), // 290 1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_newfstatat, sys_newfstatat), // 291 1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_unlinkat, sys_unlinkat), // 292 1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_renameat, sys_renameat), // 293 1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_linkat, sys_linkat), // 294 1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_symlinkat, sys_symlinkat), // 295 1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_readlinkat, sys_readlinkat), // 296 1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fchmodat, sys_fchmodat), // 297 1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_faccessat, sys_faccessat), // 298 1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_set_robust_list, sys_set_robust_list), // 299 1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_get_robust_list, sys_get_robust_list), // 300 1030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINXY(__NR_move_pages, sys_move_pages), // 301 1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_getcpu, sys_getcpu), // 302 1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 303 1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_utimensat, sys_utimensat), // 304 1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_signalfd, sys_signalfd), // 305 1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_create, sys_timerfd_create), // 306 1036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_eventfd, sys_eventfd), // 307 1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_sync_file_range2, sys_sync_file_range2), // 308 1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_fallocate, sys_fallocate), // 309 1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// LINXY(__NR_subpage_prot, sys_ni_syscall), // 310 1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 311 1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 312 1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_signalfd4, sys_signalfd4), // 313 1043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_eventfd2, sys_eventfd2), // 314 1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_epoll_create1, sys_epoll_create1), // 315 1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_dup3, sys_dup3), // 316 1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_pipe2, sys_pipe2), // 317 1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_inotify_init1, sys_inotify_init1), // 318 1048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov LINXY(__NR_perf_event_open, sys_perf_event_open), // 319 1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINXY(__NR_preadv, sys_preadv), // 320 1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LINX_(__NR_pwritev, sys_pwritev), // 321 1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 322 1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 347 1054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 351 1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng LINX_(__NR_process_vm_writev, sys_process_vm_writev) // 352 1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) 1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const UInt syscall_table_size 1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown = sizeof(syscall_table) / sizeof(syscall_table[0]); 1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Is it in the contiguous initial section of the table? */ 1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sysno < syscall_table_size) { 1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SyscallTableEntry* sys = &syscall_table[sysno]; 1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sys->before == NULL) 1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return NULL; /* no entry */ 1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return sys; 1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Can't find a wrapper */ 1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return NULL; 1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_ppc64_linux) 1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end ---*/ 1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 1082