blob: 10872fad86e5b3c06efc8d9aed3beb98c43b8bb5 [file] [log] [blame]
sewardjf0c12502014-01-12 12:54:00 +00001
2/*--------------------------------------------------------------------*/
3/*--- Platform-specific syscalls stuff. syswrap-arm64-linux.c -----*/
4/*--------------------------------------------------------------------*/
5
6/*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
10 Copyright (C) 2013-2013 OpenWorks
11 info@open-works.net
12
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
31#if defined(VGP_arm64_linux)
32
33#include "pub_core_basics.h"
34#include "pub_core_vki.h"
35#include "pub_core_vkiscnums.h"
sewardjf0c12502014-01-12 12:54:00 +000036#include "pub_core_threadstate.h"
37#include "pub_core_aspacemgr.h"
sewardjae082d82014-02-20 17:36:56 +000038#include "pub_core_libcbase.h"
sewardjf0c12502014-01-12 12:54:00 +000039#include "pub_core_libcassert.h"
40#include "pub_core_libcprint.h"
sewardjae082d82014-02-20 17:36:56 +000041#include "pub_core_libcsignal.h"
sewardjf0c12502014-01-12 12:54:00 +000042#include "pub_core_options.h"
sewardjae082d82014-02-20 17:36:56 +000043#include "pub_core_scheduler.h"
sewardjf0c12502014-01-12 12:54:00 +000044#include "pub_core_sigframe.h" // For VG_(sigframe_destroy)()
sewardjf0c12502014-01-12 12:54:00 +000045#include "pub_core_syscall.h"
46#include "pub_core_syswrap.h"
47#include "pub_core_tooliface.h"
sewardjf0c12502014-01-12 12:54:00 +000048
49#include "priv_types_n_macros.h"
50#include "priv_syswrap-generic.h" /* for decls of generic wrappers */
51#include "priv_syswrap-linux.h" /* for decls of linux-ish wrappers */
sewardjf0c12502014-01-12 12:54:00 +000052
53
54/* ---------------------------------------------------------------------
55 clone() handling
56 ------------------------------------------------------------------ */
57
58/* Call f(arg1), but first switch stacks, using 'stack' as the new
59 stack, and use 'retaddr' as f's return-to address. Also, clear all
60 the integer registers before entering f.*/
61__attribute__((noreturn))
62void ML_(call_on_new_stack_0_1) ( Addr stack,
63 Addr retaddr,
64 void (*f)(Word),
65 Word arg1 );
66// r0 = stack
67// r1 = retaddr
68// r2 = f
69// r3 = arg1
70asm(
71".text\n"
72".globl vgModuleLocal_call_on_new_stack_0_1\n"
73"vgModuleLocal_call_on_new_stack_0_1:\n"
74" mov sp, x0\n\t" /* Stack pointer */
75" mov x30, x1\n\t" /* Return address (x30 is LR) */
76" mov x0, x3\n\t" /* First argument */
77" mov x9, x2\n\t" /* 'f': x9 won't be zeroed at start of f. Oh well. */
78" mov x1, #0\n\t" /* Clear our GPRs */
79" mov x2, #0\n\t"
80" mov x3, #0\n\t"
81" mov x4, #0\n\t"
82" mov x5, #0\n\t"
83" mov x6, #0\n\t"
84" mov x7, #0\n\t"
85" mov x8, #0\n\t"
86/* don't zero out x9 */
87" mov x10, #0\n\t"
88" mov x11, #0\n\t"
89" mov x12, #0\n\t"
90" mov x13, #0\n\t"
91" mov x14, #0\n\t"
92" mov x15, #0\n\t"
93" mov x16, #0\n\t"
94" mov x17, #0\n\t"
95" mov x18, #0\n\t"
96" mov x19, #0\n\t"
97" mov x20, #0\n\t"
98" mov x21, #0\n\t"
99" mov x22, #0\n\t"
100" mov x23, #0\n\t"
101" mov x24, #0\n\t"
102" mov x25, #0\n\t"
103" mov x26, #0\n\t"
104" mov x27, #0\n\t"
105" mov x28, #0\n\t"
106" mov x29, sp\n\t" /* FP = SP, in the absence of better suggestions */
107" br x9\n\t"
108".previous\n"
109);
110
111
sewardjae082d82014-02-20 17:36:56 +0000112/*
113 Perform a clone system call. clone is strange because it has
114 fork()-like return-twice semantics, so it needs special
115 handling here.
sewardjf0c12502014-01-12 12:54:00 +0000116
sewardjae082d82014-02-20 17:36:56 +0000117 Upon entry, we have:
118
119 Word (*fn)(void*) in x0
120 void* child_stack in x1
121 int flags in x2
122 void* arg in x3
123 pid_t* child_tid in x4
124 pid_t* parent_tid in x5
125 void* tls_ptr in x6
126
127 System call requires:
128
129 int $__NR_clone in x8
130 int flags in x0
131 void* child_stack in x1
132 pid_t* parent_tid in x2
sewardj29ac9812014-02-21 14:51:14 +0000133 void* tls_ptr in x3
134 pid_t* child_tid in x4
sewardjae082d82014-02-20 17:36:56 +0000135
136 Returns a Long encoded in the linux-arm64 way, not a SysRes.
sewardjae082d82014-02-20 17:36:56 +0000137*/
138#define __NR_CLONE VG_STRINGIFY(__NR_clone)
139#define __NR_EXIT VG_STRINGIFY(__NR_exit)
140
141extern
142Long do_syscall_clone_arm64_linux ( Word (*fn)(void *),
sewardj29ac9812014-02-21 14:51:14 +0000143 void* child_stack,
sewardjae082d82014-02-20 17:36:56 +0000144 Long flags,
145 void* arg,
sewardj29ac9812014-02-21 14:51:14 +0000146 Int* child_tid,
147 Int* parent_tid,
sewardjae082d82014-02-20 17:36:56 +0000148 void* tls );
149asm(
150".text\n"
151".globl do_syscall_clone_arm64_linux\n"
152"do_syscall_clone_arm64_linux:\n"
153 // set up child stack, temporarily preserving fn and arg
154" sub x1, x1, #16\n" // make space on stack
155" str x3, [x1, #8]\n" // save arg
156" str x0, [x1, #0]\n" // save fn
157
158 // setup syscall
159" mov x8, #"__NR_CLONE"\n" // syscall number
160" mov x0, x2\n" // syscall arg1: flags
161" mov x1, x1\n" // syscall arg2: child_stack
162" mov x2, x5\n" // syscall arg3: parent_tid
sewardj29ac9812014-02-21 14:51:14 +0000163" mov x3, x6\n" // syscall arg4: tls_ptr
164" mov x4, x4\n" // syscall arg5: child_tid
sewardjae082d82014-02-20 17:36:56 +0000165
166" svc 0\n" // clone()
167
168" cmp x0, #0\n" // child if retval == 0
169" bne 1f\n"
170
171 // CHILD - call thread function
172" ldr x1, [sp, #0]\n" // pop fn
173" ldr x0, [sp, #8]\n" // pop fn arg1: arg
174" add sp, sp, #16\n"
175" blr x1\n" // call fn
176
177 // exit with result
178" mov x0, x0\n" // arg1: return value from fn
179" mov x8, #"__NR_EXIT"\n"
180
181" svc 0\n"
182
183 // Exit returned?!
184" .word 0xFFFFFFFF\n"
185
186"1:\n" // PARENT or ERROR. x0 holds return value from the clone syscall.
187" ret\n"
188".previous\n"
189);
190
191#undef __NR_CLONE
192#undef __NR_EXIT
193
194// forward declaration
195static void setup_child ( ThreadArchState*, ThreadArchState* );
196static void assign_guest_tls(ThreadId ctid, Addr tlsptr);
197//ZZ static SysRes sys_set_tls ( ThreadId tid, Addr tlsptr );
198
199/*
200 When a client clones, we need to keep track of the new thread. This means:
florianad4e9792015-07-05 21:53:33 +0000201 1. allocate a ThreadId+ThreadState+stack for the thread
sewardjae082d82014-02-20 17:36:56 +0000202
203 2. initialize the thread's new VCPU state
204
205 3. create the thread using the same args as the client requested,
206 but using the scheduler entrypoint for IP, and a separate stack
207 for SP.
208 */
209static SysRes do_clone ( ThreadId ptid,
sewardj29ac9812014-02-21 14:51:14 +0000210 ULong flags,
211 Addr child_xsp,
212 Int* parent_tidptr,
213 Int* child_tidptr,
214 Addr child_tls )
sewardjae082d82014-02-20 17:36:56 +0000215{
sewardjae082d82014-02-20 17:36:56 +0000216 ThreadId ctid = VG_(alloc_ThreadState)();
217 ThreadState* ptst = VG_(get_ThreadState)(ptid);
218 ThreadState* ctst = VG_(get_ThreadState)(ctid);
219 UWord* stack;
sewardjae082d82014-02-20 17:36:56 +0000220 SysRes res;
221 ULong x0;
222 vki_sigset_t blockall, savedmask;
223
224 VG_(sigfillset)(&blockall);
225
226 vg_assert(VG_(is_running_thread)(ptid));
227 vg_assert(VG_(is_valid_tid)(ctid));
228
229 stack = (UWord*)ML_(allocstack)(ctid);
230 if (stack == NULL) {
231 res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
232 goto out;
233 }
234
235 /* Copy register state
236
237 Both parent and child return to the same place, and the code
238 following the clone syscall works out which is which, so we
239 don't need to worry about it.
240
241 The parent gets the child's new tid returned from clone, but the
242 child gets 0.
243
244 If the clone call specifies a NULL xsp for the new thread, then
245 it actually gets a copy of the parent's xsp.
246 */
247 setup_child( &ctst->arch, &ptst->arch );
248
249 /* Make sys_clone appear to have returned Success(0) in the
250 child. */
251 ctst->arch.vex.guest_X0 = 0;
252
sewardj29ac9812014-02-21 14:51:14 +0000253 if (child_xsp != 0)
254 ctst->arch.vex.guest_XSP = child_xsp;
sewardjae082d82014-02-20 17:36:56 +0000255
256 ctst->os_state.parent = ptid;
257
258 /* inherit signal mask */
259 ctst->sig_mask = ptst->sig_mask;
260 ctst->tmp_sig_mask = ptst->sig_mask;
261
262 /* Start the child with its threadgroup being the same as the
263 parent's. This is so that any exit_group calls that happen
264 after the child is created but before it sets its
265 os_state.threadgroup field for real (in thread_wrapper in
266 syswrap-linux.c), really kill the new thread. a.k.a this avoids
267 a race condition in which the thread is unkillable (via
268 exit_group) because its threadgroup is not set. The race window
269 is probably only a few hundred or a few thousand cycles long.
270 See #226116. */
271 ctst->os_state.threadgroup = ptst->os_state.threadgroup;
272
philippe38a74d22014-08-29 22:53:19 +0000273 ML_(guess_and_register_stack)(child_xsp, ctst);
sewardjae082d82014-02-20 17:36:56 +0000274
275 /* Assume the clone will succeed, and tell any tool that wants to
276 know that this thread has come into existence. If the clone
277 fails, we'll send out a ll_exit notification for it at the out:
278 label below, to clean up. */
279 vg_assert(VG_(owns_BigLock_LL)(ptid));
280 VG_TRACK ( pre_thread_ll_create, ptid, ctid );
281
282 if (flags & VKI_CLONE_SETTLS) {
283 /* Just assign the tls pointer in the guest TPIDR_EL0. */
284 assign_guest_tls(ctid, child_tls);
285 }
286
287 flags &= ~VKI_CLONE_SETTLS;
288
289 /* start the thread with everything blocked */
290 VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
291
292 x0 = do_syscall_clone_arm64_linux(
293 ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid],
294 child_tidptr, parent_tidptr, NULL
295 );
296
297 res = VG_(mk_SysRes_arm64_linux)( x0 );
298
299 VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
300
301 out:
302 if (sr_isError(res)) {
303 /* clone failed */
304 VG_(cleanup_thread)(&ctst->arch);
305 ctst->status = VgTs_Empty;
306 /* oops. Better tell the tool the thread exited in a hurry :-) */
307 VG_TRACK( pre_thread_ll_exit, ctid );
308 }
309
310 return res;
311}
sewardjf0c12502014-01-12 12:54:00 +0000312
313
314/* ---------------------------------------------------------------------
315 More thread stuff
316 ------------------------------------------------------------------ */
317
318// ARM64 doesn't have any architecture specific thread stuff that
319// needs to be cleaned up
320void VG_(cleanup_thread) ( ThreadArchState* arch )
321{
322}
323
sewardjae082d82014-02-20 17:36:56 +0000324void setup_child ( /*OUT*/ ThreadArchState *child,
325 /*IN*/ ThreadArchState *parent )
326{
327 child->vex = parent->vex;
328 child->vex_shadow1 = parent->vex_shadow1;
329 child->vex_shadow2 = parent->vex_shadow2;
330}
331
332static void assign_guest_tls(ThreadId tid, Addr tlsptr)
333{
334 VG_(threads)[tid].arch.vex.guest_TPIDR_EL0 = tlsptr;
335}
336
sewardjf0c12502014-01-12 12:54:00 +0000337//ZZ /* Assigns tlsptr to the guest TPIDRURO.
338//ZZ If needed for the specific hardware, really executes
339//ZZ the set_tls syscall.
340//ZZ */
341//ZZ static SysRes sys_set_tls ( ThreadId tid, Addr tlsptr )
342//ZZ {
343//ZZ assign_guest_tls(tid, tlsptr);
344//ZZ #if defined(ANDROID_HARDWARE_emulator)
345//ZZ /* Android emulator does not provide an hw tls register.
346//ZZ So, the tls register is emulated by the kernel.
347//ZZ This emulated value is set by the __NR_ARM_set_tls syscall.
348//ZZ The emulated value must be read by the kernel helper function
349//ZZ located at 0xffff0fe0.
350//ZZ
351//ZZ The emulated tlsptr is located at 0xffff0ff0
352//ZZ (so slightly after the kernel helper function).
353//ZZ Note that applications are not supposed to read this directly.
354//ZZ
355//ZZ For compatibility : if there is a hw tls register, the kernel
356//ZZ will put at 0xffff0fe0 the instructions to read it, so
357//ZZ as to have old applications calling the kernel helper
358//ZZ working properly.
359//ZZ
360//ZZ For having emulated guest TLS working correctly with
361//ZZ Valgrind, it is needed to execute the syscall to set
362//ZZ the emulated TLS value in addition to the assignment
363//ZZ of TPIDRURO.
364//ZZ
365//ZZ Note: the below means that if we need thread local storage
366//ZZ for Valgrind host, then there will be a conflict between
367//ZZ the need of the guest tls and of the host tls.
368//ZZ If all the guest code would cleanly call 0xffff0fe0,
369//ZZ then we might maybe intercept this. However, at least
370//ZZ __libc_preinit reads directly 0xffff0ff0.
371//ZZ */
372//ZZ /* ??? might call the below if auxv->u.a_val & VKI_HWCAP_TLS ???
373//ZZ Unclear if real hardware having tls hw register sets
374//ZZ VKI_HWCAP_TLS. */
375//ZZ return VG_(do_syscall1) (__NR_ARM_set_tls, tlsptr);
376//ZZ #else
377//ZZ return VG_(mk_SysRes_Success)( 0 );
378//ZZ #endif
379//ZZ }
380
381/* ---------------------------------------------------------------------
382 PRE/POST wrappers for arm/Linux-specific syscalls
383 ------------------------------------------------------------------ */
384
385#define PRE(name) DEFN_PRE_TEMPLATE(arm64_linux, name)
386#define POST(name) DEFN_POST_TEMPLATE(arm64_linux, name)
387
sewardjb5170b92014-03-07 22:48:50 +0000388/* Add prototypes for the wrappers declared here, so that gcc doesn't
389 harass us for not having prototypes. Really this is a kludge --
390 the right thing to do is to make these wrappers 'static' since they
391 aren't visible outside this file, but that requires even more macro
392 magic. */
393
394DECL_TEMPLATE(arm64_linux, sys_fadvise64);
sewardjf0c12502014-01-12 12:54:00 +0000395DECL_TEMPLATE(arm64_linux, sys_mmap);
396//ZZ DECL_TEMPLATE(arm_linux, sys_stat64);
397//ZZ DECL_TEMPLATE(arm_linux, sys_lstat64);
398//ZZ DECL_TEMPLATE(arm_linux, sys_fstatat64);
399//ZZ DECL_TEMPLATE(arm_linux, sys_fstat64);
400DECL_TEMPLATE(arm64_linux, sys_clone);
401//ZZ DECL_TEMPLATE(arm_linux, sys_sigreturn);
402DECL_TEMPLATE(arm64_linux, sys_rt_sigreturn);
403//ZZ DECL_TEMPLATE(arm_linux, sys_sigsuspend);
404//ZZ DECL_TEMPLATE(arm_linux, sys_set_tls);
405//ZZ DECL_TEMPLATE(arm_linux, sys_cacheflush);
406//ZZ DECL_TEMPLATE(arm_linux, sys_ptrace);
sewardjb5170b92014-03-07 22:48:50 +0000407
sewardjf0c12502014-01-12 12:54:00 +0000408//ZZ PRE(sys_mmap2)
409//ZZ {
410//ZZ SysRes r;
411//ZZ
412//ZZ // Exactly like old_mmap() except:
413//ZZ // - all 6 args are passed in regs, rather than in a memory-block.
414//ZZ // - the file offset is specified in pagesize units rather than bytes,
415//ZZ // so that it can be used for files bigger than 2^32 bytes.
416//ZZ // pagesize or 4K-size units in offset? For ppc32/64-linux, this is
417//ZZ // 4K-sized. Assert that the page size is 4K here for safety.
418//ZZ vg_assert(VKI_PAGE_SIZE == 4096);
419//ZZ PRINT("sys_mmap2 ( %#lx, %llu, %ld, %ld, %ld, %ld )",
420//ZZ ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
421//ZZ PRE_REG_READ6(long, "mmap2",
422//ZZ unsigned long, start, unsigned long, length,
423//ZZ unsigned long, prot, unsigned long, flags,
424//ZZ unsigned long, fd, unsigned long, offset);
425//ZZ
426//ZZ r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
427//ZZ 4096 * (Off64T)ARG6 );
428//ZZ SET_STATUS_from_SysRes(r);
429//ZZ }
430
431// ARM64 FIXME is this correct?
sewardjb5170b92014-03-07 22:48:50 +0000432PRE(sys_fadvise64)
433{
florianb26101c2015-08-08 21:45:33 +0000434 PRINT("sys_fadvise64 ( %ld, %ld, %lu, %ld )", SARG1, SARG2, ARG3, SARG4);
sewardjb5170b92014-03-07 22:48:50 +0000435 PRE_REG_READ4(long, "fadvise64",
436 int, fd, vki_loff_t, offset, vki_size_t, len, int, advice);
437}
438
439// ARM64 FIXME is this correct?
sewardjf0c12502014-01-12 12:54:00 +0000440PRE(sys_mmap)
441{
442 SysRes r;
443
florianb26101c2015-08-08 21:45:33 +0000444 PRINT("sys_mmap ( %#lx, %lu, %lu, %#lx, %lu, %lu )",
445 ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
sewardjf0c12502014-01-12 12:54:00 +0000446 PRE_REG_READ6(long, "mmap",
447 unsigned long, start, unsigned long, length,
448 unsigned long, prot, unsigned long, flags,
449 unsigned long, fd, unsigned long, offset);
450
451 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
452 SET_STATUS_from_SysRes(r);
453}
454
455//ZZ
456//ZZ // XXX: lstat64/fstat64/stat64 are generic, but not necessarily
457//ZZ // applicable to every architecture -- I think only to 32-bit archs.
458//ZZ // We're going to need something like linux/core_os32.h for such
459//ZZ // things, eventually, I think. --njn
460//ZZ PRE(sys_lstat64)
461//ZZ {
462//ZZ PRINT("sys_lstat64 ( %#lx(%s), %#lx )",ARG1,(char*)ARG1,ARG2);
463//ZZ PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
464//ZZ PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
465//ZZ PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
466//ZZ }
467//ZZ
468//ZZ POST(sys_lstat64)
469//ZZ {
470//ZZ vg_assert(SUCCESS);
471//ZZ if (RES == 0) {
472//ZZ POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
473//ZZ }
474//ZZ }
475//ZZ
476//ZZ PRE(sys_stat64)
477//ZZ {
478//ZZ PRINT("sys_stat64 ( %#lx(%s), %#lx )",ARG1,(char*)ARG1,ARG2);
479//ZZ PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
480//ZZ PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
481//ZZ PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
482//ZZ }
483//ZZ
484//ZZ POST(sys_stat64)
485//ZZ {
486//ZZ POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
487//ZZ }
488//ZZ
489//ZZ PRE(sys_fstatat64)
490//ZZ {
491//ZZ PRINT("sys_fstatat64 ( %ld, %#lx(%s), %#lx )",ARG1,ARG2,(char*)ARG2,ARG3);
492//ZZ PRE_REG_READ3(long, "fstatat64",
493//ZZ int, dfd, char *, file_name, struct stat64 *, buf);
494//ZZ PRE_MEM_RASCIIZ( "fstatat64(file_name)", ARG2 );
495//ZZ PRE_MEM_WRITE( "fstatat64(buf)", ARG3, sizeof(struct vki_stat64) );
496//ZZ }
497//ZZ
498//ZZ POST(sys_fstatat64)
499//ZZ {
500//ZZ POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) );
501//ZZ }
502//ZZ
503//ZZ PRE(sys_fstat64)
504//ZZ {
505//ZZ PRINT("sys_fstat64 ( %ld, %#lx )",ARG1,ARG2);
506//ZZ PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
507//ZZ PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
508//ZZ }
509//ZZ
510//ZZ POST(sys_fstat64)
511//ZZ {
512//ZZ POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
513//ZZ }
514
sewardj29ac9812014-02-21 14:51:14 +0000515/* Aarch64 seems to use CONFIG_CLONE_BACKWARDS in the kernel. See:
516 http://dev.gentoo.org/~vapier/aarch64/linux-3.12.6.config
517 http://people.redhat.com/wcohen/aarch64/aarch64_config
518 from linux-3.10.5/kernel/fork.c
519 #ifdef CONFIG_CLONE_BACKWARDS
520 SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
521 int __user *, parent_tidptr,
522 int, tls_val,
523 int __user *, child_tidptr)
524*/
sewardjf0c12502014-01-12 12:54:00 +0000525PRE(sys_clone)
526{
sewardjae082d82014-02-20 17:36:56 +0000527 UInt cloneflags;
sewardjf0c12502014-01-12 12:54:00 +0000528
529 PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
530 PRE_REG_READ5(int, "clone",
531 unsigned long, flags,
532 void *, child_stack,
533 int *, parent_tidptr,
534 void *, child_tls,
535 int *, child_tidptr);
536
537 if (ARG1 & VKI_CLONE_PARENT_SETTID) {
538 PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
539 if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
540 VKI_PROT_WRITE)) {
541 SET_STATUS_Failure( VKI_EFAULT );
542 return;
543 }
544 }
sewardjf0c12502014-01-12 12:54:00 +0000545//ZZ if (ARG1 & VKI_CLONE_SETTLS) {
546//ZZ PRE_MEM_READ("clone(tls_user_desc)", ARG4, sizeof(vki_modify_ldt_t));
547//ZZ if (!VG_(am_is_valid_for_client)(ARG4, sizeof(vki_modify_ldt_t),
548//ZZ VKI_PROT_READ)) {
549//ZZ SET_STATUS_Failure( VKI_EFAULT );
550//ZZ return;
551//ZZ }
552//ZZ }
sewardj29ac9812014-02-21 14:51:14 +0000553 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
554 PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
555 if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int),
556 VKI_PROT_WRITE)) {
557 SET_STATUS_Failure( VKI_EFAULT );
558 return;
559 }
560 }
sewardjf0c12502014-01-12 12:54:00 +0000561
562 cloneflags = ARG1;
563
564 if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
565 SET_STATUS_Failure( VKI_EINVAL );
566 return;
567 }
568
569 /* Only look at the flags we really care about */
570 switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
571 | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
sewardjae082d82014-02-20 17:36:56 +0000572 case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
573 /* thread creation */
574 SET_STATUS_from_SysRes(
575 do_clone(tid,
sewardj29ac9812014-02-21 14:51:14 +0000576 ARG1, /* flags */
577 (Addr)ARG2, /* child SP */
578 (Int*)ARG3, /* parent_tidptr */
579 (Int*)ARG5, /* child_tidptr */
580 (Addr)ARG4)); /* tls_val */
sewardjae082d82014-02-20 17:36:56 +0000581 break;
sewardjf0c12502014-01-12 12:54:00 +0000582
583 case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
584 /* FALLTHROUGH - assume vfork == fork */
585 cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
586
587 case 0: /* plain fork */
588 SET_STATUS_from_SysRes(
589 ML_(do_fork_clone)(tid,
sewardj29ac9812014-02-21 14:51:14 +0000590 cloneflags, /* flags */
591 (Int*)ARG3, /* parent_tidptr */
592 (Int*)ARG5)); /* child_tidptr */
sewardjf0c12502014-01-12 12:54:00 +0000593 break;
594
595 default:
596 /* should we just ENOSYS? */
florian9af04c42014-11-29 17:50:10 +0000597 VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx\n", ARG1);
598 VG_(message)(Vg_UserMsg, "\n");
599 VG_(message)(Vg_UserMsg, "The only supported clone() uses are:\n");
600 VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)\n");
601 VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork\n");
602 VG_(message)(Vg_UserMsg, " - for the Quadrics Elan3 user-space driver\n");
sewardjf0c12502014-01-12 12:54:00 +0000603 VG_(unimplemented)
604 ("Valgrind does not support general clone().");
605 }
606
607 if (SUCCESS) {
608 if (ARG1 & VKI_CLONE_PARENT_SETTID)
609 POST_MEM_WRITE(ARG3, sizeof(Int));
610 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
611 POST_MEM_WRITE(ARG5, sizeof(Int));
612
613 /* Thread creation was successful; let the child have the chance
614 to run */
615 *flags |= SfYieldAfter;
616 }
617}
618
619//ZZ PRE(sys_sigreturn)
620//ZZ {
621//ZZ /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
622//ZZ an explanation of what follows. */
623//ZZ
624//ZZ PRINT("sys_sigreturn ( )");
625//ZZ
626//ZZ vg_assert(VG_(is_valid_tid)(tid));
627//ZZ vg_assert(tid >= 1 && tid < VG_N_THREADS);
628//ZZ vg_assert(VG_(is_running_thread)(tid));
629//ZZ
630//ZZ /* Restore register state from frame and remove it */
631//ZZ VG_(sigframe_destroy)(tid, False);
632//ZZ
633//ZZ /* Tell the driver not to update the guest state with the "result",
634//ZZ and set a bogus result to keep it happy. */
635//ZZ *flags |= SfNoWriteResult;
636//ZZ SET_STATUS_Success(0);
637//ZZ
638//ZZ /* Check to see if any signals arose as a result of this. */
639//ZZ *flags |= SfPollAfter;
640//ZZ }
641
642PRE(sys_rt_sigreturn)
643{
644 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
645 an explanation of what follows. */
646
647 PRINT("rt_sigreturn ( )");
648
649 vg_assert(VG_(is_valid_tid)(tid));
650 vg_assert(tid >= 1 && tid < VG_N_THREADS);
651 vg_assert(VG_(is_running_thread)(tid));
652
653 /* Restore register state from frame and remove it */
654 VG_(sigframe_destroy)(tid, True);
655
656 /* Tell the driver not to update the guest state with the "result",
657 and set a bogus result to keep it happy. */
658 *flags |= SfNoWriteResult;
659 SET_STATUS_Success(0);
660
661 /* Check to see if any signals arose as a result of this. */
662 *flags |= SfPollAfter;
663}
664
665//ZZ /* NB: clone of x86-linux version, and ppc32-linux has an almost
666//ZZ identical one. */
667//ZZ PRE(sys_sigsuspend)
668//ZZ {
669//ZZ /* The C library interface to sigsuspend just takes a pointer to
670//ZZ a signal mask but this system call has three arguments - the first
671//ZZ two don't appear to be used by the kernel and are always passed as
672//ZZ zero by glibc and the third is the first word of the signal mask
673//ZZ so only 32 signals are supported.
674//ZZ
675//ZZ In fact glibc normally uses rt_sigsuspend if it is available as
676//ZZ that takes a pointer to the signal mask so supports more signals.
677//ZZ */
678//ZZ *flags |= SfMayBlock;
679//ZZ PRINT("sys_sigsuspend ( %ld, %ld, %ld )", ARG1,ARG2,ARG3 );
680//ZZ PRE_REG_READ3(int, "sigsuspend",
681//ZZ int, history0, int, history1,
682//ZZ vki_old_sigset_t, mask);
683//ZZ }
684//ZZ
685//ZZ /* Very much ARM specific */
686//ZZ
687//ZZ PRE(sys_set_tls)
688//ZZ {
689//ZZ PRINT("set_tls (%lx)",ARG1);
690//ZZ PRE_REG_READ1(long, "set_tls", unsigned long, addr);
691//ZZ
692//ZZ SET_STATUS_from_SysRes( sys_set_tls( tid, ARG1 ) );
693//ZZ }
694//ZZ
695//ZZ PRE(sys_cacheflush)
696//ZZ {
697//ZZ PRINT("cacheflush (%lx, %#lx, %#lx)",ARG1,ARG2,ARG3);
698//ZZ PRE_REG_READ3(long, "cacheflush", void*, addrlow,void*, addrhigh,int, flags);
florianddd61ff2015-01-04 17:20:45 +0000699//ZZ VG_(discard_translations)( (Addr)ARG1,
sewardjf0c12502014-01-12 12:54:00 +0000700//ZZ ((ULong)ARG2) - ((ULong)ARG1) + 1ULL/*paranoia*/,
701//ZZ "PRE(sys_cacheflush)" );
702//ZZ SET_STATUS_Success(0);
703//ZZ }
704//ZZ
705//ZZ // ARG3 is only used for pointers into the traced process's address
706//ZZ // space and for offsets into the traced process's struct
707//ZZ // user_regs_struct. It is never a pointer into this process's memory
708//ZZ // space, and we should therefore not check anything it points to.
709//ZZ PRE(sys_ptrace)
710//ZZ {
711//ZZ PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
712//ZZ PRE_REG_READ4(int, "ptrace",
713//ZZ long, request, long, pid, long, addr, long, data);
714//ZZ switch (ARG1) {
715//ZZ case VKI_PTRACE_PEEKTEXT:
716//ZZ case VKI_PTRACE_PEEKDATA:
717//ZZ case VKI_PTRACE_PEEKUSR:
718//ZZ PRE_MEM_WRITE( "ptrace(peek)", ARG4,
719//ZZ sizeof (long));
720//ZZ break;
721//ZZ case VKI_PTRACE_GETREGS:
722//ZZ PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
723//ZZ sizeof (struct vki_user_regs_struct));
724//ZZ break;
725//ZZ case VKI_PTRACE_GETFPREGS:
726//ZZ PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
727//ZZ sizeof (struct vki_user_fp));
728//ZZ break;
729//ZZ case VKI_PTRACE_GETWMMXREGS:
730//ZZ PRE_MEM_WRITE( "ptrace(getwmmxregs)", ARG4,
731//ZZ VKI_IWMMXT_SIZE);
732//ZZ break;
733//ZZ case VKI_PTRACE_GETCRUNCHREGS:
734//ZZ PRE_MEM_WRITE( "ptrace(getcrunchregs)", ARG4,
735//ZZ VKI_CRUNCH_SIZE);
736//ZZ break;
737//ZZ case VKI_PTRACE_GETVFPREGS:
738//ZZ PRE_MEM_WRITE( "ptrace(getvfpregs)", ARG4,
739//ZZ sizeof (struct vki_user_vfp) );
740//ZZ break;
741//ZZ case VKI_PTRACE_GETHBPREGS:
742//ZZ PRE_MEM_WRITE( "ptrace(gethbpregs)", ARG4,
743//ZZ sizeof (unsigned long) );
744//ZZ break;
745//ZZ case VKI_PTRACE_SETREGS:
746//ZZ PRE_MEM_READ( "ptrace(setregs)", ARG4,
747//ZZ sizeof (struct vki_user_regs_struct));
748//ZZ break;
749//ZZ case VKI_PTRACE_SETFPREGS:
750//ZZ PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
751//ZZ sizeof (struct vki_user_fp));
752//ZZ break;
753//ZZ case VKI_PTRACE_SETWMMXREGS:
754//ZZ PRE_MEM_READ( "ptrace(setwmmxregs)", ARG4,
755//ZZ VKI_IWMMXT_SIZE);
756//ZZ break;
757//ZZ case VKI_PTRACE_SETCRUNCHREGS:
758//ZZ PRE_MEM_READ( "ptrace(setcrunchregs)", ARG4,
759//ZZ VKI_CRUNCH_SIZE);
760//ZZ break;
761//ZZ case VKI_PTRACE_SETVFPREGS:
762//ZZ PRE_MEM_READ( "ptrace(setvfpregs)", ARG4,
763//ZZ sizeof (struct vki_user_vfp));
764//ZZ break;
765//ZZ case VKI_PTRACE_SETHBPREGS:
766//ZZ PRE_MEM_READ( "ptrace(sethbpregs)", ARG4, sizeof(unsigned long));
767//ZZ break;
768//ZZ case VKI_PTRACE_GET_THREAD_AREA:
769//ZZ PRE_MEM_WRITE( "ptrace(get_thread_area)", ARG4, sizeof(unsigned long));
770//ZZ break;
771//ZZ case VKI_PTRACE_GETEVENTMSG:
772//ZZ PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long));
773//ZZ break;
774//ZZ case VKI_PTRACE_GETSIGINFO:
775//ZZ PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t));
776//ZZ break;
777//ZZ case VKI_PTRACE_SETSIGINFO:
778//ZZ PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t));
779//ZZ break;
780//ZZ case VKI_PTRACE_GETREGSET:
781//ZZ ML_(linux_PRE_getregset)(tid, ARG3, ARG4);
782//ZZ break;
783//ZZ case VKI_PTRACE_SETREGSET:
784//ZZ ML_(linux_PRE_setregset)(tid, ARG3, ARG4);
785//ZZ break;
786//ZZ default:
787//ZZ break;
788//ZZ }
789//ZZ }
790//ZZ
791//ZZ POST(sys_ptrace)
792//ZZ {
793//ZZ switch (ARG1) {
794//ZZ case VKI_PTRACE_PEEKTEXT:
795//ZZ case VKI_PTRACE_PEEKDATA:
796//ZZ case VKI_PTRACE_PEEKUSR:
797//ZZ POST_MEM_WRITE( ARG4, sizeof (long));
798//ZZ break;
799//ZZ case VKI_PTRACE_GETREGS:
800//ZZ POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
801//ZZ break;
802//ZZ case VKI_PTRACE_GETFPREGS:
803//ZZ POST_MEM_WRITE( ARG4, sizeof (struct vki_user_fp));
804//ZZ break;
805//ZZ case VKI_PTRACE_GETWMMXREGS:
806//ZZ POST_MEM_WRITE( ARG4, VKI_IWMMXT_SIZE);
807//ZZ break;
808//ZZ case VKI_PTRACE_GETCRUNCHREGS:
809//ZZ POST_MEM_WRITE( ARG4, VKI_CRUNCH_SIZE);
810//ZZ break;
811//ZZ case VKI_PTRACE_GETVFPREGS:
812//ZZ POST_MEM_WRITE( ARG4, sizeof(struct vki_user_vfp));
813//ZZ break;
814//ZZ case VKI_PTRACE_GET_THREAD_AREA:
815//ZZ case VKI_PTRACE_GETHBPREGS:
816//ZZ case VKI_PTRACE_GETEVENTMSG:
817//ZZ POST_MEM_WRITE( ARG4, sizeof(unsigned long));
818//ZZ break;
819//ZZ case VKI_PTRACE_GETSIGINFO:
820//ZZ /* XXX: This is a simplification. Different parts of the
821//ZZ * siginfo_t are valid depending on the type of signal.
822//ZZ */
823//ZZ POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t));
824//ZZ break;
825//ZZ case VKI_PTRACE_GETREGSET:
826//ZZ ML_(linux_POST_getregset)(tid, ARG3, ARG4);
827//ZZ break;
828//ZZ default:
829//ZZ break;
830//ZZ }
831//ZZ }
832//ZZ
833//ZZ #undef PRE
834//ZZ #undef POST
835
836/* ---------------------------------------------------------------------
837 The arm64/Linux syscall table
838 ------------------------------------------------------------------ */
839
840//ZZ #if 0
841//ZZ #define __NR_OABI_SYSCALL_BASE 0x900000
842//ZZ #else
843//ZZ #define __NR_OABI_SYSCALL_BASE 0x0
844//ZZ #endif
845
846#define PLAX_(sysno, name) WRAPPER_ENTRY_X_(arm64_linux, sysno, name)
847#define PLAXY(sysno, name) WRAPPER_ENTRY_XY(arm64_linux, sysno, name)
848
849// This table maps from __NR_xxx syscall numbers (from
850// linux/include/asm-arm/unistd.h) to the appropriate PRE/POST sys_foo()
851// wrappers on arm64 (as per sys_call_table in linux/arch/arm/kernel/entry.S).
852//
853// For those syscalls not handled by Valgrind, the annotation indicate its
854// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
855// (unknown).
856
857static SyscallTableEntry syscall_main_table[] = {
858 LINXY(__NR_getxattr, sys_getxattr), // 8
859 LINXY(__NR_lgetxattr, sys_lgetxattr), // 9
860 GENXY(__NR_getcwd, sys_getcwd), // 17
sewardjb5170b92014-03-07 22:48:50 +0000861 LINXY(__NR_eventfd2, sys_eventfd2), // 19
sewardjd11ed202014-03-02 12:49:52 +0000862 LINXY(__NR_epoll_create1, sys_epoll_create1), // 20
863 LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 21
864 LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 22
sewardj29ac9812014-02-21 14:51:14 +0000865 GENXY(__NR_dup, sys_dup), // 23
sewardjf0c12502014-01-12 12:54:00 +0000866 LINXY(__NR_dup3, sys_dup3), // 24
867
868 // FIXME IS THIS CORRECT?
869 LINXY(__NR3264_fcntl, sys_fcntl), // 25
870
sewardj0f730472014-03-08 20:34:45 +0000871 LINXY(__NR_inotify_init1, sys_inotify_init1), // 26
872 LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 27
873 LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 28
sewardjf0c12502014-01-12 12:54:00 +0000874 LINXY(__NR_ioctl, sys_ioctl), // 29
sewardje7f9aa42014-11-24 16:19:48 +0000875 GENX_(__NR_flock, sys_flock), // 32
sewardjd29f36d2014-10-30 14:28:14 +0000876 LINX_(__NR_mknodat, sys_mknodat), // 33
sewardjf0c12502014-01-12 12:54:00 +0000877 LINX_(__NR_mkdirat, sys_mkdirat), // 34
878 LINX_(__NR_unlinkat, sys_unlinkat), // 35
sewardjb74bb9a2014-05-16 15:02:09 +0000879 LINX_(__NR_symlinkat, sys_symlinkat), // 36
880 LINX_(__NR_linkat, sys_linkat), // 37
sewardjb5170b92014-03-07 22:48:50 +0000881 LINX_(__NR_renameat, sys_renameat), // 38
sewardjf0c12502014-01-12 12:54:00 +0000882
mjwd22b89b2015-02-18 14:23:17 +0000883 LINX_(__NR_umount2, sys_umount), // 39
884 LINX_(__NR_mount, sys_mount), // 40
885
sewardjf0c12502014-01-12 12:54:00 +0000886 // FIXME IS THIS CORRECT? it may well not be.
887 GENXY(__NR3264_statfs, sys_statfs), // 43
sewardjb5170b92014-03-07 22:48:50 +0000888 GENXY(__NR3264_fstatfs, sys_fstatfs), // 44
sewardjf0c12502014-01-12 12:54:00 +0000889
sewardj7a359892014-03-01 11:24:42 +0000890 // FIXME IS THIS CORRECT? it may well not be.
891 GENX_(__NR3264_ftruncate, sys_ftruncate), // 46
892
sewardj0f730472014-03-08 20:34:45 +0000893 LINX_(__NR_fallocate, sys_fallocate), // 47
sewardjf0c12502014-01-12 12:54:00 +0000894 LINX_(__NR_faccessat, sys_faccessat), // 48
895 GENX_(__NR_chdir, sys_chdir), // 49
sewardjd29f36d2014-10-30 14:28:14 +0000896 GENX_(__NR_fchdir, sys_fchdir), // 50
897 GENX_(__NR_chroot, sys_chroot), // 51
mjw4895caf2014-11-04 13:43:21 +0000898 GENX_(__NR_fchmod, sys_fchmod), // 52
sewardj0705dd12014-06-04 23:22:29 +0000899 LINX_(__NR_fchmodat, sys_fchmodat), // 53
sewardjd29f36d2014-10-30 14:28:14 +0000900 LINX_(__NR_fchownat, sys_fchownat), // 54
mjw4895caf2014-11-04 13:43:21 +0000901 GENX_(__NR_fchown, sys_fchown), // 55
sewardjf0c12502014-01-12 12:54:00 +0000902 LINXY(__NR_openat, sys_openat), // 56
903 GENXY(__NR_close, sys_close), // 57
904 LINXY(__NR_pipe2, sys_pipe2), // 59
sewardj0f730472014-03-08 20:34:45 +0000905 LINX_(__NR_quotactl, sys_quotactl), // 60
sewardjf0c12502014-01-12 12:54:00 +0000906 GENXY(__NR_getdents64, sys_getdents64), // 61
907
908 // FIXME IS THIS CORRECT?
909 LINX_(__NR3264_lseek, sys_lseek), // 62
910
911 GENXY(__NR_read, sys_read), // 63
912 GENX_(__NR_write, sys_write), // 64
sewardj5d998132014-04-07 14:47:23 +0000913 GENXY(__NR_readv, sys_readv), // 65
sewardjf0c12502014-01-12 12:54:00 +0000914 GENX_(__NR_writev, sys_writev), // 66
sewardj4f2f3132014-10-30 14:11:32 +0000915 GENXY(__NR_pread64, sys_pread64), // 67
sewardj0f730472014-03-08 20:34:45 +0000916 GENX_(__NR_pwrite64, sys_pwrite64), // 68
sewardj29ac9812014-02-21 14:51:14 +0000917 LINX_(__NR_pselect6, sys_pselect6), // 72
sewardjc8fa5cc2014-02-20 23:20:08 +0000918 LINXY(__NR_ppoll, sys_ppoll), // 73
sewardj5d998132014-04-07 14:47:23 +0000919 LINXY(__NR_signalfd4, sys_signalfd4), // 74
sewardjf0c12502014-01-12 12:54:00 +0000920 LINX_(__NR_readlinkat, sys_readlinkat), // 78
921
922 // FIXME IS THIS CORRECT?
923 LINXY(__NR3264_fstatat, sys_newfstatat), // 79
924 GENXY(__NR3264_fstat, sys_newfstat), // 80
925
sewardj5d998132014-04-07 14:47:23 +0000926 LINX_(__NR_utimensat, sys_utimensat), // 88
sewardjb5170b92014-03-07 22:48:50 +0000927 GENX_(__NR_fsync, sys_fsync), // 82
sewardjd379e962014-10-30 13:54:24 +0000928 GENX_(__NR_fdatasync, sys_fdatasync), // 83
sewardj5d998132014-04-07 14:47:23 +0000929 LINXY(__NR_timerfd_create, sys_timerfd_create), // 85
930 LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 86
931 LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 87
932 LINXY(__NR_capget, sys_capget), // 90
sewardjae082d82014-02-20 17:36:56 +0000933 GENX_(__NR_exit, sys_exit), // 93
sewardjf0c12502014-01-12 12:54:00 +0000934 LINX_(__NR_exit_group, sys_exit_group), // 94
935 LINX_(__NR_set_tid_address, sys_set_tid_address), // 96
936 LINXY(__NR_futex, sys_futex), // 98
937 LINX_(__NR_set_robust_list, sys_set_robust_list), // 99
sewardjae082d82014-02-20 17:36:56 +0000938 GENXY(__NR_nanosleep, sys_nanosleep), // 101
sewardj7a359892014-03-01 11:24:42 +0000939 GENXY(__NR_setitimer, sys_setitimer), // 103
sewardjf0c12502014-01-12 12:54:00 +0000940 LINXY(__NR_clock_gettime, sys_clock_gettime), // 113
sewardjb5170b92014-03-07 22:48:50 +0000941 LINXY(__NR_clock_getres, sys_clock_getres), // 114
sewardj5d998132014-04-07 14:47:23 +0000942 LINXY(__NR_syslog, sys_syslog), // 116
sewardjb74bb9a2014-05-16 15:02:09 +0000943 LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 122
sewardjb5170b92014-03-07 22:48:50 +0000944 LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 123
sewardj5d998132014-04-07 14:47:23 +0000945 LINX_(__NR_sched_yield, sys_sched_yield), // 124
sewardjc8fa5cc2014-02-20 23:20:08 +0000946 GENX_(__NR_kill, sys_kill), // 129
sewardje3c20b42014-02-27 11:14:19 +0000947 LINX_(__NR_tgkill, sys_tgkill), // 131
sewardj5d998132014-04-07 14:47:23 +0000948 GENXY(__NR_sigaltstack, sys_sigaltstack), // 132
sewardj7a359892014-03-01 11:24:42 +0000949 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 133
sewardjf0c12502014-01-12 12:54:00 +0000950 LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 134
951 LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 135
sewardj7a359892014-03-01 11:24:42 +0000952 LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 137
sewardj5d998132014-04-07 14:47:23 +0000953 LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 138
sewardjf0c12502014-01-12 12:54:00 +0000954 PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 139
sewardje3c20b42014-02-27 11:14:19 +0000955 GENX_(__NR_setpriority, sys_setpriority), // 140
956 GENX_(__NR_getpriority, sys_getpriority), // 141
sewardj4f2f3132014-10-30 14:11:32 +0000957 GENX_(__NR_setregid, sys_setregid), // 143
mjwa87ac962015-02-07 22:36:48 +0000958 GENX_(__NR_setgid, sys_setgid), // 144
sewardj4f2f3132014-10-30 14:11:32 +0000959 GENX_(__NR_setreuid, sys_setreuid), // 145
mjwf31aba42015-08-09 22:37:52 +0000960 GENX_(__NR_setuid, sys_setuid), // 146
sewardj29ac9812014-02-21 14:51:14 +0000961 LINX_(__NR_setresuid, sys_setresuid), // 147
sewardje3c20b42014-02-27 11:14:19 +0000962 LINXY(__NR_getresuid, sys_getresuid), // 148
mjwf31aba42015-08-09 22:37:52 +0000963 LINX_(__NR_setresgid, sys_setresgid), // 149
sewardje3c20b42014-02-27 11:14:19 +0000964 LINXY(__NR_getresgid, sys_getresgid), // 150
mjwfd2ac382014-10-10 21:13:28 +0000965 GENXY(__NR_times, sys_times), // 153
sewardj29ac9812014-02-21 14:51:14 +0000966 GENX_(__NR_setpgid, sys_setpgid), // 154
sewardjf0c12502014-01-12 12:54:00 +0000967 GENX_(__NR_getpgid, sys_getpgid), // 155
mjwe14440d2014-10-10 21:33:39 +0000968 GENX_(__NR_getsid, sys_getsid), // 156
969 GENX_(__NR_setsid, sys_setsid), // 157
mjw002afc52014-11-13 13:03:25 +0000970 GENXY(__NR_getgroups, sys_getgroups), // 158
971 GENX_(__NR_setgroups, sys_setgroups), // 159
sewardjf0c12502014-01-12 12:54:00 +0000972 GENXY(__NR_uname, sys_newuname), // 160
973 GENXY(__NR_getrlimit, sys_old_getrlimit), // 163
sewardj29ac9812014-02-21 14:51:14 +0000974 GENX_(__NR_setrlimit, sys_setrlimit), // 164
sewardjf0c12502014-01-12 12:54:00 +0000975 GENXY(__NR_getrusage, sys_getrusage), // 165
sewardj29ac9812014-02-21 14:51:14 +0000976 GENX_(__NR_umask, sys_umask), // 166
sewardjd11ed202014-03-02 12:49:52 +0000977 LINXY(__NR_prctl, sys_prctl), // 167
sewardjf0c12502014-01-12 12:54:00 +0000978 GENXY(__NR_gettimeofday, sys_gettimeofday), // 169
979 GENX_(__NR_getpid, sys_getpid), // 172
980 GENX_(__NR_getppid, sys_getppid), // 173
981 GENX_(__NR_getuid, sys_getuid), // 174
982 GENX_(__NR_geteuid, sys_geteuid), // 175
983 GENX_(__NR_getgid, sys_getgid), // 176
984 GENX_(__NR_getegid, sys_getegid), // 177
985 LINX_(__NR_gettid, sys_gettid), // 178
sewardj0f730472014-03-08 20:34:45 +0000986 LINXY(__NR_sysinfo, sys_sysinfo), // 179
sewardj7a359892014-03-01 11:24:42 +0000987 LINXY(__NR_mq_open, sys_mq_open), // 180
988 LINX_(__NR_mq_unlink, sys_mq_unlink), // 181
sewardj5d998132014-04-07 14:47:23 +0000989 LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 182
990 LINXY(__NR_mq_timedreceive, sys_mq_timedreceive), // 183
991 LINX_(__NR_mq_notify, sys_mq_notify), // 184
992 LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 185
mjw0b654cc2015-02-07 22:58:51 +0000993 LINX_(__NR_msgget, sys_msgget), // 186
994 LINXY(__NR_msgctl, sys_msgctl), // 187
995 LINXY(__NR_msgrcv, sys_msgrcv), // 188
996 LINX_(__NR_msgsnd, sys_msgsnd), // 189
sewardj7a359892014-03-01 11:24:42 +0000997 LINX_(__NR_semget, sys_semget), // 190
998 LINXY(__NR_semctl, sys_semctl), // 191
999 LINX_(__NR_semtimedop, sys_semtimedop), // 192
1000 LINX_(__NR_semop, sys_semop), // 193
sewardjb5170b92014-03-07 22:48:50 +00001001 LINX_(__NR_shmget, sys_shmget), // 194
sewardj0f730472014-03-08 20:34:45 +00001002 LINXY(__NR_shmctl, sys_shmctl), // 195
1003 LINXY(__NR_shmat, wrap_sys_shmat), // 196
1004 LINXY(__NR_shmdt, sys_shmdt), // 197
sewardjf0c12502014-01-12 12:54:00 +00001005 LINXY(__NR_socket, sys_socket), // 198
sewardjc8fa5cc2014-02-20 23:20:08 +00001006 LINXY(__NR_socketpair, sys_socketpair), // 199
sewardj29ac9812014-02-21 14:51:14 +00001007 LINX_(__NR_bind, sys_bind), // 200
sewardj7a359892014-03-01 11:24:42 +00001008 LINX_(__NR_listen, sys_listen), // 201
1009 LINXY(__NR_accept, sys_accept), // 202
sewardjf0c12502014-01-12 12:54:00 +00001010 LINX_(__NR_connect, sys_connect), // 203
sewardj29ac9812014-02-21 14:51:14 +00001011 LINXY(__NR_getsockname, sys_getsockname), // 204
1012 LINXY(__NR_getpeername, sys_getpeername), // 205
1013 LINX_(__NR_sendto, sys_sendto), // 206
sewardje3c20b42014-02-27 11:14:19 +00001014 LINXY(__NR_recvfrom, sys_recvfrom), // 207
sewardj29ac9812014-02-21 14:51:14 +00001015 LINX_(__NR_setsockopt, sys_setsockopt), // 208
1016 LINXY(__NR_getsockopt, sys_getsockopt), // 209
1017 LINX_(__NR_shutdown, sys_shutdown), // 210
1018 LINX_(__NR_sendmsg, sys_sendmsg), // 211
1019 LINXY(__NR_recvmsg, sys_recvmsg), // 212
sewardje3c20b42014-02-27 11:14:19 +00001020 LINX_(__NR_readahead, sys_readahead), // 213
sewardjf0c12502014-01-12 12:54:00 +00001021 GENX_(__NR_brk, sys_brk), // 214
1022 GENXY(__NR_munmap, sys_munmap), // 215
sewardj5d998132014-04-07 14:47:23 +00001023 GENX_(__NR_mremap, sys_mremap), // 216
sewardj883ac8b2014-05-15 16:47:56 +00001024 LINX_(__NR_add_key, sys_add_key), // 217
1025 LINXY(__NR_keyctl, sys_keyctl), // 219
sewardjf0c12502014-01-12 12:54:00 +00001026 PLAX_(__NR_clone, sys_clone), // 220
1027 GENX_(__NR_execve, sys_execve), // 221
1028
1029 // FIXME IS THIS CORRECT?
1030 PLAX_(__NR3264_mmap, sys_mmap), // 222
sewardjb5170b92014-03-07 22:48:50 +00001031 PLAX_(__NR3264_fadvise64, sys_fadvise64), // 223
sewardjf0c12502014-01-12 12:54:00 +00001032
1033 GENXY(__NR_mprotect, sys_mprotect), // 226
sewardj4f2f3132014-10-30 14:11:32 +00001034 GENX_(__NR_msync, sys_msync), // 227
sewardj6c730b92014-09-04 11:22:31 +00001035 GENX_(__NR_mlock, sys_mlock), // 228
1036 GENX_(__NR_mlockall, sys_mlockall), // 230
sewardjae082d82014-02-20 17:36:56 +00001037 GENX_(__NR_madvise, sys_madvise), // 233
sewardj0b6d2662015-02-05 15:28:28 +00001038 LINX_(__NR_mbind, sys_mbind), // 235
1039 LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 236
1040 LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 237
mjwc53a5342015-02-17 19:50:45 +00001041
1042 LINXY(__NR_recvmmsg, sys_recvmmsg), // 243
mjwe4a905f2015-02-10 13:39:04 +00001043 LINXY(__NR_accept4, sys_accept4), // 242
mjwc53a5342015-02-17 19:50:45 +00001044
sewardjf0c12502014-01-12 12:54:00 +00001045 GENXY(__NR_wait4, sys_wait4), // 260
1046
tom9e2645c2015-05-07 18:54:31 +00001047 LINX_(__NR_syncfs, sys_syncfs), // 267
1048
mjw13af2412015-02-17 16:04:09 +00001049 LINXY(__NR_sendmmsg, sys_sendmmsg), // 269
sewardj7a359892014-03-01 11:24:42 +00001050 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 270
1051 LINX_(__NR_process_vm_writev, sys_process_vm_writev), // 271
tome6366712014-11-10 09:55:59 +00001052 LINXY(__NR_getrandom, sys_getrandom), // 278
tom9d7592e2015-01-19 21:52:44 +00001053 LINXY(__NR_memfd_create, sys_memfd_create), // 279
sewardj7a359892014-03-01 11:24:42 +00001054
sewardjf0c12502014-01-12 12:54:00 +00001055// The numbers below are bogus. (See comment further down.)
1056// When pulling entries above this line, change the numbers
1057// to be correct.
1058
sewardjf0c12502014-01-12 12:54:00 +00001059//ZZ //zz // (restart_syscall) // 0
1060//ZZ GENX_(__NR_fork, sys_fork), // 2
1061//ZZ
1062//ZZ GENXY(__NR_open, sys_open), // 5
1063//ZZ // GENXY(__NR_waitpid, sys_waitpid), // 7
1064//ZZ GENXY(__NR_creat, sys_creat), // 8
1065//ZZ GENX_(__NR_link, sys_link), // 9
1066//ZZ
1067//ZZ GENX_(__NR_unlink, sys_unlink), // 10
1068//ZZ GENXY(__NR_time, sys_time), // 13
1069//ZZ GENX_(__NR_mknod, sys_mknod), // 14
1070//ZZ
1071//ZZ GENX_(__NR_chmod, sys_chmod), // 15
1072//ZZ //zz LINX_(__NR_lchown, sys_lchown16), // 16
1073//ZZ // GENX_(__NR_break, sys_ni_syscall), // 17
1074//ZZ //zz // (__NR_oldstat, sys_stat), // 18 (obsolete)
1075//ZZ LINX_(__NR_lseek, sys_lseek), // 19
1076//ZZ
1077//ZZ GENX_(__NR_getpid, sys_getpid), // 20
sewardjf0c12502014-01-12 12:54:00 +00001078//ZZ LINX_(__NR_umount, sys_oldumount), // 22
1079//ZZ LINX_(__NR_setuid, sys_setuid16), // 23 ## P
1080//ZZ LINX_(__NR_getuid, sys_getuid16), // 24 ## P
1081//ZZ //zz
1082//ZZ //zz // (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN)
1083//ZZ PLAXY(__NR_ptrace, sys_ptrace), // 26
1084//ZZ GENX_(__NR_alarm, sys_alarm), // 27
1085//ZZ //zz // (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete
1086//ZZ GENX_(__NR_pause, sys_pause), // 29
1087//ZZ
1088//ZZ LINX_(__NR_utime, sys_utime), // 30
1089//ZZ // GENX_(__NR_stty, sys_ni_syscall), // 31
1090//ZZ // GENX_(__NR_gtty, sys_ni_syscall), // 32
1091//ZZ GENX_(__NR_access, sys_access), // 33
1092//ZZ GENX_(__NR_nice, sys_nice), // 34
1093//ZZ
1094//ZZ // GENX_(__NR_ftime, sys_ni_syscall), // 35
1095//ZZ GENX_(__NR_sync, sys_sync), // 36
sewardjf0c12502014-01-12 12:54:00 +00001096//ZZ GENX_(__NR_rename, sys_rename), // 38
1097//ZZ GENX_(__NR_mkdir, sys_mkdir), // 39
1098//ZZ
1099//ZZ GENX_(__NR_rmdir, sys_rmdir), // 40
sewardjf0c12502014-01-12 12:54:00 +00001100//ZZ LINXY(__NR_pipe, sys_pipe), // 42
sewardjf0c12502014-01-12 12:54:00 +00001101//ZZ // GENX_(__NR_prof, sys_ni_syscall), // 44
1102
sewardjf0c12502014-01-12 12:54:00 +00001103//ZZ LINX_(__NR_getgid, sys_getgid16), // 47
1104//ZZ //zz // (__NR_signal, sys_signal), // 48 */* (ANSI C)
1105//ZZ LINX_(__NR_geteuid, sys_geteuid16), // 49
1106//ZZ
1107//ZZ LINX_(__NR_getegid, sys_getegid16), // 50
1108//ZZ GENX_(__NR_acct, sys_acct), // 51
sewardjf0c12502014-01-12 12:54:00 +00001109//ZZ // GENX_(__NR_lock, sys_ni_syscall), // 53
1110//ZZ
1111//ZZ LINXY(__NR_fcntl, sys_fcntl), // 55
1112//ZZ // GENX_(__NR_mpx, sys_ni_syscall), // 56
sewardjf0c12502014-01-12 12:54:00 +00001113//ZZ // GENX_(__NR_ulimit, sys_ni_syscall), // 58
1114//ZZ //zz // (__NR_oldolduname, sys_olduname), // 59 Linux -- obsolete
1115//ZZ //zz
sewardjf0c12502014-01-12 12:54:00 +00001116//ZZ //zz // (__NR_ustat, sys_ustat) // 62 SVr4 -- deprecated
1117//ZZ GENXY(__NR_dup2, sys_dup2), // 63
1118//ZZ GENX_(__NR_getppid, sys_getppid), // 64
1119//ZZ
1120//ZZ GENX_(__NR_getpgrp, sys_getpgrp), // 65
sewardjf0c12502014-01-12 12:54:00 +00001121//ZZ LINXY(__NR_sigaction, sys_sigaction), // 67
1122//ZZ //zz // (__NR_sgetmask, sys_sgetmask), // 68 */* (ANSI C)
1123//ZZ //zz // (__NR_ssetmask, sys_ssetmask), // 69 */* (ANSI C)
1124//ZZ //zz
sewardjf0c12502014-01-12 12:54:00 +00001125//ZZ PLAX_(__NR_sigsuspend, sys_sigsuspend), // 72
1126//ZZ LINXY(__NR_sigpending, sys_sigpending), // 73
1127//ZZ //zz // (__NR_sethostname, sys_sethostname), // 74 */*
1128//ZZ //zz
sewardjf0c12502014-01-12 12:54:00 +00001129//ZZ GENXY(__NR_getrlimit, sys_old_getrlimit), // 76
1130//ZZ GENX_(__NR_settimeofday, sys_settimeofday), // 79
1131//ZZ
1132//ZZ LINXY(__NR_getgroups, sys_getgroups16), // 80
1133//ZZ LINX_(__NR_setgroups, sys_setgroups16), // 81
1134//ZZ // PLAX_(__NR_select, old_select), // 82
1135//ZZ GENX_(__NR_symlink, sys_symlink), // 83
1136//ZZ //zz // (__NR_oldlstat, sys_lstat), // 84 -- obsolete
1137//ZZ //zz
1138//ZZ GENX_(__NR_readlink, sys_readlink), // 85
1139//ZZ //zz // (__NR_uselib, sys_uselib), // 86 */Linux
1140//ZZ //zz // (__NR_swapon, sys_swapon), // 87 */Linux
1141//ZZ //zz // (__NR_reboot, sys_reboot), // 88 */Linux
1142//ZZ //zz // (__NR_readdir, old_readdir), // 89 -- superseded
1143//ZZ //zz
1144//ZZ // _____(__NR_mmap, old_mmap), // 90
1145//ZZ GENXY(__NR_munmap, sys_munmap), // 91
1146//ZZ GENX_(__NR_truncate, sys_truncate), // 92
1147//ZZ GENX_(__NR_ftruncate, sys_ftruncate), // 93
sewardjf0c12502014-01-12 12:54:00 +00001148//ZZ
1149//ZZ LINX_(__NR_fchown, sys_fchown16), // 95
sewardjf0c12502014-01-12 12:54:00 +00001150//ZZ // GENX_(__NR_profil, sys_ni_syscall), // 98
1151//ZZ GENXY(__NR_statfs, sys_statfs), // 99
1152//ZZ
1153//ZZ GENXY(__NR_fstatfs, sys_fstatfs), // 100
1154//ZZ // LINX_(__NR_ioperm, sys_ioperm), // 101
1155//ZZ LINXY(__NR_socketcall, sys_socketcall), // 102
sewardjf0c12502014-01-12 12:54:00 +00001156//ZZ
1157//ZZ GENXY(__NR_getitimer, sys_getitimer), // 105
1158//ZZ GENXY(__NR_stat, sys_newstat), // 106
1159//ZZ GENXY(__NR_lstat, sys_newlstat), // 107
1160//ZZ GENXY(__NR_fstat, sys_newfstat), // 108
1161//ZZ //zz // (__NR_olduname, sys_uname), // 109 -- obsolete
1162//ZZ //zz
1163//ZZ // GENX_(__NR_iopl, sys_iopl), // 110
1164//ZZ LINX_(__NR_vhangup, sys_vhangup), // 111
1165//ZZ // GENX_(__NR_idle, sys_ni_syscall), // 112
1166//ZZ // PLAXY(__NR_vm86old, sys_vm86old), // 113 __NR_syscall... weird
1167//ZZ //zz
1168//ZZ //zz // (__NR_swapoff, sys_swapoff), // 115 */Linux
sewardjf0c12502014-01-12 12:54:00 +00001169//ZZ // _____(__NR_ipc, sys_ipc), // 117
1170//ZZ GENX_(__NR_fsync, sys_fsync), // 118
1171//ZZ PLAX_(__NR_sigreturn, sys_sigreturn), // 119 ?/Linux
1172//ZZ
1173//ZZ //zz // (__NR_setdomainname, sys_setdomainname), // 121 */*(?)
1174//ZZ // PLAX_(__NR_modify_ldt, sys_modify_ldt), // 123
1175//ZZ //zz LINXY(__NR_adjtimex, sys_adjtimex), // 124
1176//ZZ //zz
1177//ZZ LINXY(__NR_sigprocmask, sys_sigprocmask), // 126
1178//ZZ //zz // Nb: create_module() was removed 2.4-->2.6
1179//ZZ // GENX_(__NR_create_module, sys_ni_syscall), // 127
1180//ZZ LINX_(__NR_init_module, sys_init_module), // 128
1181//ZZ LINX_(__NR_delete_module, sys_delete_module), // 129
1182//ZZ //zz
1183//ZZ //zz // Nb: get_kernel_syms() was removed 2.4-->2.6
1184//ZZ // GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130
sewardjf0c12502014-01-12 12:54:00 +00001185//ZZ GENX_(__NR_getpgid, sys_getpgid), // 132
sewardjf0c12502014-01-12 12:54:00 +00001186//ZZ //zz // (__NR_bdflush, sys_bdflush), // 134 */Linux
1187//ZZ //zz
1188//ZZ //zz // (__NR_sysfs, sys_sysfs), // 135 SVr4
1189//ZZ LINX_(__NR_personality, sys_personality), // 136
1190//ZZ // GENX_(__NR_afs_syscall, sys_ni_syscall), // 137
1191//ZZ LINX_(__NR_setfsuid, sys_setfsuid16), // 138
1192//ZZ LINX_(__NR_setfsgid, sys_setfsgid16), // 139
1193//ZZ
1194//ZZ LINXY(__NR__llseek, sys_llseek), // 140
1195//ZZ GENXY(__NR_getdents, sys_getdents), // 141
1196//ZZ GENX_(__NR__newselect, sys_select), // 142
sewardjf0c12502014-01-12 12:54:00 +00001197//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001198//ZZ LINXY(__NR__sysctl, sys_sysctl), // 149
1199//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001200//ZZ GENX_(__NR_munlock, sys_munlock), // 151
sewardjf0c12502014-01-12 12:54:00 +00001201//ZZ LINX_(__NR_munlockall, sys_munlockall), // 153
1202//ZZ LINXY(__NR_sched_setparam, sys_sched_setparam), // 154
1203//ZZ
1204//ZZ LINXY(__NR_sched_getparam, sys_sched_getparam), // 155
1205//ZZ LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156
1206//ZZ LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157
sewardjf0c12502014-01-12 12:54:00 +00001207//ZZ LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
1208//ZZ
1209//ZZ LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
1210//ZZ //zz //LINX?(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 */*
sewardjf0c12502014-01-12 12:54:00 +00001211//ZZ LINX_(__NR_setresuid, sys_setresuid16), // 164
1212//ZZ
1213//ZZ LINXY(__NR_getresuid, sys_getresuid16), // 165
1214//ZZ // PLAXY(__NR_vm86, sys_vm86), // 166 x86/Linux-only
1215//ZZ // GENX_(__NR_query_module, sys_ni_syscall), // 167
1216//ZZ GENXY(__NR_poll, sys_poll), // 168
1217//ZZ //zz // (__NR_nfsservctl, sys_nfsservctl), // 169 */Linux
1218//ZZ //zz
1219//ZZ LINX_(__NR_setresgid, sys_setresgid16), // 170
1220//ZZ LINXY(__NR_getresgid, sys_getresgid16), // 171
1221//ZZ LINXY(__NR_prctl, sys_prctl), // 172
1222//ZZ LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 174
1223//ZZ
1224//ZZ LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 176
1225//ZZ LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait),// 177
sewardjf0c12502014-01-12 12:54:00 +00001226//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001227//ZZ LINX_(__NR_chown, sys_chown16), // 182
sewardjf0c12502014-01-12 12:54:00 +00001228//ZZ
1229//ZZ LINX_(__NR_capset, sys_capset), // 185
sewardjf0c12502014-01-12 12:54:00 +00001230//ZZ LINXY(__NR_sendfile, sys_sendfile), // 187
1231//ZZ // GENXY(__NR_getpmsg, sys_getpmsg), // 188
1232//ZZ // GENX_(__NR_putpmsg, sys_putpmsg), // 189
1233//ZZ
1234//ZZ // Nb: we treat vfork as fork
1235//ZZ GENX_(__NR_vfork, sys_fork), // 190
1236//ZZ GENXY(__NR_ugetrlimit, sys_getrlimit), // 191
1237//ZZ GENX_(__NR_truncate64, sys_truncate64), // 193
1238//ZZ GENX_(__NR_ftruncate64, sys_ftruncate64), // 194
1239//ZZ
1240//ZZ PLAXY(__NR_stat64, sys_stat64), // 195
1241//ZZ PLAXY(__NR_lstat64, sys_lstat64), // 196
1242//ZZ PLAXY(__NR_fstat64, sys_fstat64), // 197
1243//ZZ GENX_(__NR_lchown32, sys_lchown), // 198
1244//ZZ GENX_(__NR_getuid32, sys_getuid), // 199
1245//ZZ
1246//ZZ GENX_(__NR_getgid32, sys_getgid), // 200
1247//ZZ GENX_(__NR_geteuid32, sys_geteuid), // 201
1248//ZZ GENX_(__NR_getegid32, sys_getegid), // 202
1249//ZZ GENX_(__NR_setreuid32, sys_setreuid), // 203
1250//ZZ GENX_(__NR_setregid32, sys_setregid), // 204
1251//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001252//ZZ LINX_(__NR_setresuid32, sys_setresuid), // 208
1253//ZZ LINXY(__NR_getresuid32, sys_getresuid), // 209
1254//ZZ
1255//ZZ LINX_(__NR_setresgid32, sys_setresgid), // 210
1256//ZZ LINXY(__NR_getresgid32, sys_getresgid), // 211
1257//ZZ GENX_(__NR_chown32, sys_chown), // 212
1258//ZZ GENX_(__NR_setuid32, sys_setuid), // 213
1259//ZZ GENX_(__NR_setgid32, sys_setgid), // 214
1260//ZZ
1261//ZZ LINX_(__NR_setfsuid32, sys_setfsuid), // 215
1262//ZZ LINX_(__NR_setfsgid32, sys_setfsgid), // 216
1263//ZZ //zz // (__NR_pivot_root, sys_pivot_root), // 217 */Linux
1264//ZZ GENXY(__NR_mincore, sys_mincore), // 218
sewardjf0c12502014-01-12 12:54:00 +00001265//ZZ
1266//ZZ LINXY(__NR_fcntl64, sys_fcntl64), // 221
1267//ZZ // GENX_(222, sys_ni_syscall), // 222
1268//ZZ // PLAXY(223, sys_syscall223), // 223 // sys_bproc?
1269//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001270//ZZ LINX_(__NR_setxattr, sys_setxattr), // 226
1271//ZZ LINX_(__NR_lsetxattr, sys_lsetxattr), // 227
1272//ZZ LINX_(__NR_fsetxattr, sys_fsetxattr), // 228
1273//ZZ
1274//ZZ LINXY(__NR_fgetxattr, sys_fgetxattr), // 231
1275//ZZ LINXY(__NR_listxattr, sys_listxattr), // 232
1276//ZZ LINXY(__NR_llistxattr, sys_llistxattr), // 233
1277//ZZ LINXY(__NR_flistxattr, sys_flistxattr), // 234
1278//ZZ
1279//ZZ LINX_(__NR_removexattr, sys_removexattr), // 235
1280//ZZ LINX_(__NR_lremovexattr, sys_lremovexattr), // 236
1281//ZZ LINX_(__NR_fremovexattr, sys_fremovexattr), // 237
1282//ZZ LINXY(__NR_tkill, sys_tkill), // 238 */Linux
1283//ZZ LINXY(__NR_sendfile64, sys_sendfile64), // 239
1284//ZZ
1285//ZZ LINXY(__NR_futex, sys_futex), // 240
sewardjf0c12502014-01-12 12:54:00 +00001286//ZZ LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 242
1287//ZZ // PLAX_(__NR_set_thread_area, sys_set_thread_area), // 243
1288//ZZ // PLAX_(__NR_get_thread_area, sys_get_thread_area), // 244
1289//ZZ
1290//ZZ LINXY(__NR_io_setup, sys_io_setup), // 245
1291//ZZ LINX_(__NR_io_destroy, sys_io_destroy), // 246
1292//ZZ LINXY(__NR_io_getevents, sys_io_getevents), // 247
1293//ZZ LINX_(__NR_io_submit, sys_io_submit), // 248
1294//ZZ LINXY(__NR_io_cancel, sys_io_cancel), // 249
1295//ZZ
1296//ZZ // LINX_(__NR_fadvise64, sys_fadvise64), // 250 */(Linux?)
1297//ZZ GENX_(251, sys_ni_syscall), // 251
1298//ZZ // GENXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 253
1299//ZZ LINXY(__NR_epoll_create, sys_epoll_create), // 254
1300//ZZ
1301//ZZ LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 255
1302//ZZ LINXY(__NR_epoll_wait, sys_epoll_wait), // 256
1303//ZZ //zz // (__NR_remap_file_pages, sys_remap_file_pages), // 257 */Linux
1304//ZZ LINX_(__NR_set_tid_address, sys_set_tid_address), // 258
1305//ZZ LINXY(__NR_timer_create, sys_timer_create), // 259
1306//ZZ
1307//ZZ LINXY(__NR_timer_settime, sys_timer_settime), // (timer_create+1)
1308//ZZ LINXY(__NR_timer_gettime, sys_timer_gettime), // (timer_create+2)
1309//ZZ LINX_(__NR_timer_getoverrun, sys_timer_getoverrun),//(timer_create+3)
1310//ZZ LINX_(__NR_timer_delete, sys_timer_delete), // (timer_create+4)
1311//ZZ LINX_(__NR_clock_settime, sys_clock_settime), // (timer_create+5)
1312//ZZ
1313//ZZ LINXY(__NR_clock_getres, sys_clock_getres), // (timer_create+7)
1314//ZZ LINXY(__NR_clock_nanosleep, sys_clock_nanosleep),// (timer_create+8) */*
1315//ZZ GENXY(__NR_statfs64, sys_statfs64), // 268
1316//ZZ GENXY(__NR_fstatfs64, sys_fstatfs64), // 269
1317//ZZ
1318//ZZ GENX_(__NR_utimes, sys_utimes), // 271
1319//ZZ // LINX_(__NR_fadvise64_64, sys_fadvise64_64), // 272 */(Linux?)
1320//ZZ GENX_(__NR_vserver, sys_ni_syscall), // 273
1321//ZZ LINX_(__NR_mbind, sys_mbind), // 274 ?/?
1322//ZZ
1323//ZZ LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 275 ?/?
1324//ZZ LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 276 ?/?
sewardjf0c12502014-01-12 12:54:00 +00001325//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001326//ZZ LINXY(__NR_waitid, sys_waitid), // 280
1327//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001328//ZZ LINX_(__NR_send, sys_send),
sewardjf0c12502014-01-12 12:54:00 +00001329//ZZ LINXY(__NR_recv, sys_recv),
1330//ZZ LINXY(__NR_recvfrom, sys_recvfrom), // 292
sewardjf0c12502014-01-12 12:54:00 +00001331//ZZ LINX_(__NR_semget, sys_semget), // 299
1332//ZZ LINXY(__NR_semctl, sys_semctl), // 300
sewardjf0c12502014-01-12 12:54:00 +00001333//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001334//ZZ LINX_(__NR_request_key, sys_request_key), // 287
sewardjf0c12502014-01-12 12:54:00 +00001335//ZZ // LINX_(__NR_ioprio_set, sys_ioprio_set), // 289
1336//ZZ
1337//ZZ // LINX_(__NR_ioprio_get, sys_ioprio_get), // 290
1338//ZZ LINX_(__NR_inotify_init, sys_inotify_init), // 291
sewardjf0c12502014-01-12 12:54:00 +00001339//ZZ // LINX_(__NR_migrate_pages, sys_migrate_pages), // 294
1340//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001341//ZZ LINX_(__NR_futimesat, sys_futimesat), // 326 on arm
1342//ZZ
1343//ZZ PLAXY(__NR_fstatat64, sys_fstatat64), // 300
1344//ZZ LINX_(__NR_renameat, sys_renameat), // 302
sewardjf0c12502014-01-12 12:54:00 +00001345//ZZ LINX_(__NR_symlinkat, sys_symlinkat), // 304
1346//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001347//ZZ LINX_(__NR_shmget, sys_shmget), //307
sewardjf0c12502014-01-12 12:54:00 +00001348//ZZ // LINX_(__NR_pselect6, sys_pselect6), //
1349//ZZ
1350//ZZ // LINX_(__NR_unshare, sys_unshare), // 310
1351//ZZ LINX_(__NR_set_robust_list, sys_set_robust_list), // 311
1352//ZZ LINXY(__NR_get_robust_list, sys_get_robust_list), // 312
1353//ZZ // LINX_(__NR_splice, sys_ni_syscall), // 313
1354//ZZ // LINX_(__NR_sync_file_range, sys_sync_file_range), // 314
1355//ZZ
1356//ZZ // LINX_(__NR_tee, sys_ni_syscall), // 315
1357//ZZ // LINX_(__NR_vmsplice, sys_ni_syscall), // 316
1358//ZZ LINXY(__NR_move_pages, sys_move_pages), // 317
1359//ZZ // LINX_(__NR_getcpu, sys_ni_syscall), // 318
1360//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001361//ZZ LINXY(__NR_signalfd, sys_signalfd), // 321
tom4f5be8c2014-01-30 21:47:30 +00001362//ZZ LINXY(__NR_eventfd, sys_eventfd), // 323
sewardjf0c12502014-01-12 12:54:00 +00001363//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001364//ZZ
1365//ZZ ///////////////
1366//ZZ
1367//ZZ // JRS 2010-Jan-03: I believe that all the numbers listed
1368//ZZ // in comments in the table prior to this point (eg "// 326",
1369//ZZ // etc) are bogus since it looks to me like they are copied
1370//ZZ // verbatim from syswrap-x86-linux.c and they certainly do not
1371//ZZ // correspond to what's in include/vki/vki-scnums-arm-linux.h.
1372//ZZ // From here onwards, please ensure the numbers are correct.
1373//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001374//ZZ
1375//ZZ LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 346
1376//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001377//ZZ
tom4f5be8c2014-01-30 21:47:30 +00001378//ZZ LINXY(__NR_eventfd2, sys_eventfd2), // 356
sewardjf0c12502014-01-12 12:54:00 +00001379//ZZ LINXY(__NR_epoll_create1, sys_epoll_create1), // 357
sewardjf0c12502014-01-12 12:54:00 +00001380//ZZ LINXY(__NR_preadv, sys_preadv), // 361
1381//ZZ LINX_(__NR_pwritev, sys_pwritev), // 362
1382//ZZ LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 363
1383//ZZ LINXY(__NR_perf_event_open, sys_perf_event_open), // 364
1384//ZZ
sewardjf0c12502014-01-12 12:54:00 +00001385//ZZ LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 370
tomddc4a182014-01-30 22:33:02 +00001386//ZZ LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 371
1387//ZZ LINXY(__NR_clock_adjtime, sys_clock_adjtime) // 372
sewardjf0c12502014-01-12 12:54:00 +00001388};
1389
1390
1391//ZZ /* These are not in the main table because there indexes are not small
1392//ZZ integers, but rather values close to one million. So their
1393//ZZ inclusion would force the main table to be huge (about 8 MB). */
1394//ZZ
1395//ZZ static SyscallTableEntry ste___ARM_set_tls
1396//ZZ = { WRAPPER_PRE_NAME(arm_linux,sys_set_tls), NULL };
1397//ZZ
1398//ZZ static SyscallTableEntry ste___ARM_cacheflush
1399//ZZ = { WRAPPER_PRE_NAME(arm_linux,sys_cacheflush), NULL };
1400
1401SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1402{
1403 const UInt syscall_main_table_size
1404 = sizeof(syscall_main_table) / sizeof(syscall_main_table[0]);
1405
1406 /* Is it in the contiguous initial section of the table? */
1407 if (sysno < syscall_main_table_size) {
1408 SyscallTableEntry* sys = &syscall_main_table[sysno];
1409 if (sys->before == NULL)
1410 return NULL; /* no entry */
1411 else
1412 return sys;
1413 }
1414
1415//ZZ /* Check if it's one of the out-of-line entries. */
1416//ZZ switch (sysno) {
1417//ZZ case __NR_ARM_set_tls: return &ste___ARM_set_tls;
1418//ZZ case __NR_ARM_cacheflush: return &ste___ARM_cacheflush;
1419//ZZ default: break;
1420//ZZ }
1421
1422 /* Can't find a wrapper */
1423 return NULL;
1424}
1425
1426#endif // defined(VGP_arm64_linux)
1427
1428/*--------------------------------------------------------------------*/
1429/*--- end syswrap-arm64-linux.c ---*/
1430/*--------------------------------------------------------------------*/