1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Platform-specific syscalls stuff.      syswrap-amd64-linux.c ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of Valgrind, a dynamic binary instrumentation
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   framework.
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Copyright (C) 2000-2011 Nicholas Nethercote
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      njn@valgrind.org
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02111-1307, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_amd64_linux)
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_basics.h"
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vki.h"
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vkiscnums.h"
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcsetjmp.h"    // to keep _threadstate.h happy
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_threadstate.h"
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_aspacemgr.h"
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_debuglog.h"
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_options.h"
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcbase.h"
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcassert.h"
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcprint.h"
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcproc.h"
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcsignal.h"
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_scheduler.h"
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_sigframe.h"
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_signals.h"
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syscall.h"
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syswrap.h"
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_tooliface.h"
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_stacks.h"        // VG_(register_stack)
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_types_n_macros.h"
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-generic.h"   /* for decls of generic wrappers */
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-linux.h"     /* for decls of linux-ish wrappers */
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-linux-variants.h" /* decls of linux variant wrappers */
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-main.h"
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   clone() handling
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Call f(arg1), but first switch stacks, using 'stack' as the new
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   stack, and use 'retaddr' as f's return-to address.  Also, clear all
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the integer registers before entering f.  */
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noreturn))
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ML_(call_on_new_stack_0_1) ( Addr stack,
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown			          Addr retaddr,
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown			          void (*f)(Word),
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  Word arg1 );
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// %rdi == stack
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// %rsi == retaddr
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// %rdx == f
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// %rcx == arg1
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm(
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".text\n"
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".globl vgModuleLocal_call_on_new_stack_0_1\n"
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"vgModuleLocal_call_on_new_stack_0_1:\n"
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq   %rdi, %rsp\n"   // set stack
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   pushq  %rsi\n"         // retaddr to stack
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   pushq  %rdx\n"         // f to stack
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   pushq  %rcx\n"         // arg1 to stack
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %rax\n"       // zero all GP regs
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %rbx\n"
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %rcx\n"
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %rdx\n"
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %rsi\n"
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %rdi\n"
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %rbp\n"
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %r8\n"
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %r9\n"
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %r10\n"
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %r11\n"
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %r12\n"
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %r13\n"
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %r14\n"
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   movq $0, %r15\n"
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   popq   %rdi\n"         // arg1 to correct arg reg
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   ret\n"                 // jump to f
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   ud2\n"                 // should never get here
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".previous\n"
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown);
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        Perform a clone system call.  clone is strange because it has
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        fork()-like return-twice semantics, so it needs special
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        handling here.
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	Upon entry, we have:
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    int (*fn)(void*)	in %rdi
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    void*  child_stack	in %rsi
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    int    flags	in %rdx
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    void*  arg		in %rcx
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    pid_t* child_tid	in %r8
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    pid_t* parent_tid	in %r9
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    void*  tls_ptr      at 8(%rsp)
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	System call requires:
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    int    $__NR_clone  in %rax
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    int    flags	in %rdi
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    void*  child_stack	in %rsi
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    pid_t* parent_tid	in %rdx
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    pid_t* child_tid	in %r10
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    void*  tls_ptr      in %r8
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	Returns a Long encoded in the linux-amd64 way, not a SysRes.
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_CLONE        VG_STRINGIFY(__NR_clone)
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_EXIT         VG_STRINGIFY(__NR_exit)
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownLong do_syscall_clone_amd64_linux ( Word (*fn)(void *),
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    void* stack,
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    Long  flags,
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    void* arg,
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    Long* child_tid,
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    Long* parent_tid,
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    vki_modify_ldt_t * );
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm(
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".text\n"
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"do_syscall_clone_amd64_linux:\n"
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // set up child stack, temporarily preserving fn and arg
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       subq    $16, %rsi\n"            // make space on stack
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %rcx, 8(%rsi)\n"        // save arg
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %rdi, 0(%rsi)\n"        // save fn
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // setup syscall
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    $"__NR_CLONE", %rax\n"  // syscall number
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %rdx,     %rdi\n"       // syscall arg1: flags
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // %rsi already setup           // syscall arg2: child_stack
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %r9,      %rdx\n"       // syscall arg3: parent_tid
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %r8,      %r10\n"       // syscall arg4: child_tid
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    8(%rsp),  %r8\n"        // syscall arg5: tls_ptr
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       syscall\n"                      // clone()
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       testq   %rax, %rax\n"           // child if retval == 0
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       jnz     1f\n"
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // CHILD - call thread function
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       pop     %rax\n"                 // pop fn
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       pop     %rdi\n"                 // pop fn arg1: arg
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       call    *%rax\n"                // call fn
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // exit with result
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %rax, %rdi\n"           // arg1: return value from fn
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    $"__NR_EXIT", %rax\n"
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       syscall\n"
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // Exit returned?!
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       ud2\n"
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"1:\n"  // PARENT or ERROR
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       ret\n"
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".previous\n"
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown);
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_CLONE
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_EXIT
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// forward declaration
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void setup_child ( ThreadArchState*, ThreadArchState* );
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   When a client clones, we need to keep track of the new thread.  This means:
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   1. allocate a ThreadId+ThreadState+stack for the the thread
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   2. initialize the thread's new VCPU state
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   3. create the thread using the same args as the client requested,
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   but using the scheduler entrypoint for EIP, and a separate stack
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for ESP.
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes do_clone ( ThreadId ptid,
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         ULong flags, Addr rsp,
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Long* parent_tidptr,
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Long* child_tidptr,
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Addr tlsaddr )
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static const Bool debug = False;
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId     ctid = VG_(alloc_ThreadState)();
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* ptst = VG_(get_ThreadState)(ptid);
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* ctst = VG_(get_ThreadState)(ctid);
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UWord*       stack;
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NSegment const* seg;
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes       res;
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Long         rax;
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_sigset_t blockall, savedmask;
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigfillset)(&blockall);
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(ptid));
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(ctid));
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   stack = (UWord*)ML_(allocstack)(ctid);
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (stack == NULL) {
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto out;
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Copy register state
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Both parent and child return to the same place, and the code
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      following the clone syscall works out which is which, so we
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      don't need to worry about it.
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      The parent gets the child's new tid returned from clone, but the
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      child gets 0.
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      If the clone call specifies a NULL rsp for the new thread, then
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      it actually gets a copy of the parent's rsp.
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   setup_child( &ctst->arch, &ptst->arch );
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Make sys_clone appear to have returned Success(0) in the
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      child. */
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->arch.vex.guest_RAX = 0;
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (rsp != 0)
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->arch.vex.guest_RSP = rsp;
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->os_state.parent = ptid;
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* inherit signal mask */
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->sig_mask = ptst->sig_mask;
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->tmp_sig_mask = ptst->sig_mask;
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Start the child with its threadgroup being the same as the
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      parent's.  This is so that any exit_group calls that happen
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      after the child is created but before it sets its
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      os_state.threadgroup field for real (in thread_wrapper in
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      syswrap-linux.c), really kill the new thread.  a.k.a this avoids
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      a race condition in which the thread is unkillable (via
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit_group) because its threadgroup is not set.  The race window
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      is probably only a few hundred or a few thousand cycles long.
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      See #226116. */
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->os_state.threadgroup = ptst->os_state.threadgroup;
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* We don't really know where the client stack is, because its
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      allocated by the client.  The best we can do is look at the
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      memory mappings and try to derive some useful information.  We
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assume that esp starts near its highest possible value, and can
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      only go down to the start of the mmaped segment. */
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   seg = VG_(am_find_nsegment)((Addr)rsp);
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (seg && seg->kind != SkResvn) {
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(rsp);
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (debug)
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n",
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ctid, seg->start, VG_PGROUNDUP(rsp));
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "!? New thread %d starts with RSP(%#lx) unmapped\n",
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		   ctid, rsp);
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_szB  = 0;
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Assume the clone will succeed, and tell any tool that wants to
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      know that this thread has come into existence.  If the clone
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fails, we'll send out a ll_exit notification for it at the out:
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      label below, to clean up. */
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_TRACK ( pre_thread_ll_create, ptid, ctid );
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (flags & VKI_CLONE_SETTLS) {
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (debug)
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 VG_(printf)("clone child has SETTLS: tls at %#lx\n", tlsaddr);
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->arch.vex.guest_FS_ZERO = tlsaddr;
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags &= ~VKI_CLONE_SETTLS;
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* start the thread with everything blocked */
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Create the new thread */
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rax = do_syscall_clone_amd64_linux(
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid],
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            child_tidptr, parent_tidptr, NULL
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         );
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = VG_(mk_SysRes_amd64_linux)( rax );
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  out:
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sr_isError(res)) {
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* clone failed */
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(cleanup_thread)(&ctst->arch);
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->status = VgTs_Empty;
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* oops.  Better tell the tool the thread exited in a hurry :-) */
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_TRACK( pre_thread_ll_exit, ctid );
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   More thread stuff
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(cleanup_thread) ( ThreadArchState *arch )
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid setup_child ( /*OUT*/ ThreadArchState *child,
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   /*IN*/  ThreadArchState *parent )
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* We inherit our parent's guest state. */
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex = parent->vex;
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex_shadow1 = parent->vex_shadow1;
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex_shadow2 = parent->vex_shadow2;
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE/POST wrappers for AMD64/Linux-specific syscalls
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE(name)       DEFN_PRE_TEMPLATE(amd64_linux, name)
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST(name)      DEFN_POST_TEMPLATE(amd64_linux, name)
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add prototypes for the wrappers declared here, so that gcc doesn't
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   harass us for not having prototypes.  Really this is a kludge --
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the right thing to do is to make these wrappers 'static' since they
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   aren't visible outside this file, but that requires even more macro
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   magic. */
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_clone);
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_rt_sigreturn);
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_socket);
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_setsockopt);
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_getsockopt);
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_connect);
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_accept);
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_accept4);
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_sendto);
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_recvfrom);
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_sendmsg);
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_recvmsg);
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_shutdown);
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_bind);
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_listen);
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_getsockname);
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_getpeername);
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_socketpair);
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_semget);
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_semop);
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_semtimedop);
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_semctl);
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_msgget);
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_msgrcv);
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_msgsnd);
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_msgctl);
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_shmget);
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, wrap_sys_shmat);
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_shmdt);
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_shmdt);
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_shmctl);
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_arch_prctl);
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_ptrace);
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_fadvise64);
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_mmap);
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_syscall184);
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clone)
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong cloneflags;
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(int, "clone",
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, flags,
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, child_stack,
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int *, parent_tidptr,
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int *, child_tidptr,
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, tlsaddr);
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & VKI_CLONE_PARENT_SETTID) {
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int), VKI_PROT_WRITE)) {
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("clone(child_tidptr)", ARG4, sizeof(Int));
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG4, sizeof(Int), VKI_PROT_WRITE)) {
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cloneflags = ARG1;
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Only look at the flags we really care about */
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* thread creation */
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         do_clone(tid,
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG1,          /* flags */
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)ARG2,    /* child ESP */
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Long *)ARG3,  /* parent_tidptr */
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Long *)ARG4,  /* child_tidptr */
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)ARG5));  /* set_tls */
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* FALLTHROUGH - assume vfork == fork */
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 0: /* plain fork */
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(do_fork_clone)(tid,
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       cloneflags,      /* flags */
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Int *)ARG3,     /* parent_tidptr */
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Int *)ARG4));   /* child_tidptr */
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* should we just ENOSYS? */
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "Unsupported clone() flags: 0x%lx\n", ARG1);
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "\n");
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "The only supported clone() uses are:\n");
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   " - via a threads library (LinuxThreads or NPTL)\n");
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   " - via the implementation of fork or vfork\n");
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(unimplemented)
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ("Valgrind does not support general clone().");
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS) {
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG1 & VKI_CLONE_PARENT_SETTID)
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG3, sizeof(Int));
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG4, sizeof(Int));
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Thread creation was successful; let the child have the chance
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         to run */
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfYieldAfter;
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigreturn)
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* This isn't really a syscall at all - it's a misuse of the
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      syscall mechanism by m_sigframe.  VG_(sigframe_create) sets the
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return address of the signal frames it creates to be a short
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      piece of code which does this "syscall".  The only purpose of
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      the syscall is to call VG_(sigframe_destroy), which restores the
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      thread's registers from the frame and then removes it.
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Consequently we must ask the syswrap driver logic not to write
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      back the syscall "result" as that would overwrite the
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      just-restored register state. */
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst;
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_rt_sigreturn ( )");
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Adjust RSP to point to start of frame; skip back up over handler
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ret addr */
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst = VG_(get_ThreadState)(tid);
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst->arch.vex.guest_RSP -= sizeof(Addr);
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* This is only so that the RIP is (might be) useful to report if
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      something goes wrong in the sigreturn.  JRS 20070318: no idea
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      what this is for */
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Restore register state from frame and remove it, as
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      described above */
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigframe_destroy)(tid, True);
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell the driver not to update the guest state with the "result",
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      and set a bogus result to keep it happy. */
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfNoWriteResult;
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if any signals arose as a result of this. */
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfPollAfter;
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_arch_prctl)
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst;
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "arch_prctl ( %ld, %lx )", ARG1, ARG2 );
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Nb: can't use "ARG2".."ARG5" here because that's our own macro...
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "arch_prctl",
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, option, unsigned long, arg2);
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // XXX: totally wrong... we need to look at the 'option' arg, and do
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // PRE_MEM_READs/PRE_MEM_WRITEs as necessary...
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* "do" the syscall ourselves; the kernel never sees it */
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 == VKI_ARCH_SET_FS) {
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst = VG_(get_ThreadState)(tid);
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->arch.vex.guest_FS_ZERO = ARG2;
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else if (ARG1 == VKI_ARCH_GET_FS) {
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("arch_prctl(addr)", ARG2, sizeof(unsigned long));
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst = VG_(get_ThreadState)(tid);
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *(unsigned long *)ARG2 = tst->arch.vex.guest_FS_ZERO;
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, sizeof(unsigned long));
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else {
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(core_panic)("Unsupported arch_prtctl option");
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Note; the Status writeback to guest state that happens after
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      this wrapper returns does not change guest_FS_ZERO; hence that
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      direct assignment to the guest state is safe here. */
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success( 0 );
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Parts of this are amd64-specific, but the *PEEK* cases are generic.
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// ARG3 is only used for pointers into the traced process's address
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// space and for offsets into the traced process's struct
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// user_regs_struct. It is never a pointer into this process's memory
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// space, and we should therefore not check anything it points to.
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_ptrace)
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int, "ptrace",
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 long, request, long, pid, long, addr, long, data);
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1) {
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKTEXT:
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKDATA:
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKUSR:
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ptrace(peek)", ARG4,
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof (long));
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETREGS:
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof (struct vki_user_regs_struct));
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETFPREGS:
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof (struct vki_user_i387_struct));
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_SETREGS:
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ptrace(setregs)", ARG4,
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof (struct vki_user_regs_struct));
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_SETFPREGS:
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof (struct vki_user_i387_struct));
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETEVENTMSG:
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long));
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETSIGINFO:
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t));
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_SETSIGINFO:
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t));
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_ptrace)
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1) {
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKTEXT:
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKDATA:
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKUSR:
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof (long));
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETREGS:
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETFPREGS:
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETEVENTMSG:
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof(unsigned long));
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETSIGINFO:
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* XXX: This is a simplification. Different parts of the
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       * siginfo_t are valid depending on the type of signal.
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       */
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t));
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_socket)
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_socket ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "socket", int, domain, int, type, int, protocol);
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_socket)
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_POST_sys_socket)(tid, VG_(mk_SysRes_Success)(RES));
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setsockopt)
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setsockopt ( %ld, %ld, %ld, %#lx, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5);
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "setsockopt",
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, int, level, int, optname,
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const void *, optval, int, optlen);
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_setsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getsockopt)
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getsockopt ( %ld, %ld, %ld, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "getsockopt",
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, int, level, int, optname,
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, optval, int, *optlen);
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_PRE_sys_getsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getsockopt)
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_POST_sys_getsockopt)(tid, VG_(mk_SysRes_Success)(RES),
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       ARG1,ARG2,ARG3,ARG4,ARG5);
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_connect)
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_connect ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "connect",
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, sockfd, struct sockaddr *, serv_addr, int, addrlen);
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_connect)(tid, ARG1,ARG2,ARG3);
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_accept)
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_accept ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "accept",
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, struct sockaddr *, addr, int, *addrlen);
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3);
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_accept)
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES),
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                         ARG1,ARG2,ARG3);
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_accept4)
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_accept4 ( %ld, %#lx, %ld, %ld )",ARG1,ARG2,ARG3,ARG4);
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "accept4",
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, struct sockaddr *, addr, int, *addrlen, int, flags);
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3);
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_accept4)
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES),
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                         ARG1,ARG2,ARG3);
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sendto)
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sendto ( %ld, %#lx, %ld, %lu, %#lx, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "sendto",
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, const void *, msg, int, len,
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, flags,
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct sockaddr *, to, int, tolen);
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_sendto)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_recvfrom)
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_recvfrom ( %ld, %#lx, %ld, %lu, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "recvfrom",
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, void *, buf, int, len, unsigned int, flags,
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct sockaddr *, from, int *, fromlen);
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_recvfrom)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_recvfrom)
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_recvfrom)(tid, VG_(mk_SysRes_Success)(RES),
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sendmsg)
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sendmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "sendmsg",
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, const struct msghdr *, msg, int, flags);
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_sendmsg)(tid, ARG1,ARG2);
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_recvmsg)
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_recvmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "recvmsg", int, s, struct msghdr *, msg, int, flags);
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_recvmsg)(tid, ARG1,ARG2);
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_recvmsg)
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_recvmsg)(tid, ARG1,ARG2);
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shutdown)
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_shutdown ( %ld, %ld )",ARG1,ARG2);
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(int, "shutdown", int, s, int, how);
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_bind)
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_bind ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "bind",
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, sockfd, struct sockaddr *, my_addr, int, addrlen);
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_bind)(tid, ARG1,ARG2,ARG3);
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_listen)
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_listen ( %ld, %ld )",ARG1,ARG2);
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "listen", int, s, int, backlog);
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getsockname)
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getsockname ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3);
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "getsockname",
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, struct sockaddr *, name, int *, namelen);
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_getsockname)(tid, ARG1,ARG2,ARG3);
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getsockname)
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_getsockname)(tid, VG_(mk_SysRes_Success)(RES),
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          ARG1,ARG2,ARG3);
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getpeername)
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getpeername ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3);
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "getpeername",
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, struct sockaddr *, name, int *, namelen);
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_getpeername)(tid, ARG1,ARG2,ARG3);
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getpeername)
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_getpeername)(tid, VG_(mk_SysRes_Success)(RES),
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          ARG1,ARG2,ARG3);
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_socketpair)
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_socketpair ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "socketpair",
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, d, int, type, int, protocol, int*, sv);
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_socketpair)(tid, ARG1,ARG2,ARG3,ARG4);
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_socketpair)
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_socketpair)(tid, VG_(mk_SysRes_Success)(RES),
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                         ARG1,ARG2,ARG3,ARG4);
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semget)
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_semget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "semget", vki_key_t, key, int, nsems, int, semflg);
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semop)
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_semop ( %ld, %#lx, %lu )",ARG1,ARG2,ARG3);
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "semop",
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, semid, struct sembuf *, sops, unsigned, nsoops);
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_semop)(tid, ARG1,ARG2,ARG3);
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semtimedop)
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_semtimedop ( %ld, %#lx, %lu, %#lx )",ARG1,ARG2,ARG3,ARG4);
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "semtimedop",
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, semid, struct sembuf *, sops, unsigned, nsoops,
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct timespec *, timeout);
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_semtimedop)(tid, ARG1,ARG2,ARG3,ARG4);
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semctl)
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG3 & ~VKI_IPC_64) {
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_INFO:
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SEM_INFO:
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "semctl",
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd, struct seminfo *, arg);
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_STAT:
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SEM_STAT:
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_SET:
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "semctl",
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd, struct semid_ds *, arg);
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GETALL:
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SETALL:
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "semctl",
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd, unsigned short *, arg);
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_semctl ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "semctl",
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd);
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_semctl)(tid, ARG1,ARG2,ARG3|VKI_IPC_64,ARG4);
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_semctl)
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_semctl)(tid, RES,ARG1,ARG2,ARG3|VKI_IPC_64,ARG4);
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgget)
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_msgget ( %ld, %ld )",ARG1,ARG2);
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "msgget", vki_key_t, key, int, msgflg);
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgsnd)
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_msgsnd ( %ld, %#lx, %ld, %ld )",ARG1,ARG2,ARG3,ARG4);
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "msgsnd",
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz, int, msgflg);
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_PRE_sys_msgsnd)(tid, ARG1,ARG2,ARG3,ARG4);
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((ARG4 & VKI_IPC_NOWAIT) == 0)
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfMayBlock;
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgrcv)
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_msgrcv ( %ld, %#lx, %ld, %ld, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5);
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "msgrcv",
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz,
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 long, msgytp, int, msgflg);
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_PRE_sys_msgrcv)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((ARG4 & VKI_IPC_NOWAIT) == 0)
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfMayBlock;
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_msgrcv)
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_POST_sys_msgrcv)(tid, RES,ARG1,ARG2,ARG3,ARG4,ARG5);
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgctl)
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_msgctl ( %ld, %ld, %#lx )",ARG1,ARG2,ARG3);
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "msgctl",
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, msqid, int, cmd, struct msqid_ds *, buf);
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_PRE_sys_msgctl)(tid, ARG1,ARG2,ARG3);
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_msgctl)
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_POST_sys_msgctl)(tid, RES,ARG1,ARG2,ARG3);
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmget)
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_shmget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "shmget", vki_key_t, key, vki_size_t, size, int, shmflg);
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(wrap_sys_shmat)
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UWord arg2tmp;
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("wrap_sys_shmat ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "shmat",
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, shmid, const void *, shmaddr, int, shmflg);
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg2tmp = ML_(generic_PRE_sys_shmat)(tid, ARG1,ARG2,ARG3);
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (arg2tmp == 0)
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG2 = arg2tmp;  // used in POST
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(wrap_sys_shmat)
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_shmat)(tid, RES,ARG1,ARG2,ARG3);
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmdt)
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_shmdt ( %#lx )",ARG1);
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "shmdt", const void *, shmaddr);
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(generic_PRE_sys_shmdt)(tid, ARG1))
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_shmdt)
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_shmdt)(tid, RES,ARG1);
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmctl)
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_shmctl ( %ld, %ld, %#lx )",ARG1,ARG2,ARG3);
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "shmctl",
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, shmid, int, cmd, struct shmid_ds *, buf);
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_shmctl)(tid, ARG1,ARG2|VKI_IPC_64,ARG3);
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_shmctl)
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_shmctl)(tid, RES,ARG1,ARG2|VKI_IPC_64,ARG3);
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fadvise64)
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fadvise64 ( %ld, %ld, %lu, %ld )", ARG1,ARG2,ARG3,ARG4);
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "fadvise64",
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, vki_loff_t, offset, vki_size_t, len, int, advice);
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mmap)
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %d, %ld )",
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (ULong)ARG2, ARG3, ARG4, (Int)ARG5, ARG6 );
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "mmap",
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, start, unsigned long, length,
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, prot,  unsigned long, flags,
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, fd,    unsigned long, offset);
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE/POST wrappers for AMD64/Linux-variant specific syscalls
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------ */
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_syscall184)
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int err;
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* 184 is used by sys_bproc.  If we're not on a declared bproc
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      variant, fail in the usual way, since it is otherwise unused. */
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!VG_(strstr)(VG_(clo_kernel_variant), "bproc")) {
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("non-existent syscall! (syscall 184)");
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ0(long, "ni_syscall(184)");
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_ENOSYS );
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   err = ML_(linux_variant_PRE_sys_bproc)( ARG1, ARG2, ARG3,
1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                           ARG4, ARG5, ARG6 );
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (err) {
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( err );
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Let it go through. */
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock; /* who knows?  play safe. */
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_syscall184)
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_variant_POST_sys_bproc)( ARG1, ARG2, ARG3,
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      ARG4, ARG5, ARG6 );
1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef PRE
1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef POST
1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The AMD64/Linux syscall table
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add an amd64-linux specific wrapper to a syscall table. */
1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAX_(const, name)    WRAPPER_ENTRY_X_(amd64_linux, const, name)
1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAXY(const, name)    WRAPPER_ENTRY_XY(amd64_linux, const, name)
1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This table maps from __NR_xxx syscall numbers (from
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/include/asm-x86_64/unistd.h) to the appropriate PRE/POST sys_foo()
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// wrappers on AMD64 (as per sys_call_table in
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/arch/x86_64/kernel/entry.S).
1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// When implementing these wrappers, you need to work out if the wrapper is
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// generic, Linux-only (but arch-independent), or AMD64/Linux only.
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry syscall_table[] = {
1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_read,              sys_read),           // 0
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_write,             sys_write),          // 1
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_open,              sys_open),           // 2
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_close,             sys_close),          // 3
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_stat,              sys_newstat),        // 4
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstat,             sys_newfstat),       // 5
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_lstat,             sys_newlstat),       // 6
1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_poll,              sys_poll),           // 7
1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lseek,             sys_lseek),          // 8
1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_mmap,              sys_mmap),           // 9
1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_mprotect,          sys_mprotect),       // 10
1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_munmap,            sys_munmap),         // 11
1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_brk,               sys_brk),            // 12
1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigaction,      sys_rt_sigaction),   // 13
1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigprocmask,    sys_rt_sigprocmask), // 14
1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_rt_sigreturn,      sys_rt_sigreturn),   // 15
1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_ioctl,             sys_ioctl),          // 16
1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_pread64,           sys_pread64),        // 17
1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pwrite64,          sys_pwrite64),       // 18
1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_readv,             sys_readv),          // 19
1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_writev,            sys_writev),         // 20
1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_access,            sys_access),         // 21
1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_pipe,              sys_pipe),           // 22
1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_select,            sys_select),         // 23
1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_yield,       sys_sched_yield),    // 24
1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mremap,            sys_mremap),         // 25
1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_msync,             sys_msync),          // 26
1088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_mincore,           sys_mincore),        // 27
1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_madvise,           sys_madvise),        // 28
1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_shmget,            sys_shmget),         // 29
1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_shmat,             wrap_sys_shmat),     // 30
1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_shmctl,            sys_shmctl),         // 31
1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup,               sys_dup),            // 32
1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup2,              sys_dup2),           // 33
1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pause,             sys_pause),          // 34
1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_nanosleep,         sys_nanosleep),      // 35
1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getitimer,         sys_getitimer),      // 36
1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_alarm,             sys_alarm),          // 37
1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_setitimer,         sys_setitimer),      // 38
1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpid,            sys_getpid),         // 39
1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sendfile,          sys_sendfile),       // 40
1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_socket,            sys_socket),         // 41
1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_connect,           sys_connect),        // 42
1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_accept,            sys_accept),         // 43
1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_sendto,            sys_sendto),         // 44
1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_recvfrom,          sys_recvfrom),       // 45
1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_sendmsg,           sys_sendmsg),        // 46
1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_recvmsg,           sys_recvmsg),        // 47
1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_shutdown,          sys_shutdown),       // 48
1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_bind,              sys_bind),           // 49
1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_listen,            sys_listen),         // 50
1117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_getsockname,       sys_getsockname),    // 51
1118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_getpeername,       sys_getpeername),    // 52
1119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_socketpair,        sys_socketpair),     // 53
1120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_setsockopt,        sys_setsockopt),     // 54
1121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_getsockopt,        sys_getsockopt),     // 55
1123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_clone,             sys_clone),          // 56
1124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fork,              sys_fork),           // 57
1125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_vfork,             sys_fork),           // 58 treat as fork
1126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_execve,            sys_execve),         // 59
1127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_exit,              sys_exit),           // 60
1129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_wait4,             sys_wait4),          // 61
1130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_kill,              sys_kill),           // 62
1131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_uname,             sys_newuname),       // 63
1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_semget,            sys_semget),         // 64
1133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_semop,             sys_semop),          // 65
1135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_semctl,            sys_semctl),         // 66
1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_shmdt,             sys_shmdt),          // 67
1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_msgget,            sys_msgget),         // 68
1138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_msgsnd,            sys_msgsnd),         // 69
1139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_msgrcv,            sys_msgrcv),         // 70
1141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_msgctl,            sys_msgctl),         // 71
1142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fcntl,             sys_fcntl),          // 72
1143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_flock,             sys_flock),          // 73
1144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fsync,             sys_fsync),          // 74
1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fdatasync,         sys_fdatasync),      // 75
1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_truncate,          sys_truncate),       // 76
1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_ftruncate,         sys_ftruncate),      // 77
1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getdents,          sys_getdents),       // 78
1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getcwd,            sys_getcwd),         // 79
1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chdir,             sys_chdir),          // 80
1153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchdir,            sys_fchdir),         // 81
1154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rename,            sys_rename),         // 82
1155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mkdir,             sys_mkdir),          // 83
1156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rmdir,             sys_rmdir),          // 84
1157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_creat,             sys_creat),          // 85
1159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_link,              sys_link),           // 86
1160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_unlink,            sys_unlink),         // 87
1161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_symlink,           sys_symlink),        // 88
1162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_readlink,          sys_readlink),       // 89
1163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chmod,             sys_chmod),          // 90
1165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchmod,            sys_fchmod),         // 91
1166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chown,             sys_chown),          // 92
1167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchown,            sys_fchown),         // 93
1168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_lchown,            sys_lchown),         // 94
1169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_umask,             sys_umask),          // 95
1171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_gettimeofday,      sys_gettimeofday),   // 96
1172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getrlimit,         sys_getrlimit),      // 97
1173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getrusage,         sys_getrusage),      // 98
1174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sysinfo,           sys_sysinfo),        // 99
1175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_times,             sys_times),          // 100
1177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_ptrace,            sys_ptrace),         // 101
1178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getuid,            sys_getuid),         // 102
1179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_syslog,            sys_syslog),         // 103
1180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getgid,            sys_getgid),         // 104
1181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setuid,            sys_setuid),         // 105
1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setgid,            sys_setgid),         // 106
1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_geteuid,           sys_geteuid),        // 107
1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getegid,           sys_getegid),        // 108
1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpgid,           sys_setpgid),        // 109
1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getppid,           sys_getppid),        // 110
1189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpgrp,           sys_getpgrp),        // 111
1190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setsid,            sys_setsid),         // 112
1191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setreuid,          sys_setreuid),       // 113
1192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setregid,          sys_setregid),       // 114
1193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getgroups,         sys_getgroups),      // 115
1195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setgroups,         sys_setgroups),      // 116
1196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresuid,         sys_setresuid),      // 117
1197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresuid,         sys_getresuid),      // 118
1198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresgid,         sys_setresgid),      // 119
1199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresgid,         sys_getresgid),      // 120
1201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpgid,           sys_getpgid),        // 121
1202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsuid,          sys_setfsuid),       // 122
1203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsgid,          sys_setfsgid),       // 123
1204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getsid,            sys_getsid),         // 124
1205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_capget,            sys_capget),         // 125
1207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_capset,            sys_capset),         // 126
1208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigpending,     sys_rt_sigpending),  // 127
1209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigtimedwait,   sys_rt_sigtimedwait),// 128
1210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigqueueinfo,   sys_rt_sigqueueinfo),// 129
1211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_rt_sigsuspend,     sys_rt_sigsuspend),  // 130
1213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_sigaltstack,       sys_sigaltstack),    // 131
1214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_utime,             sys_utime),          // 132
1215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mknod,             sys_mknod),          // 133
1216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_uselib,            sys_uselib),         // 134
1217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_personality,       sys_personality),    // 135
1219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_ustat,             sys_ustat),          // 136
1220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_statfs,            sys_statfs),         // 137
1221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstatfs,           sys_fstatfs),        // 138
1222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_sysfs,             sys_sysfs),          // 139
1223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpriority,             sys_getpriority),             // 140
1225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpriority,             sys_setpriority),             // 141
1226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_setparam,          sys_sched_setparam),          // 142
1227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_getparam,          sys_sched_getparam),          // 143
1228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_setscheduler,      sys_sched_setscheduler),      // 144
1229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_getscheduler,      sys_sched_getscheduler),      // 145
1231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_get_priority_max,  sys_sched_get_priority_max),  // 146
1232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_get_priority_min,  sys_sched_get_priority_min),  // 147
1233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_rr_get_interval,   sys_sched_rr_get_interval),   // 148
1234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mlock,                   sys_mlock),                   // 149
1235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_munlock,           sys_munlock),        // 150
1237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mlockall,          sys_mlockall),       // 151
1238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_munlockall,        sys_munlockall),     // 152
1239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_vhangup,           sys_vhangup),        // 153
1240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_modify_ldt,        sys_modify_ldt),     // 154
1241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_pivot_root,        sys_pivot_root),     // 155
1243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR__sysctl,           sys_sysctl),         // 156
1244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_prctl,             sys_prctl),          // 157
1245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_arch_prctl,	 sys_arch_prctl),     // 158
1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_adjtimex,          sys_adjtimex),       // 159
1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setrlimit,         sys_setrlimit),      // 160
1249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chroot,            sys_chroot),         // 161
1250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_sync,              sys_sync),           // 162
1251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_acct,              sys_acct),           // 163
1252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_settimeofday,      sys_settimeofday),   // 164
1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mount,             sys_mount),          // 165
1255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_umount2,           sys_umount),         // 166
1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_swapon,            sys_swapon),         // 167
1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_swapoff,           sys_swapoff),        // 168
1258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_reboot,            sys_reboot),         // 169
1259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_sethostname,       sys_sethostname),    // 170
1261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_setdomainname,     sys_setdomainname),  // 171
1262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_iopl,              sys_iopl),           // 172
1263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_ioperm,            sys_ioperm),         // 173
1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_create_module,     sys_ni_syscall),     // 174
1265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_init_module,       sys_init_module),    // 175
1267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_delete_module,     sys_delete_module),  // 176
1268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_get_kernel_syms,   sys_ni_syscall),     // 177
1269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_query_module,      sys_ni_syscall),     // 178
1270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_quotactl,          sys_quotactl),       // 179
1271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_nfsservctl,        sys_nfsservctl),     // 180
1273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_getpmsg,           sys_ni_syscall),     // 181
1274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_putpmsg,           sys_ni_syscall),     // 182
1275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_afs_syscall,       sys_ni_syscall),     // 183
1276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(184,                    sys_syscall184),     // 184 // sys_bproc?
1277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_security,          sys_ni_syscall),     // 185
1279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_gettid,            sys_gettid),         // 186
1280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_readahead,         sys_readahead),      // 187
1281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setxattr,          sys_setxattr),       // 188
1282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lsetxattr,         sys_lsetxattr),      // 189
1283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fsetxattr,         sys_fsetxattr),      // 190
1285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getxattr,          sys_getxattr),       // 191
1286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_lgetxattr,         sys_lgetxattr),      // 192
1287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fgetxattr,         sys_fgetxattr),      // 193
1288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_listxattr,         sys_listxattr),      // 194
1289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_llistxattr,        sys_llistxattr),     // 195
1291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_flistxattr,        sys_flistxattr),     // 196
1292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_removexattr,       sys_removexattr),    // 197
1293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lremovexattr,      sys_lremovexattr),   // 198
1294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fremovexattr,      sys_fremovexattr),   // 199
1295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_tkill,             sys_tkill),             // 200
1297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_time,              sys_time), /*was sys_time64*/ // 201
1298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_futex,             sys_futex),             // 202
1299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 203
1300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 204
1301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_set_thread_area,   sys_ni_syscall),     // 205
1303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_setup,          sys_io_setup),       // 206
1304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_io_destroy,        sys_io_destroy),     // 207
1305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_getevents,      sys_io_getevents),   // 208
1306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_io_submit,         sys_io_submit),      // 209
1307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_cancel,         sys_io_cancel),      // 210
1309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_get_thread_area,   sys_ni_syscall),     // 211
1310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_lookup_dcookie,    sys_lookup_dcookie), // 212
1311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_create,      sys_epoll_create),   // 213
1312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_epoll_ctl_old,     sys_ni_syscall),     // 214
1313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_epoll_wait_old,    sys_ni_syscall),     // 215
1315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_remap_file_pages,  sys_remap_file_pages)// 216
1316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getdents64,        sys_getdents64),     // 217
1317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_tid_address,   sys_set_tid_address),// 218
1318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_restart_syscall,   sys_restart_syscall),// 219
1319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_semtimedop,        sys_semtimedop),     // 220
1321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_fadvise64,         sys_fadvise64),      // 221
1322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_create,      sys_timer_create),   // 222
1323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_settime,     sys_timer_settime),  // 223
1324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_gettime,     sys_timer_gettime),  // 224
1325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_timer_getoverrun,  sys_timer_getoverrun), // 225
1327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_timer_delete,      sys_timer_delete),   // 226
1328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_clock_settime,     sys_clock_settime),  // 227
1329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_gettime,     sys_clock_gettime),  // 228
1330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_getres,      sys_clock_getres),   // 229
1331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_nanosleep,   sys_clock_nanosleep),// 230
1333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_exit_group,        sys_exit_group),     // 231
1334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_wait,        sys_epoll_wait),     // 232
1335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_epoll_ctl,         sys_epoll_ctl),      // 233
1336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_tgkill,            sys_tgkill),         // 234
1337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_utimes,            sys_utimes),         // 235
1339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_vserver,           sys_ni_syscall),     // 236
1340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mbind,             sys_mbind),          // 237
1341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_mempolicy,     sys_set_mempolicy),  // 238
1342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_get_mempolicy,     sys_get_mempolicy),  // 239
1343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_open,           sys_mq_open),        // 240
1345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_unlink,         sys_mq_unlink),      // 241
1346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_timedsend,      sys_mq_timedsend),   // 242
1347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_timedreceive,   sys_mq_timedreceive),// 243
1348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_notify,         sys_mq_notify),      // 244
1349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_getsetattr,     sys_mq_getsetattr),  // 245
1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_kexec_load,        sys_ni_syscall),     // 246
1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_waitid,            sys_waitid),         // 247
1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_add_key,           sys_add_key),        // 248
1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_request_key,       sys_request_key),    // 249
1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_keyctl,            sys_keyctl),         // 250
1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_ioprio_set,        sys_ioprio_set),     // 251
1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_ioprio_get,        sys_ioprio_get),     // 252
1359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_init,	 sys_inotify_init),   // 253
1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 254
1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_rm_watch,	 sys_inotify_rm_watch), // 255
1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_migrate_pages,	 sys_migrate_pages),    // 256
1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_openat,		 sys_openat),           // 257
1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mkdirat,		 sys_mkdirat),          // 258
1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mknodat,		 sys_mknodat),          // 259
1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchownat,		 sys_fchownat),         // 260
1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_futimesat,	 sys_futimesat),        // 261
1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_newfstatat,	 sys_newfstatat),       // 262
1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_unlinkat,		 sys_unlinkat),         // 263
1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_renameat,		 sys_renameat),         // 264
1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_linkat,		 sys_linkat),           // 265
1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_symlinkat,	 sys_symlinkat),        // 266
1376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_readlinkat,	 sys_readlinkat),       // 267
1377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchmodat,		 sys_fchmodat),         // 268
1378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_faccessat,	 sys_faccessat),        // 269
1379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_pselect6,		 sys_pselect6),         // 270
1381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_ppoll,		 sys_ppoll),            // 271
1382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_unshare,		 sys_unshare),          // 272
1383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_robust_list,	 sys_set_robust_list),  // 273
1384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_get_robust_list,	 sys_get_robust_list),  // 274
1385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_splice,            sys_splice),           // 275
1387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_tee,               sys_ni_syscall),       // 276
1388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sync_file_range,   sys_sync_file_range),  // 277
1389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_vmsplice,          sys_ni_syscall),       // 278
1390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_move_pages,        sys_ni_syscall),       // 279
1391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_utimensat,         sys_utimensat),        // 280
1393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_pwait,       sys_epoll_pwait),      // 281
1394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_signalfd,          sys_signalfd),         // 282
1395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_create,    sys_timerfd_create),   // 283
1396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_eventfd,           sys_eventfd),          // 284
1397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fallocate,         sys_fallocate),        // 285
1399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_settime,   sys_timerfd_settime),  // 286
1400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_gettime,   sys_timerfd_gettime),  // 287
1401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_accept4,           sys_accept4),          // 288
1402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_signalfd4,         sys_signalfd4),        // 289
1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_eventfd2,          sys_eventfd2),         // 290
1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_create1,     sys_epoll_create1),    // 291
1406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_dup3,              sys_dup3),             // 292
1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_pipe2,             sys_pipe2),            // 293
1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_inotify_init1,     sys_inotify_init1),    // 294
1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_preadv,            sys_preadv),           // 295
1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_pwritev,           sys_pwritev),          // 296
1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 297
1413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_perf_event_open,   sys_perf_event_open),  // 298
1414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//   LINX_(__NR_recvmmsg,          sys_ni_syscall),       // 299
1415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//   LINX_(__NR_fanotify_init,     sys_ni_syscall),       // 300
1417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//   LINX_(__NR_fanotify_mark,     sys_ni_syscall),       // 301
1418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_prlimit64,         sys_prlimit64)         // 302
1419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//   LINX_(__NR_name_to_handle_at, sys_ni_syscall),       // 303
1420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//   LINX_(__NR_open_by_handle_at, sys_ni_syscall),       // 304
1421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//   LINX_(__NR_clock_adjtime,     sys_ni_syscall),       // 305
1423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//   LINX_(__NR_syncfs,            sys_ni_syscall),       // 306
1424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//   LINX_(__NR_sendmmsg,          sys_ni_syscall),       // 307
1425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//   LINX_(__NR_setns,             sys_ni_syscall),       // 308
1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const UInt syscall_table_size
1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = sizeof(syscall_table) / sizeof(syscall_table[0]);
1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Is it in the contiguous initial section of the table? */
1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sysno < syscall_table_size) {
1435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SyscallTableEntry* sys = &syscall_table[sysno];
1436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (sys->before == NULL)
1437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return NULL; /* no entry */
1438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
1439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return sys;
1440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Can't find a wrapper */
1443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return NULL;
1444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_amd64_linux)
1447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                                          ---*/
1450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1451