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