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