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
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2005-2013 Nicholas Nethercote <njn@valgrind.org>
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2005-2013 Cerion Armour-Brown <cerion@open-works.co.uk>
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02111-1307, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_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"
161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng".globl do_syscall_clone_ppc32_linux\n"
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"do_syscall_clone_ppc32_linux:\n"
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       stwu    1,-32(1)\n"
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       stw     29,20(1)\n"
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       stw     30,24(1)\n"
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       stw     31,28(1)\n"
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mr      30,3\n"              // preserve fn
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mr      31,6\n"              // preserve arg
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // setup child stack
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       rlwinm  4,4,0,~0xf\n"        // trim sp to multiple of 16 bytes
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       li      0,0\n"
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       stwu    0,-16(4)\n"          // make initial stack frame
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mr      29,4\n"              // preserve sp
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // setup syscall
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       li      0,"__NR_CLONE"\n"    // syscall number
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mr      3,5\n"               // syscall arg1: flags
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // r4 already setup          // syscall arg2: child_stack
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mr      5,8\n"               // syscall arg3: parent_tid
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mr      6,2\n"               // syscall arg4: REAL THREAD tls
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mr      7,7\n"               // syscall arg5: child_tid
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mr      8,8\n"               // syscall arg6: ????
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mr      9,9\n"               // syscall arg7: ????
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       sc\n"                        // clone()
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mfcr    4\n"                 // return CR in r4 (low word of ULong)
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       cmpwi   3,0\n"               // child if retval == 0
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       bne     1f\n"                // jump if !child
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* CHILD - call thread function */
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Note: 2.4 kernel doesn't set the child stack pointer,
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           so we do it here.
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           That does leave a small window for a signal to be delivered
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           on the wrong stack, unfortunately. */
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mr      1,29\n"
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mtctr   30\n"                // ctr reg = fn
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       mr      3,31\n"              // r3 = arg
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       bctrl\n"                     // call fn()
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // exit with result
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       li      0,"__NR_EXIT"\n"
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       sc\n"
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // Exit returned?!
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       .long   0\n"
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // PARENT or ERROR - return
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"1:     lwz     29,20(1)\n"
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       lwz     30,24(1)\n"
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       lwz     31,28(1)\n"
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       addi    1,1,32\n"
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       blr\n"
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".previous\n"
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown);
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_CLONE
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_EXIT
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// forward declarations
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void setup_child ( ThreadArchState*, ThreadArchState* );
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   When a client clones, we need to keep track of the new thread.  This means:
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   1. allocate a ThreadId+ThreadState+stack for the the thread
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   2. initialize the thread's new VCPU state
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   3. create the thread using the same args as the client requested,
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   but using the scheduler entrypoint for IP, and a separate stack
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for SP.
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes do_clone ( ThreadId ptid,
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt flags, Addr sp,
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Int *parent_tidptr,
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Int *child_tidptr,
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Addr child_tls)
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const Bool debug = False;
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId     ctid = VG_(alloc_ThreadState)();
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* ptst = VG_(get_ThreadState)(ptid);
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* ctst = VG_(get_ThreadState)(ctid);
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong        word64;
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UWord*       stack;
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NSegment const* seg;
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes       res;
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_sigset_t blockall, savedmask;
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigfillset)(&blockall);
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(ptid));
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(ctid));
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   stack = (UWord*)ML_(allocstack)(ctid);
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (stack == NULL) {
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto out;
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//?   /* make a stack frame */
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//?   stack -= 16;
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//?   *(UWord *)stack = 0;
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Copy register state
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Both parent and child return to the same place, and the code
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      following the clone syscall works out which is which, so we
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      don't need to worry about it.
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      The parent gets the child's new tid returned from clone, but the
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      child gets 0.
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      If the clone call specifies a NULL SP for the new thread, then
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      it actually gets a copy of the parent's SP.
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      The child's TLS register (r2) gets set to the tlsaddr argument
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if the CLONE_SETTLS flag is set.
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   setup_child( &ctst->arch, &ptst->arch );
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Make sys_clone appear to have returned Success(0) in the
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      child. */
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   { UInt old_cr = LibVEX_GuestPPC32_get_CR( &ctst->arch.vex );
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* %r3 = 0 */
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ctst->arch.vex.guest_GPR3 = 0;
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* %cr0.so = 0 */
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     LibVEX_GuestPPC32_put_CR( old_cr & ~(1<<28), &ctst->arch.vex );
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sp != 0)
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->arch.vex.guest_GPR1 = sp;
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->os_state.parent = ptid;
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* inherit signal mask */
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->sig_mask = ptst->sig_mask;
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->tmp_sig_mask = ptst->sig_mask;
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Start the child with its threadgroup being the same as the
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      parent's.  This is so that any exit_group calls that happen
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      after the child is created but before it sets its
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      os_state.threadgroup field for real (in thread_wrapper in
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      syswrap-linux.c), really kill the new thread.  a.k.a this avoids
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      a race condition in which the thread is unkillable (via
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit_group) because its threadgroup is not set.  The race window
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      is probably only a few hundred or a few thousand cycles long.
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      See #226116. */
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->os_state.threadgroup = ptst->os_state.threadgroup;
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* We don't really know where the client stack is, because its
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      allocated by the client.  The best we can do is look at the
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      memory mappings and try to derive some useful information.  We
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assume that esp starts near its highest possible value, and can
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      only go down to the start of the mmaped segment. */
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   seg = VG_(am_find_nsegment)(sp);
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (seg && seg->kind != SkResvn) {
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp);
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (debug)
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 VG_(printf)("\ntid %d: guessed client stack range %#lx-%#lx\n",
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ctid, seg->start, VG_PGROUNDUP(sp));
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "!? New thread %d starts with R1(%#lx) unmapped\n",
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		   ctid, sp);
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_szB  = 0;
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Assume the clone will succeed, and tell any tool that wants to
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      know that this thread has come into existence.  If the clone
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fails, we'll send out a ll_exit notification for it at the out:
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      label below, to clean up. */
339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vg_assert(VG_(owns_BigLock_LL)(ptid));
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_TRACK ( pre_thread_ll_create, ptid, ctid );
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (flags & VKI_CLONE_SETTLS) {
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (debug)
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("clone child has SETTLS: tls at %#lx\n", child_tls);
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->arch.vex.guest_GPR2 = child_tls;
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags &= ~VKI_CLONE_SETTLS;
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* start the thread with everything blocked */
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Create the new thread */
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   word64 = do_syscall_clone_ppc32_linux(
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid],
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               child_tidptr, parent_tidptr, NULL
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            );
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* High half word64 is syscall return value.  Low half is
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      the entire CR, from which we need to extract CR0.SO. */
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* VG_(printf)("word64 = 0x%llx\n", word64); */
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = VG_(mk_SysRes_ppc32_linux)(
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /*val*/(UInt)(word64 >> 32),
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /*errflag*/ (((UInt)word64) >> 28) & 1
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         );
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  out:
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sr_isError(res)) {
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* clone failed */
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(cleanup_thread)(&ctst->arch);
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->status = VgTs_Empty;
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* oops.  Better tell the tool the thread exited in a hurry :-) */
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_TRACK( pre_thread_ll_exit, ctid );
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   More thread stuff
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(cleanup_thread) ( ThreadArchState* arch )
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid setup_child ( /*OUT*/ ThreadArchState *child,
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   /*IN*/  ThreadArchState *parent )
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* We inherit our parent's guest state. */
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex = parent->vex;
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex_shadow1 = parent->vex_shadow1;
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex_shadow2 = parent->vex_shadow2;
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE/POST wrappers for ppc32/Linux-specific syscalls
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE(name)       DEFN_PRE_TEMPLATE(ppc32_linux, name)
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST(name)      DEFN_POST_TEMPLATE(ppc32_linux, name)
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add prototypes for the wrappers declared here, so that gcc doesn't
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   harass us for not having prototypes.  Really this is a kludge --
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the right thing to do is to make these wrappers 'static' since they
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   aren't visible outside this file, but that requires even more macro
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   magic. */
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(ppc32_linux, sys_mmap);
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(ppc32_linux, sys_mmap2);
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(ppc32_linux, sys_stat64);
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(ppc32_linux, sys_lstat64);
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(ppc32_linux, sys_fstatat64);
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(ppc32_linux, sys_fstat64);
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_mmap)
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %ld, %ld )",
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "mmap",
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, start, unsigned long, length,
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, prot,  unsigned long, flags,
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, fd,    unsigned long, offset);
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       (Off64T)ARG6 );
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mmap2)
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Exactly like old_mmap() except:
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //  - the file offset is specified in 4K units rather than bytes,
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //    so that it can be used for files bigger than 2^32 bytes.
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mmap2 ( %#lx, %llu, %ld, %ld, %ld, %ld )",
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "mmap2",
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, start, unsigned long, length,
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, prot,  unsigned long, flags,
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, fd,    unsigned long, offset);
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       4096 * (Off64T)ARG6 );
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// XXX: lstat64/fstat64/stat64 are generic, but not necessarily
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// applicable to every architecture -- I think only to 32-bit archs.
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// We're going to need something like linux/core_os32.h for such
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// things, eventually, I think.  --njn
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_stat64)
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_stat64 ( %#lx, %#lx )",ARG1,ARG2);
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_stat64)
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_lstat64)
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_lstat64 ( %#lx(%s), %#lx )",ARG1,(char*)ARG1,ARG2);
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_lstat64)
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0) {
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fstatat64)
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRINT("sys_fstatat64 ( %ld, %#lx(%s), %#lx )",ARG1,ARG2,(char*)ARG2,ARG3);
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "fstatat64",
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, char *, file_name, struct stat64 *, buf);
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "fstatat64(file_name)", ARG2 );
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "fstatat64(buf)", ARG3, sizeof(struct vki_stat64) );
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_fstatat64)
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) );
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fstat64)
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRINT("sys_fstat64 ( %ld, %#lx )",ARG1,ARG2);
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_fstat64)
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. PRE(old_select, MayBlock)
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. {
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    /* struct sel_arg_struct {
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       unsigned long n;
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       fd_set *inp, *outp, *exp;
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       struct timeval *tvp;
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       };
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    */
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRE_REG_READ1(long, "old_select", struct sel_arg_struct *, args);
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRE_MEM_READ( "old_select(args)", ARG1, 5*sizeof(UWord) );
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    {
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       UInt* arg_struct = (UInt*)ARG1;
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       UInt a1, a2, a3, a4, a5;
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       a1 = arg_struct[0];
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       a2 = arg_struct[1];
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       a3 = arg_struct[2];
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       a4 = arg_struct[3];
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       a5 = arg_struct[4];
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       PRINT("old_select ( %d, %p, %p, %p, %p )", a1,a2,a3,a4,a5);
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       if (a2 != (Addr)NULL)
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. 	 PRE_MEM_READ( "old_select(readfds)",   a2, a1/8 /* __FD_SETSIZE/8 */ );
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       if (a3 != (Addr)NULL)
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. 	 PRE_MEM_READ( "old_select(writefds)",  a3, a1/8 /* __FD_SETSIZE/8 */ );
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       if (a4 != (Addr)NULL)
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. 	 PRE_MEM_READ( "old_select(exceptfds)", a4, a1/8 /* __FD_SETSIZE/8 */ );
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       if (a5 != (Addr)NULL)
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. 	 PRE_MEM_READ( "old_select(timeout)", a5, sizeof(struct vki_timeval) );
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    }
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. }
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clone)
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt cloneflags;
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(int, "clone",
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, flags,
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *,        child_stack,
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int *,         parent_tidptr,
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *,        child_tls,
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int *,         child_tidptr);
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & VKI_CLONE_PARENT_SETTID) {
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                             VKI_PROT_WRITE)) {
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int),
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                             VKI_PROT_WRITE)) {
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cloneflags = ARG1;
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Only look at the flags we really care about */
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* thread creation */
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         do_clone(tid,
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG1,         /* flags */
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)ARG2,   /* child SP */
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Int *)ARG3,  /* parent_tidptr */
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Int *)ARG5,  /* child_tidptr */
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)ARG4)); /* child_tls */
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* FALLTHROUGH - assume vfork == fork */
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 0: /* plain fork */
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(do_fork_clone)(tid,
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       cloneflags,      /* flags */
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Int *)ARG3,     /* parent_tidptr */
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Int *)ARG5));   /* child_tidptr */
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* should we just ENOSYS? */
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx\n", ARG1);
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "\n");
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "The only supported clone() uses are:\n");
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)\n");
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork\n");
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(unimplemented)
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ("Valgrind does not support general clone().");
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS) {
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG1 & VKI_CLONE_PARENT_SETTID)
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG3, sizeof(Int));
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG5, sizeof(Int));
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Thread creation was successful; let the child have the chance
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         to run */
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfYieldAfter;
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sigreturn)
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      an explanation of what follows. */
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   //ThreadState* tst;
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sigreturn ( )");
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ///* Adjust esp to point to start of frame; skip back up over
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   sigreturn sequence's "popl %eax" and handler ret addr */
654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   //tst = VG_(get_ThreadState)(tid);
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //tst->arch.vex.guest_ESP -= sizeof(Addr)+sizeof(Word);
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Should we do something equivalent on ppc32?  Who knows.
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ///* This is only so that the EIP is (might be) useful to report if
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   something goes wrong in the sigreturn */
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Should we do something equivalent on ppc32?  Who knows.
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Restore register state from frame and remove it */
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigframe_destroy)(tid, False);
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell the driver not to update the guest state with the "result",
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      and set a bogus result to keep it happy. */
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfNoWriteResult;
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if any signals arose as a result of this. */
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfPollAfter;
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigreturn)
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      an explanation of what follows. */
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   //ThreadState* tst;
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("rt_sigreturn ( )");
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ///* Adjust esp to point to start of frame; skip back up over handler
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   ret addr */
689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   //tst = VG_(get_ThreadState)(tid);
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //tst->arch.vex.guest_ESP -= sizeof(Addr);
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Should we do something equivalent on ppc32?  Who knows.
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ///* This is only so that the EIP is (might be) useful to report if
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   something goes wrong in the sigreturn */
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Should we do something equivalent on ppc32?  Who knows.
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Restore register state from frame and remove it */
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigframe_destroy)(tid, True);
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell the driver not to update the guest state with the "result",
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      and set a bogus result to keep it happy. */
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfNoWriteResult;
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if any signals arose as a result of this. */
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfPollAfter;
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. PRE(sys_modify_ldt, Special)
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. {
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRINT("sys_modify_ldt ( %d, %p, %d )", ARG1,ARG2,ARG3);
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRE_REG_READ3(int, "modify_ldt", int, func, void *, ptr,
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..                  unsigned long, bytecount);
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    if (ARG1 == 0) {
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       /* read the LDT into ptr */
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       PRE_MEM_WRITE( "modify_ldt(ptr)", ARG2, ARG3 );
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    }
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    if (ARG1 == 1 || ARG1 == 0x11) {
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       /* write the LDT with the entry pointed at by ptr */
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       PRE_MEM_READ( "modify_ldt(ptr)", ARG2, sizeof(vki_modify_ldt_t) );
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    }
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    /* "do" the syscall ourselves; the kernel never sees it */
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    SET_RESULT( VG_(sys_modify_ldt)( tid, ARG1, (void*)ARG2, ARG3 ) );
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    if (ARG1 == 0 && !VG_(is_kerror)(RES) && RES > 0) {
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       POST_MEM_WRITE( ARG2, RES );
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    }
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. }
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. PRE(sys_set_thread_area, Special)
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. {
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRINT("sys_set_thread_area ( %p )", ARG1);
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRE_REG_READ1(int, "set_thread_area", struct user_desc *, u_info)
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRE_MEM_READ( "set_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) );
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    /* "do" the syscall ourselves; the kernel never sees it */
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    SET_RESULT( VG_(sys_set_thread_area)( tid, (void *)ARG1 ) );
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. }
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. PRE(sys_get_thread_area, Special)
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. {
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRINT("sys_get_thread_area ( %p )", ARG1);
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRE_REG_READ1(int, "get_thread_area", struct user_desc *, u_info)
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRE_MEM_WRITE( "get_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) );
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    /* "do" the syscall ourselves; the kernel never sees it */
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    SET_RESULT( VG_(sys_get_thread_area)( tid, (void *)ARG1 ) );
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    if (!VG_(is_kerror)(RES)) {
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       POST_MEM_WRITE( ARG1, sizeof(vki_modify_ldt_t) );
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    }
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. }
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. // Parts of this are ppc32-specific, but the *PEEK* cases are generic.
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. // XXX: Why is the memory pointed to by ARG3 never checked?
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. PRE(sys_ptrace, 0)
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. {
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRINT("sys_ptrace ( %d, %d, %p, %p )", ARG1,ARG2,ARG3,ARG4);
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PRE_REG_READ4(int, "ptrace",
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..                  long, request, long, pid, long, addr, long, data);
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    switch (ARG1) {
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_PEEKTEXT:
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_PEEKDATA:
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_PEEKUSR:
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       PRE_MEM_WRITE( "ptrace(peek)", ARG4,
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. 		     sizeof (long));
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_GETREGS:
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. 		     sizeof (struct vki_user_regs_struct));
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_GETFPREGS:
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. 		     sizeof (struct vki_user_i387_struct));
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_GETFPXREGS:
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       PRE_MEM_WRITE( "ptrace(getfpxregs)", ARG4,
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..                      sizeof(struct vki_user_fxsr_struct) );
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_SETREGS:
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       PRE_MEM_READ( "ptrace(setregs)", ARG4,
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. 		     sizeof (struct vki_user_regs_struct));
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_SETFPREGS:
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. 		     sizeof (struct vki_user_i387_struct));
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_SETFPXREGS:
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       PRE_MEM_READ( "ptrace(setfpxregs)", ARG4,
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..                      sizeof(struct vki_user_fxsr_struct) );
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    default:
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    }
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. }
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. POST(sys_ptrace)
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. {
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    switch (ARG1) {
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_PEEKTEXT:
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_PEEKDATA:
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_PEEKUSR:
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       POST_MEM_WRITE( ARG4, sizeof (long));
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_GETREGS:
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_GETFPREGS:
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    case VKI_PTRACE_GETFPXREGS:
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       POST_MEM_WRITE( ARG4, sizeof(struct vki_user_fxsr_struct) );
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    default:
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..       break;
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    }
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.. }
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* NB: This is an almost identical clone of versions for x86-linux and
823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   arm-linux, which are themselves literally identical. */
824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_sigsuspend)
825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The C library interface to sigsuspend just takes a pointer to
827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      a signal mask but this system call only takes the first word of
828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the signal mask as an argument so only 32 signals are supported.
829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      In fact glibc normally uses rt_sigsuspend if it is available as
831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      that takes a pointer to the signal mask so supports more signals.
832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    */
833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfMayBlock;
834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_sigsuspend ( %ld )", ARG1 );
835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ1(int, "sigsuspend", vki_old_sigset_t, mask);
836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_spu_create)
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("stat64(filename)", ARG1);
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_spu_create)
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_spu_run)
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("npc", ARG2, sizeof(unsigned int));
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("event", ARG3, sizeof(unsigned int));
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_spu_run)
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, sizeof(unsigned int));
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef PRE
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef POST
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The ppc32/Linux syscall table
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add an ppc32-linux specific wrapper to a syscall table. */
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAX_(sysno, name)    WRAPPER_ENTRY_X_(ppc32_linux, sysno, name)
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAXY(sysno, name)    WRAPPER_ENTRY_XY(ppc32_linux, sysno, name)
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This table maps from __NR_xxx syscall numbers (from
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/include/asm-ppc/unistd.h) to the appropriate PRE/POST sys_foo()
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// wrappers on ppc32 (as per sys_call_table in linux/arch/ppc/kernel/entry.S).
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// For those syscalls not handled by Valgrind, the annotation indicate its
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// (unknown).
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry syscall_table[] = {
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..   (restart_syscall)                                      // 0
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_exit,              sys_exit),              // 1
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fork,              sys_fork),              // 2
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_read,              sys_read),              // 3
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_write,             sys_write),             // 4
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_open,              sys_open),              // 5
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_close,             sys_close),             // 6
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_waitpid,           sys_waitpid),           // 7
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_creat,             sys_creat),             // 8
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_link,              sys_link),              // 9
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_unlink,            sys_unlink),            // 10
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_execve,            sys_execve),            // 11
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chdir,             sys_chdir),             // 12
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_time,              sys_time),              // 13
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mknod,             sys_mknod),             // 14
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chmod,             sys_chmod),             // 15
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_lchown,            sys_lchown),          // 16 ## P
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_break,             sys_ni_syscall),        // 17
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_oldstat,           sys_stat),              // 18 (obsolete)
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lseek,             sys_lseek),             // 19
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpid,            sys_getpid),            // 20
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mount,             sys_mount),             // 21
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_umount,            sys_oldumount),         // 22
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setuid,            sys_setuid),            // 23 ## P
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getuid,            sys_getuid),            // 24 ## P
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_stime,             sys_stime),             // 25 * (SVr4,SVID,X/OPEN)
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PLAXY(__NR_ptrace,            sys_ptrace),            // 26
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_alarm,             sys_alarm),             // 27
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_oldfstat,          sys_fstat),             // 28 * L -- obsolete
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pause,             sys_pause),             // 29
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_utime,             sys_utime),                  // 30
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_stty,              sys_ni_syscall),        // 31
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_gtty,              sys_ni_syscall),        // 32
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_access,            sys_access),            // 33
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_nice,              sys_nice),              // 34
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_ftime,             sys_ni_syscall),        // 35
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_sync,              sys_sync),              // 36
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_kill,              sys_kill),              // 37
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rename,            sys_rename),            // 38
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mkdir,             sys_mkdir),             // 39
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rmdir,             sys_rmdir),             // 40
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup,               sys_dup),               // 41
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_pipe,              sys_pipe),              // 42
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_times,             sys_times),             // 43
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_prof,              sys_ni_syscall),        // 44
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_brk,               sys_brk),               // 45
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setgid,            sys_setgid),            // 46
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getgid,            sys_getgid),            // 47
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_signal,            sys_signal),            // 48 */* (ANSI C)
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_geteuid,           sys_geteuid),           // 49
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getegid,           sys_getegid),           // 50
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_acct,              sys_acct),              // 51
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_umount2,           sys_umount),            // 52
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_lock,              sys_ni_syscall),        // 53
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_ioctl,             sys_ioctl),             // 54
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fcntl,             sys_fcntl),             // 55
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_mpx,               sys_ni_syscall),        // 56
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpgid,           sys_setpgid),           // 57
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_ulimit,            sys_ni_syscall),        // 58
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_oldolduname,       sys_olduname),          // 59 Linux -- obsolete
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_umask,             sys_umask),             // 60
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chroot,            sys_chroot),            // 61
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_ustat,             sys_ustat)              // 62 SVr4 -- deprecated
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup2,              sys_dup2),              // 63
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getppid,           sys_getppid),           // 64
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpgrp,           sys_getpgrp),           // 65
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setsid,            sys_setsid),            // 66
960d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   LINXY(__NR_sigaction,         sys_sigaction),         // 67
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_sgetmask,          sys_sgetmask),          // 68 */* (ANSI C)
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_ssetmask,          sys_ssetmask),          // 69 */* (ANSI C)
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setreuid,          sys_setreuid),          // 70
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setregid,          sys_setregid),          // 71
966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAX_(__NR_sigsuspend,        sys_sigsuspend),        // 72
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sigpending,        sys_sigpending),        // 73
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_sethostname,       sys_sethostname),       // 74 */*
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setrlimit,         sys_setrlimit),              // 75
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENXY(__NR_getrlimit,         sys_old_getrlimit),     // 76
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getrusage,         sys_getrusage),         // 77
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_gettimeofday,      sys_gettimeofday),           // 78
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_settimeofday,      sys_settimeofday),      // 79
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getgroups,         sys_getgroups),         // 80
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setgroups,         sys_setgroups),         // 81
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PLAX_(__NR_select,            old_select),            // 82
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_symlink,           sys_symlink),           // 83
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_oldlstat,          sys_lstat),             // 84 -- obsolete
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_readlink,          sys_readlink),          // 85
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_uselib,            sys_uselib),            // 86 */Linux
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_swapon,            sys_swapon),            // 87 */Linux
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_reboot,            sys_reboot),            // 88 */Linux
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_readdir,           old_readdir),           // 89 -- superseded
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_mmap,              sys_mmap),                   // 90
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_munmap,            sys_munmap),                 // 91
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_truncate,          sys_truncate),          // 92
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_ftruncate,         sys_ftruncate),         // 93
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchmod,            sys_fchmod),            // 94
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchown,            sys_fchown),            // 95
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpriority,       sys_getpriority),       // 96
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpriority,       sys_setpriority),       // 97
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_profil,            sys_ni_syscall),        // 98
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_statfs,            sys_statfs),            // 99
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstatfs,           sys_fstatfs),           // 100
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    LINX_(__NR_ioperm,            sys_ioperm),            // 101
1002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_socketcall,        sys_socketcall),        // 102
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_syslog,            sys_syslog),            // 103
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_setitimer,         sys_setitimer),         // 104
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getitimer,         sys_getitimer),         // 105
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_stat,              sys_newstat),           // 106
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_lstat,             sys_newlstat),          // 107
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstat,             sys_newfstat),          // 108
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_olduname,          sys_uname),             // 109 -- obsolete
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_iopl,              sys_iopl),              // 110
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_vhangup,           sys_vhangup),           // 111
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_idle,              sys_ni_syscall),        // 112
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_vm86old,           sys_vm86old),           // 113 x86/Linux-only
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_wait4,             sys_wait4),             // 114
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_swapoff,           sys_swapoff),           // 115 */Linux
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sysinfo,           sys_sysinfo),           // 116
1020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_ipc,               sys_ipc),               // 117
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fsync,             sys_fsync),             // 118
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_sigreturn,         sys_sigreturn),         // 119 ?/Linux
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_clone,             sys_clone),             // 120
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_setdomainname,     sys_setdomainname),     // 121 */*(?)
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_uname,             sys_newuname),          // 122
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    PLAX_(__NR_modify_ldt,        sys_modify_ldt),        // 123
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_adjtimex,          sys_adjtimex),          // 124
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_mprotect,          sys_mprotect),          // 125
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sigprocmask,       sys_sigprocmask),       // 126
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_create_module,     sys_ni_syscall),        // 127
1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_init_module,       sys_init_module),       // 128
1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_delete_module,     sys_delete_module),     // 129
1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    // Nb: get_kernel_syms() was removed 2.4-->2.6
1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_get_kernel_syms,   sys_ni_syscall),        // 130
1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    LINX_(__NR_quotactl,          sys_quotactl),          // 131
1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpgid,           sys_getpgid),           // 132
1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchdir,            sys_fchdir),            // 133
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_bdflush,           sys_bdflush),           // 134 */Linux
1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_sysfs,             sys_sysfs),             // 135 SVr4
1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_personality,       sys_personality),       // 136
1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_afs_syscall,       sys_ni_syscall),        // 137
1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsuid,          sys_setfsuid),          // 138
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsgid,          sys_setfsgid),          // 139
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR__llseek,           sys_llseek),            // 140
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getdents,          sys_getdents),          // 141
1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR__newselect,        sys_select),            // 142
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_flock,             sys_flock),             // 143
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_msync,             sys_msync),             // 144
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_readv,             sys_readv),             // 145
1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_writev,            sys_writev),            // 146
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getsid,            sys_getsid),            // 147
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fdatasync,         sys_fdatasync),         // 148
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR__sysctl,           sys_sysctl),            // 149
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mlock,             sys_mlock),             // 150
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_munlock,           sys_munlock),           // 151
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mlockall,          sys_mlockall),          // 152
1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_munlockall,        sys_munlockall),        // 153
1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_setparam,    sys_sched_setparam),    // 154
1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_getparam,         sys_sched_getparam),        // 155
1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_setscheduler,     sys_sched_setscheduler),    // 156
1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_getscheduler,     sys_sched_getscheduler),    // 157
1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_yield,            sys_sched_yield),           // 158
1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_rr_get_interval,  sys_sched_rr_get_interval), // 161
1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_nanosleep,         sys_nanosleep),         // 162
1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mremap,            sys_mremap),            // 163
1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresuid,         sys_setresuid),         // 164
1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresuid,         sys_getresuid),         // 165
1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_query_module,      sys_ni_syscall),        // 166
1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_poll,              sys_poll),              // 167
1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_nfsservctl,        sys_nfsservctl),        // 168 */Linux
1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresgid,         sys_setresgid),         // 169
1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresgid,         sys_getresgid),         // 170
1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_prctl,             sys_prctl),             // 171
1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_rt_sigreturn,      sys_rt_sigreturn),      // 172
1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigaction,      sys_rt_sigaction),      // 173
1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigprocmask,    sys_rt_sigprocmask),    // 174
1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigpending,     sys_rt_sigpending),     // 175
1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigtimedwait,   sys_rt_sigtimedwait),   // 176
1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigqueueinfo,   sys_rt_sigqueueinfo),   // 177
1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_rt_sigsuspend,     sys_rt_sigsuspend),     // 178
1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_pread64,           sys_pread64),           // 179
1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pwrite64,          sys_pwrite64),          // 180
1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chown,             sys_chown),             // 181
1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getcwd,            sys_getcwd),            // 182
1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_capget,            sys_capget),            // 183
1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_capset,            sys_capset),            // 184
1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_sigaltstack,       sys_sigaltstack),       // 185
1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sendfile,          sys_sendfile),          // 186
1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENXY(__NR_getpmsg,           sys_getpmsg),           // 187
1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_putpmsg,           sys_putpmsg),           // 188
1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Nb: we treat vfork as fork
1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_vfork,             sys_fork),              // 189
1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_ugetrlimit,        sys_getrlimit),         // 190
1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_readahead,         sys_readahead),         // 191 */Linux
1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_mmap2,             sys_mmap2),             // 192
1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_truncate64,        sys_truncate64),        // 193
1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_ftruncate64,       sys_ftruncate64),       // 194
1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_stat64,            sys_stat64),            // 195
1118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_lstat64,           sys_lstat64),           // 196
1119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_fstat64,           sys_fstat64),           // 197
1120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// __NR_pciconfig_read                                        // 198
1122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// __NR_pciconfig_write                                       // 199
1123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// __NR_pciconfig_iobase                                      // 200
1124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// __NR_multiplexer                                           // 201
1125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getdents64,        sys_getdents64),        // 202
1127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_pivot_root,        sys_pivot_root),        // 203 */Linux
1128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fcntl64,           sys_fcntl64),           // 204
1129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_madvise,           sys_madvise),           // 205
1130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_mincore,           sys_mincore),           // 206
1131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_gettid,            sys_gettid),            // 207
1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    LINX_(__NR_tkill,             sys_tkill),             // 208 */Linux
1133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_setxattr,          sys_setxattr),          // 209
1134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_lsetxattr,         sys_lsetxattr),         // 210
1135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_fsetxattr,         sys_fsetxattr),         // 211
1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getxattr,          sys_getxattr),          // 212
1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_lgetxattr,         sys_lgetxattr),         // 213
1138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fgetxattr,         sys_fgetxattr),         // 214
1139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_listxattr,         sys_listxattr),         // 215
1140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_llistxattr,        sys_llistxattr),        // 216
1141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_flistxattr,        sys_flistxattr),        // 217
1142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_removexattr,       sys_removexattr),       // 218
1143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lremovexattr,      sys_lremovexattr),      // 219
1144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fremovexattr,      sys_fremovexattr),      // 220
1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_futex,             sys_futex),                  // 221
1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 222
1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 223
1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 224 currently unused */
1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// __NR_tuxcall                                               // 225
1152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sendfile64,        sys_sendfile64),        // 226
1154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_io_setup,          sys_io_setup),          // 227
1156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_io_destroy,        sys_io_destroy),        // 228
1157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_getevents,      sys_io_getevents),      // 229
1158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_io_submit,         sys_io_submit),         // 230
1159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_cancel,         sys_io_cancel),         // 231
1160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..
1161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_tid_address,   sys_set_tid_address),   // 232
1162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fadvise64,         sys_fadvise64),         // 233 */(Linux?)
1164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_exit_group,        sys_exit_group),        // 234
1165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENXY(__NR_lookup_dcookie,    sys_lookup_dcookie),    // 235
1166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_create,      sys_epoll_create),      // 236
1167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_epoll_ctl,         sys_epoll_ctl),         // 237
1168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_wait,        sys_epoll_wait),        // 238
1169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    //   (__NR_remap_file_pages,  sys_remap_file_pages),  // 239 */Linux
1171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_create,      sys_timer_create),      // 240
1172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_settime,     sys_timer_settime),     // 241
1173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_gettime,     sys_timer_gettime),     // 242
1174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_timer_getoverrun,  sys_timer_getoverrun),  // 243
1175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_timer_delete,      sys_timer_delete),      // 244
1176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_clock_settime,     sys_clock_settime),     // 245
1177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_gettime,     sys_clock_gettime),     // 246
1178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_getres,      sys_clock_getres),      // 247
1179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_nanosleep,   sys_clock_nanosleep),   // 248
1180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// __NR_swapcontext                                           // 249
1182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_tgkill,            sys_tgkill),            // 250 */Linux
1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//..    GENX_(__NR_utimes,            sys_utimes),            // 251
1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_statfs64,          sys_statfs64),          // 252
1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstatfs64,         sys_fstatfs64),         // 253
1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fadvise64_64,      sys_fadvise64_64),      // 254 */(Linux?)
1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// __NR_rtas                                                  // 255
1190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Number 256 is reserved for sys_debug_setcontext */
1192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Number 257 is reserved for vserver */
1193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Number 258 is reserved for new sys_remap_file_pages */
1194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_mbind,             sys_mbind),             // 259
1195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_get_mempolicy,     sys_get_mempolicy),          // 260
1196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_mempolicy,     sys_set_mempolicy),          // 261
1197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_open,           sys_mq_open),           // 262
1199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_unlink,         sys_mq_unlink),         // 263
1200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_timedsend,      sys_mq_timedsend),      // 264
1201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_timedreceive,   sys_mq_timedreceive),   // 265
1202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_notify,         sys_mq_notify),         // 266
1203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_getsetattr,     sys_mq_getsetattr),     // 267
1204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// __NR_kexec_load                                            // 268
1205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Number 269 is reserved for sys_add_key */
1207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Number 270 is reserved for sys_request_key */
1208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Number 271 is reserved for sys_keyctl */
1209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Number 272 is reserved for sys_waitid */
1210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_ioprio_set,        sys_ioprio_set),         // 273
1211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_ioprio_get,        sys_ioprio_get),         // 274
1212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_init,  sys_inotify_init),               // 275
1214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_add_watch,  sys_inotify_add_watch),     // 276
1215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_rm_watch,   sys_inotify_rm_watch),      // 277
1216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_spu_run,            sys_spu_run),               // 278
1217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_spu_create,         sys_spu_create),            // 279
1218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_pselect6,          sys_pselect6),          // 280
1220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_ppoll,             sys_ppoll),             // 281
1221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_openat,            sys_openat),            // 286
1223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mkdirat,           sys_mkdirat),           // 287
1224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mknodat,           sys_mknodat),           // 288
1225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchownat,          sys_fchownat),          // 289
1226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_futimesat,         sys_futimesat),         // 290
1227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_fstatat64,         sys_fstatat64),         // 291
1228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_unlinkat,          sys_unlinkat),          // 292
1229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_renameat,          sys_renameat),          // 293
1230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_linkat,            sys_linkat),            // 294
1231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_symlinkat,         sys_symlinkat),         // 295
1232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_readlinkat,        sys_readlinkat),        // 296
1233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchmodat,          sys_fchmodat),          // 297
1234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_faccessat,         sys_faccessat),         // 298
1235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_robust_list,   sys_set_robust_list),   // 299
1236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_get_robust_list,   sys_get_robust_list),   // 300
1237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_move_pages,        sys_move_pages),        // 301
1238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getcpu,            sys_getcpu),            // 302
1239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_pwait,       sys_epoll_pwait),       // 303
1240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_utimensat,         sys_utimensat),         // 304
1241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_signalfd,          sys_signalfd),          // 305
1242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_create,    sys_timerfd_create),    // 306
1243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_eventfd,           sys_eventfd),           // 307
1244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sync_file_range2,  sys_sync_file_range2),  // 308
1245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fallocate,         sys_fallocate),         // 309
1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINXY(__NR_subpage_prot,       sys_ni_syscall),       // 310
1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_settime,   sys_timerfd_settime),  // 311
1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_gettime,   sys_timerfd_gettime),  // 312
1249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_signalfd4,         sys_signalfd4),        // 313
1250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_eventfd2,          sys_eventfd2),         // 314
1251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_create1,     sys_epoll_create1),    // 315
1252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_dup3,              sys_dup3),             // 316
1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_pipe2,             sys_pipe2),            // 317
1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_inotify_init1,     sys_inotify_init1),    // 318
1255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_perf_event_open,   sys_perf_event_open),  // 319
1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_preadv,            sys_preadv),           // 320
1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_pwritev,           sys_pwritev),          // 321
1258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 322
1259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_clock_adjtime,     sys_clock_adjtime),    // 347
1261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_process_vm_readv,  sys_process_vm_readv), // 351
1263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINX_(__NR_process_vm_writev, sys_process_vm_writev) // 352
1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const UInt syscall_table_size
1269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = sizeof(syscall_table) / sizeof(syscall_table[0]);
1270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Is it in the contiguous initial section of the table? */
1272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sysno < syscall_table_size) {
1273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SyscallTableEntry* sys = &syscall_table[sysno];
1274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (sys->before == NULL)
1275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return NULL; /* no entry */
1276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
1277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return sys;
1278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Can't find a wrapper */
1281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return NULL;
1282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_ppc32_linux)
1285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                                          ---*/
1288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1289