1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Platform-specific syscalls stuff.      syswrap-arm-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
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2008-2013 Evan Geller
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      gaze@bea.ms
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02111-1307, USA.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_arm_linux)
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_basics.h"
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vki.h"
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vkiscnums.h"
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcsetjmp.h"    // to keep _threadstate.h happy
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_threadstate.h"
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_aspacemgr.h"
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_debuglog.h"
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcbase.h"
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcassert.h"
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcprint.h"
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcproc.h"
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcsignal.h"
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_options.h"
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_scheduler.h"
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_sigframe.h"      // For VG_(sigframe_destroy)()
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_signals.h"
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syscall.h"
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syswrap.h"
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_tooliface.h"
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_stacks.h"        // VG_(register_stack)
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_transtab.h"      // VG_(discard_translations)
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_types_n_macros.h"
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-generic.h"   /* for decls of generic wrappers */
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-linux.h"     /* for decls of linux-ish wrappers */
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-main.h"
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   clone() handling
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Call f(arg1), but first switch stacks, using 'stack' as the new
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   stack, and use 'retaddr' as f's return-to address.  Also, clear all
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the integer registers before entering f.*/
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noreturn))
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ML_(call_on_new_stack_0_1) ( Addr stack,
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  Addr retaddr,
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  void (*f)(Word),
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  Word arg1 );
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//    r0 = stack
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//    r1 = retaddr
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//    r2 = f
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//    r3 = arg1
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm(
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".text\n"
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".globl vgModuleLocal_call_on_new_stack_0_1\n"
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"vgModuleLocal_call_on_new_stack_0_1:\n"
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    sp,r0\n\t" /* Stack pointer */
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    lr,r1\n\t" /* Return address */
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r0,r3\n\t" /* First argument */
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   push   {r2}\n\t"  /* So we can ret to the new dest */
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r1, #0\n\t" /* Clear our GPRs */
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r2, #0\n\t"
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r3, #0\n\t"
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r4, #0\n\t"
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r5, #0\n\t"
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r6, #0\n\t"
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r7, #0\n\t"
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r8, #0\n\t"
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r9, #0\n\t"
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r10, #0\n\t"
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r11, #0\n\t"
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov    r12, #0\n\t"
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   pop    {pc}\n\t"  /* Herrre we go! */
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".previous\n"
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown);
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_CLONE        VG_STRINGIFY(__NR_clone)
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_EXIT         VG_STRINGIFY(__NR_exit)
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong do_syscall_clone_arm_linux   ( Word (*fn)(void *),
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     void* stack,
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     Int   flags,
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     void* arg,
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     Int*  child_tid,
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     Int*  parent_tid,
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     void* tls );
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm(
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".text\n"
117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng".globl do_syscall_clone_arm_linux\n"
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"do_syscall_clone_arm_linux:\n"
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*Setup child stack */
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   str     r0, [r1, #-4]!\n"
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   str     r3, [r1, #-4]!\n"
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   push {r4,r7}\n"
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov r0, r2\n" /* arg1: flags */
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* r1 (arg2) is already our child's stack */
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   ldr r2, [sp, #12]\n" // parent tid
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   ldr r3, [sp, #16]\n" // tls
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   ldr r4, [sp, #8]\n" // Child tid
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov r7, #"__NR_CLONE"\n"
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   svc 0x00000000\n"
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   cmp r0, #0\n"
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   beq 1f\n"
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Parent */
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   pop {r4,r7}\n"
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   bx lr\n"
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"1:\n" /*child*/
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov     lr, pc\n"
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   pop     {r0,pc}\n"
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Retval from child is already in r0 */
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov r7, #"__NR_EXIT"\n"
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   svc 0x00000000\n"
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Urh.. why did exit return? */
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   .long 0\n"
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   .previous\n"
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown);
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_CLONE
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_EXIT
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// forward declarations
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void setup_child ( ThreadArchState*, ThreadArchState* );
154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void assign_guest_tls(ThreadId ctid, Addr tlsptr);
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes sys_set_tls ( ThreadId tid, Addr tlsptr );
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   When a client clones, we need to keep track of the new thread.  This means:
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   1. allocate a ThreadId+ThreadState+stack for the the thread
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   2. initialize the thread's new VCPU state
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   3. create the thread using the same args as the client requested,
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   but using the scheduler entrypoint for IP, and a separate stack
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for SP.
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes do_clone ( ThreadId ptid,
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt flags, Addr sp,
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Int *parent_tidptr,
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Int *child_tidptr,
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Addr child_tls)
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const Bool debug = False;
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId ctid = VG_(alloc_ThreadState)();
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* ptst = VG_(get_ThreadState)(ptid);
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* ctst = VG_(get_ThreadState)(ctid);
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt r0;
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UWord *stack;
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NSegment const* seg;
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes res;
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_sigset_t blockall, savedmask;
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigfillset)(&blockall);
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(ptid));
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(ctid));
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   stack = (UWord*)ML_(allocstack)(ctid);
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if(stack == NULL) {
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto out;
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   setup_child( &ctst->arch, &ptst->arch );
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->arch.vex.guest_R0 = 0;
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if(sp != 0)
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->arch.vex.guest_R13 = sp;
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->os_state.parent = ptid;
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->sig_mask = ptst->sig_mask;
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->tmp_sig_mask = ptst->sig_mask;
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Start the child with its threadgroup being the same as the
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      parent's.  This is so that any exit_group calls that happen
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      after the child is created but before it sets its
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      os_state.threadgroup field for real (in thread_wrapper in
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      syswrap-linux.c), really kill the new thread.  a.k.a this avoids
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      a race condition in which the thread is unkillable (via
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit_group) because its threadgroup is not set.  The race window
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      is probably only a few hundred or a few thousand cycles long.
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      See #226116. */
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->os_state.threadgroup = ptst->os_state.threadgroup;
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   seg = VG_(am_find_nsegment)((Addr)sp);
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (seg && seg->kind != SkResvn) {
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp);
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (debug)
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n",
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ctid, seg->start, VG_PGROUNDUP(sp));
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "!? New thread %d starts with sp+%#lx) unmapped\n", ctid, sp);
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_szB  = 0;
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vg_assert(VG_(owns_BigLock_LL)(ptid));
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_TRACK ( pre_thread_ll_create, ptid, ctid );
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (flags & VKI_CLONE_SETTLS) {
237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Just assign the tls pointer in the guest TPIDRURO. */
238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      assign_guest_tls(ctid, child_tls);
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags &= ~VKI_CLONE_SETTLS;
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r0 = do_syscall_clone_arm_linux(
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid],
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      child_tidptr, parent_tidptr, NULL
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //VG_(printf)("AFTER SYSCALL, %x and %x  CHILD: %d PARENT: %d\n",child_tidptr, parent_tidptr,*child_tidptr,*parent_tidptr);
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = VG_(mk_SysRes_arm_linux)( r0 );
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownout:
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sr_isError(res)) {
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(cleanup_thread)(&ctst->arch);
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->status = VgTs_Empty;
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_TRACK( pre_thread_ll_exit, ctid );
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   More thread stuff
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// ARM doesn't have any architecture specific thread stuff that
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// needs to be cleaned up
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(cleanup_thread) ( ThreadArchState* arch )
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid setup_child ( /*OUT*/ ThreadArchState *child,
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   /*IN*/  ThreadArchState *parent )
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex = parent->vex;
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex_shadow1 = parent->vex_shadow1;
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex_shadow2 = parent->vex_shadow2;
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void assign_guest_tls(ThreadId tid, Addr tlsptr)
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(threads)[tid].arch.vex.guest_TPIDRURO = tlsptr;
288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Assigns tlsptr to the guest TPIDRURO.
291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   If needed for the specific hardware, really executes
292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   the set_tls syscall.
293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/
294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic SysRes sys_set_tls ( ThreadId tid, Addr tlsptr )
295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign_guest_tls(tid, tlsptr);
297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined(ANDROID_HARDWARE_emulator)
298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Android emulator does not provide an hw tls register.
299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      So, the tls register is emulated by the kernel.
300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      This emulated value is set by the __NR_ARM_set_tls syscall.
301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      The emulated value must be read by the kernel helper function
302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      located at 0xffff0fe0.
303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      The emulated tlsptr is located at 0xffff0ff0
305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      (so slightly after the kernel helper function).
306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Note that applications are not supposed to read this directly.
307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      For compatibility : if there is a hw tls register, the kernel
309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      will put at 0xffff0fe0 the instructions to read it, so
310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      as to have old applications calling the kernel helper
311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      working properly.
312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      For having emulated guest TLS working correctly with
314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Valgrind, it is needed to execute the syscall to set
315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      the emulated TLS value in addition to the assignment
316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      of TPIDRURO.
317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Note: the below means that if we need thread local storage
319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for Valgrind host, then there will be a conflict between
320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      the need of the guest tls and of the host tls.
321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      If all the guest code would cleanly call 0xffff0fe0,
322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      then we might maybe intercept this. However, at least
323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __libc_preinit reads directly 0xffff0ff0.
324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   */
325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* ??? might call the below if auxv->u.a_val & VKI_HWCAP_TLS ???
326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Unclear if real hardware having tls hw register sets
327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      VKI_HWCAP_TLS. */
328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return VG_(do_syscall1) (__NR_ARM_set_tls, tlsptr);
329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#else
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return VG_(mk_SysRes_Success)( 0 );
331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE/POST wrappers for arm/Linux-specific syscalls
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE(name)       DEFN_PRE_TEMPLATE(arm_linux, name)
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST(name)      DEFN_POST_TEMPLATE(arm_linux, name)
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add prototypes for the wrappers declared here, so that gcc doesn't
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   harass us for not having prototypes.  Really this is a kludge --
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the right thing to do is to make these wrappers 'static' since they
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   aren't visible outside this file, but that requires even more macro
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   magic. */
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_mmap2);
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_stat64);
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_lstat64);
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_fstatat64);
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_fstat64);
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_clone);
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_sigreturn);
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_rt_sigreturn);
355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(arm_linux, sys_sigsuspend);
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_set_tls);
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_cacheflush);
358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(arm_linux, sys_ptrace);
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mmap2)
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Exactly like old_mmap() except:
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //  - all 6 args are passed in regs, rather than in a memory-block.
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //  - the file offset is specified in pagesize units rather than bytes,
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //    so that it can be used for files bigger than 2^32 bytes.
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // pagesize or 4K-size units in offset?  For ppc32/64-linux, this is
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // 4K-sized.  Assert that the page size is 4K here for safety.
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VKI_PAGE_SIZE == 4096);
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mmap2 ( %#lx, %llu, %ld, %ld, %ld, %ld )",
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "mmap2",
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, start, unsigned long, length,
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, prot,  unsigned long, flags,
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, fd,    unsigned long, offset);
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       4096 * (Off64T)ARG6 );
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// XXX: lstat64/fstat64/stat64 are generic, but not necessarily
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// applicable to every architecture -- I think only to 32-bit archs.
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// We're going to need something like linux/core_os32.h for such
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// things, eventually, I think.  --njn
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_lstat64)
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_lstat64 ( %#lx(%s), %#lx )",ARG1,(char*)ARG1,ARG2);
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_lstat64)
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0) {
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_stat64)
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_stat64 ( %#lx(%s), %#lx )",ARG1,(char*)ARG1,ARG2);
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_stat64)
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fstatat64)
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fstatat64 ( %ld, %#lx(%s), %#lx )",ARG1,ARG2,(char*)ARG2,ARG3);
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "fstatat64",
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, char *, file_name, struct stat64 *, buf);
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "fstatat64(file_name)", ARG2 );
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "fstatat64(buf)", ARG3, sizeof(struct vki_stat64) );
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_fstatat64)
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) );
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fstat64)
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fstat64 ( %ld, %#lx )",ARG1,ARG2);
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_fstat64)
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clone)
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    UInt cloneflags;
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(int, "clone",
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, flags,
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, child_stack,
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int *, parent_tidptr,
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, child_tls,
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int *, child_tidptr);
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & VKI_CLONE_PARENT_SETTID) {
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                             VKI_PROT_WRITE)) {
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int),
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                             VKI_PROT_WRITE)) {
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & VKI_CLONE_SETTLS) {
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("clone(tls_user_desc)", ARG4, sizeof(vki_modify_ldt_t));
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG4, sizeof(vki_modify_ldt_t),
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                             VKI_PROT_READ)) {
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cloneflags = ARG1;
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Only look at the flags we really care about */
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* thread creation */
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         do_clone(tid,
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG1,         /* flags */
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)ARG2,   /* child ESP */
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Int *)ARG3,  /* parent_tidptr */
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Int *)ARG5,  /* child_tidptr */
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)ARG4)); /* set_tls */
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* FALLTHROUGH - assume vfork == fork */
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 0: /* plain fork */
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(do_fork_clone)(tid,
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       cloneflags,      /* flags */
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Int *)ARG3,     /* parent_tidptr */
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Int *)ARG5));   /* child_tidptr */
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* should we just ENOSYS? */
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "");
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx", ARG1);
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "");
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "The only supported clone() uses are:");
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)");
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork");
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, " - for the Quadrics Elan3 user-space driver");
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(unimplemented)
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ("Valgrind does not support general clone().");
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS) {
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG1 & VKI_CLONE_PARENT_SETTID)
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG3, sizeof(Int));
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG5, sizeof(Int));
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Thread creation was successful; let the child have the chance
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         to run */
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfYieldAfter;
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sigreturn)
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     an explanation of what follows. */
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sigreturn ( )");
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Restore register state from frame and remove it */
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigframe_destroy)(tid, False);
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell the driver not to update the guest state with the "result",
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      and set a bogus result to keep it happy. */
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfNoWriteResult;
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if any signals arose as a result of this. */
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfPollAfter;
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigreturn)
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      an explanation of what follows. */
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("rt_sigreturn ( )");
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Restore register state from frame and remove it */
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigframe_destroy)(tid, True);
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell the driver not to update the guest state with the "result",
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      and set a bogus result to keep it happy. */
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfNoWriteResult;
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if any signals arose as a result of this. */
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfPollAfter;
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* NB: clone of x86-linux version, and ppc32-linux has an almost
584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   identical one. */
585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_sigsuspend)
586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The C library interface to sigsuspend just takes a pointer to
588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      a signal mask but this system call has three arguments - the first
589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      two don't appear to be used by the kernel and are always passed as
590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      zero by glibc and the third is the first word of the signal mask
591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      so only 32 signals are supported.
592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      In fact glibc normally uses rt_sigsuspend if it is available as
594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      that takes a pointer to the signal mask so supports more signals.
595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    */
596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfMayBlock;
597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_sigsuspend ( %ld, %ld, %ld )", ARG1,ARG2,ARG3 );
598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ3(int, "sigsuspend",
599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 int, history0, int, history1,
600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 vki_old_sigset_t, mask);
601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Very much ARM specific */
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_set_tls)
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("set_tls (%lx)",ARG1);
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "set_tls", unsigned long, addr);
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes( sys_set_tls( tid, ARG1 ) );
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_cacheflush)
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("cacheflush (%lx, %#lx, %#lx)",ARG1,ARG2,ARG3);
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "cacheflush", void*, addrlow,void*, addrhigh,int, flags);
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(discard_translations)( (Addr64)ARG1,
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              ((ULong)ARG2) - ((ULong)ARG1) + 1ULL/*paranoia*/,
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              "PRE(sys_cacheflush)" );
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ARG3 is only used for pointers into the traced process's address
624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// space and for offsets into the traced process's struct
625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// user_regs_struct. It is never a pointer into this process's memory
626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// space, and we should therefore not check anything it points to.
627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_ptrace)
628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ4(int, "ptrace",
631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 long, request, long, pid, long, addr, long, data);
632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (ARG1) {
633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKTEXT:
634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKDATA:
635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKUSR:
636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(peek)", ARG4,
637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     sizeof (long));
638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETREGS:
640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     sizeof (struct vki_user_regs_struct));
642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETFPREGS:
644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     sizeof (struct vki_user_fp));
646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETWMMXREGS:
648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getwmmxregs)", ARG4,
649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     VKI_IWMMXT_SIZE);
650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETCRUNCHREGS:
652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getcrunchregs)", ARG4,
653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     VKI_CRUNCH_SIZE);
654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETVFPREGS:
656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getvfpregs)", ARG4,
657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     sizeof (struct vki_user_vfp) );
658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETHBPREGS:
660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(gethbpregs)", ARG4,
661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     sizeof (unsigned long) );
662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETREGS:
664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setregs)", ARG4,
665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     sizeof (struct vki_user_regs_struct));
666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETFPREGS:
668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     sizeof (struct vki_user_fp));
670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETWMMXREGS:
672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setwmmxregs)", ARG4,
673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     VKI_IWMMXT_SIZE);
674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETCRUNCHREGS:
676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setcrunchregs)", ARG4,
677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     VKI_CRUNCH_SIZE);
678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETVFPREGS:
680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setvfpregs)", ARG4,
681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     sizeof (struct vki_user_vfp));
682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETHBPREGS:
684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(sethbpregs)", ARG4, sizeof(unsigned long));
685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GET_THREAD_AREA:
687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(get_thread_area)", ARG4, sizeof(unsigned long));
688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETEVENTMSG:
690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long));
691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETSIGINFO:
693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t));
694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETSIGINFO:
696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t));
697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_PTRACE_GETREGSET:
699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_PRE_getregset)(tid, ARG3, ARG4);
700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_PTRACE_SETREGSET:
702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_PRE_setregset)(tid, ARG3, ARG4);
703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(sys_ptrace)
710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (ARG1) {
712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKTEXT:
713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKDATA:
714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKUSR:
715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof (long));
716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETREGS:
718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETFPREGS:
721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof (struct vki_user_fp));
722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETWMMXREGS:
724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, VKI_IWMMXT_SIZE);
725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETCRUNCHREGS:
727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, VKI_CRUNCH_SIZE);
728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETVFPREGS:
730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof(struct vki_user_vfp));
731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GET_THREAD_AREA:
733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETHBPREGS:
734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETEVENTMSG:
735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof(unsigned long));
736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETSIGINFO:
738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* XXX: This is a simplification. Different parts of the
739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * siginfo_t are valid depending on the type of signal.
740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       */
741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t));
742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case VKI_PTRACE_GETREGSET:
744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ML_(linux_POST_getregset)(tid, ARG3, ARG4);
745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef PRE
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef POST
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The arm/Linux syscall table
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_OABI_SYSCALL_BASE 0x900000
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_OABI_SYSCALL_BASE 0x0
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAX_(sysno, name)    WRAPPER_ENTRY_X_(arm_linux, sysno, name)
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAXY(sysno, name)    WRAPPER_ENTRY_XY(arm_linux, sysno, name)
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This table maps from __NR_xxx syscall numbers (from
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/include/asm-arm/unistd.h) to the appropriate PRE/POST sys_foo()
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// wrappers on arm (as per sys_call_table in linux/arch/arm/kernel/entry.S).
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// For those syscalls not handled by Valgrind, the annotation indicate its
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// (unknown).
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry syscall_main_table[] = {
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (restart_syscall)                             // 0
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_exit,              sys_exit),           // 1
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fork,              sys_fork),           // 2
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_read,              sys_read),           // 3
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_write,             sys_write),          // 4
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_open,              sys_open),           // 5
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_close,             sys_close),          // 6
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENXY(__NR_waitpid,           sys_waitpid),        // 7
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_creat,             sys_creat),          // 8
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_link,              sys_link),           // 9
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_unlink,            sys_unlink),         // 10
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_execve,            sys_execve),         // 11
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chdir,             sys_chdir),          // 12
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_time,              sys_time),           // 13
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mknod,             sys_mknod),          // 14
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chmod,             sys_chmod),          // 15
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    LINX_(__NR_lchown,            sys_lchown16),       // 16
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_break,             sys_ni_syscall),     // 17
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_oldstat,           sys_stat),           // 18 (obsolete)
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lseek,             sys_lseek),          // 19
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpid,            sys_getpid),         // 20
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mount,             sys_mount),          // 21
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_umount,            sys_oldumount),      // 22
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setuid,            sys_setuid16),       // 23 ## P
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_getuid,            sys_getuid16),       // 24 ## P
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_stime,             sys_stime),          // 25 * (SVr4,SVID,X/OPEN)
807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAXY(__NR_ptrace,            sys_ptrace),         // 26
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_alarm,             sys_alarm),          // 27
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_oldfstat,          sys_fstat),          // 28 * L -- obsolete
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pause,             sys_pause),          // 29
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_utime,             sys_utime),          // 30
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_stty,              sys_ni_syscall),     // 31
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_gtty,              sys_ni_syscall),     // 32
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_access,            sys_access),         // 33
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_nice,              sys_nice),           // 34
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_ftime,             sys_ni_syscall),     // 35
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_sync,              sys_sync),           // 36
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_kill,              sys_kill),           // 37
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rename,            sys_rename),         // 38
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mkdir,             sys_mkdir),          // 39
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rmdir,             sys_rmdir),          // 40
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup,               sys_dup),            // 41
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_pipe,              sys_pipe),           // 42
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_times,             sys_times),          // 43
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_prof,              sys_ni_syscall),     // 44
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_brk,               sys_brk),            // 45
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setgid,            sys_setgid16),       // 46
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_getgid,            sys_getgid16),       // 47
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_signal,            sys_signal),         // 48 */* (ANSI C)
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_geteuid,           sys_geteuid16),      // 49
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_getegid,           sys_getegid16),      // 50
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_acct,              sys_acct),           // 51
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_umount2,           sys_umount),         // 52
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_lock,              sys_ni_syscall),     // 53
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_ioctl,             sys_ioctl),          // 54
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fcntl,             sys_fcntl),          // 55
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_mpx,               sys_ni_syscall),     // 56
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpgid,           sys_setpgid),        // 57
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_ulimit,            sys_ni_syscall),     // 58
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_oldolduname,       sys_olduname),       // 59 Linux -- obsolete
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_umask,             sys_umask),          // 60
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chroot,            sys_chroot),         // 61
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_ustat,             sys_ustat)           // 62 SVr4 -- deprecated
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup2,              sys_dup2),           // 63
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getppid,           sys_getppid),        // 64
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpgrp,           sys_getpgrp),        // 65
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setsid,            sys_setsid),         // 66
856d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   LINXY(__NR_sigaction,         sys_sigaction),      // 67
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_sgetmask,          sys_sgetmask),       // 68 */* (ANSI C)
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_ssetmask,          sys_ssetmask),       // 69 */* (ANSI C)
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setreuid,          sys_setreuid16),     // 70
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setregid,          sys_setregid16),     // 71
862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAX_(__NR_sigsuspend,        sys_sigsuspend),     // 72
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sigpending,        sys_sigpending),     // 73
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_sethostname,       sys_sethostname),    // 74 */*
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setrlimit,         sys_setrlimit),      // 75
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getrlimit,         sys_old_getrlimit),  // 76
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getrusage,         sys_getrusage),      // 77
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_gettimeofday,      sys_gettimeofday),   // 78
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_settimeofday,      sys_settimeofday),   // 79
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getgroups,         sys_getgroups16),    // 80
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setgroups,         sys_setgroups16),    // 81
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAX_(__NR_select,            old_select),         // 82
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_symlink,           sys_symlink),        // 83
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_oldlstat,          sys_lstat),          // 84 -- obsolete
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_readlink,          sys_readlink),       // 85
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_uselib,            sys_uselib),         // 86 */Linux
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_swapon,            sys_swapon),         // 87 */Linux
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_reboot,            sys_reboot),         // 88 */Linux
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_readdir,           old_readdir),        // 89 -- superseded
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   _____(__NR_mmap,              old_mmap),           // 90
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_munmap,            sys_munmap),         // 91
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_truncate,          sys_truncate),       // 92
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_ftruncate,         sys_ftruncate),      // 93
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchmod,            sys_fchmod),         // 94
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchown,            sys_fchown16),       // 95
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpriority,       sys_getpriority),    // 96
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpriority,       sys_setpriority),    // 97
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_profil,            sys_ni_syscall),     // 98
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_statfs,            sys_statfs),         // 99
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstatfs,           sys_fstatfs),        // 100
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_ioperm,            sys_ioperm),         // 101
898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_socketcall,        sys_socketcall),     // 102
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_syslog,            sys_syslog),         // 103
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_setitimer,         sys_setitimer),      // 104
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getitimer,         sys_getitimer),      // 105
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_stat,              sys_newstat),        // 106
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_lstat,             sys_newlstat),       // 107
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstat,             sys_newfstat),       // 108
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_olduname,          sys_uname),          // 109 -- obsolete
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_iopl,              sys_iopl),           // 110
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_vhangup,           sys_vhangup),        // 111
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_idle,              sys_ni_syscall),     // 112
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// PLAXY(__NR_vm86old,           sys_vm86old),        // 113 __NR_syscall... weird
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_wait4,             sys_wait4),          // 114
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_swapoff,           sys_swapoff),        // 115 */Linux
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sysinfo,           sys_sysinfo),        // 116
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   _____(__NR_ipc,               sys_ipc),            // 117
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fsync,             sys_fsync),          // 118
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_sigreturn,         sys_sigreturn),      // 119 ?/Linux
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_clone,             sys_clone),          // 120
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_setdomainname,     sys_setdomainname),  // 121 */*(?)
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_uname,             sys_newuname),       // 122
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAX_(__NR_modify_ldt,        sys_modify_ldt),     // 123
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    LINXY(__NR_adjtimex,          sys_adjtimex),       // 124
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_mprotect,          sys_mprotect),       // 125
927d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   LINXY(__NR_sigprocmask,       sys_sigprocmask),    // 126
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    // Nb: create_module() was removed 2.4-->2.6
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_create_module,     sys_ni_syscall),     // 127
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_init_module,       sys_init_module),    // 128
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_delete_module,     sys_delete_module),  // 129
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    // Nb: get_kernel_syms() was removed 2.4-->2.6
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_get_kernel_syms,   sys_ni_syscall),     // 130
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_quotactl,          sys_quotactl),       // 131
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpgid,           sys_getpgid),        // 132
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchdir,            sys_fchdir),         // 133
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_bdflush,           sys_bdflush),        // 134 */Linux
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_sysfs,             sys_sysfs),          // 135 SVr4
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_personality,       sys_personality),    // 136
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_afs_syscall,       sys_ni_syscall),     // 137
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsuid,          sys_setfsuid16),     // 138
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsgid,          sys_setfsgid16),     // 139
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR__llseek,           sys_llseek),         // 140
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getdents,          sys_getdents),       // 141
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR__newselect,        sys_select),         // 142
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_flock,             sys_flock),          // 143
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_msync,             sys_msync),          // 144
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_readv,             sys_readv),          // 145
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_writev,            sys_writev),         // 146
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getsid,            sys_getsid),         // 147
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fdatasync,         sys_fdatasync),      // 148
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR__sysctl,           sys_sysctl),         // 149
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mlock,             sys_mlock),          // 150
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_munlock,           sys_munlock),        // 151
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mlockall,          sys_mlockall),       // 152
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_munlockall,        sys_munlockall),     // 153
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_setparam,    sys_sched_setparam), // 154
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_getparam,         sys_sched_getparam),        // 155
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_setscheduler,     sys_sched_setscheduler),    // 156
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_getscheduler,     sys_sched_getscheduler),    // 157
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_yield,            sys_sched_yield),           // 158
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //LINX?(__NR_sched_rr_get_interval,  sys_sched_rr_get_interval), // 161 */*
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_nanosleep,         sys_nanosleep),      // 162
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mremap,            sys_mremap),         // 163
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresuid,         sys_setresuid16),    // 164
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresuid,         sys_getresuid16),    // 165
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAXY(__NR_vm86,              sys_vm86),           // 166 x86/Linux-only
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_query_module,      sys_ni_syscall),     // 167
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_poll,              sys_poll),           // 168
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_nfsservctl,        sys_nfsservctl),     // 169 */Linux
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresgid,         sys_setresgid16),    // 170
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresgid,         sys_getresgid16),    // 171
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_prctl,             sys_prctl),          // 172
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_rt_sigreturn,      sys_rt_sigreturn),   // 173
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigaction,      sys_rt_sigaction),   // 174
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigprocmask,    sys_rt_sigprocmask), // 175
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigpending,     sys_rt_sigpending),  // 176
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigtimedwait,   sys_rt_sigtimedwait),// 177
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigqueueinfo,   sys_rt_sigqueueinfo),// 178
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_rt_sigsuspend,     sys_rt_sigsuspend),  // 179
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_pread64,           sys_pread64),        // 180
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pwrite64,          sys_pwrite64),       // 181
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_chown,             sys_chown16),        // 182
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getcwd,            sys_getcwd),         // 183
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_capget,            sys_capget),         // 184
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_capset,            sys_capset),         // 185
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_sigaltstack,       sys_sigaltstack),    // 186
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sendfile,          sys_sendfile),       // 187
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENXY(__NR_getpmsg,           sys_getpmsg),        // 188
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_putpmsg,           sys_putpmsg),        // 189
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Nb: we treat vfork as fork
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_vfork,             sys_fork),           // 190
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_ugetrlimit,        sys_getrlimit),      // 191
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_mmap2,             sys_mmap2),          // 192
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_truncate64,        sys_truncate64),     // 193
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_ftruncate64,       sys_ftruncate64),    // 194
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_stat64,            sys_stat64),         // 195
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_lstat64,           sys_lstat64),        // 196
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_fstat64,           sys_fstat64),        // 197
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_lchown32,          sys_lchown),         // 198
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getuid32,          sys_getuid),         // 199
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getgid32,          sys_getgid),         // 200
1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_geteuid32,         sys_geteuid),        // 201
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getegid32,         sys_getegid),        // 202
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setreuid32,        sys_setreuid),       // 203
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setregid32,        sys_setregid),       // 204
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getgroups32,       sys_getgroups),      // 205
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setgroups32,       sys_setgroups),      // 206
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchown32,          sys_fchown),         // 207
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresuid32,       sys_setresuid),      // 208
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresuid32,       sys_getresuid),      // 209
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresgid32,       sys_setresgid),      // 210
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresgid32,       sys_getresgid),      // 211
1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chown32,           sys_chown),          // 212
1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setuid32,          sys_setuid),         // 213
1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setgid32,          sys_setgid),         // 214
1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsuid32,        sys_setfsuid),       // 215
1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsgid32,        sys_setfsgid),       // 216
1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_pivot_root,        sys_pivot_root),     // 217 */Linux
1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_mincore,           sys_mincore),        // 218
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_madvise,           sys_madvise),        // 219
1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getdents64,        sys_getdents64),     // 220
1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fcntl64,           sys_fcntl64),        // 221
1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(222,                    sys_ni_syscall),     // 222
1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAXY(223,                    sys_syscall223),     // 223 // sys_bproc?
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_gettid,            sys_gettid),         // 224
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_readahead,         sys_readahead),      // 225 */Linux
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setxattr,          sys_setxattr),       // 226
1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lsetxattr,         sys_lsetxattr),      // 227
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fsetxattr,         sys_fsetxattr),      // 228
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getxattr,          sys_getxattr),       // 229
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_lgetxattr,         sys_lgetxattr),      // 230
1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fgetxattr,         sys_fgetxattr),      // 231
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_listxattr,         sys_listxattr),      // 232
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_llistxattr,        sys_llistxattr),     // 233
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_flistxattr,        sys_flistxattr),     // 234
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_removexattr,       sys_removexattr),    // 235
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lremovexattr,      sys_lremovexattr),   // 236
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fremovexattr,      sys_fremovexattr),   // 237
1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_tkill,             sys_tkill),          // 238 */Linux
1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sendfile64,        sys_sendfile64),     // 239
1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_futex,             sys_futex),             // 240
1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 241
1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 242
1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAX_(__NR_set_thread_area,   sys_set_thread_area),   // 243
1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAX_(__NR_get_thread_area,   sys_get_thread_area),   // 244
1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_setup,          sys_io_setup),       // 245
1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_io_destroy,        sys_io_destroy),     // 246
1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_getevents,      sys_io_getevents),   // 247
1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_io_submit,         sys_io_submit),      // 248
1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_cancel,         sys_io_cancel),      // 249
1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_fadvise64,         sys_fadvise64),      // 250 */(Linux?)
1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(251,                    sys_ni_syscall),     // 251
1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_exit_group,        sys_exit_group),     // 252
1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENXY(__NR_lookup_dcookie,    sys_lookup_dcookie), // 253
1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_create,      sys_epoll_create),   // 254
1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_epoll_ctl,         sys_epoll_ctl),         // 255
1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_wait,        sys_epoll_wait),        // 256
1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_remap_file_pages,  sys_remap_file_pages),  // 257 */Linux
1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_tid_address,   sys_set_tid_address),   // 258
1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_create,      sys_timer_create),      // 259
1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_settime,     sys_timer_settime),  // (timer_create+1)
1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_gettime,     sys_timer_gettime),  // (timer_create+2)
1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_timer_getoverrun,  sys_timer_getoverrun),//(timer_create+3)
1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_timer_delete,      sys_timer_delete),   // (timer_create+4)
1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_clock_settime,     sys_clock_settime),  // (timer_create+5)
1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_gettime,     sys_clock_gettime),  // (timer_create+6)
1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_getres,      sys_clock_getres),   // (timer_create+7)
1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_nanosleep,   sys_clock_nanosleep),// (timer_create+8) */*
1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_statfs64,          sys_statfs64),       // 268
1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstatfs64,         sys_fstatfs64),      // 269
1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_tgkill,            sys_tgkill),         // 270 */Linux
1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_utimes,            sys_utimes),         // 271
1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_fadvise64_64,      sys_fadvise64_64),   // 272 */(Linux?)
1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_vserver,           sys_ni_syscall),     // 273
1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mbind,             sys_mbind),          // 274 ?/?
1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_get_mempolicy,     sys_get_mempolicy),  // 275 ?/?
1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_mempolicy,     sys_set_mempolicy),  // 276 ?/?
1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_open,           sys_mq_open),        // 277
1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_unlink,         sys_mq_unlink),      // (mq_open+1)
1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_timedsend,      sys_mq_timedsend),   // (mq_open+2)
1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_timedreceive,   sys_mq_timedreceive),// (mq_open+3)
1116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_notify,         sys_mq_notify),      // (mq_open+4)
1117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_getsetattr,     sys_mq_getsetattr),  // (mq_open+5)
1118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_waitid,            sys_waitid),         // 280
1119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_socket,            sys_socket),         // 281
1121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_bind,              sys_bind),           // 282
1122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_connect,           sys_connect),        // 283
1123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_listen,            sys_listen),         // 284
1124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_accept,            sys_accept),         // 285
1125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_getsockname,       sys_getsockname),    // 286
1126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_getpeername,       sys_getpeername),    // 287
1127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_socketpair,        sys_socketpair),     // 288
1128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_send,              sys_send),
1129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_sendto,            sys_sendto),         // 290
1130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_recv,              sys_recv),
1131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_recvfrom,          sys_recvfrom),       // 292
1132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_shutdown,          sys_shutdown),       // 293
1133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_setsockopt,        sys_setsockopt),     // 294
1134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_getsockopt,        sys_getsockopt),     // 295
1135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_sendmsg,           sys_sendmsg),        // 296
1136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_recvmsg,           sys_recvmsg),        // 297
1137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_semop,             sys_semop),          // 298
1138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_semget,            sys_semget),         // 299
1139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_semctl,            sys_semctl),         // 300
1140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_msgget,            sys_msgget),
1141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_msgsnd,            sys_msgsnd),
1142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_msgrcv,            sys_msgrcv),
1143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_msgctl,            sys_msgctl),         // 304
1144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_semtimedop,        sys_semtimedop),     // 312
1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_add_key,           sys_add_key),        // 286
1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_request_key,       sys_request_key),    // 287
1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_keyctl,            sys_keyctl),         // not 288...
1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_ioprio_set,        sys_ioprio_set),     // 289
1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_ioprio_get,        sys_ioprio_get),     // 290
1152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_init,    sys_inotify_init),   // 291
1153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 292
1154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_rm_watch,    sys_inotify_rm_watch), // 293
1155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_migrate_pages,    sys_migrate_pages),    // 294
1156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_openat,       sys_openat),           // 295
1158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mkdirat,       sys_mkdirat),          // 296
1159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mknodat,       sys_mknodat),          // 297
1160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchownat,       sys_fchownat),         // 298
1161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_futimesat,    sys_futimesat),        // 326 on arm
1162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_fstatat64,    sys_fstatat64),        // 300
1164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_unlinkat,       sys_unlinkat),         // 301
1165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_renameat,       sys_renameat),         // 302
1166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_linkat,       sys_linkat),           // 303
1167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_symlinkat,    sys_symlinkat),        // 304
1168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_readlinkat,    sys_readlinkat),       //
1170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchmodat,       sys_fchmodat),         //
1171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_faccessat,    sys_faccessat),        //
1172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_shmat,         wrap_sys_shmat),       //305
1173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_shmdt,             sys_shmdt),          //306
1174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_shmget,            sys_shmget),         //307
1175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_shmctl,            sys_shmctl),         // 308
1176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_pselect6,       sys_pselect6),         //
1177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_unshare,       sys_unshare),          // 310
1179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_robust_list,    sys_set_robust_list),  // 311
1180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_get_robust_list,    sys_get_robust_list),  // 312
1181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_splice,            sys_ni_syscall),       // 313
1182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_sync_file_range,   sys_sync_file_range),  // 314
1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_tee,               sys_ni_syscall),       // 315
1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_vmsplice,          sys_ni_syscall),       // 316
1186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_move_pages,        sys_move_pages),       // 317
1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_getcpu,            sys_ni_syscall),       // 318
1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_utimensat,         sys_utimensat),        // 320
1190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_signalfd,          sys_signalfd),         // 321
1191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_create,    sys_timerfd_create),   // 322
1192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_eventfd,           sys_eventfd),          // 323
1193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_settime,   sys_timerfd_settime),  // 325
1195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_gettime,   sys_timerfd_gettime),   // 326
1196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ///////////////
1198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // JRS 2010-Jan-03: I believe that all the numbers listed
1200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // in comments in the table prior to this point (eg "// 326",
1201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // etc) are bogus since it looks to me like they are copied
1202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // verbatim from syswrap-x86-linux.c and they certainly do not
1203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // correspond to what's in include/vki/vki-scnums-arm-linux.h.
1204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // From here onwards, please ensure the numbers are correct.
1205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_pselect6,          sys_pselect6),         // 335
1207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_ppoll,             sys_ppoll),            // 336
1208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_epoll_pwait,       sys_epoll_pwait),      // 346
1210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINX_(__NR_fallocate,         sys_fallocate),        // 352
1212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_signalfd4,         sys_signalfd4),        // 355
1214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_eventfd2,          sys_eventfd2),         // 356
1215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_epoll_create1,     sys_epoll_create1),    // 357
1216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_dup3,              sys_dup3),             // 358
1217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_pipe2,             sys_pipe2),            // 359
1218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_inotify_init1,     sys_inotify_init1),    // 360
1219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_preadv,            sys_preadv),           // 361
1220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINX_(__NR_pwritev,           sys_pwritev),          // 362
1221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 363
1222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LINXY(__NR_perf_event_open,   sys_perf_event_open),  // 364
1223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_accept4,           sys_accept4),          // 366
1225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_fanotify_init,     sys_fanotify_init),    // 367
1226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINX_(__NR_fanotify_mark,     sys_fanotify_mark),    // 368
1227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_prlimit64,         sys_prlimit64),        // 369
1228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 370
1229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 371
1230eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   LINXY(__NR_clock_adjtime,     sys_clock_adjtime),    // 372
1231eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   LINXY(__NR_sendmmsg,          sys_sendmmsg)          // 374
1232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* These are not in the main table because there indexes are not small
1236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   integers, but rather values close to one million.  So their
1237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   inclusion would force the main table to be huge (about 8 MB). */
1238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry ste___ARM_set_tls
1240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   = { WRAPPER_PRE_NAME(arm_linux,sys_set_tls), NULL };
1241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry ste___ARM_cacheflush
1243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   = { WRAPPER_PRE_NAME(arm_linux,sys_cacheflush), NULL };
1244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const UInt syscall_main_table_size
1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = sizeof(syscall_main_table) / sizeof(syscall_main_table[0]);
1249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Is it in the contiguous initial section of the table? */
1251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sysno < syscall_main_table_size) {
1252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SyscallTableEntry* sys = &syscall_main_table[sysno];
1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (sys->before == NULL)
1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return NULL; /* no entry */
1255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return sys;
1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check if it's one of the out-of-line entries. */
1260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (sysno) {
1261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case __NR_ARM_set_tls:    return &ste___ARM_set_tls;
1262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case __NR_ARM_cacheflush: return &ste___ARM_cacheflush;
1263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default: break;
1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Can't find a wrapper */
1267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return NULL;
1268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_arm_linux)
1271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                      syswrap-arm-linux.c ---*/
1274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1275