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