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
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Copyright (C) 2000-2011 Nicholas Nethercote
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      njn@valgrind.org
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Copyright (C) 2008-2011 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"
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"do_syscall_clone_arm_linux:\n"
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*Setup child stack */
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   str     r0, [r1, #-4]!\n"
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   str     r3, [r1, #-4]!\n"
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   push {r4,r7}\n"
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov r0, r2\n" /* arg1: flags */
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* r1 (arg2) is already our child's stack */
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   ldr r2, [sp, #12]\n" // parent tid
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   ldr r3, [sp, #16]\n" // tls
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   ldr r4, [sp, #8]\n" // Child tid
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov r7, #"__NR_CLONE"\n"
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   svc 0x00000000\n"
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   cmp r0, #0\n"
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   beq 1f\n"
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Parent */
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   pop {r4,r7}\n"
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   bx lr\n"
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"1:\n" /*child*/
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov     lr, pc\n"
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   pop     {r0,pc}\n"
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Retval from child is already in r0 */
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   mov r7, #"__NR_EXIT"\n"
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   svc 0x00000000\n"
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Urh.. why did exit return? */
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   .long 0\n"
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"   .previous\n"
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown);
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_CLONE
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __NR_EXIT
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// forward declarations
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void setup_child ( ThreadArchState*, ThreadArchState* );
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes sys_set_tls ( ThreadId tid, Addr tlsptr );
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   When a client clones, we need to keep track of the new thread.  This means:
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   1. allocate a ThreadId+ThreadState+stack for the the thread
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   2. initialize the thread's new VCPU state
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   3. create the thread using the same args as the client requested,
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   but using the scheduler entrypoint for IP, and a separate stack
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for SP.
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes do_clone ( ThreadId ptid,
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt flags, Addr sp,
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Int *parent_tidptr,
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Int *child_tidptr,
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         Addr child_tls)
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const Bool debug = False;
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId ctid = VG_(alloc_ThreadState)();
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* ptst = VG_(get_ThreadState)(ptid);
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* ctst = VG_(get_ThreadState)(ctid);
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt r0;
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UWord *stack;
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NSegment const* seg;
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes res;
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_sigset_t blockall, savedmask;
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigfillset)(&blockall);
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(ptid));
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(ctid));
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   stack = (UWord*)ML_(allocstack)(ctid);
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if(stack == NULL) {
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto out;
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   setup_child( &ctst->arch, &ptst->arch );
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->arch.vex.guest_R0 = 0;
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if(sp != 0)
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->arch.vex.guest_R13 = sp;
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->os_state.parent = ptid;
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->sig_mask = ptst->sig_mask;
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->tmp_sig_mask = ptst->sig_mask;
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Start the child with its threadgroup being the same as the
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      parent's.  This is so that any exit_group calls that happen
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      after the child is created but before it sets its
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      os_state.threadgroup field for real (in thread_wrapper in
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      syswrap-linux.c), really kill the new thread.  a.k.a this avoids
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      a race condition in which the thread is unkillable (via
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit_group) because its threadgroup is not set.  The race window
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      is probably only a few hundred or a few thousand cycles long.
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      See #226116. */
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctst->os_state.threadgroup = ptst->os_state.threadgroup;
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   seg = VG_(am_find_nsegment)((Addr)sp);
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (seg && seg->kind != SkResvn) {
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp);
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (debug)
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n",
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ctid, seg->start, VG_PGROUNDUP(sp));
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "!? New thread %d starts with sp+%#lx) unmapped\n", ctid, sp);
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->client_stack_szB  = 0;
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_TRACK ( pre_thread_ll_create, ptid, ctid );
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (flags & VKI_CLONE_SETTLS) {
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = sys_set_tls(ctid, child_tls);
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (sr_isError(res))
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto out;
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags &= ~VKI_CLONE_SETTLS;
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r0 = do_syscall_clone_arm_linux(
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid],
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      child_tidptr, parent_tidptr, NULL
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //VG_(printf)("AFTER SYSCALL, %x and %x  CHILD: %d PARENT: %d\n",child_tidptr, parent_tidptr,*child_tidptr,*parent_tidptr);
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = VG_(mk_SysRes_arm_linux)( r0 );
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownout:
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sr_isError(res)) {
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(cleanup_thread)(&ctst->arch);
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ctst->status = VgTs_Empty;
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_TRACK( pre_thread_ll_exit, ctid );
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   More thread stuff
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// ARM doesn't have any architecture specific thread stuff that
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// needs to be cleaned up
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(cleanup_thread) ( ThreadArchState* arch )
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid setup_child ( /*OUT*/ ThreadArchState *child,
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   /*IN*/  ThreadArchState *parent )
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex = parent->vex;
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex_shadow1 = parent->vex_shadow1;
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   child->vex_shadow2 = parent->vex_shadow2;
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes sys_set_tls ( ThreadId tid, Addr tlsptr )
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(threads)[tid].arch.vex.guest_TPIDRURO = tlsptr;
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return VG_(mk_SysRes_Success)( 0 );
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE/POST wrappers for arm/Linux-specific syscalls
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE(name)       DEFN_PRE_TEMPLATE(arm_linux, name)
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST(name)      DEFN_POST_TEMPLATE(arm_linux, name)
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add prototypes for the wrappers declared here, so that gcc doesn't
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   harass us for not having prototypes.  Really this is a kludge --
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the right thing to do is to make these wrappers 'static' since they
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   aren't visible outside this file, but that requires even more macro
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   magic. */
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_socketcall);
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_socket);
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_setsockopt);
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_getsockopt);
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_connect);
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_accept);
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_sendto);
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_recvfrom);
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//XXX: Semaphore code ripped from AMD64.
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_semget);
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_semop);
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_semctl);
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_semtimedop);
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//XXX: Shared memory code ripped from AMD64
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, wrap_sys_shmat);
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_shmget);
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_shmdt);
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_shmctl);
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_sendmsg);
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_recvmsg);
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//msg* code from AMD64
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_msgget);
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_msgrcv);
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_msgsnd);
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_msgctl);
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_shutdown);
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_bind);
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_listen);
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_getsockname);
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_getpeername);
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_socketpair);
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_send);
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_recv);
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_mmap2);
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_stat64);
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_lstat64);
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_fstatat64);
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_fstat64);
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_clone);
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_sigreturn);
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_rt_sigreturn);
344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(arm_linux, sys_sigsuspend);
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_set_tls);
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownDECL_TEMPLATE(arm_linux, sys_cacheflush);
347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDECL_TEMPLATE(arm_linux, sys_ptrace);
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_socketcall)
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_0  (((UWord*)ARG2)[0])
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_1  (((UWord*)ARG2)[1])
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_2  (((UWord*)ARG2)[2])
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_3  (((UWord*)ARG2)[3])
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_4  (((UWord*)ARG2)[4])
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_5  (((UWord*)ARG2)[5])
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1 /* request */) {
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_SOCKETPAIR:
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int socketpair(int d, int type, int protocol, int sv[2]); */
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_SOCKET:
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int socket(int domain, int type, int protocol); */
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_BIND:
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int bind(int sockfd, struct sockaddr *my_addr,
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int addrlen); */
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_LISTEN:
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int listen(int s, int backlog); */
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_ACCEPT: {
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int accept(int s, struct sockaddr *addr, int *addrlen); */
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_SENDTO:
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int sendto(int s, const void *msg, int len,
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int flags,
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    const struct sockaddr *to, int tolen); */
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              ARG2_3, ARG2_4, ARG2_5 );
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_SEND:
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int send(int s, const void *msg, size_t len, int flags); */
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_RECVFROM:
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int recvfrom(int s, void *buf, int len, unsigned int flags,
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct sockaddr *from, int *fromlen); */
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                ARG2_3, ARG2_4, ARG2_5 );
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_RECV:
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int recv(int s, void *buf, int len, unsigned int flags); */
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* man 2 recv says:
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         The  recv call is normally used only on a connected socket
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (see connect(2)) and is identical to recvfrom with a  NULL
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         from parameter.
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     */
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_CONNECT:
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int connect(int sockfd,
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct sockaddr *serv_addr, int addrlen ); */
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_SETSOCKOPT:
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int setsockopt(int s, int level, int optname,
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const void *optval, int optlen); */
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG2_3, ARG2_4 );
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_GETSOCKOPT:
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int getsockopt(int s, int level, int optname,
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   void *optval, socklen_t *optlen); */
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG2_3, ARG2_4 );
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_GETSOCKNAME:
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int getsockname(int s, struct sockaddr* name, int* namelen) */
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_GETPEERNAME:
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int getpeername(int s, struct sockaddr* name, int* namelen) */
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_SHUTDOWN:
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int shutdown(int s, int how); */
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_SENDMSG: {
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int sendmsg(int s, const struct msghdr *msg, int flags); */
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* this causes warnings, and I don't get why. glibc bug?
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      * (after all it's glibc providing the arguments array)
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     */
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 );
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SYS_RECVMSG: {
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* int recvmsg(int s, struct msghdr *msg, int flags); */
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     /* this causes warnings, and I don't get why. glibc bug?
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      * (after all it's glibc providing the arguments array)
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     */
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx",ARG1);
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     SET_STATUS_Failure( VKI_EINVAL );
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     break;
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_0
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_1
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_2
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_3
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_4
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_5
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_socketcall)
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_0  (((UWord*)ARG2)[0])
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_1  (((UWord*)ARG2)[1])
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_2  (((UWord*)ARG2)[2])
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_3  (((UWord*)ARG2)[3])
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_4  (((UWord*)ARG2)[4])
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define ARG2_5  (((UWord*)ARG2)[5])
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SysRes r;
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  vg_assert(SUCCESS);
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  switch (ARG1 /* request */) {
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_SOCKETPAIR:
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    r = ML_(generic_POST_sys_socketpair)(
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                tid, VG_(mk_SysRes_Success)(RES),
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                ARG2_0, ARG2_1, ARG2_2, ARG2_3
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                );
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    SET_STATUS_from_SysRes(r);
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_SOCKET:
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    SET_STATUS_from_SysRes(r);
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_BIND:
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /* int bind(int sockfd, struct sockaddr *my_addr,
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       int addrlen); */
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_LISTEN:
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /* int listen(int s, int backlog); */
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_ACCEPT:
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /* int accept(int s, struct sockaddr *addr, int *addrlen); */
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG2_0, ARG2_1, ARG2_2 );
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    SET_STATUS_from_SysRes(r);
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_SENDTO:
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_SEND:
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_RECVFROM:
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                ARG2_0, ARG2_1, ARG2_2,
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                ARG2_3, ARG2_4, ARG2_5 );
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_RECV:
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_CONNECT:
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_SETSOCKOPT:
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_GETSOCKOPT:
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG2_0, ARG2_1,
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG2_2, ARG2_3, ARG2_4 );
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_GETSOCKNAME:
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   ARG2_0, ARG2_1, ARG2_2 );
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_GETPEERNAME:
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   ARG2_0, ARG2_1, ARG2_2 );
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_SHUTDOWN:
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_SENDMSG:
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  case VKI_SYS_RECVMSG:
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break;
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  default:
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx",ARG1);
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    VG_(core_panic)("... bye!\n");
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    break; /*NOTREACHED*/
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_0
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_1
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_2
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_3
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_4
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  undef ARG2_5
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_socket)
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_socket ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "socket", int, domain, int, type, int, protocol);
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_socket)
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_POST_sys_socket)(tid, VG_(mk_SysRes_Success)(RES));
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_setsockopt)
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_setsockopt ( %ld, %ld, %ld, %#lx, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5);
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "setsockopt",
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, int, level, int, optname,
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const void *, optval, int, optlen);
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_setsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getsockopt)
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getsockopt ( %ld, %ld, %ld, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "getsockopt",
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, int, level, int, optname,
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, optval, int, *optlen);
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_PRE_sys_getsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getsockopt)
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_POST_sys_getsockopt)(tid, VG_(mk_SysRes_Success)(RES),
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                         ARG1,ARG2,ARG3,ARG4,ARG5);
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_connect)
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_connect ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "connect",
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, sockfd, struct sockaddr *, serv_addr, int, addrlen);
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_connect)(tid, ARG1,ARG2,ARG3);
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_accept)
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_accept ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "accept",
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, struct sockaddr *, addr, int, *addrlen);
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3);
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_accept)
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES),
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                         ARG1,ARG2,ARG3);
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sendto)
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sendto ( %ld, %#lx, %ld, %lu, %#lx, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "sendto",
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, const void *, msg, int, len,
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, flags,
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct sockaddr *, to, int, tolen);
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_sendto)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_recvfrom)
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_recvfrom ( %ld, %#lx, %ld, %lu, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "recvfrom",
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, void *, buf, int, len, unsigned int, flags,
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct sockaddr *, from, int *, fromlen);
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_recvfrom)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_recvfrom)
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_recvfrom)(tid, VG_(mk_SysRes_Success)(RES),
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sendmsg)
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sendmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "sendmsg",
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, const struct msghdr *, msg, int, flags);
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_sendmsg)(tid, ARG1,ARG2);
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_recvmsg)
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_recvmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "recvmsg", int, s, struct msghdr *, msg, int, flags);
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_recvmsg)(tid, ARG1,ARG2);
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_recvmsg)
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_recvmsg)(tid, ARG1,ARG2);
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//XXX: Semaphore code ripped from AMD64.
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semget)
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_semget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "semget", vki_key_t, key, int, nsems, int, semflg);
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semop)
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_semop ( %ld, %#lx, %lu )",ARG1,ARG2,ARG3);
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "semop",
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, semid, struct sembuf *, sops, unsigned, nsoops);
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_semop)(tid, ARG1,ARG2,ARG3);
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semctl)
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG3 & ~VKI_IPC_64) {
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_INFO:
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SEM_INFO:
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "semctl",
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd, struct seminfo *, arg);
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_STAT:
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SEM_STAT:
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_SET:
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "semctl",
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd, struct semid_ds *, arg);
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GETALL:
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SETALL:
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "semctl",
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd, unsigned short *, arg);
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sys_semctl ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "semctl",
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd);
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_semctl)(tid, ARG1,ARG2,ARG3,ARG4);
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_semctl)
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_semctl)(tid, RES,ARG1,ARG2,ARG3,ARG4);
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_semtimedop)
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_semtimedop ( %ld, %#lx, %lu, %#lx )",ARG1,ARG2,ARG3,ARG4);
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "semtimedop",
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, semid, struct sembuf *, sops, unsigned, nsoops,
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct timespec *, timeout);
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_semtimedop)(tid, ARG1,ARG2,ARG3,ARG4);
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//amd64
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgget)
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_msgget ( %ld, %ld )",ARG1,ARG2);
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "msgget", vki_key_t, key, int, msgflg);
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgsnd)
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_msgsnd ( %ld, %#lx, %ld, %ld )",ARG1,ARG2,ARG3,ARG4);
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "msgsnd",
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz, int, msgflg);
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_PRE_sys_msgsnd)(tid, ARG1,ARG2,ARG3,ARG4);
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((ARG4 & VKI_IPC_NOWAIT) == 0)
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfMayBlock;
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgrcv)
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_msgrcv ( %ld, %#lx, %ld, %ld, %ld )",ARG1,ARG2,ARG3,ARG4,ARG5);
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "msgrcv",
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, msqid, struct msgbuf *, msgp, vki_size_t, msgsz,
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 long, msgytp, int, msgflg);
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_PRE_sys_msgrcv)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((ARG4 & VKI_IPC_NOWAIT) == 0)
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfMayBlock;
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_msgrcv)
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_POST_sys_msgrcv)(tid, RES,ARG1,ARG2,ARG3,ARG4,ARG5);
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_msgctl)
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_msgctl ( %ld, %ld, %#lx )",ARG1,ARG2,ARG3);
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "msgctl",
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, msqid, int, cmd, struct msqid_ds *, buf);
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_PRE_sys_msgctl)(tid, ARG1,ARG2,ARG3);
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_msgctl)
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(linux_POST_sys_msgctl)(tid, RES,ARG1,ARG2,ARG3);
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//shared memory code from AMD64
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmget)
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_shmget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "shmget", vki_key_t, key, vki_size_t, size, int, shmflg);
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(wrap_sys_shmat)
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UWord arg2tmp;
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("wrap_sys_shmat ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "shmat",
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, shmid, const void *, shmaddr, int, shmflg);
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Round the attach address down to an VKI_SHMLBA boundary if the
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      client requested rounding.  See #222545.  This is necessary only
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      on arm-linux because VKI_SHMLBA is 4 * VKI_PAGE size; on all
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      other linux targets it is the same as the page size. */
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 & VKI_SHM_RND)
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG2 = VG_ROUNDDN(ARG2, VKI_SHMLBA);
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg2tmp = ML_(generic_PRE_sys_shmat)(tid, ARG1,ARG2,ARG3);
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (arg2tmp == 0)
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG2 = arg2tmp;
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(wrap_sys_shmat)
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_shmat)(tid, RES,ARG1,ARG2,ARG3);
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmdt)
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_shmdt ( %#lx )",ARG1);
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "shmdt", const void *, shmaddr);
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(generic_PRE_sys_shmdt)(tid, ARG1))
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_shmdt)
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_shmdt)(tid, RES,ARG1);
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shmctl)
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_shmctl ( %ld, %ld, %#lx )",ARG1,ARG2,ARG3);
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "shmctl",
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, shmid, int, cmd, struct shmid_ds *, buf);
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_shmctl)(tid, ARG1,ARG2,ARG3);
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_shmctl)
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_shmctl)(tid, RES,ARG1,ARG2,ARG3);
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_shutdown)
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_shutdown ( %ld, %ld )",ARG1,ARG2);
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(int, "shutdown", int, s, int, how);
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_bind)
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_bind ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "bind",
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, sockfd, struct sockaddr *, my_addr, int, addrlen);
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_bind)(tid, ARG1,ARG2,ARG3);
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_listen)
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_listen ( %ld, %ld )",ARG1,ARG2);
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "listen", int, s, int, backlog);
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getsockname)
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getsockname ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3);
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "getsockname",
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, struct sockaddr *, name, int *, namelen);
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_getsockname)(tid, ARG1,ARG2,ARG3);
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getsockname)
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_getsockname)(tid, VG_(mk_SysRes_Success)(RES),
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          ARG1,ARG2,ARG3);
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_getpeername)
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_getpeername ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3);
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "getpeername",
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, struct sockaddr *, name, int *, namelen);
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_getpeername)(tid, ARG1,ARG2,ARG3);
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_getpeername)
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_getpeername)(tid, VG_(mk_SysRes_Success)(RES),
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          ARG1,ARG2,ARG3);
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_socketpair)
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_socketpair ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "socketpair",
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, d, int, type, int, protocol, int*, sv);
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_socketpair)(tid, ARG1,ARG2,ARG3,ARG4);
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_socketpair)
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_socketpair)(tid, VG_(mk_SysRes_Success)(RES),
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                         ARG1,ARG2,ARG3,ARG4);
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_send)
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_send ( %ld, %#lx, %ld, %lu )",ARG1,ARG2,ARG3,ARG4);
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "send",
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, const void *, msg, int, len,
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, flags);
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_send)( tid, ARG1, ARG2, ARG3 );
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_recv)
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_recv ( %ld, %#lx, %ld, %lu )",ARG1,ARG2,ARG3,ARG4);
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "recv",
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, void *, buf, int, len, unsigned int, flags);
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_recv)( tid, ARG1, ARG2, ARG3 );
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_recv)
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_recv)( tid, RES, ARG1, ARG2, ARG3 );
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_mmap2)
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Exactly like old_mmap() except:
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //  - all 6 args are passed in regs, rather than in a memory-block.
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //  - the file offset is specified in pagesize units rather than bytes,
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //    so that it can be used for files bigger than 2^32 bytes.
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // pagesize or 4K-size units in offset?  For ppc32/64-linux, this is
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // 4K-sized.  Assert that the page size is 4K here for safety.
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VKI_PAGE_SIZE == 4096);
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mmap2 ( %#lx, %llu, %ld, %ld, %ld, %ld )",
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "mmap2",
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, start, unsigned long, length,
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, prot,  unsigned long, flags,
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, fd,    unsigned long, offset);
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       4096 * (Off64T)ARG6 );
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// XXX: lstat64/fstat64/stat64 are generic, but not necessarily
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// applicable to every architecture -- I think only to 32-bit archs.
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// We're going to need something like linux/core_os32.h for such
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// things, eventually, I think.  --njn
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_lstat64)
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_lstat64 ( %#lx(%s), %#lx )",ARG1,(char*)ARG1,ARG2);
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_lstat64)
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0) {
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_stat64)
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_stat64 ( %#lx(%s), %#lx )",ARG1,(char*)ARG1,ARG2);
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_stat64)
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fstatat64)
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fstatat64 ( %ld, %#lx(%s), %#lx )",ARG1,ARG2,(char*)ARG2,ARG3);
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "fstatat64",
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, dfd, char *, file_name, struct stat64 *, buf);
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "fstatat64(file_name)", ARG2 );
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "fstatat64(buf)", ARG3, sizeof(struct vki_stat64) );
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_fstatat64)
1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) );
1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_fstat64)
1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_fstat64 ( %ld, %#lx )",ARG1,ARG2);
1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sys_fstat64)
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_clone)
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    UInt cloneflags;
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(int, "clone",
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long, flags,
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, child_stack,
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int *, parent_tidptr,
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, child_tls,
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int *, child_tidptr);
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & VKI_CLONE_PARENT_SETTID) {
1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                             VKI_PROT_WRITE)) {
1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int),
1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                             VKI_PROT_WRITE)) {
1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1 & VKI_CLONE_SETTLS) {
1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("clone(tls_user_desc)", ARG4, sizeof(vki_modify_ldt_t));
1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!VG_(am_is_valid_for_client)(ARG4, sizeof(vki_modify_ldt_t),
1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                             VKI_PROT_READ)) {
1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EFAULT );
1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cloneflags = ARG1;
1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Only look at the flags we really care about */
1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* thread creation */
1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         do_clone(tid,
1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ARG1,         /* flags */
1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)ARG2,   /* child ESP */
1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Int *)ARG3,  /* parent_tidptr */
1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Int *)ARG5,  /* child_tidptr */
1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)ARG4)); /* set_tls */
1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* FALLTHROUGH - assume vfork == fork */
1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 0: /* plain fork */
1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(do_fork_clone)(tid,
1116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       cloneflags,      /* flags */
1117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Int *)ARG3,     /* parent_tidptr */
1118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Int *)ARG5));   /* child_tidptr */
1119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
1122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* should we just ENOSYS? */
1123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "");
1124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx", ARG1);
1125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "");
1126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "The only supported clone() uses are:");
1127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)");
1128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork");
1129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, " - for the Quadrics Elan3 user-space driver");
1130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(unimplemented)
1131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ("Valgrind does not support general clone().");
1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS) {
1135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG1 & VKI_CLONE_PARENT_SETTID)
1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG3, sizeof(Int));
1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
1138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG5, sizeof(Int));
1139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Thread creation was successful; let the child have the chance
1141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         to run */
1142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfYieldAfter;
1143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_sigreturn)
1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     an explanation of what follows. */
1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_sigreturn ( )");
1152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
1154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
1155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
1156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Restore register state from frame and remove it */
1158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigframe_destroy)(tid, False);
1159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell the driver not to update the guest state with the "result",
1161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      and set a bogus result to keep it happy. */
1162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfNoWriteResult;
1163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
1164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if any signals arose as a result of this. */
1166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfPollAfter;
1167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_rt_sigreturn)
1170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
1172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      an explanation of what follows. */
1173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("rt_sigreturn ( )");
1175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
1177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
1178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
1179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Restore register state from frame and remove it */
1181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigframe_destroy)(tid, True);
1182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell the driver not to update the guest state with the "result",
1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      and set a bogus result to keep it happy. */
1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfNoWriteResult;
1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if any signals arose as a result of this. */
1189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfPollAfter;
1190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* NB: clone of x86-linux version, and ppc32-linux has an almost
1193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   identical one. */
1194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_sigsuspend)
1195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The C library interface to sigsuspend just takes a pointer to
1197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      a signal mask but this system call has three arguments - the first
1198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      two don't appear to be used by the kernel and are always passed as
1199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      zero by glibc and the third is the first word of the signal mask
1200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      so only 32 signals are supported.
1201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      In fact glibc normally uses rt_sigsuspend if it is available as
1203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      that takes a pointer to the signal mask so supports more signals.
1204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    */
1205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfMayBlock;
1206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_sigsuspend ( %ld, %ld, %ld )", ARG1,ARG2,ARG3 );
1207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ3(int, "sigsuspend",
1208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 int, history0, int, history1,
1209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 vki_old_sigset_t, mask);
1210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Very much ARM specific */
1213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_set_tls)
1215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "set_tls", unsigned long, addr);
1217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes( sys_set_tls( tid, ARG1 ) );
1219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sys_cacheflush)
1222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("cacheflush (%lx, %#lx, %#lx)",ARG1,ARG2,ARG3);
1224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "cacheflush", void*, addrlow,void*, addrhigh,int, flags);
1225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(discard_translations)( (Addr64)ARG1,
1226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              ((ULong)ARG2) - ((ULong)ARG1) + 1ULL/*paranoia*/,
1227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              "PRE(sys_cacheflush)" );
1228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
1229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ARG3 is only used for pointers into the traced process's address
1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// space and for offsets into the traced process's struct
1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// user_regs_struct. It is never a pointer into this process's memory
1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// space, and we should therefore not check anything it points to.
1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(sys_ptrace)
1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ4(int, "ptrace",
1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 long, request, long, pid, long, addr, long, data);
1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (ARG1) {
1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKTEXT:
1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKDATA:
1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKUSR:
1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(peek)", ARG4,
1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     sizeof (long));
1246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETREGS:
1248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
1249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     sizeof (struct vki_user_regs_struct));
1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETFPREGS:
1252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
1253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     sizeof (struct vki_user_fp));
1254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETWMMXREGS:
1256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getwmmxregs)", ARG4,
1257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     VKI_IWMMXT_SIZE);
1258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETCRUNCHREGS:
1260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getcrunchregs)", ARG4,
1261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     VKI_CRUNCH_SIZE);
1262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETVFPREGS:
1264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getvfpregs)", ARG4,
1265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     sizeof (struct vki_user_vfp) );
1266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETHBPREGS:
1268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(gethbpregs)", ARG4,
1269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     sizeof (unsigned long) );
1270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETREGS:
1272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setregs)", ARG4,
1273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     sizeof (struct vki_user_regs_struct));
1274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETFPREGS:
1276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
1277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     sizeof (struct vki_user_fp));
1278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETWMMXREGS:
1280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setwmmxregs)", ARG4,
1281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     VKI_IWMMXT_SIZE);
1282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETCRUNCHREGS:
1284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setcrunchregs)", ARG4,
1285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		     VKI_CRUNCH_SIZE);
1286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETVFPREGS:
1288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setvfpregs)", ARG4,
1289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     sizeof (struct vki_user_vfp));
1290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETHBPREGS:
1292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(sethbpregs)", ARG4, sizeof(unsigned long));
1293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GET_THREAD_AREA:
1295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(get_thread_area)", ARG4, sizeof(unsigned long));
1296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETEVENTMSG:
1298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long));
1299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETSIGINFO:
1301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t));
1302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_SETSIGINFO:
1304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t));
1305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
1307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
1309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(sys_ptrace)
1312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (ARG1) {
1314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKTEXT:
1315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKDATA:
1316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_PEEKUSR:
1317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof (long));
1318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETREGS:
1320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
1321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETFPREGS:
1323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof (struct vki_user_fp));
1324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETWMMXREGS:
1326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, VKI_IWMMXT_SIZE);
1327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETCRUNCHREGS:
1329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, VKI_CRUNCH_SIZE);
1330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETVFPREGS:
1332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof(struct vki_user_vfp));
1333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GET_THREAD_AREA:
1335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETHBPREGS:
1336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETEVENTMSG:
1337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof(unsigned long));
1338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_PTRACE_GETSIGINFO:
1340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* XXX: This is a simplification. Different parts of the
1341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * siginfo_t are valid depending on the type of signal.
1342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       */
1343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t));
1344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
1346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
1347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
1348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef PRE
1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef POST
1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The arm/Linux syscall table
1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_OABI_SYSCALL_BASE 0x900000
1359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __NR_OABI_SYSCALL_BASE 0x0
1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAX_(sysno, name)    WRAPPER_ENTRY_X_(arm_linux, sysno, name)
1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PLAXY(sysno, name)    WRAPPER_ENTRY_XY(arm_linux, sysno, name)
1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This table maps from __NR_xxx syscall numbers (from
1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// linux/include/asm-arm/unistd.h) to the appropriate PRE/POST sys_foo()
1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// wrappers on arm (as per sys_call_table in linux/arch/arm/kernel/entry.S).
1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// For those syscalls not handled by Valgrind, the annotation indicate its
1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// (unknown).
1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry syscall_main_table[] = {
1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (restart_syscall)                             // 0
1376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_exit,              sys_exit),           // 1
1377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fork,              sys_fork),           // 2
1378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_read,              sys_read),           // 3
1379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_write,             sys_write),          // 4
1380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_open,              sys_open),           // 5
1382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_close,             sys_close),          // 6
1383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENXY(__NR_waitpid,           sys_waitpid),        // 7
1384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_creat,             sys_creat),          // 8
1385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_link,              sys_link),           // 9
1386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_unlink,            sys_unlink),         // 10
1388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_execve,            sys_execve),         // 11
1389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chdir,             sys_chdir),          // 12
1390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_time,              sys_time),           // 13
1391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mknod,             sys_mknod),          // 14
1392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chmod,             sys_chmod),          // 15
1394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    LINX_(__NR_lchown,            sys_lchown16),       // 16
1395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_break,             sys_ni_syscall),     // 17
1396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_oldstat,           sys_stat),           // 18 (obsolete)
1397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lseek,             sys_lseek),          // 19
1398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpid,            sys_getpid),         // 20
1400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mount,             sys_mount),          // 21
1401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_umount,            sys_oldumount),      // 22
1402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setuid,            sys_setuid16),       // 23 ## P
1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_getuid,            sys_getuid16),       // 24 ## P
1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_stime,             sys_stime),          // 25 * (SVr4,SVID,X/OPEN)
1406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAXY(__NR_ptrace,            sys_ptrace),         // 26
1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_alarm,             sys_alarm),          // 27
1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_oldfstat,          sys_fstat),          // 28 * L -- obsolete
1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pause,             sys_pause),          // 29
1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_utime,             sys_utime),          // 30
1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_stty,              sys_ni_syscall),     // 31
1413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_gtty,              sys_ni_syscall),     // 32
1414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_access,            sys_access),         // 33
1415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_nice,              sys_nice),           // 34
1416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_ftime,             sys_ni_syscall),     // 35
1418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_sync,              sys_sync),           // 36
1419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_kill,              sys_kill),           // 37
1420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rename,            sys_rename),         // 38
1421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mkdir,             sys_mkdir),          // 39
1422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rmdir,             sys_rmdir),          // 40
1424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup,               sys_dup),            // 41
1425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_pipe,              sys_pipe),           // 42
1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_times,             sys_times),          // 43
1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_prof,              sys_ni_syscall),     // 44
1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_brk,               sys_brk),            // 45
1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setgid,            sys_setgid16),       // 46
1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_getgid,            sys_getgid16),       // 47
1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_signal,            sys_signal),         // 48 */* (ANSI C)
1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_geteuid,           sys_geteuid16),      // 49
1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_getegid,           sys_getegid16),      // 50
1436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_acct,              sys_acct),           // 51
1437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_umount2,           sys_umount),         // 52
1438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_lock,              sys_ni_syscall),     // 53
1439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_ioctl,             sys_ioctl),          // 54
1440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fcntl,             sys_fcntl),          // 55
1442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_mpx,               sys_ni_syscall),     // 56
1443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpgid,           sys_setpgid),        // 57
1444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_ulimit,            sys_ni_syscall),     // 58
1445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_oldolduname,       sys_olduname),       // 59 Linux -- obsolete
1446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_umask,             sys_umask),          // 60
1448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chroot,            sys_chroot),         // 61
1449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_ustat,             sys_ustat)           // 62 SVr4 -- deprecated
1450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup2,              sys_dup2),           // 63
1451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getppid,           sys_getppid),        // 64
1452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpgrp,           sys_getpgrp),        // 65
1454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setsid,            sys_setsid),         // 66
1455d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   LINXY(__NR_sigaction,         sys_sigaction),      // 67
1456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_sgetmask,          sys_sgetmask),       // 68 */* (ANSI C)
1457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_ssetmask,          sys_ssetmask),       // 69 */* (ANSI C)
1458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setreuid,          sys_setreuid16),     // 70
1460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setregid,          sys_setregid16),     // 71
1461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PLAX_(__NR_sigsuspend,        sys_sigsuspend),     // 72
1462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sigpending,        sys_sigpending),     // 73
1463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_sethostname,       sys_sethostname),    // 74 */*
1464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setrlimit,         sys_setrlimit),      // 75
1466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getrlimit,         sys_old_getrlimit),  // 76
1467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getrusage,         sys_getrusage),      // 77
1468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_gettimeofday,      sys_gettimeofday),   // 78
1469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_settimeofday,      sys_settimeofday),   // 79
1470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getgroups,         sys_getgroups16),    // 80
1472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setgroups,         sys_setgroups16),    // 81
1473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAX_(__NR_select,            old_select),         // 82
1474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_symlink,           sys_symlink),        // 83
1475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_oldlstat,          sys_lstat),          // 84 -- obsolete
1476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_readlink,          sys_readlink),       // 85
1478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_uselib,            sys_uselib),         // 86 */Linux
1479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_swapon,            sys_swapon),         // 87 */Linux
1480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_reboot,            sys_reboot),         // 88 */Linux
1481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_readdir,           old_readdir),        // 89 -- superseded
1482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   _____(__NR_mmap,              old_mmap),           // 90
1484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_munmap,            sys_munmap),         // 91
1485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_truncate,          sys_truncate),       // 92
1486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_ftruncate,         sys_ftruncate),      // 93
1487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchmod,            sys_fchmod),         // 94
1488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchown,            sys_fchown16),       // 95
1490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpriority,       sys_getpriority),    // 96
1491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpriority,       sys_setpriority),    // 97
1492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_profil,            sys_ni_syscall),     // 98
1493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_statfs,            sys_statfs),         // 99
1494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstatfs,           sys_fstatfs),        // 100
1496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_ioperm,            sys_ioperm),         // 101
1497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_socketcall,        sys_socketcall),     // 102
1498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_syslog,            sys_syslog),         // 103
1499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_setitimer,         sys_setitimer),      // 104
1500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getitimer,         sys_getitimer),      // 105
1502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_stat,              sys_newstat),        // 106
1503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_lstat,             sys_newlstat),       // 107
1504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstat,             sys_newfstat),       // 108
1505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_olduname,          sys_uname),          // 109 -- obsolete
1506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_iopl,              sys_iopl),           // 110
1508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_vhangup,           sys_vhangup),        // 111
1509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_idle,              sys_ni_syscall),     // 112
1510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// PLAXY(__NR_vm86old,           sys_vm86old),        // 113 __NR_syscall... weird
1511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_wait4,             sys_wait4),          // 114
1512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_swapoff,           sys_swapoff),        // 115 */Linux
1514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sysinfo,           sys_sysinfo),        // 116
1515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   _____(__NR_ipc,               sys_ipc),            // 117
1516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fsync,             sys_fsync),          // 118
1517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_sigreturn,         sys_sigreturn),      // 119 ?/Linux
1518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_clone,             sys_clone),          // 120
1520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_setdomainname,     sys_setdomainname),  // 121 */*(?)
1521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_uname,             sys_newuname),       // 122
1522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAX_(__NR_modify_ldt,        sys_modify_ldt),     // 123
1523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    LINXY(__NR_adjtimex,          sys_adjtimex),       // 124
1524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_mprotect,          sys_mprotect),       // 125
1526d140cf361ba12f3084fbe4a06e8f1a5500bd2285Kenny Root   LINXY(__NR_sigprocmask,       sys_sigprocmask),    // 126
1527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    // Nb: create_module() was removed 2.4-->2.6
1528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_create_module,     sys_ni_syscall),     // 127
1529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_init_module,       sys_init_module),    // 128
1530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_delete_module,     sys_delete_module),  // 129
1531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    // Nb: get_kernel_syms() was removed 2.4-->2.6
1533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_get_kernel_syms,   sys_ni_syscall),     // 130
1534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_quotactl,          sys_quotactl),       // 131
1535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpgid,           sys_getpgid),        // 132
1536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchdir,            sys_fchdir),         // 133
1537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_bdflush,           sys_bdflush),        // 134 */Linux
1538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_sysfs,             sys_sysfs),          // 135 SVr4
1540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_personality,       sys_personality),    // 136
1541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_afs_syscall,       sys_ni_syscall),     // 137
1542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsuid,          sys_setfsuid16),     // 138
1543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsgid,          sys_setfsgid16),     // 139
1544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR__llseek,           sys_llseek),         // 140
1546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getdents,          sys_getdents),       // 141
1547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR__newselect,        sys_select),         // 142
1548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_flock,             sys_flock),          // 143
1549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_msync,             sys_msync),          // 144
1550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_readv,             sys_readv),          // 145
1552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_writev,            sys_writev),         // 146
1553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getsid,            sys_getsid),         // 147
1554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fdatasync,         sys_fdatasync),      // 148
1555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR__sysctl,           sys_sysctl),         // 149
1556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mlock,             sys_mlock),          // 150
1558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_munlock,           sys_munlock),        // 151
1559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mlockall,          sys_mlockall),       // 152
1560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_munlockall,        sys_munlockall),     // 153
1561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_setparam,    sys_sched_setparam), // 154
1562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_getparam,         sys_sched_getparam),        // 155
1564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_setscheduler,     sys_sched_setscheduler),    // 156
1565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_getscheduler,     sys_sched_getscheduler),    // 157
1566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_yield,            sys_sched_yield),           // 158
1567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
1568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
1570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //LINX?(__NR_sched_rr_get_interval,  sys_sched_rr_get_interval), // 161 */*
1571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_nanosleep,         sys_nanosleep),      // 162
1572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mremap,            sys_mremap),         // 163
1573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresuid,         sys_setresuid16),    // 164
1574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresuid,         sys_getresuid16),    // 165
1576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAXY(__NR_vm86,              sys_vm86),           // 166 x86/Linux-only
1577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_query_module,      sys_ni_syscall),     // 167
1578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_poll,              sys_poll),           // 168
1579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_nfsservctl,        sys_nfsservctl),     // 169 */Linux
1580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz
1581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresgid,         sys_setresgid16),    // 170
1582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresgid,         sys_getresgid16),    // 171
1583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_prctl,             sys_prctl),          // 172
1584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_rt_sigreturn,      sys_rt_sigreturn),   // 173
1585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigaction,      sys_rt_sigaction),   // 174
1586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigprocmask,    sys_rt_sigprocmask), // 175
1588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigpending,     sys_rt_sigpending),  // 176
1589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigtimedwait,   sys_rt_sigtimedwait),// 177
1590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_rt_sigqueueinfo,   sys_rt_sigqueueinfo),// 178
1591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_rt_sigsuspend,     sys_rt_sigsuspend),  // 179
1592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_pread64,           sys_pread64),        // 180
1594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pwrite64,          sys_pwrite64),       // 181
1595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_chown,             sys_chown16),        // 182
1596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getcwd,            sys_getcwd),         // 183
1597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_capget,            sys_capget),         // 184
1598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_capset,            sys_capset),         // 185
1600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_sigaltstack,       sys_sigaltstack),    // 186
1601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sendfile,          sys_sendfile),       // 187
1602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENXY(__NR_getpmsg,           sys_getpmsg),        // 188
1603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(__NR_putpmsg,           sys_putpmsg),        // 189
1604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Nb: we treat vfork as fork
1606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_vfork,             sys_fork),           // 190
1607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_ugetrlimit,        sys_getrlimit),      // 191
1608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_mmap2,             sys_mmap2),          // 192
1609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_truncate64,        sys_truncate64),     // 193
1610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_ftruncate64,       sys_ftruncate64),    // 194
1611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_stat64,            sys_stat64),         // 195
1613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_lstat64,           sys_lstat64),        // 196
1614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_fstat64,           sys_fstat64),        // 197
1615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_lchown32,          sys_lchown),         // 198
1616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getuid32,          sys_getuid),         // 199
1617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getgid32,          sys_getgid),         // 200
1619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_geteuid32,         sys_geteuid),        // 201
1620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getegid32,         sys_getegid),        // 202
1621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setreuid32,        sys_setreuid),       // 203
1622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setregid32,        sys_setregid),       // 204
1623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getgroups32,       sys_getgroups),      // 205
1625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setgroups32,       sys_setgroups),      // 206
1626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchown32,          sys_fchown),         // 207
1627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresuid32,       sys_setresuid),      // 208
1628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresuid32,       sys_getresuid),      // 209
1629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setresgid32,       sys_setresgid),      // 210
1631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getresgid32,       sys_getresgid),      // 211
1632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chown32,           sys_chown),          // 212
1633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setuid32,          sys_setuid),         // 213
1634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setgid32,          sys_setgid),         // 214
1635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsuid32,        sys_setfsuid),       // 215
1637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setfsgid32,        sys_setfsgid),       // 216
1638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_pivot_root,        sys_pivot_root),     // 217 */Linux
1639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_mincore,           sys_mincore),        // 218
1640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_madvise,           sys_madvise),        // 219
1641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getdents64,        sys_getdents64),     // 220
1643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fcntl64,           sys_fcntl64),        // 221
1644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENX_(222,                    sys_ni_syscall),     // 222
1645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAXY(223,                    sys_syscall223),     // 223 // sys_bproc?
1646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_gettid,            sys_gettid),         // 224
1647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_readahead,         sys_readahead),      // 225 */Linux
1649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_setxattr,          sys_setxattr),       // 226
1650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lsetxattr,         sys_lsetxattr),      // 227
1651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fsetxattr,         sys_fsetxattr),      // 228
1652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_getxattr,          sys_getxattr),       // 229
1653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_lgetxattr,         sys_lgetxattr),      // 230
1655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_fgetxattr,         sys_fgetxattr),      // 231
1656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_listxattr,         sys_listxattr),      // 232
1657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_llistxattr,        sys_llistxattr),     // 233
1658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_flistxattr,        sys_flistxattr),     // 234
1659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_removexattr,       sys_removexattr),    // 235
1661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_lremovexattr,      sys_lremovexattr),   // 236
1662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fremovexattr,      sys_fremovexattr),   // 237
1663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_tkill,             sys_tkill),          // 238 */Linux
1664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sendfile64,        sys_sendfile64),     // 239
1665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_futex,             sys_futex),             // 240
1667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 241
1668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 242
1669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAX_(__NR_set_thread_area,   sys_set_thread_area),   // 243
1670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PLAX_(__NR_get_thread_area,   sys_get_thread_area),   // 244
1671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_setup,          sys_io_setup),       // 245
1673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_io_destroy,        sys_io_destroy),     // 246
1674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_getevents,      sys_io_getevents),   // 247
1675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_io_submit,         sys_io_submit),      // 248
1676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_io_cancel,         sys_io_cancel),      // 249
1677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_fadvise64,         sys_fadvise64),      // 250 */(Linux?)
1679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(251,                    sys_ni_syscall),     // 251
1680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_exit_group,        sys_exit_group),     // 252
1681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   GENXY(__NR_lookup_dcookie,    sys_lookup_dcookie), // 253
1682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_create,      sys_epoll_create),   // 254
1683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_epoll_ctl,         sys_epoll_ctl),         // 255
1685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_epoll_wait,        sys_epoll_wait),        // 256
1686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//zz    //   (__NR_remap_file_pages,  sys_remap_file_pages),  // 257 */Linux
1687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_tid_address,   sys_set_tid_address),   // 258
1688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_create,      sys_timer_create),      // 259
1689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_settime,     sys_timer_settime),  // (timer_create+1)
1691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timer_gettime,     sys_timer_gettime),  // (timer_create+2)
1692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_timer_getoverrun,  sys_timer_getoverrun),//(timer_create+3)
1693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_timer_delete,      sys_timer_delete),   // (timer_create+4)
1694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_clock_settime,     sys_clock_settime),  // (timer_create+5)
1695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_gettime,     sys_clock_gettime),  // (timer_create+6)
1697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_getres,      sys_clock_getres),   // (timer_create+7)
1698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_clock_nanosleep,   sys_clock_nanosleep),// (timer_create+8) */*
1699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_statfs64,          sys_statfs64),       // 268
1700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstatfs64,         sys_fstatfs64),      // 269
1701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_tgkill,            sys_tgkill),         // 270 */Linux
1703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_utimes,            sys_utimes),         // 271
1704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_fadvise64_64,      sys_fadvise64_64),   // 272 */(Linux?)
1705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_vserver,           sys_ni_syscall),     // 273
1706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mbind,             sys_mbind),          // 274 ?/?
1707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_get_mempolicy,     sys_get_mempolicy),  // 275 ?/?
1709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_mempolicy,     sys_set_mempolicy),  // 276 ?/?
1710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_open,           sys_mq_open),        // 277
1711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_unlink,         sys_mq_unlink),      // (mq_open+1)
1712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_timedsend,      sys_mq_timedsend),   // (mq_open+2)
1713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_timedreceive,   sys_mq_timedreceive),// (mq_open+3)
1715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mq_notify,         sys_mq_notify),      // (mq_open+4)
1716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_mq_getsetattr,     sys_mq_getsetattr),  // (mq_open+5)
1717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_waitid,            sys_waitid),         // 280
1718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_socket,            sys_socket),         // 281
1720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_bind,              sys_bind),           // 282
1721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_connect,           sys_connect),        // 283
1722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_listen,            sys_listen),         // 284
1723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_accept,            sys_accept),         // 285
1724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_getsockname,       sys_getsockname),    // 286
1725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_getpeername,       sys_getpeername),    // 287
1726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_socketpair,        sys_socketpair),     // 288
1727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_send,              sys_send),
1728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_sendto,            sys_sendto),         // 290
1729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_recv,              sys_recv),
1730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_recvfrom,          sys_recvfrom),       // 292
1731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_shutdown,          sys_shutdown),       // 293
1732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_setsockopt,        sys_setsockopt),     // 294
1733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_getsockopt,        sys_getsockopt),     // 295
1734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_sendmsg,           sys_sendmsg),        // 296
1735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_recvmsg,           sys_recvmsg),        // 297
1736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_semop,             sys_semop),          // 298
1737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_semget,            sys_semget),         // 299
1738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_semctl,            sys_semctl),         // 300
1739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_msgget,            sys_msgget),
1740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_msgsnd,            sys_msgsnd),
1741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_msgrcv,            sys_msgrcv),
1742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_msgctl,            sys_msgctl),         // 304
1743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_semtimedop,        sys_semtimedop),     // 312
1744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_add_key,           sys_add_key),        // 286
1746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_request_key,       sys_request_key),    // 287
1747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_keyctl,            sys_keyctl),         // not 288...
1748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_ioprio_set,        sys_ioprio_set),     // 289
1749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_ioprio_get,        sys_ioprio_get),     // 290
1751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_init,    sys_inotify_init),   // 291
1752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 292
1753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_inotify_rm_watch,    sys_inotify_rm_watch), // 293
1754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_migrate_pages,    sys_migrate_pages),    // 294
1755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_openat,       sys_openat),           // 295
1757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mkdirat,       sys_mkdirat),          // 296
1758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_mknodat,       sys_mknodat),          // 297
1759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchownat,       sys_fchownat),         // 298
1760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_futimesat,    sys_futimesat),        // 326 on arm
1761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_fstatat64,    sys_fstatat64),        // 300
1763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_unlinkat,       sys_unlinkat),         // 301
1764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_renameat,       sys_renameat),         // 302
1765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_linkat,       sys_linkat),           // 303
1766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_symlinkat,    sys_symlinkat),        // 304
1767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_readlinkat,    sys_readlinkat),       //
1769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_fchmodat,       sys_fchmodat),         //
1770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_faccessat,    sys_faccessat),        //
1771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_shmat,         wrap_sys_shmat),       //305
1772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_shmdt,             sys_shmdt),          //306
1773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAX_(__NR_shmget,            sys_shmget),         //307
1774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PLAXY(__NR_shmctl,            sys_shmctl),         // 308
1775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_pselect6,       sys_pselect6),         //
1776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_unshare,       sys_unshare),          // 310
1778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_set_robust_list,    sys_set_robust_list),  // 311
1779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_get_robust_list,    sys_get_robust_list),  // 312
1780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_splice,            sys_ni_syscall),       // 313
1781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_sync_file_range,   sys_sync_file_range),  // 314
1782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_tee,               sys_ni_syscall),       // 315
1784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_vmsplice,          sys_ni_syscall),       // 316
1785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_move_pages,        sys_ni_syscall),       // 317
1786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_getcpu,            sys_ni_syscall),       // 318
1787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_utimensat,         sys_utimensat),        // 320
1789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_signalfd,          sys_signalfd),         // 321
1790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_create,    sys_timerfd_create),   // 322
1791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_eventfd,           sys_eventfd),          // 323
1792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   LINX_(__NR_fallocate,        sys_ni_syscall),        // 324
1793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_settime,   sys_timerfd_settime),  // 325
1794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_timerfd_gettime,   sys_timerfd_gettime),   // 326
1795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ///////////////
1797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // JRS 2010-Jan-03: I believe that all the numbers listed
1799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // in comments in the table prior to this point (eg "// 326",
1800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // etc) are bogus since it looks to me like they are copied
1801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // verbatim from syswrap-x86-linux.c and they certainly do not
1802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // correspond to what's in include/vki/vki-scnums-arm-linux.h.
1803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // From here onwards, please ensure the numbers are correct.
1804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_pselect6,          sys_pselect6),         // 335
1806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_ppoll,             sys_ppoll),            // 336
1807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   LINXY(__NR_epoll_pwait,       sys_epoll_pwait),      // 346
1809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_signalfd4,         sys_signalfd4),        // 355
1811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINX_(__NR_eventfd2,          sys_eventfd2),         // 356
1812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_pipe2,             sys_pipe2),            // 359
1814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LINXY(__NR_inotify_init1,     sys_inotify_init1)     // 360
1815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* These are not in the main table because there indexes are not small
1819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   integers, but rather values close to one million.  So their
1820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   inclusion would force the main table to be huge (about 8 MB). */
1821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry ste___ARM_set_tls
1823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   = { WRAPPER_PRE_NAME(arm_linux,sys_set_tls), NULL };
1824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SyscallTableEntry ste___ARM_cacheflush
1826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   = { WRAPPER_PRE_NAME(arm_linux,sys_cacheflush), NULL };
1827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const UInt syscall_main_table_size
1831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = sizeof(syscall_main_table) / sizeof(syscall_main_table[0]);
1832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Is it in the contiguous initial section of the table? */
1834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sysno < syscall_main_table_size) {
1835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SyscallTableEntry* sys = &syscall_main_table[sysno];
1836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (sys->before == NULL)
1837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return NULL; /* no entry */
1838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
1839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return sys;
1840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check if it's one of the out-of-line entries. */
1843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (sysno) {
1844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case __NR_ARM_set_tls:    return &ste___ARM_set_tls;
1845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case __NR_ARM_cacheflush: return &ste___ARM_cacheflush;
1846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default: break;
1847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Can't find a wrapper */
1850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return NULL;
1851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_arm_linux)
1854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                      syswrap-arm-linux.c ---*/
1857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1858