blob: c4e65d5579ef483de0f23ca4def3179b142bcb66 [file] [log] [blame]
njnc6168192004-11-29 13:54:10 +00001
2/*--------------------------------------------------------------------*/
njnc1b01812005-06-17 22:19:06 +00003/*--- Platform-specific syscalls stuff. syswrap-amd64-linux.c ---*/
njnc6168192004-11-29 13:54:10 +00004/*--------------------------------------------------------------------*/
5
6/*
njnb9c427c2004-12-01 14:14:42 +00007 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
njnc6168192004-11-29 13:54:10 +00009
sewardj0f157dd2013-10-18 14:27:36 +000010 Copyright (C) 2000-2013 Nicholas Nethercote
njn2bc10122005-05-08 02:10:27 +000011 njn@valgrind.org
njnc6168192004-11-29 13:54:10 +000012
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 02111-1307, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29*/
30
njn8b68b642009-06-24 00:37:09 +000031#if defined(VGP_amd64_linux)
32
njnc7561b92005-06-19 01:24:32 +000033#include "pub_core_basics.h"
sewardj53c0dc92006-10-14 20:06:48 +000034#include "pub_core_vki.h"
35#include "pub_core_vkiscnums.h"
sewardj6c591e12011-04-11 16:17:51 +000036#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy
njnc7561b92005-06-19 01:24:32 +000037#include "pub_core_threadstate.h"
sewardj601371a2005-04-25 16:21:17 +000038#include "pub_core_aspacemgr.h"
njn899ce732005-06-21 00:28:11 +000039#include "pub_core_debuglog.h"
sewardje7aa4ae2005-06-09 12:43:42 +000040#include "pub_core_options.h"
41#include "pub_core_libcbase.h"
njn132bfcc2005-06-04 19:16:06 +000042#include "pub_core_libcassert.h"
njn36a20fa2005-06-03 03:08:39 +000043#include "pub_core_libcprint.h"
njnf39e9a32005-06-12 02:43:17 +000044#include "pub_core_libcproc.h"
njnde62cbf2005-06-10 22:08:14 +000045#include "pub_core_libcsignal.h"
njnc7561b92005-06-19 01:24:32 +000046#include "pub_core_scheduler.h"
njn2521d322005-05-08 14:45:13 +000047#include "pub_core_sigframe.h"
njnde62cbf2005-06-10 22:08:14 +000048#include "pub_core_signals.h"
njn9abd6082005-06-17 21:31:45 +000049#include "pub_core_syscall.h"
njnc1b01812005-06-17 22:19:06 +000050#include "pub_core_syswrap.h"
njn43b9a8a2005-05-10 04:37:01 +000051#include "pub_core_tooliface.h"
sewardj9084de72008-02-11 11:23:12 +000052#include "pub_core_stacks.h" // VG_(register_stack)
njnc6168192004-11-29 13:54:10 +000053
sewardje7aa4ae2005-06-09 12:43:42 +000054#include "priv_types_n_macros.h"
njnc1b01812005-06-17 22:19:06 +000055#include "priv_syswrap-generic.h" /* for decls of generic wrappers */
56#include "priv_syswrap-linux.h" /* for decls of linux-ish wrappers */
sewardje25e7652006-04-20 14:38:50 +000057#include "priv_syswrap-linux-variants.h" /* decls of linux variant wrappers */
njnc1b01812005-06-17 22:19:06 +000058#include "priv_syswrap-main.h"
sewardje7aa4ae2005-06-09 12:43:42 +000059
sewardj8eff3822005-02-17 09:30:21 +000060
njnc6168192004-11-29 13:54:10 +000061/* ---------------------------------------------------------------------
njne1486662005-11-10 02:48:04 +000062 clone() handling
sewardj4d89e302005-03-16 22:04:40 +000063 ------------------------------------------------------------------ */
64
njnfcb7c3e2005-06-18 15:54:25 +000065/* Call f(arg1), but first switch stacks, using 'stack' as the new
66 stack, and use 'retaddr' as f's return-to address. Also, clear all
67 the integer registers before entering f. */
68__attribute__((noreturn))
njna3afdfb2005-11-09 04:49:28 +000069void ML_(call_on_new_stack_0_1) ( Addr stack,
70 Addr retaddr,
71 void (*f)(Word),
72 Word arg1 );
njnfcb7c3e2005-06-18 15:54:25 +000073// %rdi == stack
74// %rsi == retaddr
75// %rdx == f
76// %rcx == arg1
77asm(
sewardjd9fc3822005-11-18 23:50:43 +000078".text\n"
njna3afdfb2005-11-09 04:49:28 +000079".globl vgModuleLocal_call_on_new_stack_0_1\n"
tom0dce48b2005-11-09 08:52:21 +000080"vgModuleLocal_call_on_new_stack_0_1:\n"
njnfcb7c3e2005-06-18 15:54:25 +000081" movq %rdi, %rsp\n" // set stack
82" pushq %rsi\n" // retaddr to stack
83" pushq %rdx\n" // f to stack
84" pushq %rcx\n" // arg1 to stack
85" movq $0, %rax\n" // zero all GP regs
86" movq $0, %rbx\n"
87" movq $0, %rcx\n"
88" movq $0, %rdx\n"
89" movq $0, %rsi\n"
90" movq $0, %rdi\n"
91" movq $0, %rbp\n"
92" movq $0, %r8\n"
93" movq $0, %r9\n"
94" movq $0, %r10\n"
95" movq $0, %r11\n"
96" movq $0, %r12\n"
97" movq $0, %r13\n"
98" movq $0, %r14\n"
99" movq $0, %r15\n"
100" popq %rdi\n" // arg1 to correct arg reg
101" ret\n" // jump to f
102" ud2\n" // should never get here
sewardj2fedc642005-11-19 02:02:57 +0000103".previous\n"
njnfcb7c3e2005-06-18 15:54:25 +0000104);
105
sewardje7aa4ae2005-06-09 12:43:42 +0000106/*
107 Perform a clone system call. clone is strange because it has
108 fork()-like return-twice semantics, so it needs special
109 handling here.
110
111 Upon entry, we have:
112
113 int (*fn)(void*) in %rdi
114 void* child_stack in %rsi
115 int flags in %rdx
116 void* arg in %rcx
117 pid_t* child_tid in %r8
118 pid_t* parent_tid in %r9
119 void* tls_ptr at 8(%rsp)
120
121 System call requires:
122
123 int $__NR_clone in %rax
124 int flags in %rdi
125 void* child_stack in %rsi
126 pid_t* parent_tid in %rdx
127 pid_t* child_tid in %r10
128 void* tls_ptr in %r8
129
130 Returns a Long encoded in the linux-amd64 way, not a SysRes.
131 */
sewardj7d15e512005-09-30 01:20:47 +0000132#define __NR_CLONE VG_STRINGIFY(__NR_clone)
133#define __NR_EXIT VG_STRINGIFY(__NR_exit)
sewardje7aa4ae2005-06-09 12:43:42 +0000134
135extern
njnffd9c1d2005-11-10 04:02:19 +0000136Long do_syscall_clone_amd64_linux ( Word (*fn)(void *),
sewardje7aa4ae2005-06-09 12:43:42 +0000137 void* stack,
138 Long flags,
139 void* arg,
140 Long* child_tid,
141 Long* parent_tid,
142 vki_modify_ldt_t * );
143asm(
sewardjd9fc3822005-11-18 23:50:43 +0000144".text\n"
philippe9fdca562012-04-16 22:06:47 +0000145".globl do_syscall_clone_amd64_linux\n"
sewardje7aa4ae2005-06-09 12:43:42 +0000146"do_syscall_clone_amd64_linux:\n"
147 // set up child stack, temporarily preserving fn and arg
148" subq $16, %rsi\n" // make space on stack
149" movq %rcx, 8(%rsi)\n" // save arg
150" movq %rdi, 0(%rsi)\n" // save fn
151
152 // setup syscall
153" movq $"__NR_CLONE", %rax\n" // syscall number
154" movq %rdx, %rdi\n" // syscall arg1: flags
155 // %rsi already setup // syscall arg2: child_stack
156" movq %r9, %rdx\n" // syscall arg3: parent_tid
157" movq %r8, %r10\n" // syscall arg4: child_tid
158" movq 8(%rsp), %r8\n" // syscall arg5: tls_ptr
159
160" syscall\n" // clone()
161
162" testq %rax, %rax\n" // child if retval == 0
163" jnz 1f\n"
164
165 // CHILD - call thread function
166" pop %rax\n" // pop fn
167" pop %rdi\n" // pop fn arg1: arg
168" call *%rax\n" // call fn
169
170 // exit with result
171" movq %rax, %rdi\n" // arg1: return value from fn
172" movq $"__NR_EXIT", %rax\n"
173
174" syscall\n"
175
176 // Exit returned?!
177" ud2\n"
178
179"1:\n" // PARENT or ERROR
180" ret\n"
sewardj2fedc642005-11-19 02:02:57 +0000181".previous\n"
sewardje7aa4ae2005-06-09 12:43:42 +0000182);
183
184#undef __NR_CLONE
185#undef __NR_EXIT
sewardje7aa4ae2005-06-09 12:43:42 +0000186
187
njn2335d112005-05-15 20:52:04 +0000188// forward declaration
189static void setup_child ( ThreadArchState*, ThreadArchState* );
190
191/*
sewardj96f71e12005-03-24 19:38:57 +0000192 When a client clones, we need to keep track of the new thread. This means:
193 1. allocate a ThreadId+ThreadState+stack for the the thread
194
195 2. initialize the thread's new VCPU state
196
197 3. create the thread using the same args as the client requested,
198 but using the scheduler entrypoint for EIP, and a separate stack
199 for ESP.
200 */
sewardje7aa4ae2005-06-09 12:43:42 +0000201static SysRes do_clone ( ThreadId ptid,
202 ULong flags, Addr rsp,
203 Long* parent_tidptr,
204 Long* child_tidptr,
205 Addr tlsaddr )
sewardj96f71e12005-03-24 19:38:57 +0000206{
207 static const Bool debug = False;
208
sewardje7aa4ae2005-06-09 12:43:42 +0000209 ThreadId ctid = VG_(alloc_ThreadState)();
210 ThreadState* ptst = VG_(get_ThreadState)(ptid);
211 ThreadState* ctst = VG_(get_ThreadState)(ctid);
212 UWord* stack;
sewardjef1cf8b2006-10-17 01:47:30 +0000213 NSegment const* seg;
sewardje7aa4ae2005-06-09 12:43:42 +0000214 SysRes res;
215 Long rax;
sewardj96f71e12005-03-24 19:38:57 +0000216 vki_sigset_t blockall, savedmask;
217
218 VG_(sigfillset)(&blockall);
219
220 vg_assert(VG_(is_running_thread)(ptid));
221 vg_assert(VG_(is_valid_tid)(ctid));
222
njna3afdfb2005-11-09 04:49:28 +0000223 stack = (UWord*)ML_(allocstack)(ctid);
sewardj45f4e7c2005-09-27 19:20:21 +0000224 if (stack == NULL) {
225 res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
226 goto out;
227 }
sewardj96f71e12005-03-24 19:38:57 +0000228
229 /* Copy register state
230
231 Both parent and child return to the same place, and the code
232 following the clone syscall works out which is which, so we
233 don't need to worry about it.
234
235 The parent gets the child's new tid returned from clone, but the
236 child gets 0.
237
238 If the clone call specifies a NULL rsp for the new thread, then
239 it actually gets a copy of the parent's rsp.
240 */
njn2335d112005-05-15 20:52:04 +0000241 setup_child( &ctst->arch, &ptst->arch );
sewardj96f71e12005-03-24 19:38:57 +0000242
sewardje7aa4ae2005-06-09 12:43:42 +0000243 /* Make sys_clone appear to have returned Success(0) in the
244 child. */
245 ctst->arch.vex.guest_RAX = 0;
246
sewardj96f71e12005-03-24 19:38:57 +0000247 if (rsp != 0)
248 ctst->arch.vex.guest_RSP = rsp;
249
250 ctst->os_state.parent = ptid;
sewardj96f71e12005-03-24 19:38:57 +0000251
252 /* inherit signal mask */
253 ctst->sig_mask = ptst->sig_mask;
254 ctst->tmp_sig_mask = ptst->sig_mask;
255
sewardjce215632010-02-22 11:03:10 +0000256 /* Start the child with its threadgroup being the same as the
257 parent's. This is so that any exit_group calls that happen
258 after the child is created but before it sets its
259 os_state.threadgroup field for real (in thread_wrapper in
260 syswrap-linux.c), really kill the new thread. a.k.a this avoids
261 a race condition in which the thread is unkillable (via
262 exit_group) because its threadgroup is not set. The race window
263 is probably only a few hundred or a few thousand cycles long.
264 See #226116. */
265 ctst->os_state.threadgroup = ptst->os_state.threadgroup;
266
sewardj96f71e12005-03-24 19:38:57 +0000267 /* We don't really know where the client stack is, because its
268 allocated by the client. The best we can do is look at the
269 memory mappings and try to derive some useful information. We
270 assume that esp starts near its highest possible value, and can
271 only go down to the start of the mmaped segment. */
sewardj45f4e7c2005-09-27 19:20:21 +0000272 seg = VG_(am_find_nsegment)((Addr)rsp);
273 if (seg && seg->kind != SkResvn) {
njn13bfd852005-06-02 03:52:53 +0000274 ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(rsp);
sewardj45f4e7c2005-09-27 19:20:21 +0000275 ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
sewardj96f71e12005-03-24 19:38:57 +0000276
tom690c3c82008-02-08 15:17:07 +0000277 VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
278
sewardj96f71e12005-03-24 19:38:57 +0000279 if (debug)
barta0b6b2c2008-07-07 06:49:24 +0000280 VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n",
sewardj45f4e7c2005-09-27 19:20:21 +0000281 ctid, seg->start, VG_PGROUNDUP(rsp));
sewardj96f71e12005-03-24 19:38:57 +0000282 } else {
sewardj738856f2009-07-15 14:48:32 +0000283 VG_(message)(Vg_UserMsg,
284 "!? New thread %d starts with RSP(%#lx) unmapped\n",
sewardj96f71e12005-03-24 19:38:57 +0000285 ctid, rsp);
njn50ba34e2005-04-04 02:41:42 +0000286 ctst->client_stack_szB = 0;
sewardj96f71e12005-03-24 19:38:57 +0000287 }
288
sewardjadb102f2007-11-09 23:21:44 +0000289 /* Assume the clone will succeed, and tell any tool that wants to
290 know that this thread has come into existence. If the clone
291 fails, we'll send out a ll_exit notification for it at the out:
292 label below, to clean up. */
bart9a2b80d2012-03-25 17:51:59 +0000293 vg_assert(VG_(owns_BigLock_LL)(ptid));
sewardjadb102f2007-11-09 23:21:44 +0000294 VG_TRACK ( pre_thread_ll_create, ptid, ctid );
295
sewardj96f71e12005-03-24 19:38:57 +0000296 if (flags & VKI_CLONE_SETTLS) {
297 if (debug)
barta0b6b2c2008-07-07 06:49:24 +0000298 VG_(printf)("clone child has SETTLS: tls at %#lx\n", tlsaddr);
sewardj96f71e12005-03-24 19:38:57 +0000299 ctst->arch.vex.guest_FS_ZERO = tlsaddr;
300 }
301
302 flags &= ~VKI_CLONE_SETTLS;
303
304 /* start the thread with everything blocked */
305 VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
306
307 /* Create the new thread */
sewardje7aa4ae2005-06-09 12:43:42 +0000308 rax = do_syscall_clone_amd64_linux(
njna3afdfb2005-11-09 04:49:28 +0000309 ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid],
sewardje7aa4ae2005-06-09 12:43:42 +0000310 child_tidptr, parent_tidptr, NULL
311 );
cerion85665ca2005-06-20 15:51:07 +0000312 res = VG_(mk_SysRes_amd64_linux)( rax );
sewardj96f71e12005-03-24 19:38:57 +0000313
314 VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
315
sewardj45f4e7c2005-09-27 19:20:21 +0000316 out:
njncda2f0f2009-05-18 02:12:08 +0000317 if (sr_isError(res)) {
sewardj96f71e12005-03-24 19:38:57 +0000318 /* clone failed */
njnaf839f52005-06-23 03:27:57 +0000319 VG_(cleanup_thread)(&ctst->arch);
sewardj96f71e12005-03-24 19:38:57 +0000320 ctst->status = VgTs_Empty;
sewardjadb102f2007-11-09 23:21:44 +0000321 /* oops. Better tell the tool the thread exited in a hurry :-) */
322 VG_TRACK( pre_thread_ll_exit, ctid );
sewardj96f71e12005-03-24 19:38:57 +0000323 }
324
sewardje7aa4ae2005-06-09 12:43:42 +0000325 return res;
sewardj96f71e12005-03-24 19:38:57 +0000326}
327
sewardje7aa4ae2005-06-09 12:43:42 +0000328
sewardj4d89e302005-03-16 22:04:40 +0000329/* ---------------------------------------------------------------------
njn2335d112005-05-15 20:52:04 +0000330 More thread stuff
331 ------------------------------------------------------------------ */
332
njnaf839f52005-06-23 03:27:57 +0000333void VG_(cleanup_thread) ( ThreadArchState *arch )
njn2335d112005-05-15 20:52:04 +0000334{
335}
336
337void setup_child ( /*OUT*/ ThreadArchState *child,
338 /*IN*/ ThreadArchState *parent )
339{
340 /* We inherit our parent's guest state. */
341 child->vex = parent->vex;
sewardj7cf4e6b2008-05-01 20:24:26 +0000342 child->vex_shadow1 = parent->vex_shadow1;
343 child->vex_shadow2 = parent->vex_shadow2;
njn2335d112005-05-15 20:52:04 +0000344}
345
sewardje7aa4ae2005-06-09 12:43:42 +0000346
njn2335d112005-05-15 20:52:04 +0000347/* ---------------------------------------------------------------------
njnc6168192004-11-29 13:54:10 +0000348 PRE/POST wrappers for AMD64/Linux-specific syscalls
349 ------------------------------------------------------------------ */
350
sewardje7aa4ae2005-06-09 12:43:42 +0000351#define PRE(name) DEFN_PRE_TEMPLATE(amd64_linux, name)
352#define POST(name) DEFN_POST_TEMPLATE(amd64_linux, name)
njnc6168192004-11-29 13:54:10 +0000353
sewardje7aa4ae2005-06-09 12:43:42 +0000354/* Add prototypes for the wrappers declared here, so that gcc doesn't
355 harass us for not having prototypes. Really this is a kludge --
356 the right thing to do is to make these wrappers 'static' since they
357 aren't visible outside this file, but that requires even more macro
358 magic. */
359DECL_TEMPLATE(amd64_linux, sys_clone);
360DECL_TEMPLATE(amd64_linux, sys_rt_sigreturn);
sewardje7aa4ae2005-06-09 12:43:42 +0000361DECL_TEMPLATE(amd64_linux, sys_arch_prctl);
tom2af58f22005-07-22 15:04:14 +0000362DECL_TEMPLATE(amd64_linux, sys_ptrace);
tom20d35722005-07-27 22:57:18 +0000363DECL_TEMPLATE(amd64_linux, sys_fadvise64);
tom9548a162005-09-30 08:07:53 +0000364DECL_TEMPLATE(amd64_linux, sys_mmap);
sewardje25e7652006-04-20 14:38:50 +0000365DECL_TEMPLATE(amd64_linux, sys_syscall184);
njnc6168192004-11-29 13:54:10 +0000366
sewardje7aa4ae2005-06-09 12:43:42 +0000367
368PRE(sys_clone)
sewardj96f71e12005-03-24 19:38:57 +0000369{
sewardje7aa4ae2005-06-09 12:43:42 +0000370 ULong cloneflags;
sewardj96f71e12005-03-24 19:38:57 +0000371
barta0b6b2c2008-07-07 06:49:24 +0000372 PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
philippe8414ab32012-05-26 23:08:41 +0000373 PRE_REG_READ2(int, "clone",
sewardj96f71e12005-03-24 19:38:57 +0000374 unsigned long, flags,
philippe8414ab32012-05-26 23:08:41 +0000375 void *, child_stack);
sewardj96f71e12005-03-24 19:38:57 +0000376
377 if (ARG1 & VKI_CLONE_PARENT_SETTID) {
philippe8414ab32012-05-26 23:08:41 +0000378 if (VG_(tdict).track_pre_reg_read) {
379 PRA3("clone", int *, parent_tidptr);
380 }
sewardj96f71e12005-03-24 19:38:57 +0000381 PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
sewardj45f4e7c2005-09-27 19:20:21 +0000382 if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int), VKI_PROT_WRITE)) {
sewardje7aa4ae2005-06-09 12:43:42 +0000383 SET_STATUS_Failure( VKI_EFAULT );
sewardj96f71e12005-03-24 19:38:57 +0000384 return;
385 }
386 }
philippe8414ab32012-05-26 23:08:41 +0000387 if (ARG1 & VKI_CLONE_SETTLS) {
388 if (VG_(tdict).track_pre_reg_read) {
389 PRA4("clone", vki_modify_ldt_t *, tlsinfo);
390 }
391 PRE_MEM_READ("clone(tlsinfo)", ARG4, sizeof(vki_modify_ldt_t));
392 if (!VG_(am_is_valid_for_client)(ARG4, sizeof(vki_modify_ldt_t),
393 VKI_PROT_READ)) {
394 SET_STATUS_Failure( VKI_EFAULT );
395 return;
396 }
397 }
sewardj96f71e12005-03-24 19:38:57 +0000398 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
philippe8414ab32012-05-26 23:08:41 +0000399 if (VG_(tdict).track_pre_reg_read) {
400 PRA5("clone", int *, child_tidptr);
401 }
sewardj96f71e12005-03-24 19:38:57 +0000402 PRE_MEM_WRITE("clone(child_tidptr)", ARG4, sizeof(Int));
sewardj45f4e7c2005-09-27 19:20:21 +0000403 if (!VG_(am_is_valid_for_client)(ARG4, sizeof(Int), VKI_PROT_WRITE)) {
sewardje7aa4ae2005-06-09 12:43:42 +0000404 SET_STATUS_Failure( VKI_EFAULT );
sewardj96f71e12005-03-24 19:38:57 +0000405 return;
406 }
407 }
408
409 cloneflags = ARG1;
410
cerion7b2c38c2005-06-23 07:52:54 +0000411 if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
sewardje7aa4ae2005-06-09 12:43:42 +0000412 SET_STATUS_Failure( VKI_EINVAL );
sewardj96f71e12005-03-24 19:38:57 +0000413 return;
414 }
415
416 /* Only look at the flags we really care about */
sewardje7aa4ae2005-06-09 12:43:42 +0000417 switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
418 | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
sewardj96f71e12005-03-24 19:38:57 +0000419 case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
420 /* thread creation */
sewardje7aa4ae2005-06-09 12:43:42 +0000421 SET_STATUS_from_SysRes(
422 do_clone(tid,
423 ARG1, /* flags */
424 (Addr)ARG2, /* child ESP */
425 (Long *)ARG3, /* parent_tidptr */
426 (Long *)ARG4, /* child_tidptr */
427 (Addr)ARG5)); /* set_tls */
sewardj96f71e12005-03-24 19:38:57 +0000428 break;
429
430 case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
431 /* FALLTHROUGH - assume vfork == fork */
432 cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
433
434 case 0: /* plain fork */
sewardje7aa4ae2005-06-09 12:43:42 +0000435 SET_STATUS_from_SysRes(
njne1486662005-11-10 02:48:04 +0000436 ML_(do_fork_clone)(tid,
sewardje7aa4ae2005-06-09 12:43:42 +0000437 cloneflags, /* flags */
tom60677fb2005-11-11 11:54:11 +0000438 (Int *)ARG3, /* parent_tidptr */
439 (Int *)ARG4)); /* child_tidptr */
sewardj96f71e12005-03-24 19:38:57 +0000440 break;
441
442 default:
443 /* should we just ENOSYS? */
sewardj738856f2009-07-15 14:48:32 +0000444 VG_(message)(Vg_UserMsg,
445 "Unsupported clone() flags: 0x%lx\n", ARG1);
446 VG_(message)(Vg_UserMsg,
447 "\n");
448 VG_(message)(Vg_UserMsg,
449 "The only supported clone() uses are:\n");
450 VG_(message)(Vg_UserMsg,
451 " - via a threads library (LinuxThreads or NPTL)\n");
452 VG_(message)(Vg_UserMsg,
453 " - via the implementation of fork or vfork\n");
sewardj96f71e12005-03-24 19:38:57 +0000454 VG_(unimplemented)
sewardje7aa4ae2005-06-09 12:43:42 +0000455 ("Valgrind does not support general clone().");
sewardj96f71e12005-03-24 19:38:57 +0000456 }
457
sewardje7aa4ae2005-06-09 12:43:42 +0000458 if (SUCCESS) {
sewardj96f71e12005-03-24 19:38:57 +0000459 if (ARG1 & VKI_CLONE_PARENT_SETTID)
460 POST_MEM_WRITE(ARG3, sizeof(Int));
461 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
462 POST_MEM_WRITE(ARG4, sizeof(Int));
463
464 /* Thread creation was successful; let the child have the chance
465 to run */
sewardje7aa4ae2005-06-09 12:43:42 +0000466 *flags |= SfYieldAfter;
sewardj96f71e12005-03-24 19:38:57 +0000467 }
468}
469
sewardje7aa4ae2005-06-09 12:43:42 +0000470PRE(sys_rt_sigreturn)
sewardj62601592005-03-26 13:48:19 +0000471{
sewardj18290532007-03-19 13:38:11 +0000472 /* This isn't really a syscall at all - it's a misuse of the
473 syscall mechanism by m_sigframe. VG_(sigframe_create) sets the
474 return address of the signal frames it creates to be a short
475 piece of code which does this "syscall". The only purpose of
476 the syscall is to call VG_(sigframe_destroy), which restores the
477 thread's registers from the frame and then removes it.
478 Consequently we must ask the syswrap driver logic not to write
479 back the syscall "result" as that would overwrite the
480 just-restored register state. */
481
sewardje7aa4ae2005-06-09 12:43:42 +0000482 ThreadState* tst;
sewardj18290532007-03-19 13:38:11 +0000483 PRINT("sys_rt_sigreturn ( )");
sewardj62601592005-03-26 13:48:19 +0000484
sewardje7aa4ae2005-06-09 12:43:42 +0000485 vg_assert(VG_(is_valid_tid)(tid));
486 vg_assert(tid >= 1 && tid < VG_N_THREADS);
487 vg_assert(VG_(is_running_thread)(tid));
488
sewardj18290532007-03-19 13:38:11 +0000489 /* Adjust RSP to point to start of frame; skip back up over handler
sewardj62601592005-03-26 13:48:19 +0000490 ret addr */
sewardje7aa4ae2005-06-09 12:43:42 +0000491 tst = VG_(get_ThreadState)(tid);
sewardj62601592005-03-26 13:48:19 +0000492 tst->arch.vex.guest_RSP -= sizeof(Addr);
493
494 /* This is only so that the RIP is (might be) useful to report if
sewardj18290532007-03-19 13:38:11 +0000495 something goes wrong in the sigreturn. JRS 20070318: no idea
496 what this is for */
cerion7b2c38c2005-06-23 07:52:54 +0000497 ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
sewardj62601592005-03-26 13:48:19 +0000498
sewardj18290532007-03-19 13:38:11 +0000499 /* Restore register state from frame and remove it, as
500 described above */
sewardj8a7fdd22005-04-24 14:31:29 +0000501 VG_(sigframe_destroy)(tid, True);
sewardj62601592005-03-26 13:48:19 +0000502
sewardj18290532007-03-19 13:38:11 +0000503 /* Tell the driver not to update the guest state with the "result",
504 and set a bogus result to keep it happy. */
505 *flags |= SfNoWriteResult;
506 SET_STATUS_Success(0);
sewardj62601592005-03-26 13:48:19 +0000507
sewardjcba8f432007-03-19 14:34:08 +0000508 /* Check to see if any signals arose as a result of this. */
sewardje7aa4ae2005-06-09 12:43:42 +0000509 *flags |= SfPollAfter;
sewardj62601592005-03-26 13:48:19 +0000510}
511
sewardje7aa4ae2005-06-09 12:43:42 +0000512PRE(sys_arch_prctl)
njnc6168192004-11-29 13:54:10 +0000513{
sewardje7aa4ae2005-06-09 12:43:42 +0000514 ThreadState* tst;
barta0b6b2c2008-07-07 06:49:24 +0000515 PRINT( "arch_prctl ( %ld, %lx )", ARG1, ARG2 );
sewardj8eff3822005-02-17 09:30:21 +0000516
sewardje7aa4ae2005-06-09 12:43:42 +0000517 vg_assert(VG_(is_valid_tid)(tid));
518 vg_assert(tid >= 1 && tid < VG_N_THREADS);
519 vg_assert(VG_(is_running_thread)(tid));
520
sewardj8eff3822005-02-17 09:30:21 +0000521 // Nb: can't use "ARG2".."ARG5" here because that's our own macro...
522 PRE_REG_READ2(long, "arch_prctl",
523 int, option, unsigned long, arg2);
524 // XXX: totally wrong... we need to look at the 'option' arg, and do
525 // PRE_MEM_READs/PRE_MEM_WRITEs as necessary...
526
527 /* "do" the syscall ourselves; the kernel never sees it */
tomf2dab382005-07-19 22:35:58 +0000528 if (ARG1 == VKI_ARCH_SET_FS) {
529 tst = VG_(get_ThreadState)(tid);
530 tst->arch.vex.guest_FS_ZERO = ARG2;
531 }
532 else if (ARG1 == VKI_ARCH_GET_FS) {
533 PRE_MEM_WRITE("arch_prctl(addr)", ARG2, sizeof(unsigned long));
534 tst = VG_(get_ThreadState)(tid);
535 *(unsigned long *)ARG2 = tst->arch.vex.guest_FS_ZERO;
536 POST_MEM_WRITE(ARG2, sizeof(unsigned long));
537 }
538 else {
539 VG_(core_panic)("Unsupported arch_prtctl option");
540 }
sewardje7aa4ae2005-06-09 12:43:42 +0000541
542 /* Note; the Status writeback to guest state that happens after
543 this wrapper returns does not change guest_FS_ZERO; hence that
544 direct assignment to the guest state is safe here. */
545 SET_STATUS_Success( 0 );
njnc6168192004-11-29 13:54:10 +0000546}
547
tom2af58f22005-07-22 15:04:14 +0000548// Parts of this are amd64-specific, but the *PEEK* cases are generic.
tomb807a782007-03-07 09:48:32 +0000549//
550// ARG3 is only used for pointers into the traced process's address
551// space and for offsets into the traced process's struct
552// user_regs_struct. It is never a pointer into this process's memory
553// space, and we should therefore not check anything it points to.
tom2af58f22005-07-22 15:04:14 +0000554PRE(sys_ptrace)
555{
barta0b6b2c2008-07-07 06:49:24 +0000556 PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
tom2af58f22005-07-22 15:04:14 +0000557 PRE_REG_READ4(int, "ptrace",
558 long, request, long, pid, long, addr, long, data);
559 switch (ARG1) {
560 case VKI_PTRACE_PEEKTEXT:
561 case VKI_PTRACE_PEEKDATA:
562 case VKI_PTRACE_PEEKUSR:
563 PRE_MEM_WRITE( "ptrace(peek)", ARG4,
564 sizeof (long));
565 break;
566 case VKI_PTRACE_GETREGS:
567 PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
568 sizeof (struct vki_user_regs_struct));
569 break;
570 case VKI_PTRACE_GETFPREGS:
571 PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
572 sizeof (struct vki_user_i387_struct));
573 break;
574 case VKI_PTRACE_SETREGS:
575 PRE_MEM_READ( "ptrace(setregs)", ARG4,
576 sizeof (struct vki_user_regs_struct));
577 break;
578 case VKI_PTRACE_SETFPREGS:
579 PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
580 sizeof (struct vki_user_i387_struct));
581 break;
tomb807a782007-03-07 09:48:32 +0000582 case VKI_PTRACE_GETEVENTMSG:
583 PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long));
584 break;
585 case VKI_PTRACE_GETSIGINFO:
586 PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t));
587 break;
588 case VKI_PTRACE_SETSIGINFO:
589 PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t));
590 break;
cborntrab2cd1bc2012-11-08 20:27:05 +0000591 case VKI_PTRACE_GETREGSET:
592 ML_(linux_PRE_getregset)(tid, ARG3, ARG4);
593 break;
594 case VKI_PTRACE_SETREGSET:
595 ML_(linux_PRE_setregset)(tid, ARG3, ARG4);
596 break;
tom2af58f22005-07-22 15:04:14 +0000597 default:
598 break;
599 }
600}
601
602POST(sys_ptrace)
603{
604 switch (ARG1) {
605 case VKI_PTRACE_PEEKTEXT:
606 case VKI_PTRACE_PEEKDATA:
607 case VKI_PTRACE_PEEKUSR:
608 POST_MEM_WRITE( ARG4, sizeof (long));
609 break;
610 case VKI_PTRACE_GETREGS:
611 POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
612 break;
613 case VKI_PTRACE_GETFPREGS:
614 POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
615 break;
tomb807a782007-03-07 09:48:32 +0000616 case VKI_PTRACE_GETEVENTMSG:
617 POST_MEM_WRITE( ARG4, sizeof(unsigned long));
618 break;
619 case VKI_PTRACE_GETSIGINFO:
620 /* XXX: This is a simplification. Different parts of the
621 * siginfo_t are valid depending on the type of signal.
622 */
623 POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t));
624 break;
cborntrab2cd1bc2012-11-08 20:27:05 +0000625 case VKI_PTRACE_GETREGSET:
626 ML_(linux_POST_getregset)(tid, ARG3, ARG4);
627 break;
tom2af58f22005-07-22 15:04:14 +0000628 default:
629 break;
630 }
631}
632
tom20d35722005-07-27 22:57:18 +0000633PRE(sys_fadvise64)
634{
barta0b6b2c2008-07-07 06:49:24 +0000635 PRINT("sys_fadvise64 ( %ld, %ld, %lu, %ld )", ARG1,ARG2,ARG3,ARG4);
tom20d35722005-07-27 22:57:18 +0000636 PRE_REG_READ4(long, "fadvise64",
637 int, fd, vki_loff_t, offset, vki_size_t, len, int, advice);
638}
639
tom9548a162005-09-30 08:07:53 +0000640PRE(sys_mmap)
641{
642 SysRes r;
643
sewardj50a99de2008-11-13 13:14:00 +0000644 PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %d, %ld )",
645 ARG1, (ULong)ARG2, ARG3, ARG4, (Int)ARG5, ARG6 );
tom9548a162005-09-30 08:07:53 +0000646 PRE_REG_READ6(long, "mmap",
647 unsigned long, start, unsigned long, length,
648 unsigned long, prot, unsigned long, flags,
649 unsigned long, fd, unsigned long, offset);
650
651 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
652 SET_STATUS_from_SysRes(r);
653}
654
sewardje25e7652006-04-20 14:38:50 +0000655
656/* ---------------------------------------------------------------
657 PRE/POST wrappers for AMD64/Linux-variant specific syscalls
658 ------------------------------------------------------------ */
659
660PRE(sys_syscall184)
661{
662 Int err;
663
664 /* 184 is used by sys_bproc. If we're not on a declared bproc
665 variant, fail in the usual way, since it is otherwise unused. */
666
667 if (!VG_(strstr)(VG_(clo_kernel_variant), "bproc")) {
668 PRINT("non-existent syscall! (syscall 184)");
669 PRE_REG_READ0(long, "ni_syscall(184)");
670 SET_STATUS_Failure( VKI_ENOSYS );
671 return;
672 }
673
674 err = ML_(linux_variant_PRE_sys_bproc)( ARG1, ARG2, ARG3,
675 ARG4, ARG5, ARG6 );
676 if (err) {
677 SET_STATUS_Failure( err );
678 return;
679 }
680 /* Let it go through. */
681 *flags |= SfMayBlock; /* who knows? play safe. */
682}
683
684POST(sys_syscall184)
685{
686 ML_(linux_variant_POST_sys_bproc)( ARG1, ARG2, ARG3,
687 ARG4, ARG5, ARG6 );
688}
689
njnc6168192004-11-29 13:54:10 +0000690#undef PRE
691#undef POST
692
sewardj987a8eb2005-03-01 19:00:30 +0000693
njnc6168192004-11-29 13:54:10 +0000694/* ---------------------------------------------------------------------
695 The AMD64/Linux syscall table
696 ------------------------------------------------------------------ */
697
sewardje7aa4ae2005-06-09 12:43:42 +0000698/* Add an amd64-linux specific wrapper to a syscall table. */
699#define PLAX_(const, name) WRAPPER_ENTRY_X_(amd64_linux, const, name)
700#define PLAXY(const, name) WRAPPER_ENTRY_XY(amd64_linux, const, name)
njnc6168192004-11-29 13:54:10 +0000701
702// This table maps from __NR_xxx syscall numbers (from
703// linux/include/asm-x86_64/unistd.h) to the appropriate PRE/POST sys_foo()
704// wrappers on AMD64 (as per sys_call_table in
705// linux/arch/x86_64/kernel/entry.S).
706//
njna22a93a2004-11-29 17:28:41 +0000707// When implementing these wrappers, you need to work out if the wrapper is
708// generic, Linux-only (but arch-independent), or AMD64/Linux only.
njnc6168192004-11-29 13:54:10 +0000709
sewardj59570ff2010-01-01 11:59:33 +0000710static SyscallTableEntry syscall_table[] = {
sewardj91f1c6f2005-02-13 10:47:24 +0000711 GENXY(__NR_read, sys_read), // 0
sewardj8eff3822005-02-17 09:30:21 +0000712 GENX_(__NR_write, sys_write), // 1
tom04e069e2005-03-28 23:25:58 +0000713 GENXY(__NR_open, sys_open), // 2
sewardj91f1c6f2005-02-13 10:47:24 +0000714 GENXY(__NR_close, sys_close), // 3
715 GENXY(__NR_stat, sys_newstat), // 4
njna22a93a2004-11-29 17:28:41 +0000716
sewardj91f1c6f2005-02-13 10:47:24 +0000717 GENXY(__NR_fstat, sys_newfstat), // 5
sewardjc9b7b122005-02-19 22:45:15 +0000718 GENXY(__NR_lstat, sys_newlstat), // 6
sewardj987a8eb2005-03-01 19:00:30 +0000719 GENXY(__NR_poll, sys_poll), // 7
njncd405ea2005-08-31 02:44:31 +0000720 LINX_(__NR_lseek, sys_lseek), // 8
tom9548a162005-09-30 08:07:53 +0000721 PLAX_(__NR_mmap, sys_mmap), // 9
njna22a93a2004-11-29 17:28:41 +0000722
sewardj91f1c6f2005-02-13 10:47:24 +0000723 GENXY(__NR_mprotect, sys_mprotect), // 10
sewardj8eff3822005-02-17 09:30:21 +0000724 GENXY(__NR_munmap, sys_munmap), // 11
sewardj91f1c6f2005-02-13 10:47:24 +0000725 GENX_(__NR_brk, sys_brk), // 12
njncd405ea2005-08-31 02:44:31 +0000726 LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 13
727 LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 14
njna22a93a2004-11-29 17:28:41 +0000728
sewardj62601592005-03-26 13:48:19 +0000729 PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 15
njn096ccdd2009-02-22 23:00:30 +0000730 LINXY(__NR_ioctl, sys_ioctl), // 16
njn7b1edbd2009-05-19 06:50:37 +0000731 GENXY(__NR_pread64, sys_pread64), // 17
732 GENX_(__NR_pwrite64, sys_pwrite64), // 18
sewardj6941a1a2005-03-02 16:01:23 +0000733 GENXY(__NR_readv, sys_readv), // 19
njna22a93a2004-11-29 17:28:41 +0000734
sewardj91f1c6f2005-02-13 10:47:24 +0000735 GENX_(__NR_writev, sys_writev), // 20
736 GENX_(__NR_access, sys_access), // 21
njncd405ea2005-08-31 02:44:31 +0000737 LINXY(__NR_pipe, sys_pipe), // 22
sewardj6941a1a2005-03-02 16:01:23 +0000738 GENX_(__NR_select, sys_select), // 23
njnb2480c92005-08-30 02:17:23 +0000739 LINX_(__NR_sched_yield, sys_sched_yield), // 24
njna22a93a2004-11-29 17:28:41 +0000740
sewardj33586e52005-03-23 11:41:15 +0000741 GENX_(__NR_mremap, sys_mremap), // 25
tom507ae562005-07-20 08:46:50 +0000742 GENX_(__NR_msync, sys_msync), // 26
tom5ba95302011-08-10 09:57:27 +0000743 GENXY(__NR_mincore, sys_mincore), // 27
sewardj91f1c6f2005-02-13 10:47:24 +0000744 GENX_(__NR_madvise, sys_madvise), // 28
philippe6b087762013-03-01 23:31:09 +0000745 LINX_(__NR_shmget, sys_shmget), // 29
njna22a93a2004-11-29 17:28:41 +0000746
philippe6b087762013-03-01 23:31:09 +0000747 LINXY(__NR_shmat, wrap_sys_shmat), // 30
748 LINXY(__NR_shmctl, sys_shmctl), // 31
sewardjb369c5e2005-03-24 17:52:02 +0000749 GENXY(__NR_dup, sys_dup), // 32
750 GENXY(__NR_dup2, sys_dup2), // 33
sewardj96f71e12005-03-24 19:38:57 +0000751 GENX_(__NR_pause, sys_pause), // 34
njna22a93a2004-11-29 17:28:41 +0000752
sewardj96f71e12005-03-24 19:38:57 +0000753 GENXY(__NR_nanosleep, sys_nanosleep), // 35
tom074edc62005-04-02 17:43:50 +0000754 GENXY(__NR_getitimer, sys_getitimer), // 36
sewardj33586e52005-03-23 11:41:15 +0000755 GENX_(__NR_alarm, sys_alarm), // 37
tom074edc62005-04-02 17:43:50 +0000756 GENXY(__NR_setitimer, sys_setitimer), // 38
sewardj8eff3822005-02-17 09:30:21 +0000757 GENX_(__NR_getpid, sys_getpid), // 39
njna22a93a2004-11-29 17:28:41 +0000758
sewardja58bbbc2006-04-14 01:04:04 +0000759 LINXY(__NR_sendfile, sys_sendfile), // 40
philippe6b087762013-03-01 23:31:09 +0000760 LINXY(__NR_socket, sys_socket), // 41
761 LINX_(__NR_connect, sys_connect), // 42
762 LINXY(__NR_accept, sys_accept), // 43
763 LINX_(__NR_sendto, sys_sendto), // 44
njna22a93a2004-11-29 17:28:41 +0000764
philippe6b087762013-03-01 23:31:09 +0000765 LINXY(__NR_recvfrom, sys_recvfrom), // 45
766 LINX_(__NR_sendmsg, sys_sendmsg), // 46
767 LINXY(__NR_recvmsg, sys_recvmsg), // 47
768 LINX_(__NR_shutdown, sys_shutdown), // 48
769 LINX_(__NR_bind, sys_bind), // 49
njna22a93a2004-11-29 17:28:41 +0000770
philippe6b087762013-03-01 23:31:09 +0000771 LINX_(__NR_listen, sys_listen), // 50
772 LINXY(__NR_getsockname, sys_getsockname), // 51
773 LINXY(__NR_getpeername, sys_getpeername), // 52
774 LINXY(__NR_socketpair, sys_socketpair), // 53
775 LINX_(__NR_setsockopt, sys_setsockopt), // 54
njna22a93a2004-11-29 17:28:41 +0000776
philippe6b087762013-03-01 23:31:09 +0000777 LINXY(__NR_getsockopt, sys_getsockopt), // 55
sewardj96f71e12005-03-24 19:38:57 +0000778 PLAX_(__NR_clone, sys_clone), // 56
779 GENX_(__NR_fork, sys_fork), // 57
780 GENX_(__NR_vfork, sys_fork), // 58 treat as fork
sewardjb369c5e2005-03-24 17:52:02 +0000781 GENX_(__NR_execve, sys_execve), // 59
njna22a93a2004-11-29 17:28:41 +0000782
njnc6168192004-11-29 13:54:10 +0000783 GENX_(__NR_exit, sys_exit), // 60
sewardjb369c5e2005-03-24 17:52:02 +0000784 GENXY(__NR_wait4, sys_wait4), // 61
sewardj860fc632005-03-27 01:35:16 +0000785 GENX_(__NR_kill, sys_kill), // 62
sewardj91f1c6f2005-02-13 10:47:24 +0000786 GENXY(__NR_uname, sys_newuname), // 63
philippe6b087762013-03-01 23:31:09 +0000787 LINX_(__NR_semget, sys_semget), // 64
njna22a93a2004-11-29 17:28:41 +0000788
philippe6b087762013-03-01 23:31:09 +0000789 LINX_(__NR_semop, sys_semop), // 65
790 LINXY(__NR_semctl, sys_semctl), // 66
791 LINXY(__NR_shmdt, sys_shmdt), // 67
792 LINX_(__NR_msgget, sys_msgget), // 68
793 LINX_(__NR_msgsnd, sys_msgsnd), // 69
njna22a93a2004-11-29 17:28:41 +0000794
philippe6b087762013-03-01 23:31:09 +0000795 LINXY(__NR_msgrcv, sys_msgrcv), // 70
796 LINXY(__NR_msgctl, sys_msgctl), // 71
njn096ccdd2009-02-22 23:00:30 +0000797 LINXY(__NR_fcntl, sys_fcntl), // 72
tome329b262005-11-21 13:57:49 +0000798 GENX_(__NR_flock, sys_flock), // 73
sewardj5d2ca932005-04-07 02:23:50 +0000799 GENX_(__NR_fsync, sys_fsync), // 74
njna22a93a2004-11-29 17:28:41 +0000800
sewardj5d2ca932005-04-07 02:23:50 +0000801 GENX_(__NR_fdatasync, sys_fdatasync), // 75
tom507ae562005-07-20 08:46:50 +0000802 GENX_(__NR_truncate, sys_truncate), // 76
sewardjb369c5e2005-03-24 17:52:02 +0000803 GENX_(__NR_ftruncate, sys_ftruncate), // 77
sewardj6941a1a2005-03-02 16:01:23 +0000804 GENXY(__NR_getdents, sys_getdents), // 78
805 GENXY(__NR_getcwd, sys_getcwd), // 79
njna22a93a2004-11-29 17:28:41 +0000806
sewardj6941a1a2005-03-02 16:01:23 +0000807 GENX_(__NR_chdir, sys_chdir), // 80
808 GENX_(__NR_fchdir, sys_fchdir), // 81
tom7286be52005-04-01 23:22:36 +0000809 GENX_(__NR_rename, sys_rename), // 82
810 GENX_(__NR_mkdir, sys_mkdir), // 83
811 GENX_(__NR_rmdir, sys_rmdir), // 84
njna22a93a2004-11-29 17:28:41 +0000812
sewardj33586e52005-03-23 11:41:15 +0000813 GENXY(__NR_creat, sys_creat), // 85
tom7286be52005-04-01 23:22:36 +0000814 GENX_(__NR_link, sys_link), // 86
sewardjc9b7b122005-02-19 22:45:15 +0000815 GENX_(__NR_unlink, sys_unlink), // 87
tom7286be52005-04-01 23:22:36 +0000816 GENX_(__NR_symlink, sys_symlink), // 88
sewardj33586e52005-03-23 11:41:15 +0000817 GENX_(__NR_readlink, sys_readlink), // 89
njna22a93a2004-11-29 17:28:41 +0000818
sewardjc9b7b122005-02-19 22:45:15 +0000819 GENX_(__NR_chmod, sys_chmod), // 90
sewardj5d2ca932005-04-07 02:23:50 +0000820 GENX_(__NR_fchmod, sys_fchmod), // 91
tomb2112c12005-07-05 23:34:44 +0000821 GENX_(__NR_chown, sys_chown), // 92
822 GENX_(__NR_fchown, sys_fchown), // 93
823 GENX_(__NR_lchown, sys_lchown), // 94
njna22a93a2004-11-29 17:28:41 +0000824
sewardj33586e52005-03-23 11:41:15 +0000825 GENX_(__NR_umask, sys_umask), // 95
sewardj6941a1a2005-03-02 16:01:23 +0000826 GENXY(__NR_gettimeofday, sys_gettimeofday), // 96
sewardj987a8eb2005-03-01 19:00:30 +0000827 GENXY(__NR_getrlimit, sys_getrlimit), // 97
sewardj33586e52005-03-23 11:41:15 +0000828 GENXY(__NR_getrusage, sys_getrusage), // 98
tombc49f3d2005-07-19 16:05:49 +0000829 LINXY(__NR_sysinfo, sys_sysinfo), // 99
njna22a93a2004-11-29 17:28:41 +0000830
sewardjb369c5e2005-03-24 17:52:02 +0000831 GENXY(__NR_times, sys_times), // 100
tom2af58f22005-07-22 15:04:14 +0000832 PLAXY(__NR_ptrace, sys_ptrace), // 101
sewardj33586e52005-03-23 11:41:15 +0000833 GENX_(__NR_getuid, sys_getuid), // 102
bart65bfd212008-04-26 10:57:07 +0000834 LINXY(__NR_syslog, sys_syslog), // 103
sewardj6193c092005-03-27 18:20:26 +0000835 GENX_(__NR_getgid, sys_getgid), // 104
njna22a93a2004-11-29 17:28:41 +0000836
tom96375732005-07-19 15:26:33 +0000837 GENX_(__NR_setuid, sys_setuid), // 105
838 GENX_(__NR_setgid, sys_setgid), // 106
sewardj6193c092005-03-27 18:20:26 +0000839 GENX_(__NR_geteuid, sys_geteuid), // 107
840 GENX_(__NR_getegid, sys_getegid), // 108
tom7286be52005-04-01 23:22:36 +0000841 GENX_(__NR_setpgid, sys_setpgid), // 109
njna22a93a2004-11-29 17:28:41 +0000842
sewardj33586e52005-03-23 11:41:15 +0000843 GENX_(__NR_getppid, sys_getppid), // 110
sewardj6193c092005-03-27 18:20:26 +0000844 GENX_(__NR_getpgrp, sys_getpgrp), // 111
tom074edc62005-04-02 17:43:50 +0000845 GENX_(__NR_setsid, sys_setsid), // 112
tombc49f3d2005-07-19 16:05:49 +0000846 GENX_(__NR_setreuid, sys_setreuid), // 113
847 GENX_(__NR_setregid, sys_setregid), // 114
njna22a93a2004-11-29 17:28:41 +0000848
sewardj6193c092005-03-27 18:20:26 +0000849 GENXY(__NR_getgroups, sys_getgroups), // 115
tombc49f3d2005-07-19 16:05:49 +0000850 GENX_(__NR_setgroups, sys_setgroups), // 116
851 LINX_(__NR_setresuid, sys_setresuid), // 117
tom9749a502005-04-01 23:38:37 +0000852 LINXY(__NR_getresuid, sys_getresuid), // 118
tombc49f3d2005-07-19 16:05:49 +0000853 LINX_(__NR_setresgid, sys_setresgid), // 119
njna22a93a2004-11-29 17:28:41 +0000854
tom9749a502005-04-01 23:38:37 +0000855 LINXY(__NR_getresgid, sys_getresgid), // 120
tom074edc62005-04-02 17:43:50 +0000856 GENX_(__NR_getpgid, sys_getpgid), // 121
tom507ae562005-07-20 08:46:50 +0000857 LINX_(__NR_setfsuid, sys_setfsuid), // 122
858 LINX_(__NR_setfsgid, sys_setfsgid), // 123
tom2af58f22005-07-22 15:04:14 +0000859 GENX_(__NR_getsid, sys_getsid), // 124
njna22a93a2004-11-29 17:28:41 +0000860
bart744f9ea2008-08-27 17:41:56 +0000861 LINXY(__NR_capget, sys_capget), // 125
862 LINX_(__NR_capset, sys_capset), // 126
njncd405ea2005-08-31 02:44:31 +0000863 LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 127
864 LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait),// 128
865 LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),// 129
njna22a93a2004-11-29 17:28:41 +0000866
njncd405ea2005-08-31 02:44:31 +0000867 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 130
sewardj33586e52005-03-23 11:41:15 +0000868 GENXY(__NR_sigaltstack, sys_sigaltstack), // 131
njncd405ea2005-08-31 02:44:31 +0000869 LINX_(__NR_utime, sys_utime), // 132
tom7286be52005-04-01 23:22:36 +0000870 GENX_(__NR_mknod, sys_mknod), // 133
njna22a93a2004-11-29 17:28:41 +0000871 // (__NR_uselib, sys_uselib), // 134
872
tom2af58f22005-07-22 15:04:14 +0000873 LINX_(__NR_personality, sys_personality), // 135
njna22a93a2004-11-29 17:28:41 +0000874 // (__NR_ustat, sys_ustat), // 136
sewardj33586e52005-03-23 11:41:15 +0000875 GENXY(__NR_statfs, sys_statfs), // 137
tome329b262005-11-21 13:57:49 +0000876 GENXY(__NR_fstatfs, sys_fstatfs), // 138
njna22a93a2004-11-29 17:28:41 +0000877 // (__NR_sysfs, sys_sysfs), // 139
878
tom1a626ab2005-12-01 09:21:37 +0000879 GENX_(__NR_getpriority, sys_getpriority), // 140
880 GENX_(__NR_setpriority, sys_setpriority), // 141
bart2819f142008-07-09 07:39:09 +0000881 LINXY(__NR_sched_setparam, sys_sched_setparam), // 142
njnb2480c92005-08-30 02:17:23 +0000882 LINXY(__NR_sched_getparam, sys_sched_getparam), // 143
883 LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 144
njna22a93a2004-11-29 17:28:41 +0000884
njnb2480c92005-08-30 02:17:23 +0000885 LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 145
886 LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max), // 146
887 LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min), // 147
tomb8b48482009-11-24 16:03:19 +0000888 LINXY(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 148
tom686d4ca2005-04-02 11:39:56 +0000889 GENX_(__NR_mlock, sys_mlock), // 149
njna22a93a2004-11-29 17:28:41 +0000890
tom686d4ca2005-04-02 11:39:56 +0000891 GENX_(__NR_munlock, sys_munlock), // 150
892 GENX_(__NR_mlockall, sys_mlockall), // 151
njncd405ea2005-08-31 02:44:31 +0000893 LINX_(__NR_munlockall, sys_munlockall), // 152
tomacb7c342009-11-25 11:54:56 +0000894 LINX_(__NR_vhangup, sys_vhangup), // 153
njna22a93a2004-11-29 17:28:41 +0000895 // (__NR_modify_ldt, sys_modify_ldt), // 154
896
897 // (__NR_pivot_root, sys_pivot_root), // 155
sewardj02f718f2005-03-23 03:42:26 +0000898 LINXY(__NR__sysctl, sys_sysctl), // 156
toma39ebc82006-12-18 15:22:46 +0000899 LINXY(__NR_prctl, sys_prctl), // 157
njna22a93a2004-11-29 17:28:41 +0000900 PLAX_(__NR_arch_prctl, sys_arch_prctl), // 158
tom9ceaa972009-11-24 16:38:21 +0000901 LINXY(__NR_adjtimex, sys_adjtimex), // 159
njna22a93a2004-11-29 17:28:41 +0000902
sewardjb369c5e2005-03-24 17:52:02 +0000903 GENX_(__NR_setrlimit, sys_setrlimit), // 160
tom7286be52005-04-01 23:22:36 +0000904 GENX_(__NR_chroot, sys_chroot), // 161
tom686d4ca2005-04-02 11:39:56 +0000905 GENX_(__NR_sync, sys_sync), // 162
njna22a93a2004-11-29 17:28:41 +0000906 // (__NR_acct, sys_acct), // 163
tom1b1a2232005-07-20 09:24:04 +0000907 GENX_(__NR_settimeofday, sys_settimeofday), // 164
njna22a93a2004-11-29 17:28:41 +0000908
njnc6168192004-11-29 13:54:10 +0000909 LINX_(__NR_mount, sys_mount), // 165
sewardja58bbbc2006-04-14 01:04:04 +0000910 LINX_(__NR_umount2, sys_umount), // 166
njna22a93a2004-11-29 17:28:41 +0000911 // (__NR_swapon, sys_swapon), // 167
912 // (__NR_swapoff, sys_swapoff), // 168
913 // (__NR_reboot, sys_reboot), // 169
914
tomf93bbd92013-07-17 12:43:30 +0000915 GENX_(__NR_sethostname, sys_sethostname), // 170
njna22a93a2004-11-29 17:28:41 +0000916 // (__NR_setdomainname, sys_setdomainname), // 171
njn877d53e2005-09-30 01:05:53 +0000917 GENX_(__NR_iopl, sys_iopl), // 172
tom2af58f22005-07-22 15:04:14 +0000918 LINX_(__NR_ioperm, sys_ioperm), // 173
bart65bfd212008-04-26 10:57:07 +0000919 GENX_(__NR_create_module, sys_ni_syscall), // 174
njna22a93a2004-11-29 17:28:41 +0000920
bart10ac1442008-06-21 16:28:24 +0000921 LINX_(__NR_init_module, sys_init_module), // 175
922 LINX_(__NR_delete_module, sys_delete_module), // 176
njna22a93a2004-11-29 17:28:41 +0000923 // (__NR_get_kernel_syms, sys_ni_syscall), // 177
924 // (__NR_query_module, sys_ni_syscall), // 178
sewardja4885132008-10-30 13:12:50 +0000925 LINX_(__NR_quotactl, sys_quotactl), // 179
njna22a93a2004-11-29 17:28:41 +0000926
927 // (__NR_nfsservctl, sys_nfsservctl), // 180
928 // (__NR_getpmsg, sys_ni_syscall), // 181
929 // (__NR_putpmsg, sys_ni_syscall), // 182
930 // (__NR_afs_syscall, sys_ni_syscall), // 183
sewardje25e7652006-04-20 14:38:50 +0000931 PLAXY(184, sys_syscall184), // 184 // sys_bproc?
njna22a93a2004-11-29 17:28:41 +0000932
933 // (__NR_security, sys_ni_syscall), // 185
toma8d1ec62005-03-31 16:02:07 +0000934 LINX_(__NR_gettid, sys_gettid), // 186
sewardj792e00a2010-10-04 20:03:27 +0000935 LINX_(__NR_readahead, sys_readahead), // 187
tom1a7bda92005-11-13 00:08:03 +0000936 LINX_(__NR_setxattr, sys_setxattr), // 188
937 LINX_(__NR_lsetxattr, sys_lsetxattr), // 189
njna22a93a2004-11-29 17:28:41 +0000938
tom1a7bda92005-11-13 00:08:03 +0000939 LINX_(__NR_fsetxattr, sys_fsetxattr), // 190
njn65ccc502005-08-30 01:53:54 +0000940 LINXY(__NR_getxattr, sys_getxattr), // 191
tom1a7bda92005-11-13 00:08:03 +0000941 LINXY(__NR_lgetxattr, sys_lgetxattr), // 192
942 LINXY(__NR_fgetxattr, sys_fgetxattr), // 193
943 LINXY(__NR_listxattr, sys_listxattr), // 194
njna22a93a2004-11-29 17:28:41 +0000944
tom1a7bda92005-11-13 00:08:03 +0000945 LINXY(__NR_llistxattr, sys_llistxattr), // 195
946 LINXY(__NR_flistxattr, sys_flistxattr), // 196
947 LINX_(__NR_removexattr, sys_removexattr), // 197
948 LINX_(__NR_lremovexattr, sys_lremovexattr), // 198
949 LINX_(__NR_fremovexattr, sys_fremovexattr), // 199
njna22a93a2004-11-29 17:28:41 +0000950
tomc8cfca62006-02-15 10:34:50 +0000951 LINXY(__NR_tkill, sys_tkill), // 200
sewardj6941a1a2005-03-02 16:01:23 +0000952 GENXY(__NR_time, sys_time), /*was sys_time64*/ // 201
sewardj02f718f2005-03-23 03:42:26 +0000953 LINXY(__NR_futex, sys_futex), // 202
njnb2480c92005-08-30 02:17:23 +0000954 LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 203
955 LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 204
njna22a93a2004-11-29 17:28:41 +0000956
957 // (__NR_set_thread_area, sys_ni_syscall), // 205
sewardj45f4e7c2005-09-27 19:20:21 +0000958 LINXY(__NR_io_setup, sys_io_setup), // 206
tomb2112c12005-07-05 23:34:44 +0000959 LINX_(__NR_io_destroy, sys_io_destroy), // 207
960 LINXY(__NR_io_getevents, sys_io_getevents), // 208
961 LINX_(__NR_io_submit, sys_io_submit), // 209
njna22a93a2004-11-29 17:28:41 +0000962
tomb2112c12005-07-05 23:34:44 +0000963 LINXY(__NR_io_cancel, sys_io_cancel), // 210
njna22a93a2004-11-29 17:28:41 +0000964 // (__NR_get_thread_area, sys_ni_syscall), // 211
sewardjd3263e52008-11-16 21:40:54 +0000965 LINXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 212
sewardj43557d32005-07-01 08:39:38 +0000966 LINXY(__NR_epoll_create, sys_epoll_create), // 213
njna22a93a2004-11-29 17:28:41 +0000967 // (__NR_epoll_ctl_old, sys_ni_syscall), // 214
968
969 // (__NR_epoll_wait_old, sys_ni_syscall), // 215
970 // (__NR_remap_file_pages, sys_remap_file_pages)// 216
sewardj33586e52005-03-23 11:41:15 +0000971 GENXY(__NR_getdents64, sys_getdents64), // 217
sewardje7aa4ae2005-06-09 12:43:42 +0000972 LINX_(__NR_set_tid_address, sys_set_tid_address),// 218
njna22a93a2004-11-29 17:28:41 +0000973 // (__NR_restart_syscall, sys_restart_syscall),// 219
974
philippe6b087762013-03-01 23:31:09 +0000975 LINX_(__NR_semtimedop, sys_semtimedop), // 220
tom20d35722005-07-27 22:57:18 +0000976 PLAX_(__NR_fadvise64, sys_fadvise64), // 221
njn424c0562005-08-26 03:54:30 +0000977 LINXY(__NR_timer_create, sys_timer_create), // 222
978 LINXY(__NR_timer_settime, sys_timer_settime), // 223
979 LINXY(__NR_timer_gettime, sys_timer_gettime), // 224
njna22a93a2004-11-29 17:28:41 +0000980
njn424c0562005-08-26 03:54:30 +0000981 LINX_(__NR_timer_getoverrun, sys_timer_getoverrun), // 225
982 LINX_(__NR_timer_delete, sys_timer_delete), // 226
njn1588bc02005-08-26 03:49:43 +0000983 LINX_(__NR_clock_settime, sys_clock_settime), // 227
984 LINXY(__NR_clock_gettime, sys_clock_gettime), // 228
985 LINXY(__NR_clock_getres, sys_clock_getres), // 229
njna22a93a2004-11-29 17:28:41 +0000986
njn1588bc02005-08-26 03:49:43 +0000987 LINXY(__NR_clock_nanosleep, sys_clock_nanosleep),// 230
sewardj02f718f2005-03-23 03:42:26 +0000988 LINX_(__NR_exit_group, sys_exit_group), // 231
sewardj43557d32005-07-01 08:39:38 +0000989 LINXY(__NR_epoll_wait, sys_epoll_wait), // 232
990 LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 233
sewardj62601592005-03-26 13:48:19 +0000991 LINXY(__NR_tgkill, sys_tgkill), // 234
njna22a93a2004-11-29 17:28:41 +0000992
tome329b262005-11-21 13:57:49 +0000993 GENX_(__NR_utimes, sys_utimes), // 235
njna22a93a2004-11-29 17:28:41 +0000994 // (__NR_vserver, sys_ni_syscall), // 236
tom70a5cb02005-10-20 17:00:23 +0000995 LINX_(__NR_mbind, sys_mbind), // 237
tom2af58f22005-07-22 15:04:14 +0000996 LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 238
tom95d23cc2005-08-06 18:07:17 +0000997 LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 239
njna22a93a2004-11-29 17:28:41 +0000998
njn4279a882005-08-26 03:43:28 +0000999 LINXY(__NR_mq_open, sys_mq_open), // 240
1000 LINX_(__NR_mq_unlink, sys_mq_unlink), // 241
1001 LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 242
tom44e534d2010-05-24 13:40:10 +00001002 LINXY(__NR_mq_timedreceive, sys_mq_timedreceive),// 243
njn4279a882005-08-26 03:43:28 +00001003 LINX_(__NR_mq_notify, sys_mq_notify), // 244
njna22a93a2004-11-29 17:28:41 +00001004
njn4279a882005-08-26 03:43:28 +00001005 LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 245
njna22a93a2004-11-29 17:28:41 +00001006 // (__NR_kexec_load, sys_ni_syscall), // 246
njncd405ea2005-08-31 02:44:31 +00001007 LINXY(__NR_waitid, sys_waitid), // 247
tom7f4d7e42007-03-07 11:12:13 +00001008 LINX_(__NR_add_key, sys_add_key), // 248
1009 LINX_(__NR_request_key, sys_request_key), // 249
tom95d23cc2005-08-06 18:07:17 +00001010
tom7f4d7e42007-03-07 11:12:13 +00001011 LINXY(__NR_keyctl, sys_keyctl), // 250
sewardj7acef082007-03-11 19:28:02 +00001012 LINX_(__NR_ioprio_set, sys_ioprio_set), // 251
tom16dfea42008-12-15 08:58:29 +00001013 LINX_(__NR_ioprio_get, sys_ioprio_get), // 252
tom95d23cc2005-08-06 18:07:17 +00001014 LINX_(__NR_inotify_init, sys_inotify_init), // 253
1015 LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 254
1016
1017 LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 255
tom363ec762006-03-21 10:58:35 +00001018// LINX_(__NR_migrate_pages, sys_migrate_pages), // 256
1019 LINXY(__NR_openat, sys_openat), // 257
1020 LINX_(__NR_mkdirat, sys_mkdirat), // 258
1021 LINX_(__NR_mknodat, sys_mknodat), // 259
1022
1023 LINX_(__NR_fchownat, sys_fchownat), // 260
1024 LINX_(__NR_futimesat, sys_futimesat), // 261
1025 LINXY(__NR_newfstatat, sys_newfstatat), // 262
1026 LINX_(__NR_unlinkat, sys_unlinkat), // 263
1027 LINX_(__NR_renameat, sys_renameat), // 264
1028
1029 LINX_(__NR_linkat, sys_linkat), // 265
1030 LINX_(__NR_symlinkat, sys_symlinkat), // 266
1031 LINX_(__NR_readlinkat, sys_readlinkat), // 267
1032 LINX_(__NR_fchmodat, sys_fchmodat), // 268
1033 LINX_(__NR_faccessat, sys_faccessat), // 269
1034
sewardj303dabc2007-01-18 00:13:24 +00001035 LINX_(__NR_pselect6, sys_pselect6), // 270
bartf5ceec82008-04-26 07:45:10 +00001036 LINXY(__NR_ppoll, sys_ppoll), // 271
tom363ec762006-03-21 10:58:35 +00001037// LINX_(__NR_unshare, sys_unshare), // 272
tom05b1f9a2006-05-17 14:24:12 +00001038 LINX_(__NR_set_robust_list, sys_set_robust_list), // 273
1039 LINXY(__NR_get_robust_list, sys_get_robust_list), // 274
tomc4e466f2008-01-08 16:31:25 +00001040
tom110743c2010-02-23 10:49:48 +00001041 LINX_(__NR_splice, sys_splice), // 275
tom5db7a792012-08-08 08:03:44 +00001042 LINX_(__NR_tee, sys_tee), // 276
tomc4e466f2008-01-08 16:31:25 +00001043 LINX_(__NR_sync_file_range, sys_sync_file_range), // 277
tom5db7a792012-08-08 08:03:44 +00001044 LINXY(__NR_vmsplice, sys_vmsplice), // 278
tomd5fb58e2012-04-03 10:51:27 +00001045 LINXY(__NR_move_pages, sys_move_pages), // 279
sewardj586c8152008-11-05 11:20:59 +00001046
bartf5ceec82008-04-26 07:45:10 +00001047 LINX_(__NR_utimensat, sys_utimensat), // 280
1048 LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 281
1049 LINXY(__NR_signalfd, sys_signalfd), // 282
bart5fc7da22008-04-27 12:56:06 +00001050 LINXY(__NR_timerfd_create, sys_timerfd_create), // 283
tom4f5be8c2014-01-30 21:47:30 +00001051 LINXY(__NR_eventfd, sys_eventfd), // 284
sewardj586c8152008-11-05 11:20:59 +00001052
njn0bd71772009-07-15 03:08:35 +00001053 LINX_(__NR_fallocate, sys_fallocate), // 285
bart5fc7da22008-04-27 12:56:06 +00001054 LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 286
1055 LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 287
philippe6b087762013-03-01 23:31:09 +00001056 LINXY(__NR_accept4, sys_accept4), // 288
tom6c67ef52009-01-09 16:42:51 +00001057 LINXY(__NR_signalfd4, sys_signalfd4), // 289
sewardj586c8152008-11-05 11:20:59 +00001058
tom4f5be8c2014-01-30 21:47:30 +00001059 LINXY(__NR_eventfd2, sys_eventfd2), // 290
njn72715882009-07-10 12:02:03 +00001060 LINXY(__NR_epoll_create1, sys_epoll_create1), // 291
tomf43793a2009-11-23 08:19:20 +00001061 LINXY(__NR_dup3, sys_dup3), // 292
tom3fbccee2009-10-27 09:19:26 +00001062 LINXY(__NR_pipe2, sys_pipe2), // 293
tom7bb1b1c2009-10-27 14:17:27 +00001063 LINXY(__NR_inotify_init1, sys_inotify_init1), // 294
tom4969c792009-10-27 09:01:43 +00001064
tomd8feb702009-10-28 10:04:11 +00001065 LINXY(__NR_preadv, sys_preadv), // 295
1066 LINX_(__NR_pwritev, sys_pwritev), // 296
tomd18b5412009-11-24 16:08:40 +00001067 LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 297
tom46d02ab2011-06-08 09:55:54 +00001068 LINXY(__NR_perf_event_open, sys_perf_event_open), // 298
toma4991232012-02-10 11:30:09 +00001069 LINXY(__NR_recvmmsg, sys_recvmmsg), // 299
tom46d02ab2011-06-08 09:55:54 +00001070
tomcec24b52013-07-17 13:58:59 +00001071 LINXY(__NR_fanotify_init, sys_fanotify_init), // 300
1072 LINX_(__NR_fanotify_mark, sys_fanotify_mark), // 301
tom5eac4b52012-02-09 11:48:28 +00001073 LINXY(__NR_prlimit64, sys_prlimit64), // 302
tomf9e5b5e2013-03-03 12:57:20 +00001074 LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 303
tom43ca0972013-07-17 13:25:08 +00001075 LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 304
tom46d02ab2011-06-08 09:55:54 +00001076
tomddc4a182014-01-30 22:33:02 +00001077 LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 305
tom46d02ab2011-06-08 09:55:54 +00001078// LINX_(__NR_syncfs, sys_ni_syscall), // 306
tom27640002012-02-10 11:48:01 +00001079 LINXY(__NR_sendmmsg, sys_sendmmsg), // 307
tom46d02ab2011-06-08 09:55:54 +00001080// LINX_(__NR_setns, sys_ni_syscall), // 308
tom9e4b6362012-02-10 09:39:37 +00001081 LINXY(__NR_getcpu, sys_getcpu), // 309
1082
1083 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 310
1084 LINX_(__NR_process_vm_writev, sys_process_vm_writev) // 311
njnc6168192004-11-29 13:54:10 +00001085};
1086
sewardj59570ff2010-01-01 11:59:33 +00001087SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1088{
1089 const UInt syscall_table_size
1090 = sizeof(syscall_table) / sizeof(syscall_table[0]);
1091
1092 /* Is it in the contiguous initial section of the table? */
1093 if (sysno < syscall_table_size) {
1094 SyscallTableEntry* sys = &syscall_table[sysno];
1095 if (sys->before == NULL)
1096 return NULL; /* no entry */
1097 else
1098 return sys;
1099 }
1100
1101 /* Can't find a wrapper */
1102 return NULL;
1103}
njn27ce2562004-11-30 15:10:02 +00001104
njn8b68b642009-06-24 00:37:09 +00001105#endif // defined(VGP_amd64_linux)
1106
njnc6168192004-11-29 13:54:10 +00001107/*--------------------------------------------------------------------*/
njn2521d322005-05-08 14:45:13 +00001108/*--- end ---*/
njnc6168192004-11-29 13:54:10 +00001109/*--------------------------------------------------------------------*/