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