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