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
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2000-2013 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"
145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng".globl do_syscall_clone_amd64_linux\n"
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"do_syscall_clone_amd64_linux:\n"
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // set up child stack, temporarily preserving fn and arg
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       subq    $16, %rsi\n"            // make space on stack
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %rcx, 8(%rsi)\n"        // save arg
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %rdi, 0(%rsi)\n"        // save fn
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // setup syscall
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    $"__NR_CLONE", %rax\n"  // syscall number
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %rdx,     %rdi\n"       // syscall arg1: flags
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // %rsi already setup           // syscall arg2: child_stack
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %r9,      %rdx\n"       // syscall arg3: parent_tid
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %r8,      %r10\n"       // syscall arg4: child_tid
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    8(%rsp),  %r8\n"        // syscall arg5: tls_ptr
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       syscall\n"                      // clone()
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       testq   %rax, %rax\n"           // child if retval == 0
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       jnz     1f\n"
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // CHILD - call thread function
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       pop     %rax\n"                 // pop fn
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       pop     %rdi\n"                 // pop fn arg1: arg
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       call    *%rax\n"                // call fn
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // exit with result
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    %rax, %rdi\n"           // arg1: return value from fn
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       movq    $"__NR_EXIT", %rax\n"
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       syscall\n"
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        // Exit returned?!
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       ud2\n"
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"1:\n"  // PARENT or ERROR
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"       ret\n"
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".previous\n"
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown);
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_CLONE
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_EXIT
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// forward declaration
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void setup_child ( ThreadArchState*, ThreadArchState* );
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   When a client clones, we need to keep track of the new thread.  This means:
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   1. allocate a ThreadId+ThreadState+stack for the the thread
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   2. initialize the thread's new VCPU state
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   3. create the thread using the same args as the client requested,
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   but using the scheduler entrypoint for EIP, and a separate stack
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for ESP.
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes do_clone ( ThreadId ptid,
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         ULong flags, Addr rsp,
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Long* parent_tidptr,
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Long* child_tidptr,
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Addr tlsaddr )
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static const Bool debug = False;
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId     ctid = VG_(alloc_ThreadState)();
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* ptst = VG_(get_ThreadState)(ptid);
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* ctst = VG_(get_ThreadState)(ctid);
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UWord*       stack;
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NSegment const* seg;
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes       res;
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Long         rax;
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_sigset_t blockall, savedmask;
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigfillset)(&blockall);
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(ptid));
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(ctid));
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   stack = (UWord*)ML_(allocstack)(ctid);
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (stack == NULL) {
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto out;
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Copy register state
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Both parent and child return to the same place, and the code
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      following the clone syscall works out which is which, so we
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      don't need to worry about it.
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      The parent gets the child's new tid returned from clone, but the
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      child gets 0.
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      If the clone call specifies a NULL rsp for the new thread, then
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      it actually gets a copy of the parent's rsp.
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   setup_child( &ctst->arch, &ptst->arch );
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Make sys_clone appear to have returned Success(0) in the
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      child. */
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->arch.vex.guest_RAX = 0;
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (rsp != 0)
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->arch.vex.guest_RSP = rsp;
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->os_state.parent = ptid;
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* inherit signal mask */
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->sig_mask = ptst->sig_mask;
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->tmp_sig_mask = ptst->sig_mask;
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Start the child with its threadgroup being the same as the
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      parent's.  This is so that any exit_group calls that happen
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      after the child is created but before it sets its
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      os_state.threadgroup field for real (in thread_wrapper in
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      syswrap-linux.c), really kill the new thread.  a.k.a this avoids
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      a race condition in which the thread is unkillable (via
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit_group) because its threadgroup is not set.  The race window
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      is probably only a few hundred or a few thousand cycles long.
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      See #226116. */
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->os_state.threadgroup = ptst->os_state.threadgroup;
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* We don't really know where the client stack is, because its
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      allocated by the client.  The best we can do is look at the
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      memory mappings and try to derive some useful information.  We
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assume that esp starts near its highest possible value, and can
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      only go down to the start of the mmaped segment. */
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   seg = VG_(am_find_nsegment)((Addr)rsp);
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (seg && seg->kind != SkResvn) {
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(rsp);
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (debug)
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n",
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     ctid, seg->start, VG_PGROUNDUP(rsp));
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "!? New thread %d starts with RSP(%#lx) unmapped\n",
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		   ctid, rsp);
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_szB  = 0;
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Assume the clone will succeed, and tell any tool that wants to
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      know that this thread has come into existence.  If the clone
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fails, we'll send out a ll_exit notification for it at the out:
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      label below, to clean up. */
293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vg_assert(VG_(owns_BigLock_LL)(ptid));
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_TRACK ( pre_thread_ll_create, ptid, ctid );
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (flags & VKI_CLONE_SETTLS) {
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (debug)
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 VG_(printf)("clone child has SETTLS: tls at %#lx\n", tlsaddr);
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->arch.vex.guest_FS_ZERO = tlsaddr;
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags &= ~VKI_CLONE_SETTLS;
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* start the thread with everything blocked */
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Create the new thread */
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rax = do_syscall_clone_amd64_linux(
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid],
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            child_tidptr, parent_tidptr, NULL
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         );
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = VG_(mk_SysRes_amd64_linux)( rax );
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  out:
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sr_isError(res)) {
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* clone failed */
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(cleanup_thread)(&ctst->arch);
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->status = VgTs_Empty;
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* oops.  Better tell the tool the thread exited in a hurry :-) */
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_TRACK( pre_thread_ll_exit, ctid );
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   More thread stuff
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(cleanup_thread) ( ThreadArchState *arch )
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid setup_child ( /*OUT*/ ThreadArchState *child,
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   /*IN*/  ThreadArchState *parent )
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* We inherit our parent's guest state. */
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex = parent->vex;
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex_shadow1 = parent->vex_shadow1;
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex_shadow2 = parent->vex_shadow2;
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE/POST wrappers for AMD64/Linux-specific syscalls
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE(name)       DEFN_PRE_TEMPLATE(amd64_linux, name)
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST(name)      DEFN_POST_TEMPLATE(amd64_linux, name)
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add prototypes for the wrappers declared here, so that gcc doesn't
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   harass us for not having prototypes.  Really this is a kludge --
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the right thing to do is to make these wrappers 'static' since they
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   aren't visible outside this file, but that requires even more macro
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   magic. */
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_clone);
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_rt_sigreturn);
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_arch_prctl);
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_ptrace);
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_fadvise64);
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_mmap);
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(amd64_linux, sys_syscall184);
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clone)
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong cloneflags;
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_REG_READ2(int, "clone",
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, flags,
375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 void *, child_stack);
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & VKI_CLONE_PARENT_SETTID) {
378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (VG_(tdict).track_pre_reg_read) {
379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         PRA3("clone", int *, parent_tidptr);
380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int), VKI_PROT_WRITE)) {
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (ARG1 & VKI_CLONE_SETTLS) {
388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (VG_(tdict).track_pre_reg_read) {
389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         PRA4("clone", vki_modify_ldt_t *, tlsinfo);
390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      PRE_MEM_READ("clone(tlsinfo)", ARG4, sizeof(vki_modify_ldt_t));
392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (!VG_(am_is_valid_for_client)(ARG4, sizeof(vki_modify_ldt_t),
393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                             VKI_PROT_READ)) {
394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         SET_STATUS_Failure( VKI_EFAULT );
395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         return;
396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (VG_(tdict).track_pre_reg_read) {
400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         PRA5("clone", int *, child_tidptr);
401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("clone(child_tidptr)", ARG4, sizeof(Int));
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG4, sizeof(Int), VKI_PROT_WRITE)) {
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cloneflags = ARG1;
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Only look at the flags we really care about */
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* thread creation */
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         do_clone(tid,
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG1,          /* flags */
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)ARG2,    /* child ESP */
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Long *)ARG3,  /* parent_tidptr */
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Long *)ARG4,  /* child_tidptr */
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)ARG5));  /* set_tls */
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* FALLTHROUGH - assume vfork == fork */
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 0: /* plain fork */
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(do_fork_clone)(tid,
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       cloneflags,      /* flags */
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Int *)ARG3,     /* parent_tidptr */
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Int *)ARG4));   /* child_tidptr */
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* should we just ENOSYS? */
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "Unsupported clone() flags: 0x%lx\n", ARG1);
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "\n");
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "The only supported clone() uses are:\n");
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   " - via a threads library (LinuxThreads or NPTL)\n");
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg,
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   " - via the implementation of fork or vfork\n");
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(unimplemented)
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ("Valgrind does not support general clone().");
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS) {
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG1 & VKI_CLONE_PARENT_SETTID)
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG3, sizeof(Int));
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG4, sizeof(Int));
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Thread creation was successful; let the child have the chance
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         to run */
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfYieldAfter;
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigreturn)
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* This isn't really a syscall at all - it's a misuse of the
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      syscall mechanism by m_sigframe.  VG_(sigframe_create) sets the
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return address of the signal frames it creates to be a short
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      piece of code which does this "syscall".  The only purpose of
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      the syscall is to call VG_(sigframe_destroy), which restores the
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      thread's registers from the frame and then removes it.
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Consequently we must ask the syswrap driver logic not to write
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      back the syscall "result" as that would overwrite the
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      just-restored register state. */
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst;
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_rt_sigreturn ( )");
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Adjust RSP to point to start of frame; skip back up over handler
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ret addr */
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst = VG_(get_ThreadState)(tid);
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst->arch.vex.guest_RSP -= sizeof(Addr);
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* This is only so that the RIP is (might be) useful to report if
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      something goes wrong in the sigreturn.  JRS 20070318: no idea
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      what this is for */
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Restore register state from frame and remove it, as
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      described above */
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigframe_destroy)(tid, True);
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell the driver not to update the guest state with the "result",
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      and set a bogus result to keep it happy. */
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfNoWriteResult;
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if any signals arose as a result of this. */
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfPollAfter;
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_arch_prctl)
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst;
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "arch_prctl ( %ld, %lx )", ARG1, ARG2 );
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Nb: can't use "ARG2".."ARG5" here because that's our own macro...
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "arch_prctl",
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, option, unsigned long, arg2);
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // XXX: totally wrong... we need to look at the 'option' arg, and do
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // PRE_MEM_READs/PRE_MEM_WRITEs as necessary...
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* "do" the syscall ourselves; the kernel never sees it */
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 == VKI_ARCH_SET_FS) {
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst = VG_(get_ThreadState)(tid);
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->arch.vex.guest_FS_ZERO = ARG2;
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else if (ARG1 == VKI_ARCH_GET_FS) {
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("arch_prctl(addr)", ARG2, sizeof(unsigned long));
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst = VG_(get_ThreadState)(tid);
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *(unsigned long *)ARG2 = tst->arch.vex.guest_FS_ZERO;
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, sizeof(unsigned long));
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else {
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(core_panic)("Unsupported arch_prtctl option");
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Note; the Status writeback to guest state that happens after
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      this wrapper returns does not change guest_FS_ZERO; hence that
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      direct assignment to the guest state is safe here. */
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success( 0 );
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Parts of this are amd64-specific, but the *PEEK* cases are generic.
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// ARG3 is only used for pointers into the traced process's address
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// space and for offsets into the traced process's struct
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// user_regs_struct. It is never a pointer into this process's memory
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// space, and we should therefore not check anything it points to.
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_ptrace)
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int, "ptrace",
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 long, request, long, pid, long, addr, long, data);
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1) {
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKTEXT:
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKDATA:
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKUSR:
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ptrace(peek)", ARG4,
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof (long));
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETREGS:
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof (struct vki_user_regs_struct));
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETFPREGS:
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof (struct vki_user_i387_struct));
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_SETREGS:
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ptrace(setregs)", ARG4,
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof (struct vki_user_regs_struct));
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_SETFPREGS:
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		     sizeof (struct vki_user_i387_struct));
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETEVENTMSG:
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long));
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETSIGINFO:
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t));
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_SETSIGINFO:
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t));
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_PTRACE_GETREGSET:
592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_PRE_getregset)(tid, ARG3, ARG4);
593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_PTRACE_SETREGSET:
595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_PRE_setregset)(tid, ARG3, ARG4);
596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_ptrace)
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1) {
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKTEXT:
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKDATA:
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_PEEKUSR:
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof (long));
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETREGS:
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETFPREGS:
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETEVENTMSG:
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof(unsigned long));
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_PTRACE_GETSIGINFO:
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* XXX: This is a simplification. Different parts of the
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       * siginfo_t are valid depending on the type of signal.
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       */
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t));
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_PTRACE_GETREGSET:
626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_POST_getregset)(tid, ARG3, ARG4);
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fadvise64)
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fadvise64 ( %ld, %ld, %lu, %ld )", ARG1,ARG2,ARG3,ARG4);
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "fadvise64",
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, vki_loff_t, offset, vki_size_t, len, int, advice);
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mmap)
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %d, %ld )",
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (ULong)ARG2, ARG3, ARG4, (Int)ARG5, ARG6 );
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "mmap",
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, start, unsigned long, length,
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, prot,  unsigned long, flags,
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, fd,    unsigned long, offset);
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE/POST wrappers for AMD64/Linux-variant specific syscalls
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------ */
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_syscall184)
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int err;
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* 184 is used by sys_bproc.  If we're not on a declared bproc
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      variant, fail in the usual way, since it is otherwise unused. */
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!VG_(strstr)(VG_(clo_kernel_variant), "bproc")) {
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("non-existent syscall! (syscall 184)");
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ0(long, "ni_syscall(184)");
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_ENOSYS );
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   err = ML_(linux_variant_PRE_sys_bproc)( ARG1, ARG2, ARG3,
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                           ARG4, ARG5, ARG6 );
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (err) {
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( err );
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Let it go through. */
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock; /* who knows?  play safe. */
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_syscall184)
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_variant_POST_sys_bproc)( ARG1, ARG2, ARG3,
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      ARG4, ARG5, ARG6 );
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef PRE
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef POST
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The AMD64/Linux syscall table
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add an amd64-linux specific wrapper to a syscall table. */
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAX_(const, name)    WRAPPER_ENTRY_X_(amd64_linux, const, name)
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAXY(const, name)    WRAPPER_ENTRY_XY(amd64_linux, const, name)
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This table maps from __NR_xxx syscall numbers (from
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/include/asm-x86_64/unistd.h) to the appropriate PRE/POST sys_foo()
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// wrappers on AMD64 (as per sys_call_table in
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/arch/x86_64/kernel/entry.S).
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// When implementing these wrappers, you need to work out if the wrapper is
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// generic, Linux-only (but arch-independent), or AMD64/Linux only.
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry syscall_table[] = {
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_read,              sys_read),           // 0
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_write,             sys_write),          // 1
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_open,              sys_open),           // 2
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_close,             sys_close),          // 3
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_stat,              sys_newstat),        // 4
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstat,             sys_newfstat),       // 5
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_lstat,             sys_newlstat),       // 6
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_poll,              sys_poll),           // 7
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lseek,             sys_lseek),          // 8
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_mmap,              sys_mmap),           // 9
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_mprotect,          sys_mprotect),       // 10
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_munmap,            sys_munmap),         // 11
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_brk,               sys_brk),            // 12
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigaction,      sys_rt_sigaction),   // 13
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigprocmask,    sys_rt_sigprocmask), // 14
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_rt_sigreturn,      sys_rt_sigreturn),   // 15
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_ioctl,             sys_ioctl),          // 16
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_pread64,           sys_pread64),        // 17
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pwrite64,          sys_pwrite64),       // 18
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_readv,             sys_readv),          // 19
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_writev,            sys_writev),         // 20
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_access,            sys_access),         // 21
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_pipe,              sys_pipe),           // 22
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_select,            sys_select),         // 23
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_yield,       sys_sched_yield),    // 24
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mremap,            sys_mremap),         // 25
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_msync,             sys_msync),          // 26
743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GENXY(__NR_mincore,           sys_mincore),        // 27
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_madvise,           sys_madvise),        // 28
745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_shmget,            sys_shmget),         // 29
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_shmat,             wrap_sys_shmat),     // 30
748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_shmctl,            sys_shmctl),         // 31
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup,               sys_dup),            // 32
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup2,              sys_dup2),           // 33
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pause,             sys_pause),          // 34
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_nanosleep,         sys_nanosleep),      // 35
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getitimer,         sys_getitimer),      // 36
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_alarm,             sys_alarm),          // 37
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_setitimer,         sys_setitimer),      // 38
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpid,            sys_getpid),         // 39
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sendfile,          sys_sendfile),       // 40
760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_socket,            sys_socket),         // 41
761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_connect,           sys_connect),        // 42
762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_accept,            sys_accept),         // 43
763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_sendto,            sys_sendto),         // 44
764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_recvfrom,          sys_recvfrom),       // 45
766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_sendmsg,           sys_sendmsg),        // 46
767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_recvmsg,           sys_recvmsg),        // 47
768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_shutdown,          sys_shutdown),       // 48
769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_bind,              sys_bind),           // 49
770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_listen,            sys_listen),         // 50
772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_getsockname,       sys_getsockname),    // 51
773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_getpeername,       sys_getpeername),    // 52
774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_socketpair,        sys_socketpair),     // 53
775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_setsockopt,        sys_setsockopt),     // 54
776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_getsockopt,        sys_getsockopt),     // 55
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_clone,             sys_clone),          // 56
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fork,              sys_fork),           // 57
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_vfork,             sys_fork),           // 58 treat as fork
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_execve,            sys_execve),         // 59
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_exit,              sys_exit),           // 60
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_wait4,             sys_wait4),          // 61
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_kill,              sys_kill),           // 62
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_uname,             sys_newuname),       // 63
787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_semget,            sys_semget),         // 64
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_semop,             sys_semop),          // 65
790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_semctl,            sys_semctl),         // 66
791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_shmdt,             sys_shmdt),          // 67
792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_msgget,            sys_msgget),         // 68
793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_msgsnd,            sys_msgsnd),         // 69
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_msgrcv,            sys_msgrcv),         // 70
796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_msgctl,            sys_msgctl),         // 71
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fcntl,             sys_fcntl),          // 72
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_flock,             sys_flock),          // 73
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fsync,             sys_fsync),          // 74
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fdatasync,         sys_fdatasync),      // 75
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_truncate,          sys_truncate),       // 76
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_ftruncate,         sys_ftruncate),      // 77
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getdents,          sys_getdents),       // 78
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getcwd,            sys_getcwd),         // 79
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chdir,             sys_chdir),          // 80
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchdir,            sys_fchdir),         // 81
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rename,            sys_rename),         // 82
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mkdir,             sys_mkdir),          // 83
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rmdir,             sys_rmdir),          // 84
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_creat,             sys_creat),          // 85
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_link,              sys_link),           // 86
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_unlink,            sys_unlink),         // 87
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_symlink,           sys_symlink),        // 88
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_readlink,          sys_readlink),       // 89
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chmod,             sys_chmod),          // 90
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchmod,            sys_fchmod),         // 91
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chown,             sys_chown),          // 92
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchown,            sys_fchown),         // 93
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_lchown,            sys_lchown),         // 94
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_umask,             sys_umask),          // 95
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_gettimeofday,      sys_gettimeofday),   // 96
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getrlimit,         sys_getrlimit),      // 97
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getrusage,         sys_getrusage),      // 98
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sysinfo,           sys_sysinfo),        // 99
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_times,             sys_times),          // 100
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_ptrace,            sys_ptrace),         // 101
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getuid,            sys_getuid),         // 102
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_syslog,            sys_syslog),         // 103
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getgid,            sys_getgid),         // 104
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setuid,            sys_setuid),         // 105
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setgid,            sys_setgid),         // 106
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_geteuid,           sys_geteuid),        // 107
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getegid,           sys_getegid),        // 108
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpgid,           sys_setpgid),        // 109
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getppid,           sys_getppid),        // 110
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpgrp,           sys_getpgrp),        // 111
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setsid,            sys_setsid),         // 112
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setreuid,          sys_setreuid),       // 113
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setregid,          sys_setregid),       // 114
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getgroups,         sys_getgroups),      // 115
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setgroups,         sys_setgroups),      // 116
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresuid,         sys_setresuid),      // 117
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresuid,         sys_getresuid),      // 118
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresgid,         sys_setresgid),      // 119
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresgid,         sys_getresgid),      // 120
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpgid,           sys_getpgid),        // 121
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsuid,          sys_setfsuid),       // 122
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsgid,          sys_setfsgid),       // 123
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getsid,            sys_getsid),         // 124
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_capget,            sys_capget),         // 125
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_capset,            sys_capset),         // 126
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigpending,     sys_rt_sigpending),  // 127
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigtimedwait,   sys_rt_sigtimedwait),// 128
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigqueueinfo,   sys_rt_sigqueueinfo),// 129
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_rt_sigsuspend,     sys_rt_sigsuspend),  // 130
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_sigaltstack,       sys_sigaltstack),    // 131
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_utime,             sys_utime),          // 132
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mknod,             sys_mknod),          // 133
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_uselib,            sys_uselib),         // 134
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_personality,       sys_personality),    // 135
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_ustat,             sys_ustat),          // 136
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_statfs,            sys_statfs),         // 137
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstatfs,           sys_fstatfs),        // 138
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_sysfs,             sys_sysfs),          // 139
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpriority,             sys_getpriority),             // 140
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpriority,             sys_setpriority),             // 141
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_setparam,          sys_sched_setparam),          // 142
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_getparam,          sys_sched_getparam),          // 143
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_setscheduler,      sys_sched_setscheduler),      // 144
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_getscheduler,      sys_sched_getscheduler),      // 145
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_get_priority_max,  sys_sched_get_priority_max),  // 146
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_get_priority_min,  sys_sched_get_priority_min),  // 147
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_rr_get_interval,   sys_sched_rr_get_interval),   // 148
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mlock,                   sys_mlock),                   // 149
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_munlock,           sys_munlock),        // 150
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mlockall,          sys_mlockall),       // 151
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_munlockall,        sys_munlockall),     // 152
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_vhangup,           sys_vhangup),        // 153
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_modify_ldt,        sys_modify_ldt),     // 154
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_pivot_root,        sys_pivot_root),     // 155
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR__sysctl,           sys_sysctl),         // 156
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_prctl,             sys_prctl),          // 157
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_arch_prctl,	 sys_arch_prctl),     // 158
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_adjtimex,          sys_adjtimex),       // 159
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setrlimit,         sys_setrlimit),      // 160
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chroot,            sys_chroot),         // 161
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_sync,              sys_sync),           // 162
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_acct,              sys_acct),           // 163
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_settimeofday,      sys_settimeofday),   // 164
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mount,             sys_mount),          // 165
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_umount2,           sys_umount),         // 166
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_swapon,            sys_swapon),         // 167
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_swapoff,           sys_swapoff),        // 168
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_reboot,            sys_reboot),         // 169
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   GENX_(__NR_sethostname,       sys_sethostname),    // 170
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_setdomainname,     sys_setdomainname),  // 171
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_iopl,              sys_iopl),           // 172
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_ioperm,            sys_ioperm),         // 173
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_create_module,     sys_ni_syscall),     // 174
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_init_module,       sys_init_module),    // 175
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_delete_module,     sys_delete_module),  // 176
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_get_kernel_syms,   sys_ni_syscall),     // 177
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_query_module,      sys_ni_syscall),     // 178
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_quotactl,          sys_quotactl),       // 179
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_nfsservctl,        sys_nfsservctl),     // 180
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_getpmsg,           sys_ni_syscall),     // 181
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_putpmsg,           sys_ni_syscall),     // 182
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_afs_syscall,       sys_ni_syscall),     // 183
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(184,                    sys_syscall184),     // 184 // sys_bproc?
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_security,          sys_ni_syscall),     // 185
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_gettid,            sys_gettid),         // 186
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_readahead,         sys_readahead),      // 187
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setxattr,          sys_setxattr),       // 188
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lsetxattr,         sys_lsetxattr),      // 189
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fsetxattr,         sys_fsetxattr),      // 190
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getxattr,          sys_getxattr),       // 191
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_lgetxattr,         sys_lgetxattr),      // 192
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fgetxattr,         sys_fgetxattr),      // 193
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_listxattr,         sys_listxattr),      // 194
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_llistxattr,        sys_llistxattr),     // 195
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_flistxattr,        sys_flistxattr),     // 196
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_removexattr,       sys_removexattr),    // 197
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lremovexattr,      sys_lremovexattr),   // 198
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fremovexattr,      sys_fremovexattr),   // 199
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_tkill,             sys_tkill),             // 200
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_time,              sys_time), /*was sys_time64*/ // 201
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_futex,             sys_futex),             // 202
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 203
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 204
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_set_thread_area,   sys_ni_syscall),     // 205
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_setup,          sys_io_setup),       // 206
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_io_destroy,        sys_io_destroy),     // 207
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_getevents,      sys_io_getevents),   // 208
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_io_submit,         sys_io_submit),      // 209
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_cancel,         sys_io_cancel),      // 210
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_get_thread_area,   sys_ni_syscall),     // 211
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_lookup_dcookie,    sys_lookup_dcookie), // 212
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_create,      sys_epoll_create),   // 213
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_epoll_ctl_old,     sys_ni_syscall),     // 214
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_epoll_wait_old,    sys_ni_syscall),     // 215
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_remap_file_pages,  sys_remap_file_pages)// 216
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getdents64,        sys_getdents64),     // 217
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_tid_address,   sys_set_tid_address),// 218
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_restart_syscall,   sys_restart_syscall),// 219
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_semtimedop,        sys_semtimedop),     // 220
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_fadvise64,         sys_fadvise64),      // 221
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_create,      sys_timer_create),   // 222
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_settime,     sys_timer_settime),  // 223
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_gettime,     sys_timer_gettime),  // 224
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_timer_getoverrun,  sys_timer_getoverrun), // 225
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_timer_delete,      sys_timer_delete),   // 226
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_clock_settime,     sys_clock_settime),  // 227
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_gettime,     sys_clock_gettime),  // 228
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_getres,      sys_clock_getres),   // 229
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_nanosleep,   sys_clock_nanosleep),// 230
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_exit_group,        sys_exit_group),     // 231
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_wait,        sys_epoll_wait),     // 232
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_epoll_ctl,         sys_epoll_ctl),      // 233
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_tgkill,            sys_tgkill),         // 234
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_utimes,            sys_utimes),         // 235
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_vserver,           sys_ni_syscall),     // 236
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mbind,             sys_mbind),          // 237
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_mempolicy,     sys_set_mempolicy),  // 238
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_get_mempolicy,     sys_get_mempolicy),  // 239
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_open,           sys_mq_open),        // 240
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_unlink,         sys_mq_unlink),      // 241
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_timedsend,      sys_mq_timedsend),   // 242
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_timedreceive,   sys_mq_timedreceive),// 243
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_notify,         sys_mq_notify),      // 244
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_getsetattr,     sys_mq_getsetattr),  // 245
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   (__NR_kexec_load,        sys_ni_syscall),     // 246
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_waitid,            sys_waitid),         // 247
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_add_key,           sys_add_key),        // 248
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_request_key,       sys_request_key),    // 249
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_keyctl,            sys_keyctl),         // 250
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_ioprio_set,        sys_ioprio_set),     // 251
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_ioprio_get,        sys_ioprio_get),     // 252
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_init,	 sys_inotify_init),   // 253
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 254
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_rm_watch,	 sys_inotify_rm_watch), // 255
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_migrate_pages,	 sys_migrate_pages),    // 256
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_openat,		 sys_openat),           // 257
1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mkdirat,		 sys_mkdirat),          // 258
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mknodat,		 sys_mknodat),          // 259
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchownat,		 sys_fchownat),         // 260
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_futimesat,	 sys_futimesat),        // 261
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_newfstatat,	 sys_newfstatat),       // 262
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_unlinkat,		 sys_unlinkat),         // 263
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_renameat,		 sys_renameat),         // 264
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_linkat,		 sys_linkat),           // 265
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_symlinkat,	 sys_symlinkat),        // 266
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_readlinkat,	 sys_readlinkat),       // 267
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchmodat,		 sys_fchmodat),         // 268
1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_faccessat,	 sys_faccessat),        // 269
1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_pselect6,		 sys_pselect6),         // 270
1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_ppoll,		 sys_ppoll),            // 271
1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_unshare,		 sys_unshare),          // 272
1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_robust_list,	 sys_set_robust_list),  // 273
1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_get_robust_list,	 sys_get_robust_list),  // 274
1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_splice,            sys_splice),           // 275
1042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINX_(__NR_tee,               sys_tee),              // 276
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sync_file_range,   sys_sync_file_range),  // 277
1044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_vmsplice,          sys_vmsplice),         // 278
1045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_move_pages,        sys_move_pages),       // 279
1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_utimensat,         sys_utimensat),        // 280
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_pwait,       sys_epoll_pwait),      // 281
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_signalfd,          sys_signalfd),         // 282
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_create,    sys_timerfd_create),   // 283
1051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_eventfd,           sys_eventfd),          // 284
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fallocate,         sys_fallocate),        // 285
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_settime,   sys_timerfd_settime),  // 286
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_gettime,   sys_timerfd_gettime),  // 287
1056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_accept4,           sys_accept4),          // 288
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_signalfd4,         sys_signalfd4),        // 289
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_eventfd2,          sys_eventfd2),         // 290
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_create1,     sys_epoll_create1),    // 291
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_dup3,              sys_dup3),             // 292
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_pipe2,             sys_pipe2),            // 293
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_inotify_init1,     sys_inotify_init1),    // 294
1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_preadv,            sys_preadv),           // 295
1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_pwritev,           sys_pwritev),          // 296
1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 297
1068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_perf_event_open,   sys_perf_event_open),  // 298
1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_recvmmsg,          sys_recvmmsg),         // 299
1070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_fanotify_init,     sys_fanotify_init),    // 300
1072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_fanotify_mark,     sys_fanotify_mark),    // 301
1073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_prlimit64,         sys_prlimit64),        // 302
1074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 303
1075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 304
1076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_clock_adjtime,     sys_clock_adjtime),    // 305
1078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//   LINX_(__NR_syncfs,            sys_ni_syscall),       // 306
1079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_sendmmsg,          sys_sendmmsg),         // 307
1080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//   LINX_(__NR_setns,             sys_ni_syscall),       // 308
1081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_getcpu,            sys_getcpu),           // 309
1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_process_vm_readv,  sys_process_vm_readv), // 310
1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINX_(__NR_process_vm_writev, sys_process_vm_writev) // 311
1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const UInt syscall_table_size
1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = sizeof(syscall_table) / sizeof(syscall_table[0]);
1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Is it in the contiguous initial section of the table? */
1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sysno < syscall_table_size) {
1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SyscallTableEntry* sys = &syscall_table[sysno];
1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (sys->before == NULL)
1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return NULL; /* no entry */
1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return sys;
1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Can't find a wrapper */
1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return NULL;
1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_amd64_linux)
1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                                          ---*/
1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1110