1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------------------*/
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Platform-specific syscalls stuff.      syswrap-s390x-linux.c ---*/
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------------------*/
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This file is part of Valgrind, a dynamic binary instrumentation
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   framework.
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Copyright IBM Corp. 2010-2011
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is free software; you can redistribute it and/or
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   modify it under the terms of the GNU General Public License as
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   published by the Free Software Foundation; either version 2 of the
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   License, or (at your option) any later version.
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is distributed in the hope that it will be useful, but
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   WITHOUT ANY WARRANTY; without even the implied warranty of
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   General Public License for more details.
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   You should have received a copy of the GNU General Public License
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   along with this program; if not, write to the Free Software
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   02111-1307, USA.
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   The GNU General Public License is contained in the file COPYING.
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Contributed by Christian Borntraeger */
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if defined(VGP_s390x_linux)
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_basics.h"
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_vki.h"
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_vkiscnums.h"
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcsetjmp.h"    // to keep _threadstate.h happy
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_threadstate.h"
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_aspacemgr.h"
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_debuglog.h"
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcbase.h"
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcassert.h"
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcprint.h"
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcproc.h"
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcsignal.h"
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_mallocfree.h"
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_options.h"
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_scheduler.h"
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_sigframe.h"      // For VG_(sigframe_destroy)()
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_signals.h"
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_syscall.h"
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_syswrap.h"
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_tooliface.h"
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_stacks.h"        // VG_(register_stack)
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "priv_types_n_macros.h"
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "priv_syswrap-generic.h"    /* for decls of generic wrappers */
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "priv_syswrap-linux.h"      /* for decls of linux-ish wrappers */
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "priv_syswrap-linux-variants.h" /* decls of linux variant wrappers */
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "priv_syswrap-main.h"
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* ---------------------------------------------------------------------
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   clone() handling
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ------------------------------------------------------------------ */
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Call f(arg1), but first switch stacks, using 'stack' as the new
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stack, and use 'retaddr' as f's return-to address.  Also, clear all
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   the integer registers before entering f.
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Thought: Why are we clearing the GPRs ? The callee pointed to by f
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   is a regular C function which will play by the ABI rules. So there is
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   no need to zero out the GPRs. If we assumed that f accesses registers at
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   will, then it would make sense to create a defined register state.
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   But then, why only for the GPRs and not the FPRs ? */
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov__attribute__((noreturn))
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid ML_(call_on_new_stack_0_1) ( Addr stack,
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  Addr retaddr,
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  void (*f)(Word),
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  Word arg1 );
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Upon entering this function we have the following setup:
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     r2 = stack
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     r3 = retaddr
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     r4 = f_desc
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     r5 = arg1
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovasm(
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ".text\n"
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ".align 4\n"
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ".globl vgModuleLocal_call_on_new_stack_0_1\n"
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ".type vgModuleLocal_call_on_new_stack_0_1, @function\n"
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "vgModuleLocal_call_on_new_stack_0_1:\n"
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lgr %r15,%r2\n"     // stack to r15
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lgr %r14,%r3\n"     // retaddr to r14
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lgr %r2,%r5\n"      // arg1 to r2
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // zero all gprs to get a defined state
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r0,0\n"
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r1,0\n"
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // r2 holds the argument for the callee
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r3,0\n"
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // r4 holds the callee address
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r5,0\n"
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r6,0\n"
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r7,0\n"
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r8,0\n"
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r9,0\n"
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r10,0\n"
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r11,0\n"
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r12,0\n"
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   lghi  %r13,0\n"
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // r14 holds the return address for the callee
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // r15 is the stack pointer
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "   br  %r4\n"          // jump to f
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ".previous\n"
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    );
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Perform a clone system call.  clone is strange because it has
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        fork()-like return-twice semantics, so it needs special
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        handling here.
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Upon entry, we have:
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            void*  child_stack   in r2
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            long   flags         in r3
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int*   parent_tid    in r4
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int*   child_tid     in r5
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int*   child_tid     in r6
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Word   (*fn)(void *) 160(r15)
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            void   *arg          168(r15)
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        System call requires:
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            void*  child_stack  in r2  (sc arg1)
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            long   flags        in r3  (sc arg2)
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int*   parent_tid   in r4  (sc arg3)
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int*   child_tid    in r5  (sc arg4)
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            void*  tlsaddr      in r6  (sc arg5)
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Returns a ULong encoded as: top half is %cr following syscall,
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        low half is syscall return value (r3).
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define __NR_CLONE        VG_STRINGIFY(__NR_clone)
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define __NR_EXIT         VG_STRINGIFY(__NR_exit)
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern
144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovULong do_syscall_clone_s390x_linux ( void  *stack,
145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ULong flags,
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     Int   *child_tid,
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     Int   *parent_tid,
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     Addr  tlsaddr,
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     Word (*fn)(void *),
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     void  *arg);
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovasm(
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   .text\n"
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   .align  4\n"
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "do_syscall_clone_s390x_linux:\n"
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   lg    %r1, 160(%r15)\n"   // save fn from parent stack into r1
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   lg    %r0, 168(%r15)\n"   // save arg from parent stack into r0
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   aghi  %r2, -160\n"        // create stack frame for child
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // all syscall parameters are already in place (r2-r6)
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   svc " __NR_CLONE"\n"        // clone()
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   ltgr  %r2,%r2\n"           // child if retval == 0
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   jne   1f\n"
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // CHILD - call thread function
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   lgr   %r2, %r0\n"            // get arg from r0
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   basr  %r14,%r1\n"            // call fn
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // exit. The result is already in r2
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   svc " __NR_EXIT"\n"
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Exit returned?!
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   j +2\n"
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "1:\n"  // PARENT or ERROR
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   "   br %r14\n"
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ".previous\n"
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov);
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef __NR_CLONE
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef __NR_EXIT
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid VG_(cleanup_thread) ( ThreadArchState* arch )
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* only used on x86 for descriptor tables */
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void setup_child ( /*OUT*/ ThreadArchState *child,
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   /*IN*/  ThreadArchState *parent )
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* We inherit our parent's guest state. */
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   child->vex = parent->vex;
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   child->vex_shadow1 = parent->vex_shadow1;
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   child->vex_shadow2 = parent->vex_shadow2;
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   When a client clones, we need to keep track of the new thread.  This means:
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   1. allocate a ThreadId+ThreadState+stack for the the thread
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   2. initialize the thread's new VCPU state
201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   3. create the thread using the same args as the client requested,
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   but using the scheduler entrypoint for IP, and a separate stack
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for SP.
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic SysRes do_clone ( ThreadId ptid,
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         Addr sp, ULong flags,
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         Int *parent_tidptr,
209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         Int *child_tidptr,
210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         Addr tlsaddr)
211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   static const Bool debug = False;
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ThreadId     ctid = VG_(alloc_ThreadState)();
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ThreadState* ptst = VG_(get_ThreadState)(ptid);
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ThreadState* ctst = VG_(get_ThreadState)(ctid);
217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UWord*       stack;
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   NSegment const* seg;
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   SysRes       res;
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong        r2;
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vki_sigset_t blockall, savedmask;
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(sigfillset)(&blockall);
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vg_assert(VG_(is_running_thread)(ptid));
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vg_assert(VG_(is_valid_tid)(ctid));
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stack = (UWord*)ML_(allocstack)(ctid);
229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (stack == NULL) {
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      goto out;
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Copy register state
235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Both parent and child return to the same place, and the code
237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      following the clone syscall works out which is which, so we
238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      don't need to worry about it.
239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      The parent gets the child's new tid returned from clone, but the
241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      child gets 0.
242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      If the clone call specifies a NULL sp for the new thread, then
244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      it actually gets a copy of the parent's sp.
245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   */
246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   setup_child( &ctst->arch, &ptst->arch );
247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Make sys_clone appear to have returned Success(0) in the
249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      child. */
250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ctst->arch.vex.guest_r2 = 0;
251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (sp != 0)
253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ctst->arch.vex.guest_r15 = sp;
254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ctst->os_state.parent = ptid;
256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* inherit signal mask */
258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ctst->sig_mask = ptst->sig_mask;
259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ctst->tmp_sig_mask = ptst->sig_mask;
260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* have the parents thread group */
262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ctst->os_state.threadgroup = ptst->os_state.threadgroup;
263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* We don't really know where the client stack is, because its
265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      allocated by the client.  The best we can do is look at the
266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      memory mappings and try to derive some useful information.  We
267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assume that esp starts near its highest possible value, and can
268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      only go down to the start of the mmaped segment. */
269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   seg = VG_(am_find_nsegment)((Addr)sp);
270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (seg && seg->kind != SkResvn) {
271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp);
272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (debug)
277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n",
278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     ctid, seg->start, VG_PGROUNDUP(sp));
279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(message)(Vg_UserMsg,
281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   "!? New thread %d starts with SP(%#lx) unmapped\n",
282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		   ctid, sp);
283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ctst->client_stack_szB  = 0;
284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Assume the clone will succeed, and tell any tool that wants to
287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      know that this thread has come into existence.  If the clone
288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      fails, we'll send out a ll_exit notification for it at the out:
289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      label below, to clean up. */
290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_TRACK ( pre_thread_ll_create, ptid, ctid );
291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (flags & VKI_CLONE_SETTLS) {
293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (debug)
294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 VG_(printf)("clone child has SETTLS: tls at %#lx\n", tlsaddr);
295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ctst->arch.vex.guest_a0 = (UInt) (tlsaddr >> 32);
296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ctst->arch.vex.guest_a1 = (UInt) tlsaddr;
297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   flags &= ~VKI_CLONE_SETTLS;
299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* start the thread with everything blocked */
301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Create the new thread */
304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   r2 = do_syscall_clone_s390x_linux(
305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            stack, flags, child_tidptr, parent_tidptr, tlsaddr,
306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ML_(start_thread_NORETURN), &VG_(threads)[ctid]);
307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   res = VG_(mk_SysRes_s390x_linux)( r2 );
309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  out:
313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (sr_isError(res)) {
314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* clone failed */
315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ctst->status = VgTs_Empty;
316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* oops.  Better tell the tool the thread exited in a hurry :-) */
317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_TRACK( pre_thread_ll_exit, ctid );
318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return res;
321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* ---------------------------------------------------------------------
327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE/POST wrappers for s390x/Linux-specific syscalls
328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ------------------------------------------------------------------ */
329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define PRE(name)       DEFN_PRE_TEMPLATE(s390x_linux, name)
331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define POST(name)      DEFN_POST_TEMPLATE(s390x_linux, name)
332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Add prototypes for the wrappers declared here, so that gcc doesn't
334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   harass us for not having prototypes.  Really this is a kludge --
335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   the right thing to do is to make these wrappers 'static' since they
336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   aren't visible outside this file, but that requires even more macro
337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   magic. */
338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_ptrace);
340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_socketcall);
341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_mmap);
342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_ipc);
343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_clone);
344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_sigreturn);
345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_rt_sigreturn);
346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(s390x_linux, sys_fadvise64);
347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// PEEK TEXT,DATA and USER are common to all architectures
349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// PEEKUSR_AREA and POKEUSR_AREA are special, having a memory area
350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// containing the real addr, data, and len field pointed to by ARG3
351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// instead of ARG4
352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_ptrace)
353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ4(int, "ptrace",
356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 long, request, long, pid, long, addr, long, data);
357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (ARG1) {
358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKTEXT:
359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKDATA:
360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKUSR:
361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(peek)", ARG4,
362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     sizeof (long));
363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETEVENTMSG:
365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long));
366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETSIGINFO:
368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t));
369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETSIGINFO:
371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t));
372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKUSR_AREA:
374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      {
375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         vki_ptrace_area *pa;
376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* Reads a part of the user area into memory at pa->process_addr */
378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 pa = (vki_ptrace_area *) ARG3;
379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         PRE_MEM_READ("ptrace(peekusrarea ptrace_area->len)",
380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      (unsigned long) &pa->vki_len, sizeof(pa->vki_len));
381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         PRE_MEM_READ("ptrace(peekusrarea ptrace_area->kernel_addr)",
382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      (unsigned long) &pa->vki_kernel_addr, sizeof(pa->vki_kernel_addr));
383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         PRE_MEM_READ("ptrace(peekusrarea ptrace_area->process_addr)",
384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      (unsigned long) &pa->vki_process_addr, sizeof(pa->vki_process_addr));
385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         PRE_MEM_WRITE("ptrace(peekusrarea *(ptrace_area->process_addr))",
386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       pa->vki_process_addr, pa->vki_len);
387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_POKEUSR_AREA:
390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      {
391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         vki_ptrace_area *pa;
392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* Updates a part of the user area from memory at pa->process_addr */
394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 pa = (vki_ptrace_area *) ARG3;
395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->len)",
396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      (unsigned long) &pa->vki_len, sizeof(pa->vki_len));
397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->kernel_addr)",
398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      (unsigned long) &pa->vki_kernel_addr,
399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      sizeof(pa->vki_kernel_addr));
400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         PRE_MEM_READ("ptrace(pokeusrarea ptrace_area->process_addr)",
401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      (unsigned long) &pa->vki_process_addr,
402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      sizeof(pa->vki_process_addr));
403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         PRE_MEM_READ("ptrace(pokeusrarea *(ptrace_area->process_addr))",
404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       pa->vki_process_addr, pa->vki_len);
405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(sys_ptrace)
413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (ARG1) {
415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKTEXT:
416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKDATA:
417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKUSR:
418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof (long));
419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETEVENTMSG:
421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof(unsigned long));
422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETSIGINFO:
424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* XXX: This is a simplification. Different parts of the
425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * siginfo_t are valid depending on the type of signal.
426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       */
427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t));
428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKUSR_AREA:
430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      {
431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         vki_ptrace_area *pa;
432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 pa = (vki_ptrace_area *) ARG3;
434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         POST_MEM_WRITE(pa->vki_process_addr, pa->vki_len);
435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_socketcall)
443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_0  (((UWord*)ARG2)[0])
445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_1  (((UWord*)ARG2)[1])
446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_2  (((UWord*)ARG2)[2])
447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_3  (((UWord*)ARG2)[3])
448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_4  (((UWord*)ARG2)[4])
449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_5  (((UWord*)ARG2)[5])
450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfMayBlock;
452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (ARG1 /* request */) {
456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_SOCKETPAIR:
458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int socketpair(int d, int type, int protocol, int sv[2]); */
459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) {
461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_SOCKET:
468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int socket(int domain, int type, int protocol); */
469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_BIND:
477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int bind(int sockfd, struct sockaddr *my_addr,
478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	int addrlen); */
479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_LISTEN:
488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int listen(int s, int backlog); */
489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (!ML_(valid_client_addr)(ARG2, 2*sizeof(Addr), tid, NULL)) {
491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_ACCEPT: {
497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int accept(int s, struct sockaddr *addr, int *addrlen); */
498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_SENDTO:
508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int sendto(int s, const void *msg, int len,
509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    unsigned int flags,
510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    const struct sockaddr *to, int tolen); */
511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 6*sizeof(Addr), tid, NULL)) {
513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				  ARG2_3, ARG2_4, ARG2_5 );
518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_SEND:
521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int send(int s, const void *msg, size_t len, int flags); */
522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) {
524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_RECVFROM:
531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int recvfrom(int s, void *buf, int len, unsigned int flags,
532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	struct sockaddr *from, int *fromlen); */
533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 6*sizeof(Addr), tid, NULL)) {
535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				    ARG2_3, ARG2_4, ARG2_5 );
540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_RECV:
543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int recv(int s, void *buf, int len, unsigned int flags); */
544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* man 2 recv says:
545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         The  recv call is normally used only on a connected socket
546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         (see connect(2)) and is identical to recvfrom with a  NULL
547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         from parameter.
548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     */
549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) {
551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_CONNECT:
558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int connect(int sockfd,
559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	struct sockaddr *serv_addr, int addrlen ); */
560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_SETSOCKOPT:
569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int setsockopt(int s, int level, int optname,
570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	const void *optval, int optlen); */
571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 5*sizeof(Addr), tid, NULL)) {
573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				      ARG2_3, ARG2_4 );
578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_GETSOCKOPT:
581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int getsockopt(int s, int level, int optname,
582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	void *optval, socklen_t *optlen); */
583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 5*sizeof(Addr), tid, NULL)) {
585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				      ARG2_3, ARG2_4 );
590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_GETSOCKNAME:
593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int getsockname(int s, struct sockaddr* name, int* namelen) */
594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_GETPEERNAME:
603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int getpeername(int s, struct sockaddr* name, int* namelen) */
604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_SHUTDOWN:
613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int shutdown(int s, int how); */
614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 2*sizeof(Addr), tid, NULL)) {
616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_SENDMSG: {
622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int sendmsg(int s, const struct msghdr *msg, int flags); */
623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 );
629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_SYS_RECVMSG: {
633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* int recvmsg(int s, struct msghdr *msg, int flags); */
634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     }
639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1);
645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     SET_STATUS_Failure( VKI_EINVAL );
646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     break;
647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_0
649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_1
650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_2
651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_3
652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_4
653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_5
654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(sys_socketcall)
657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_0  (((UWord*)ARG2)[0])
659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_1  (((UWord*)ARG2)[1])
660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_2  (((UWord*)ARG2)[2])
661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_3  (((UWord*)ARG2)[3])
662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_4  (((UWord*)ARG2)[4])
663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define ARG2_5  (((UWord*)ARG2)[5])
664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  SysRes r;
666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  vg_assert(SUCCESS);
667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  switch (ARG1 /* request */) {
668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_SOCKETPAIR:
670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    r = ML_(generic_POST_sys_socketpair)(
671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov					 tid, VG_(mk_SysRes_Success)(RES),
672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov					 ARG2_0, ARG2_1, ARG2_2, ARG2_3
673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov					 );
674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    SET_STATUS_from_SysRes(r);
675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_SOCKET:
678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    SET_STATUS_from_SysRes(r);
680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_BIND:
683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    /* int bind(int sockfd, struct sockaddr *my_addr,
684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       int addrlen); */
685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_LISTEN:
688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    /* int listen(int s, int backlog); */
689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_ACCEPT:
692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    /* int accept(int s, struct sockaddr *addr, int *addrlen); */
693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				      ARG2_0, ARG2_1, ARG2_2 );
695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    SET_STATUS_from_SysRes(r);
696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_SENDTO:
699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_SEND:
702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_RECVFROM:
705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				    ARG2_0, ARG2_1, ARG2_2,
707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				    ARG2_3, ARG2_4, ARG2_5 );
708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_RECV:
711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_CONNECT:
715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_SETSOCKOPT:
718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_GETSOCKOPT:
721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				      ARG2_0, ARG2_1,
723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				      ARG2_2, ARG2_3, ARG2_4 );
724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_GETSOCKNAME:
727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				       ARG2_0, ARG2_1, ARG2_2 );
729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_GETPEERNAME:
732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				       ARG2_0, ARG2_1, ARG2_2 );
734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_SHUTDOWN:
737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_SENDMSG:
740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SYS_RECVMSG:
743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  default:
747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1);
748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    VG_(core_panic)("... bye!\n");
749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break; /*NOTREACHED*/
750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  }
751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_0
752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_1
753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_2
754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_3
755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_4
756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef ARG2_5
757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_mmap)
760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UWord a0, a1, a2, a3, a4, a5;
762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   SysRes r;
763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UWord* args = (UWord*)ARG1;
765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ1(long, "sys_mmap", struct mmap_arg_struct *, args);
766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_MEM_READ( "sys_mmap(args)", (Addr) args, 6*sizeof(UWord) );
767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   a0 = args[0];
769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   a1 = args[1];
770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   a2 = args[2];
771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   a3 = args[3];
772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   a4 = args[4];
773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   a5 = args[5];
774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %ld, %ld )",
776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         a0, (ULong)a1, a2, a3, a4, a5 );
777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   r = ML_(generic_PRE_sys_mmap)( tid, a0, a1, a2, a3, a4, (Off64T)a5 );
779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   SET_STATUS_from_SysRes(r);
780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Addr* a_p = (Addr*)a;
785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return *a_p;
787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_ipc)
790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  PRINT("sys_ipc ( %ld, %ld, %ld, %ld, %#lx, %ld )",
792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // XXX: this is simplistic -- some args are not used in all circumstances.
794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  PRE_REG_READ6(int, "ipc",
795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		vki_uint, call, int, first, int, second, int, third,
796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		void *, ptr, long, fifth)
797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    switch (ARG1 /* call */) {
799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_SEMOP:
800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      *flags |= SfMayBlock;
802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_SEMGET:
804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_SEMCTL:
806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      {
807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	break;
810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_SEMTIMEDOP:
812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      *flags |= SfMayBlock;
814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_MSGSND:
816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if ((ARG4 & VKI_IPC_NOWAIT) == 0)
818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	*flags |= SfMayBlock;
819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_MSGRCV:
821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      {
822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	Addr msgp;
823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	Word msgtyp;
824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	msgp = deref_Addr( tid,
826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			   (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			   "msgrcv(msgp)" );
828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	msgtyp = deref_Addr( tid,
829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			     (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			     "msgrcv(msgp)" );
831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	if ((ARG4 & VKI_IPC_NOWAIT) == 0)
835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	  *flags |= SfMayBlock;
836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	break;
837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_MSGGET:
839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_MSGCTL:
841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_SHMAT:
844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      {
845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	UWord w;
846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	if (w == 0)
849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	  SET_STATUS_Failure( VKI_EINVAL );
850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	else
851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	  ARG5 = w;
852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	break;
853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_SHMDT:
855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	SET_STATUS_Failure( VKI_EINVAL );
857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_SHMGET:
859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    case VKI_SHMCTL: /* IPCOP_shmctl */
861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    default:
864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %ld", ARG1 );
865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(core_panic)("... bye!\n");
866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break; /*NOTREACHED*/
867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(sys_ipc)
871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  vg_assert(SUCCESS);
873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  switch (ARG1 /* call */) {
874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SEMOP:
875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SEMGET:
876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SEMCTL:
878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SEMTIMEDOP:
884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_MSGSND:
885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_MSGRCV:
887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Addr msgp;
889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Word msgtyp;
890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      msgp = deref_Addr( tid,
892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         "msgrcv(msgp)" );
894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      msgtyp = deref_Addr( tid,
895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           "msgrcv(msgp)" );
897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_MSGGET:
902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_MSGCTL:
904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SHMAT:
907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Addr addr;
909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* force readability. before the syscall it is
911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * indeed uninitialized, as can be seen in
912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * glibc/sysdeps/unix/sysv/linux/shmat.c */
913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof( Addr ) );
914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SHMDT:
920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SHMGET:
923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  case VKI_SHMCTL:
925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break;
927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  default:
928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    VG_(message)(Vg_DebugMsg,
929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		 "FATAL: unhandled syscall(ipc) %ld",
930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		 ARG1 );
931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    VG_(core_panic)("... bye!\n");
932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    break; /*NOTREACHED*/
933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  }
934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_clone)
937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt cloneflags;
939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4, ARG5);
941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ2(int, "clone",
942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 void *,        child_stack,
943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 unsigned long, flags);
944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (ARG2 & VKI_CLONE_PARENT_SETTID) {
946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (VG_(tdict).track_pre_reg_read)
947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         PRA3("clone(parent_tidptr)", int *, parent_tidptr);
948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                             VKI_PROT_WRITE)) {
951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (ARG2 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (VG_(tdict).track_pre_reg_read)
957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         PRA4("clone(child_tidptr)", int *, child_tidptr);
958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE("clone(child_tidptr)", ARG4, sizeof(Int));
959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (!VG_(am_is_valid_for_client)(ARG4, sizeof(Int),
960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                             VKI_PROT_WRITE)) {
961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         SET_STATUS_Failure( VKI_EFAULT );
962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cloneflags = ARG2;
967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (!ML_(client_signal_OK)(ARG2 & VKI_CSIGNAL)) {
969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      SET_STATUS_Failure( VKI_EINVAL );
970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Only look at the flags we really care about */
974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* thread creation */
978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      SET_STATUS_from_SysRes(
979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         do_clone(tid,
980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  (Addr)ARG1,   /* child SP */
981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  ARG2,         /* flags */
982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  (Int *)ARG3,  /* parent_tidptr */
983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  (Int *)ARG4, /* child_tidptr */
984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  (Addr)ARG5)); /*  tlsaddr */
985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* FALLTHROUGH - assume vfork == fork */
989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0: /* plain fork */
992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      SET_STATUS_from_SysRes(
993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         ML_(do_fork_clone)(tid,
994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       cloneflags,      /* flags */
995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       (Int *)ARG3,     /* parent_tidptr */
996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       (Int *)ARG4));   /* child_tidptr */
997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
1000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* should we just ENOSYS? */
1001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx", ARG2);
1002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(message)(Vg_UserMsg, "");
1003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(message)(Vg_UserMsg, "The only supported clone() uses are:");
1004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(message)(Vg_UserMsg, " - via a threads library (NPTL)");
1005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork");
1006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(unimplemented)
1007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         ("Valgrind does not support general clone().");
1008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
1009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (SUCCESS) {
1011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (ARG2 & VKI_CLONE_PARENT_SETTID)
1012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         POST_MEM_WRITE(ARG3, sizeof(Int));
1013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (ARG2 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
1014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         POST_MEM_WRITE(ARG4, sizeof(Int));
1015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Thread creation was successful; let the child have the chance
1017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         to run */
1018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      *flags |= SfYieldAfter;
1019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
1020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_sigreturn)
1023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ThreadState* tst;
1025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_sigreturn ( )");
1026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vg_assert(VG_(is_valid_tid)(tid));
1028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vg_assert(tid >= 1 && tid < VG_N_THREADS);
1029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vg_assert(VG_(is_running_thread)(tid));
1030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   tst = VG_(get_ThreadState)(tid);
1032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* This is only so that the IA is (might be) useful to report if
1034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      something goes wrong in the sigreturn */
1035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
1036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Restore register state from frame and remove it */
1038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(sigframe_destroy)(tid, False);
1039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Tell the driver not to update the guest state with the "result",
1041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      and set a bogus result to keep it happy. */
1042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfNoWriteResult;
1043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   SET_STATUS_Success(0);
1044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Check to see if any signals arose as a result of this. */
1046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfPollAfter;
1047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_rt_sigreturn)
1051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
1053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      an explanation of what follows. */
1054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ThreadState* tst;
1056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_rt_sigreturn ( )");
1057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vg_assert(VG_(is_valid_tid)(tid));
1059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vg_assert(tid >= 1 && tid < VG_N_THREADS);
1060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vg_assert(VG_(is_running_thread)(tid));
1061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   tst = VG_(get_ThreadState)(tid);
1063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* This is only so that the IA is (might be) useful to report if
1065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      something goes wrong in the sigreturn */
1066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
1067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Restore register state from frame and remove it */
1069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(sigframe_destroy)(tid, True);
1070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Tell the driver not to update the guest state with the "result",
1072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      and set a bogus result to keep it happy. */
1073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfNoWriteResult;
1074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   SET_STATUS_Success(0);
1075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Check to see if any signals arose as a result of this. */
1077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfPollAfter;
1078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* we cant use the LINX_ version for 64 bit */
1081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_fadvise64)
1082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_fadvise64 ( %ld, %ld, %ld, %ld )", ARG1,ARG2,ARG3,ARG4);
1084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ4(long, "fadvise64",
1085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 int, fd, vki_loff_t, offset, vki_loff_t, len, int, advice);
1086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef PRE
1089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef POST
1090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* ---------------------------------------------------------------------
1092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   The s390x/Linux syscall table
1093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ------------------------------------------------------------------ */
1094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Add an s390x-linux specific wrapper to a syscall table. */
1096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define PLAX_(sysno, name)    WRAPPER_ENTRY_X_(s390x_linux, sysno, name)
1097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define PLAXY(sysno, name)    WRAPPER_ENTRY_XY(s390x_linux, sysno, name)
1098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// This table maps from __NR_xxx syscall numbers from
1100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// linux/arch/s390/kernel/syscalls.S to the appropriate PRE/POST sys_foo()
1101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// wrappers on s390x. There are several unused numbers, which are only
1102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// defined on s390 (31bit mode) but no longer available on s390x (64 bit).
1103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// For those syscalls not handled by Valgrind, the annotation indicate its
1104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
1105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// (unknown).
1106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic SyscallTableEntry syscall_table[] = {
1108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(0, sys_ni_syscall), /* unimplemented (by the kernel) */      // 0
1109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_exit,  sys_exit),                                       // 1
1110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_fork,  sys_fork),                                       // 2
1111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_read,  sys_read),                                       // 3
1112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_write,  sys_write),                                     // 4
1113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_open,  sys_open),                                       // 5
1115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_close,  sys_close),                                     // 6
1116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_restart_syscall, ),                                     // 7
1117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_creat,  sys_creat),                                     // 8
1118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_link,  sys_link),                                       // 9
1119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_unlink,  sys_unlink),                                   // 10
1121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_execve,  sys_execve),                                   // 11
1122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_chdir,  sys_chdir),                                     // 12
1123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(13, sys_ni_syscall), /* unimplemented (by the kernel) */     // 13
1124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_mknod,  sys_mknod),                                     // 14
1125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_chmod,  sys_chmod),                                     // 15
1127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(16, sys_ni_syscall), /* unimplemented (by the kernel) */     // 16
1128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(17, sys_ni_syscall), /* unimplemented (by the kernel) */     // 17
1129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(18, sys_ni_syscall), /* unimplemented (by the kernel) */     // 18
1130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_lseek,  sys_lseek),                                     // 19
1131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_getpid,  sys_getpid),                                   // 20
1133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_mount,  sys_mount),                                     // 21
1134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_umount, sys_oldumount),                                 // 22
1135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(23, sys_ni_syscall), /* unimplemented (by the kernel) */     // 23
1136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(24, sys_ni_syscall), /* unimplemented (by the kernel) */     // 24
1137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(25, sys_ni_syscall), /* unimplemented (by the kernel) */     // 25
1139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAXY(__NR_ptrace, sys_ptrace),                                    // 26
1140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_alarm,  sys_alarm),                                     // 27
1141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(28, sys_ni_syscall), /* unimplemented (by the kernel) */     // 28
1142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_pause,  sys_pause),                                     // 29
1143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_utime,  sys_utime),                                     // 30
1145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(31, sys_ni_syscall), /* unimplemented (by the kernel) */     // 31
1146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(32, sys_ni_syscall), /* unimplemented (by the kernel) */     // 32
1147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_access,  sys_access),                                   // 33
1148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_nice, sys_nice),                                        // 34
1149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(35, sys_ni_syscall), /* unimplemented (by the kernel) */     // 35
1151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_sync, sys_sync),                                        // 36
1152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_kill,  sys_kill),                                       // 37
1153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_rename,  sys_rename),                                   // 38
1154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_mkdir,  sys_mkdir),                                     // 39
1155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_rmdir, sys_rmdir),                                      // 40
1157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_dup,  sys_dup),                                         // 41
1158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_pipe,  sys_pipe),                                       // 42
1159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_times,  sys_times),                                     // 43
1160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(44, sys_ni_syscall), /* unimplemented (by the kernel) */     // 44
1161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_brk,  sys_brk),                                         // 45
1163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(46, sys_ni_syscall), /* unimplemented (by the kernel) */     // 46
1164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(47, sys_ni_syscall), /* unimplemented (by the kernel) */     // 47
1165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_signal, ),                                              // 48
1166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(49, sys_ni_syscall), /* unimplemented (by the kernel) */     // 49
1167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(50, sys_ni_syscall), /* unimplemented (by the kernel) */     // 50
1169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_acct, sys_acct),                                        // 51
1170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_umount2, sys_umount),                                   // 52
1171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(53, sys_ni_syscall), /* unimplemented (by the kernel) */     // 53
1172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_ioctl,  sys_ioctl),                                     // 54
1173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_fcntl,  sys_fcntl),                                     // 55
1175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(56, sys_ni_syscall), /* unimplemented (by the kernel) */     // 56
1176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_setpgid,  sys_setpgid),                                 // 57
1177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(58, sys_ni_syscall), /* unimplemented (by the kernel) */     // 58
1178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(59, sys_ni_syscall), /* unimplemented (by the kernel) */     // 59
1179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_umask,  sys_umask),                                     // 60
1181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_chroot,  sys_chroot),                                   // 61
1182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_ustat, sys_ustat), /* deprecated in favor of statfs */  // 62
1183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_dup2,  sys_dup2),                                       // 63
1184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_getppid,  sys_getppid),                                 // 64
1185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_getpgrp,  sys_getpgrp),                                 // 65
1187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_setsid,  sys_setsid),                                   // 66
1188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sigaction, ),   /* userspace uses rt_sigaction */       // 67
1189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(68, sys_ni_syscall), /* unimplemented (by the kernel) */     // 68
1190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(69, sys_ni_syscall), /* unimplemented (by the kernel) */     // 69
1191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(70, sys_ni_syscall), /* unimplemented (by the kernel) */     // 70
1193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(71, sys_ni_syscall), /* unimplemented (by the kernel) */     // 71
1194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sigsuspend, ),                                          // 72
1195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sigpending, ),                                          // 73
1196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sethostname, ),                                         // 74
1197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_setrlimit,  sys_setrlimit),                             // 75
1199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(76,  sys_getrlimit), /* see also 191 */                      // 76
1200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_getrusage,  sys_getrusage),                             // 77
1201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_gettimeofday,  sys_gettimeofday),                       // 78
1202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_settimeofday, sys_settimeofday),                        // 79
1203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(80, sys_ni_syscall), /* unimplemented (by the kernel) */     // 80
1205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(81, sys_ni_syscall), /* unimplemented (by the kernel) */     // 81
1206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(82, sys_ni_syscall), /* unimplemented (by the kernel) */     // 82
1207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_symlink,  sys_symlink),                                 // 83
1208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(84, sys_ni_syscall), /* unimplemented (by the kernel) */     // 84
1209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_readlink,  sys_readlink),                               // 85
1211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_uselib, ),                                              // 86
1212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_swapon, ),                                              // 87
1213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_reboot, ),                                              // 88
1214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(89, sys_ni_syscall), /* unimplemented (by the kernel) */     // 89
1215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAX_(__NR_mmap, sys_mmap ),                                       // 90
1217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_munmap,  sys_munmap),                                   // 91
1218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_truncate,  sys_truncate),                               // 92
1219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_ftruncate,  sys_ftruncate),                             // 93
1220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_fchmod,  sys_fchmod),                                   // 94
1221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(95, sys_ni_syscall), /* unimplemented (by the kernel) */     // 95
1223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_getpriority, sys_getpriority),                          // 96
1224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_setpriority, sys_setpriority),                          // 97
1225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(98, sys_ni_syscall), /* unimplemented (by the kernel) */     // 98
1226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_statfs,  sys_statfs),                                   // 99
1227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_fstatfs,  sys_fstatfs),                                 // 100
1229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(101, sys_ni_syscall), /* unimplemented (by the kernel) */    // 101
1230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAXY(__NR_socketcall, sys_socketcall),                            // 102
1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_syslog,  sys_syslog),                                   // 103
1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_setitimer,  sys_setitimer),                             // 104
1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_getitimer,  sys_getitimer),                             // 105
1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_stat, sys_newstat),                                     // 106
1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_lstat, sys_newlstat),                                   // 107
1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_fstat, sys_newfstat),                                   // 108
1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(109, sys_ni_syscall), /* unimplemented (by the kernel) */    // 109
1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_lookup_dcookie, sys_lookup_dcookie),                    // 110
1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_vhangup, sys_vhangup),                                  // 111
1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(112, sys_ni_syscall), /* unimplemented (by the kernel) */    // 112
1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(113, sys_ni_syscall), /* unimplemented (by the kernel) */    // 113
1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_wait4,  sys_wait4),                                     // 114
1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_swapoff, ),                                             // 115
1247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_sysinfo,  sys_sysinfo),                                 // 116
1248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAXY(__NR_ipc, sys_ipc),                                          // 117
1249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_fsync,  sys_fsync),                                     // 118
1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAX_(__NR_sigreturn, sys_sigreturn),                              // 119
1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAX_(__NR_clone,  sys_clone),                                     // 120
1253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_setdomainname, ),                                       // 121
1254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_uname, sys_newuname),                                   // 122
1255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(123, sys_ni_syscall), /* unimplemented (by the kernel) */    // 123
1256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_adjtimex, ),                                            // 124
1257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_mprotect,  sys_mprotect),                               // 125
1259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINXY(__NR_sigprocmask, sys_sigprocmask),                          // 126
1260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(127, sys_ni_syscall), /* unimplemented (by the kernel) */    // 127
1261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_init_module,  sys_init_module),                         // 128
1262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_delete_module,  sys_delete_module),                     // 129
1263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(130, sys_ni_syscall), /* unimplemented (by the kernel) */    // 130
1265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_quotactl, sys_quotactl),                                // 131
1266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_getpgid,  sys_getpgid),                                 // 132
1267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_fchdir,  sys_fchdir),                                   // 133
1268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_bdflush, ),                                             // 134
1269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sysfs, ),                                               // 135
1271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_personality, sys_personality),                          // 136
1272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(137, sys_ni_syscall), /* unimplemented (by the kernel) */    // 137
1273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(138, sys_ni_syscall), /* unimplemented (by the kernel) */    // 138
1274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(139, sys_ni_syscall), /* unimplemented (by the kernel) */    // 139
1275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// LINXY(__NR__llseek, sys_llseek), /* 64 bit --> lseek */            // 140
1277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_getdents,  sys_getdents),                               // 141
1278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_select, sys_select),                                    // 142
1279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_flock,  sys_flock),                                     // 143
1280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_msync,  sys_msync),                                     // 144
1281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_readv,  sys_readv),                                     // 145
1283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_writev,  sys_writev),                                   // 146
1284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_getsid, sys_getsid),                                    // 147
1285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_fdatasync,  sys_fdatasync),                             // 148
1286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR__sysctl, sys_sysctl),                                   // 149
1287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_mlock,  sys_mlock),                                     // 150
1289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_munlock,  sys_munlock),                                 // 151
1290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_mlockall,  sys_mlockall),                               // 152
1291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_munlockall,  sys_munlockall),                           // 153
1292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_sched_setparam,  sys_sched_setparam),                   // 154
1293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_sched_getparam,  sys_sched_getparam),                   // 155
1295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_sched_setscheduler,  sys_sched_setscheduler),           // 156
1296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_sched_getscheduler,  sys_sched_getscheduler),           // 157
1297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_sched_yield,  sys_sched_yield),                         // 158
1298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_sched_get_priority_max,  sys_sched_get_priority_max),   // 159
1299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_sched_get_priority_min,  sys_sched_get_priority_min),   // 160
1301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_sched_rr_get_interval, ),                               // 161
1302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_nanosleep,  sys_nanosleep),                             // 162
1303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_mremap,  sys_mremap),                                   // 163
1304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(164, sys_ni_syscall), /* unimplemented (by the kernel) */    // 164
1305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(165, sys_ni_syscall), /* unimplemented (by the kernel) */    // 165
1307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(166, sys_ni_syscall), /* unimplemented (by the kernel) */    // 166
1308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(167, sys_ni_syscall), /* unimplemented (by the kernel) */    // 167
1309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_poll,  sys_poll),                                       // 168
1310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_nfsservctl, ),                                          // 169
1311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(170, sys_ni_syscall), /* unimplemented (by the kernel) */    // 170
1313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(171, sys_ni_syscall), /* unimplemented (by the kernel) */    // 171
1314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_prctl, sys_prctl),                                      // 172
1315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAX_(__NR_rt_sigreturn,  sys_rt_sigreturn),                       // 173
1316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_rt_sigaction,  sys_rt_sigaction),                       // 174
1317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_rt_sigprocmask,  sys_rt_sigprocmask),                   // 175
1319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_rt_sigpending, sys_rt_sigpending),                      // 176
1320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_rt_sigtimedwait,  sys_rt_sigtimedwait),                 // 177
1321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),                  // 178
1322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend),                      // 179
1323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_pread64,  sys_pread64),                                 // 180
1325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_pwrite64, sys_pwrite64),                                // 181
1326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(182, sys_ni_syscall), /* unimplemented (by the kernel) */    // 182
1327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_getcwd,  sys_getcwd),                                   // 183
1328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_capget,  sys_capget),                                   // 184
1329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_capset,  sys_capset),                                   // 185
1331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_sigaltstack,  sys_sigaltstack),                         // 186
1332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_sendfile, sys_sendfile),                                // 187
1333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(188, sys_ni_syscall), /* unimplemented (by the kernel) */    // 188
1334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(189, sys_ni_syscall), /* unimplemented (by the kernel) */    // 189
1335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_vfork,  sys_fork),                                      // 190
1337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_getrlimit,  sys_getrlimit),                             // 191
1338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(192, sys_ni_syscall), /* not exported on 64bit*/             // 192
1339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(193, sys_ni_syscall), /* unimplemented (by the kernel) */    // 193
1340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(194, sys_ni_syscall), /* unimplemented (by the kernel) */    // 194
1341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(195, sys_ni_syscall), /* unimplemented (by the kernel) */    // 195
1343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(196, sys_ni_syscall), /* unimplemented (by the kernel) */    // 196
1344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(197, sys_ni_syscall), /* unimplemented (by the kernel) */    // 197
1345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_lchown, sys_lchown),                                    // 198
1346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_getuid, sys_getuid),                                    // 199
1347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_getgid, sys_getgid),                                    // 200
1349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_geteuid, sys_geteuid),                                  // 201
1350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_getegid, sys_getegid),                                  // 202
1351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_setreuid, sys_setreuid),                                // 203
1352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_setregid, sys_setregid),                                // 204
1353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_getgroups, sys_getgroups),                              // 205
1355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_setgroups, sys_setgroups),                              // 206
1356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_fchown, sys_fchown),                                    // 207
1357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_setresuid, sys_setresuid),                              // 208
1358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_getresuid, sys_getresuid),                              // 209
1359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_setresgid, sys_setresgid),                              // 210
1361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_getresgid, sys_getresgid),                              // 211
1362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_chown, sys_chown),                                      // 212
1363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_setuid, sys_setuid),                                    // 213
1364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_setgid, sys_setgid),                                    // 214
1365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_setfsuid, sys_setfsuid),                                // 215
1367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_setfsgid, sys_setfsgid),                                // 216
1368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_pivot_root, ),
1369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_mincore, sys_mincore),                                  // 218
1370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_madvise,  sys_madvise),                                 // 219
1371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_getdents64,  sys_getdents64),                           // 220
1373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(221, sys_ni_syscall), /* unimplemented (by the kernel) */    // 221
1374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_readahead, sys_readahead),                              // 222
1375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(223, sys_ni_syscall), /* unimplemented (by the kernel) */    // 223
1376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_setxattr, sys_setxattr),                                // 224
1377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_lsetxattr, sys_lsetxattr),                              // 225
1379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_fsetxattr, sys_fsetxattr),                              // 226
1380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_getxattr,  sys_getxattr),                               // 227
1381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_lgetxattr,  sys_lgetxattr),                             // 228
1382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_fgetxattr,  sys_fgetxattr),                             // 229
1383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_listxattr,  sys_listxattr),                             // 230
1385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_llistxattr,  sys_llistxattr),                           // 231
1386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_flistxattr,  sys_flistxattr),                           // 232
1387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_removexattr,  sys_removexattr),                         // 233
1388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_lremovexattr,  sys_lremovexattr),                       // 234
1389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_fremovexattr,  sys_fremovexattr),                       // 235
1391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_gettid,  sys_gettid),                                   // 236
1392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_tkill, sys_tkill),                                      // 237
1393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_futex,  sys_futex),                                     // 238
1394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_sched_setaffinity,  sys_sched_setaffinity),             // 239
1395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_sched_getaffinity,  sys_sched_getaffinity),             // 240
1397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_tgkill, sys_tgkill),                                    // 241
1398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(242, sys_ni_syscall), /* unimplemented (by the kernel) */    // 242
1399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_io_setup, sys_io_setup),                                // 243
1400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_io_destroy,  sys_io_destroy),                           // 244
1401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_io_getevents,  sys_io_getevents),                       // 245
1403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_io_submit,  sys_io_submit),                             // 246
1404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_io_cancel,  sys_io_cancel),                             // 247
1405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_exit_group,  sys_exit_group),                           // 248
1406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_epoll_create,  sys_epoll_create),                       // 249
1407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_epoll_ctl,  sys_epoll_ctl),                             // 250
1409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_epoll_wait,  sys_epoll_wait),                           // 251
1410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_set_tid_address,  sys_set_tid_address),                 // 252
1411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAX_(__NR_fadvise64, sys_fadvise64),                              // 253
1412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_timer_create,  sys_timer_create),                       // 254
1413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_timer_settime,  sys_timer_settime),                     // 255
1415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_timer_gettime,  sys_timer_gettime),                     // 256
1416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_timer_getoverrun,  sys_timer_getoverrun),               // 257
1417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_timer_delete,  sys_timer_delete),                       // 258
1418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_clock_settime,  sys_clock_settime),                     // 259
1419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_clock_gettime,  sys_clock_gettime),                     // 260
1421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_clock_getres,  sys_clock_getres),                       // 261
1422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_clock_nanosleep,  sys_clock_nanosleep),                 // 262
1423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(263, sys_ni_syscall), /* unimplemented (by the kernel) */    // 263
1424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(264, sys_ni_syscall), /* unimplemented (by the kernel) */    // 264
1425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_statfs64, sys_statfs64),                                // 265
1427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_fstatfs64, sys_fstatfs64),                              // 266
1428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_remap_file_pages, ),
1429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(268, sys_ni_syscall), /* unimplemented (by the kernel) */    // 268
1430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(269, sys_ni_syscall), /* unimplemented (by the kernel) */    // 269
1431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(270, sys_ni_syscall), /* unimplemented (by the kernel) */    // 270
1433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_mq_open,  sys_mq_open),                                 // 271
1434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_mq_unlink,  sys_mq_unlink),                             // 272
1435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_mq_timedsend,  sys_mq_timedsend),                       // 273
1436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_mq_timedreceive, sys_mq_timedreceive),                  // 274
1437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_mq_notify,  sys_mq_notify),                             // 275
1439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_mq_getsetattr,  sys_mq_getsetattr),                     // 276
1440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_kexec_load, ),
1441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_add_key,  sys_add_key),                                 // 278
1442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_request_key,  sys_request_key),                         // 279
1443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_keyctl,  sys_keyctl),                                   // 280
1445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_waitid, sys_waitid),                                    // 281
1446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_ioprio_set,  sys_ioprio_set),                           // 282
1447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_ioprio_get,  sys_ioprio_get),                           // 283
1448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_inotify_init,  sys_inotify_init),                       // 284
1449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_inotify_add_watch,  sys_inotify_add_watch),             // 285
1451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_inotify_rm_watch,  sys_inotify_rm_watch),               // 286
1452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(287, sys_ni_syscall), /* unimplemented (by the kernel) */    // 287
1453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_openat,  sys_openat),                                   // 288
1454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_mkdirat,  sys_mkdirat),                                 // 289
1455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_mknodat,  sys_mknodat),                                 // 290
1457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_fchownat,  sys_fchownat),                               // 291
1458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_futimesat,  sys_futimesat),                             // 292
1459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_newfstatat, sys_newfstatat),                            // 293
1460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_unlinkat,  sys_unlinkat),                               // 294
1461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_renameat,  sys_renameat),                               // 295
1463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_linkat,  sys_linkat),                                   // 296
1464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_symlinkat,  sys_symlinkat),                             // 297
1465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_readlinkat,  sys_readlinkat),                           // 298
1466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_fchmodat,  sys_fchmodat),                               // 299
1467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_faccessat,  sys_faccessat),                             // 300
1469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_pselect6, sys_pselect6),                                // 301
1470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_ppoll, sys_ppoll),                                      // 302
1471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_unshare, ),
1472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_set_robust_list,  sys_set_robust_list),                 // 304
1473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_get_robust_list,  sys_get_robust_list),                 // 305
1475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_splice, ),
1476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_sync_file_range, sys_sync_file_range),                  // 307
1477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_tee, ),
1478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_vmsplice, ),
1479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(310, sys_ni_syscall), /* unimplemented (by the kernel) */    // 310
1481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_getcpu, ),
1482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_epoll_pwait,  sys_epoll_pwait),                         // 312
1483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(__NR_utimes, sys_utimes),                                    // 313
1484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_fallocate, sys_fallocate),                              // 314
1485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_utimensat,  sys_utimensat),                             // 315
1487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_signalfd,  sys_signalfd),                               // 316
1488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENX_(317, sys_ni_syscall), /* unimplemented (by the kernel) */    // 317
1489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_eventfd,  sys_eventfd),                                 // 318
1490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_timerfd_create,  sys_timerfd_create),                   // 319
1491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_timerfd_settime,  sys_timerfd_settime),                 // 320
1493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_timerfd_gettime,  sys_timerfd_gettime),                 // 321
1494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_signalfd4,  sys_signalfd4),                             // 322
1495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_eventfd2,  sys_eventfd2),                               // 323
1496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_inotify_init1,  sys_inotify_init1),                     // 324
1497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_pipe2,  sys_pipe2),                                     // 325
1499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // (__NR_dup3,  ),
1500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_epoll_create1,  sys_epoll_create1),                     // 327
1501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_preadv, sys_preadv),                                    // 328
1502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINX_(__NR_pwritev, sys_pwritev),                                  // 329
1503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ?????(__NR_rt_tgsigqueueinfo, ),
1505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_perf_event_open, sys_perf_event_open),                  // 331
1506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov};
1507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovSyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   const UInt syscall_table_size
1511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      = sizeof(syscall_table) / sizeof(syscall_table[0]);
1512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Is it in the contiguous initial section of the table? */
1514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (sysno < syscall_table_size) {
1515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      SyscallTableEntry* sys = &syscall_table[sysno];
1516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (sys->before == NULL)
1517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return NULL; /* no entry */
1518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else
1519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return sys;
1520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
1521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Can't find a wrapper */
1523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return NULL;
1524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
1527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------------------*/
1529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- end                                                          ---*/
1530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------------------*/
1531