1
2 /*--------------------------------------------------------------------*/
3 /*--- Platform-specific syscalls stuff. syswrap-arm-linux.c -----*/
4 /*--------------------------------------------------------------------*/
5
6 /*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
10 Copyright (C) 2000-2017 Nicholas Nethercote
11 njn@valgrind.org
12 Copyright (C) 2008-2017 Evan Geller
13 gaze@bea.ms
14
15 This program is free software; you can redistribute it and/or
16 modify it under the terms of the GNU General Public License as
17 published by the Free Software Foundation; either version 2 of the
18 License, or (at your option) any later version.
19
20 This program is distributed in the hope that it will be useful, but
21 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
24
25 You should have received a copy of the GNU General Public License
26 along with this program; if not, write to the Free Software
27 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28 02111-1307, USA.
29
30 The GNU General Public License is contained in the file COPYING.
31 */
32
33 #if defined(VGP_arm_linux)
34
35 #include "pub_core_basics.h"
36 #include "pub_core_vki.h"
37 #include "pub_core_vkiscnums.h"
38 #include "pub_core_threadstate.h"
39 #include "pub_core_aspacemgr.h"
40 #include "pub_core_debuglog.h"
41 #include "pub_core_libcbase.h"
42 #include "pub_core_libcassert.h"
43 #include "pub_core_libcprint.h"
44 #include "pub_core_libcproc.h"
45 #include "pub_core_libcsignal.h"
46 #include "pub_core_options.h"
47 #include "pub_core_scheduler.h"
48 #include "pub_core_sigframe.h" // For VG_(sigframe_destroy)()
49 #include "pub_core_signals.h"
50 #include "pub_core_syscall.h"
51 #include "pub_core_syswrap.h"
52 #include "pub_core_tooliface.h"
53 #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 #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))
69 void 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
77 asm(
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,r0\n\t" /* Stack pointer */
82 " mov lr,r1\n\t" /* Return address */
83 " mov r0,r3\n\t" /* First argument */
84 " push {r2}\n\t" /* So we can ret to the new dest */
85 " mov r1, #0\n\t" /* Clear our GPRs */
86 " mov r2, #0\n\t"
87 " mov r3, #0\n\t"
88 " mov r4, #0\n\t"
89 " mov r5, #0\n\t"
90 " mov r6, #0\n\t"
91 " mov r7, #0\n\t"
92 " mov r8, #0\n\t"
93 " mov r9, #0\n\t"
94 " mov r10, #0\n\t"
95 " mov r11, #0\n\t"
96 " mov r12, #0\n\t"
97 " pop {pc}\n\t" /* Herrre we go! */
98 ".previous\n"
99 );
100
101
102 #define __NR_CLONE VG_STRINGIFY(__NR_clone)
103 #define __NR_EXIT VG_STRINGIFY(__NR_exit)
104
105 // See priv_syswrap-linux.h for arg profile.
106 asm(
107 ".text\n"
108 ".globl do_syscall_clone_arm_linux\n"
109 "do_syscall_clone_arm_linux:\n"
110
111 /*Setup child stack */
112 " str r0, [r1, #-4]!\n"
113 " str r3, [r1, #-4]!\n"
114 " push {r4,r7}\n"
115 " mov r0, r2\n" /* arg1: flags */
116 /* r1 (arg2) is already our child's stack */
117 " ldr r2, [sp, #12]\n" // parent tid
118 " ldr r3, [sp, #16]\n" // tls
119 " ldr r4, [sp, #8]\n" // Child tid
120 " mov r7, #"__NR_CLONE"\n"
121 " svc 0x00000000\n"
122 " cmp r0, #0\n"
123 " beq 1f\n"
124
125 /* Parent */
126 " pop {r4,r7}\n"
127 " bx lr\n"
128
129 "1:\n" /*child*/
130 " mov lr, pc\n"
131 " pop {r0,pc}\n"
132 /* Retval from child is already in r0 */
133 " mov r7, #"__NR_EXIT"\n"
134 " svc 0x00000000\n"
135 /* Urh.. why did exit return? */
136 " .long 0\n"
137 " .previous\n"
138 );
139
140 #undef __NR_CLONE
141 #undef __NR_EXIT
142
143 // forward declarations
144 static SysRes sys_set_tls ( ThreadId tid, Addr tlsptr );
145
146 /* ---------------------------------------------------------------------
147 More thread stuff
148 ------------------------------------------------------------------ */
149
150 // ARM doesn't have any architecture specific thread stuff that
151 // needs to be cleaned up
VG_(cleanup_thread)152 void VG_(cleanup_thread) ( ThreadArchState* arch )
153 {
154 }
155
156 /* Assigns tlsptr to the guest TPIDRURO.
157 If needed for the specific hardware, really executes
158 the set_tls syscall.
159 */
sys_set_tls(ThreadId tid,Addr tlsptr)160 static SysRes sys_set_tls ( ThreadId tid, Addr tlsptr )
161 {
162 VG_(threads)[tid].arch.vex.guest_TPIDRURO = tlsptr;
163
164 if (KernelVariantiS(KernelVariant_android_no_hw_tls,
165 VG_(clo_kernel_variant))) {
166 /* Android emulator does not provide an hw tls register.
167 So, the tls register is emulated by the kernel.
168 This emulated value is set by the __NR_ARM_set_tls syscall.
169 The emulated value must be read by the kernel helper function
170 located at 0xffff0fe0.
171
172 The emulated tlsptr is located at 0xffff0ff0
173 (so slightly after the kernel helper function).
174 Note that applications are not supposed to read this directly.
175
176 For compatibility : if there is a hw tls register, the kernel
177 will put at 0xffff0fe0 the instructions to read it, so
178 as to have old applications calling the kernel helper
179 working properly.
180
181 For having emulated guest TLS working correctly with
182 Valgrind, it is needed to execute the syscall to set
183 the emulated TLS value in addition to the assignment
184 of TPIDRURO.
185
186 Note: the below means that if we need thread local storage
187 for Valgrind host, then there will be a conflict between
188 the need of the guest tls and of the host tls.
189 If all the guest code would cleanly call 0xffff0fe0,
190 then we might maybe intercept this. However, at least
191 __libc_preinit reads directly 0xffff0ff0.
192 */
193 /* ??? might call the below if auxv->u.a_val & VKI_HWCAP_TLS ???
194 Unclear if real hardware having tls hw register sets
195 VKI_HWCAP_TLS. */
196 return VG_(do_syscall1) (__NR_ARM_set_tls, tlsptr);
197 } else {
198 return VG_(mk_SysRes_Success)( 0 );
199 }
200 }
201
202 /* ---------------------------------------------------------------------
203 PRE/POST wrappers for arm/Linux-specific syscalls
204 ------------------------------------------------------------------ */
205
206 #define PRE(name) DEFN_PRE_TEMPLATE(arm_linux, name)
207 #define POST(name) DEFN_POST_TEMPLATE(arm_linux, name)
208
209 /* Add prototypes for the wrappers declared here, so that gcc doesn't
210 harass us for not having prototypes. Really this is a kludge --
211 the right thing to do is to make these wrappers 'static' since they
212 aren't visible outside this file, but that requires even more macro
213 magic. */
214
215 DECL_TEMPLATE(arm_linux, sys_mmap2);
216 DECL_TEMPLATE(arm_linux, sys_stat64);
217 DECL_TEMPLATE(arm_linux, sys_lstat64);
218 DECL_TEMPLATE(arm_linux, sys_fstatat64);
219 DECL_TEMPLATE(arm_linux, sys_fstat64);
220 DECL_TEMPLATE(arm_linux, sys_sigreturn);
221 DECL_TEMPLATE(arm_linux, sys_rt_sigreturn);
222 DECL_TEMPLATE(arm_linux, sys_sigsuspend);
223 DECL_TEMPLATE(arm_linux, sys_set_tls);
224 DECL_TEMPLATE(arm_linux, sys_cacheflush);
225 DECL_TEMPLATE(arm_linux, sys_ptrace);
226
PRE(sys_mmap2)227 PRE(sys_mmap2)
228 {
229 SysRes r;
230
231 // Exactly like old_mmap() except:
232 // - all 6 args are passed in regs, rather than in a memory-block.
233 // - the file offset is specified in pagesize units rather than bytes,
234 // so that it can be used for files bigger than 2^32 bytes.
235 // pagesize or 4K-size units in offset? For ppc32/64-linux, this is
236 // 4K-sized. Assert that the page size is 4K here for safety.
237 vg_assert(VKI_PAGE_SIZE == 4096);
238 PRINT("sys_mmap2 ( %#lx, %lu, %lu, %lu, %lu, %lu )",
239 ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
240 PRE_REG_READ6(long, "mmap2",
241 unsigned long, start, unsigned long, length,
242 unsigned long, prot, unsigned long, flags,
243 unsigned long, fd, unsigned long, offset);
244
245 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
246 4096 * (Off64T)ARG6 );
247 SET_STATUS_from_SysRes(r);
248 }
249
250 // XXX: lstat64/fstat64/stat64 are generic, but not necessarily
251 // applicable to every architecture -- I think only to 32-bit archs.
252 // We're going to need something like linux/core_os32.h for such
253 // things, eventually, I think. --njn
PRE(sys_lstat64)254 PRE(sys_lstat64)
255 {
256 PRINT("sys_lstat64 ( %#lx(%s), %#lx )", ARG1, (HChar*)ARG1, ARG2);
257 PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
258 PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
259 PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
260 }
261
POST(sys_lstat64)262 POST(sys_lstat64)
263 {
264 vg_assert(SUCCESS);
265 if (RES == 0) {
266 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
267 }
268 }
269
PRE(sys_stat64)270 PRE(sys_stat64)
271 {
272 PRINT("sys_stat64 ( %#lx(%s), %#lx )", ARG1, (HChar*)ARG1, ARG2);
273 PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
274 PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
275 PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
276 }
277
POST(sys_stat64)278 POST(sys_stat64)
279 {
280 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
281 }
282
PRE(sys_fstatat64)283 PRE(sys_fstatat64)
284 {
285 PRINT("sys_fstatat64 ( %ld, %#lx(%s), %#lx )",
286 SARG1, ARG2, (HChar*)ARG2, ARG3);
287 PRE_REG_READ3(long, "fstatat64",
288 int, dfd, char *, file_name, struct stat64 *, buf);
289 PRE_MEM_RASCIIZ( "fstatat64(file_name)", ARG2 );
290 PRE_MEM_WRITE( "fstatat64(buf)", ARG3, sizeof(struct vki_stat64) );
291 }
292
POST(sys_fstatat64)293 POST(sys_fstatat64)
294 {
295 POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) );
296 }
297
PRE(sys_fstat64)298 PRE(sys_fstat64)
299 {
300 PRINT("sys_fstat64 ( %lu, %#lx )", ARG1, ARG2);
301 PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
302 PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
303 }
304
POST(sys_fstat64)305 POST(sys_fstat64)
306 {
307 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
308 }
309
PRE(sys_sigreturn)310 PRE(sys_sigreturn)
311 {
312 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
313 an explanation of what follows. */
314
315 PRINT("sys_sigreturn ( )");
316
317 vg_assert(VG_(is_valid_tid)(tid));
318 vg_assert(tid >= 1 && tid < VG_N_THREADS);
319 vg_assert(VG_(is_running_thread)(tid));
320
321 /* Restore register state from frame and remove it */
322 VG_(sigframe_destroy)(tid, False);
323
324 /* Tell the driver not to update the guest state with the "result",
325 and set a bogus result to keep it happy. */
326 *flags |= SfNoWriteResult;
327 SET_STATUS_Success(0);
328
329 /* Check to see if any signals arose as a result of this. */
330 *flags |= SfPollAfter;
331 }
332
PRE(sys_rt_sigreturn)333 PRE(sys_rt_sigreturn)
334 {
335 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
336 an explanation of what follows. */
337
338 PRINT("rt_sigreturn ( )");
339
340 vg_assert(VG_(is_valid_tid)(tid));
341 vg_assert(tid >= 1 && tid < VG_N_THREADS);
342 vg_assert(VG_(is_running_thread)(tid));
343
344 /* Restore register state from frame and remove it */
345 VG_(sigframe_destroy)(tid, True);
346
347 /* Tell the driver not to update the guest state with the "result",
348 and set a bogus result to keep it happy. */
349 *flags |= SfNoWriteResult;
350 SET_STATUS_Success(0);
351
352 /* Check to see if any signals arose as a result of this. */
353 *flags |= SfPollAfter;
354 }
355
356 /* NB: clone of x86-linux version, and ppc32-linux has an almost
357 identical one. */
PRE(sys_sigsuspend)358 PRE(sys_sigsuspend)
359 {
360 /* The C library interface to sigsuspend just takes a pointer to
361 a signal mask but this system call has three arguments - the first
362 two don't appear to be used by the kernel and are always passed as
363 zero by glibc and the third is the first word of the signal mask
364 so only 32 signals are supported.
365
366 In fact glibc normally uses rt_sigsuspend if it is available as
367 that takes a pointer to the signal mask so supports more signals.
368 */
369 *flags |= SfMayBlock;
370 PRINT("sys_sigsuspend ( %ld, %ld, %#lx )", SARG1, SARG2, ARG3 );
371 PRE_REG_READ3(int, "sigsuspend",
372 int, history0, int, history1,
373 vki_old_sigset_t, mask);
374 }
375
376 /* Very much ARM specific */
377
PRE(sys_set_tls)378 PRE(sys_set_tls)
379 {
380 PRINT("set_tls (%lx)",ARG1);
381 PRE_REG_READ1(long, "set_tls", unsigned long, addr);
382
383 SET_STATUS_from_SysRes( sys_set_tls( tid, ARG1 ) );
384 }
385
PRE(sys_cacheflush)386 PRE(sys_cacheflush)
387 {
388 PRINT("cacheflush (%lx, %#lx, %#lx)",ARG1,ARG2,ARG3);
389 PRE_REG_READ3(long, "cacheflush", void*, addrlow,void*, addrhigh,int, flags);
390 VG_(discard_translations)( (Addr)ARG1,
391 ((ULong)ARG2) - ((ULong)ARG1) + 1ULL/*paranoia*/,
392 "PRE(sys_cacheflush)" );
393 SET_STATUS_Success(0);
394 }
395
396 // ARG3 is only used for pointers into the traced process's address
397 // space and for offsets into the traced process's struct
398 // user_regs_struct. It is never a pointer into this process's memory
399 // space, and we should therefore not check anything it points to.
PRE(sys_ptrace)400 PRE(sys_ptrace)
401 {
402 PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", SARG1, SARG2, ARG3, ARG4);
403 PRE_REG_READ4(int, "ptrace",
404 long, request, long, pid, long, addr, long, data);
405 switch (ARG1) {
406 case VKI_PTRACE_PEEKTEXT:
407 case VKI_PTRACE_PEEKDATA:
408 case VKI_PTRACE_PEEKUSR:
409 PRE_MEM_WRITE( "ptrace(peek)", ARG4,
410 sizeof (long));
411 break;
412 case VKI_PTRACE_GETREGS:
413 PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
414 sizeof (struct vki_user_regs_struct));
415 break;
416 case VKI_PTRACE_GETFPREGS:
417 PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
418 sizeof (struct vki_user_fp));
419 break;
420 case VKI_PTRACE_GETWMMXREGS:
421 PRE_MEM_WRITE( "ptrace(getwmmxregs)", ARG4,
422 VKI_IWMMXT_SIZE);
423 break;
424 case VKI_PTRACE_GETCRUNCHREGS:
425 PRE_MEM_WRITE( "ptrace(getcrunchregs)", ARG4,
426 VKI_CRUNCH_SIZE);
427 break;
428 case VKI_PTRACE_GETVFPREGS:
429 PRE_MEM_WRITE( "ptrace(getvfpregs)", ARG4,
430 sizeof (struct vki_user_vfp) );
431 break;
432 case VKI_PTRACE_GETHBPREGS:
433 PRE_MEM_WRITE( "ptrace(gethbpregs)", ARG4,
434 sizeof (unsigned long) );
435 break;
436 case VKI_PTRACE_SETREGS:
437 PRE_MEM_READ( "ptrace(setregs)", ARG4,
438 sizeof (struct vki_user_regs_struct));
439 break;
440 case VKI_PTRACE_SETFPREGS:
441 PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
442 sizeof (struct vki_user_fp));
443 break;
444 case VKI_PTRACE_SETWMMXREGS:
445 PRE_MEM_READ( "ptrace(setwmmxregs)", ARG4,
446 VKI_IWMMXT_SIZE);
447 break;
448 case VKI_PTRACE_SETCRUNCHREGS:
449 PRE_MEM_READ( "ptrace(setcrunchregs)", ARG4,
450 VKI_CRUNCH_SIZE);
451 break;
452 case VKI_PTRACE_SETVFPREGS:
453 PRE_MEM_READ( "ptrace(setvfpregs)", ARG4,
454 sizeof (struct vki_user_vfp));
455 break;
456 case VKI_PTRACE_SETHBPREGS:
457 PRE_MEM_READ( "ptrace(sethbpregs)", ARG4, sizeof(unsigned long));
458 break;
459 case VKI_PTRACE_GET_THREAD_AREA:
460 PRE_MEM_WRITE( "ptrace(get_thread_area)", ARG4, sizeof(unsigned long));
461 break;
462 case VKI_PTRACE_GETEVENTMSG:
463 PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long));
464 break;
465 case VKI_PTRACE_GETSIGINFO:
466 PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t));
467 break;
468 case VKI_PTRACE_SETSIGINFO:
469 PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t));
470 break;
471 case VKI_PTRACE_GETREGSET:
472 ML_(linux_PRE_getregset)(tid, ARG3, ARG4);
473 break;
474 case VKI_PTRACE_SETREGSET:
475 ML_(linux_PRE_setregset)(tid, ARG3, ARG4);
476 break;
477 default:
478 break;
479 }
480 }
481
POST(sys_ptrace)482 POST(sys_ptrace)
483 {
484 switch (ARG1) {
485 case VKI_PTRACE_TRACEME:
486 ML_(linux_POST_traceme)(tid);
487 break;
488 case VKI_PTRACE_PEEKTEXT:
489 case VKI_PTRACE_PEEKDATA:
490 case VKI_PTRACE_PEEKUSR:
491 POST_MEM_WRITE( ARG4, sizeof (long));
492 break;
493 case VKI_PTRACE_GETREGS:
494 POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
495 break;
496 case VKI_PTRACE_GETFPREGS:
497 POST_MEM_WRITE( ARG4, sizeof (struct vki_user_fp));
498 break;
499 case VKI_PTRACE_GETWMMXREGS:
500 POST_MEM_WRITE( ARG4, VKI_IWMMXT_SIZE);
501 break;
502 case VKI_PTRACE_GETCRUNCHREGS:
503 POST_MEM_WRITE( ARG4, VKI_CRUNCH_SIZE);
504 break;
505 case VKI_PTRACE_GETVFPREGS:
506 POST_MEM_WRITE( ARG4, sizeof(struct vki_user_vfp));
507 break;
508 case VKI_PTRACE_GET_THREAD_AREA:
509 case VKI_PTRACE_GETHBPREGS:
510 case VKI_PTRACE_GETEVENTMSG:
511 POST_MEM_WRITE( ARG4, sizeof(unsigned long));
512 break;
513 case VKI_PTRACE_GETSIGINFO:
514 /* XXX: This is a simplification. Different parts of the
515 * siginfo_t are valid depending on the type of signal.
516 */
517 POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t));
518 break;
519 case VKI_PTRACE_GETREGSET:
520 ML_(linux_POST_getregset)(tid, ARG3, ARG4);
521 break;
522 default:
523 break;
524 }
525 }
526
527 #undef PRE
528 #undef POST
529
530 /* ---------------------------------------------------------------------
531 The arm/Linux syscall table
532 ------------------------------------------------------------------ */
533
534 #if 0
535 #define __NR_OABI_SYSCALL_BASE 0x900000
536 #else
537 #define __NR_OABI_SYSCALL_BASE 0x0
538 #endif
539
540 #define PLAX_(sysno, name) WRAPPER_ENTRY_X_(arm_linux, sysno, name)
541 #define PLAXY(sysno, name) WRAPPER_ENTRY_XY(arm_linux, sysno, name)
542
543 // This table maps from __NR_xxx syscall numbers (from
544 // linux/include/asm-arm/unistd.h) to the appropriate PRE/POST sys_foo()
545 // wrappers on arm (as per sys_call_table in linux/arch/arm/kernel/entry.S).
546 //
547 // For those syscalls not handled by Valgrind, the annotation indicate its
548 // arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
549 // (unknown).
550
551 static SyscallTableEntry syscall_main_table[] = {
552 //zz // (restart_syscall) // 0
553 GENX_(__NR_exit, sys_exit), // 1
554 GENX_(__NR_fork, sys_fork), // 2
555 GENXY(__NR_read, sys_read), // 3
556 GENX_(__NR_write, sys_write), // 4
557
558 GENXY(__NR_open, sys_open), // 5
559 GENXY(__NR_close, sys_close), // 6
560 // GENXY(__NR_waitpid, sys_waitpid), // 7
561 GENXY(__NR_creat, sys_creat), // 8
562 GENX_(__NR_link, sys_link), // 9
563
564 GENX_(__NR_unlink, sys_unlink), // 10
565 GENX_(__NR_execve, sys_execve), // 11
566 GENX_(__NR_chdir, sys_chdir), // 12
567 GENXY(__NR_time, sys_time), // 13
568 GENX_(__NR_mknod, sys_mknod), // 14
569
570 GENX_(__NR_chmod, sys_chmod), // 15
571 //zz LINX_(__NR_lchown, sys_lchown16), // 16
572 // GENX_(__NR_break, sys_ni_syscall), // 17
573 //zz // (__NR_oldstat, sys_stat), // 18 (obsolete)
574 LINX_(__NR_lseek, sys_lseek), // 19
575
576 GENX_(__NR_getpid, sys_getpid), // 20
577 LINX_(__NR_mount, sys_mount), // 21
578 LINX_(__NR_umount, sys_oldumount), // 22
579 LINX_(__NR_setuid, sys_setuid16), // 23 ## P
580 LINX_(__NR_getuid, sys_getuid16), // 24 ## P
581 //zz
582 //zz // (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN)
583 PLAXY(__NR_ptrace, sys_ptrace), // 26
584 GENX_(__NR_alarm, sys_alarm), // 27
585 //zz // (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete
586 GENX_(__NR_pause, sys_pause), // 29
587
588 LINX_(__NR_utime, sys_utime), // 30
589 // GENX_(__NR_stty, sys_ni_syscall), // 31
590 // GENX_(__NR_gtty, sys_ni_syscall), // 32
591 GENX_(__NR_access, sys_access), // 33
592 GENX_(__NR_nice, sys_nice), // 34
593
594 // GENX_(__NR_ftime, sys_ni_syscall), // 35
595 GENX_(__NR_sync, sys_sync), // 36
596 GENX_(__NR_kill, sys_kill), // 37
597 GENX_(__NR_rename, sys_rename), // 38
598 GENX_(__NR_mkdir, sys_mkdir), // 39
599
600 GENX_(__NR_rmdir, sys_rmdir), // 40
601 GENXY(__NR_dup, sys_dup), // 41
602 LINXY(__NR_pipe, sys_pipe), // 42
603 GENXY(__NR_times, sys_times), // 43
604 // GENX_(__NR_prof, sys_ni_syscall), // 44
605 //zz
606 GENX_(__NR_brk, sys_brk), // 45
607 LINX_(__NR_setgid, sys_setgid16), // 46
608 LINX_(__NR_getgid, sys_getgid16), // 47
609 //zz // (__NR_signal, sys_signal), // 48 */* (ANSI C)
610 LINX_(__NR_geteuid, sys_geteuid16), // 49
611
612 LINX_(__NR_getegid, sys_getegid16), // 50
613 GENX_(__NR_acct, sys_acct), // 51
614 LINX_(__NR_umount2, sys_umount), // 52
615 // GENX_(__NR_lock, sys_ni_syscall), // 53
616 LINXY(__NR_ioctl, sys_ioctl), // 54
617
618 LINXY(__NR_fcntl, sys_fcntl), // 55
619 // GENX_(__NR_mpx, sys_ni_syscall), // 56
620 GENX_(__NR_setpgid, sys_setpgid), // 57
621 // GENX_(__NR_ulimit, sys_ni_syscall), // 58
622 //zz // (__NR_oldolduname, sys_olduname), // 59 Linux -- obsolete
623 //zz
624 GENX_(__NR_umask, sys_umask), // 60
625 GENX_(__NR_chroot, sys_chroot), // 61
626 //zz // (__NR_ustat, sys_ustat) // 62 SVr4 -- deprecated
627 GENXY(__NR_dup2, sys_dup2), // 63
628 GENX_(__NR_getppid, sys_getppid), // 64
629
630 GENX_(__NR_getpgrp, sys_getpgrp), // 65
631 GENX_(__NR_setsid, sys_setsid), // 66
632 LINXY(__NR_sigaction, sys_sigaction), // 67
633 //zz // (__NR_sgetmask, sys_sgetmask), // 68 */* (ANSI C)
634 //zz // (__NR_ssetmask, sys_ssetmask), // 69 */* (ANSI C)
635 //zz
636 LINX_(__NR_setreuid, sys_setreuid16), // 70
637 LINX_(__NR_setregid, sys_setregid16), // 71
638 PLAX_(__NR_sigsuspend, sys_sigsuspend), // 72
639 LINXY(__NR_sigpending, sys_sigpending), // 73
640 //zz // (__NR_sethostname, sys_sethostname), // 74 */*
641 //zz
642 GENX_(__NR_setrlimit, sys_setrlimit), // 75
643 GENXY(__NR_getrlimit, sys_old_getrlimit), // 76
644 GENXY(__NR_getrusage, sys_getrusage), // 77
645 GENXY(__NR_gettimeofday, sys_gettimeofday), // 78
646 GENX_(__NR_settimeofday, sys_settimeofday), // 79
647
648 LINXY(__NR_getgroups, sys_getgroups16), // 80
649 LINX_(__NR_setgroups, sys_setgroups16), // 81
650 // PLAX_(__NR_select, old_select), // 82
651 GENX_(__NR_symlink, sys_symlink), // 83
652 //zz // (__NR_oldlstat, sys_lstat), // 84 -- obsolete
653 //zz
654 GENX_(__NR_readlink, sys_readlink), // 85
655 //zz // (__NR_uselib, sys_uselib), // 86 */Linux
656 //zz // (__NR_swapon, sys_swapon), // 87 */Linux
657 //zz // (__NR_reboot, sys_reboot), // 88 */Linux
658 //zz // (__NR_readdir, old_readdir), // 89 -- superseded
659 //zz
660 // _____(__NR_mmap, old_mmap), // 90
661 GENXY(__NR_munmap, sys_munmap), // 91
662 GENX_(__NR_truncate, sys_truncate), // 92
663 GENX_(__NR_ftruncate, sys_ftruncate), // 93
664 GENX_(__NR_fchmod, sys_fchmod), // 94
665
666 LINX_(__NR_fchown, sys_fchown16), // 95
667 GENX_(__NR_getpriority, sys_getpriority), // 96
668 GENX_(__NR_setpriority, sys_setpriority), // 97
669 // GENX_(__NR_profil, sys_ni_syscall), // 98
670 GENXY(__NR_statfs, sys_statfs), // 99
671
672 GENXY(__NR_fstatfs, sys_fstatfs), // 100
673 // LINX_(__NR_ioperm, sys_ioperm), // 101
674 LINXY(__NR_socketcall, sys_socketcall), // 102
675 LINXY(__NR_syslog, sys_syslog), // 103
676 GENXY(__NR_setitimer, sys_setitimer), // 104
677
678 GENXY(__NR_getitimer, sys_getitimer), // 105
679 GENXY(__NR_stat, sys_newstat), // 106
680 GENXY(__NR_lstat, sys_newlstat), // 107
681 GENXY(__NR_fstat, sys_newfstat), // 108
682 //zz // (__NR_olduname, sys_uname), // 109 -- obsolete
683 //zz
684 // GENX_(__NR_iopl, sys_iopl), // 110
685 LINX_(__NR_vhangup, sys_vhangup), // 111
686 // GENX_(__NR_idle, sys_ni_syscall), // 112
687 // PLAXY(__NR_vm86old, sys_vm86old), // 113 __NR_syscall... weird
688 GENXY(__NR_wait4, sys_wait4), // 114
689 //zz
690 //zz // (__NR_swapoff, sys_swapoff), // 115 */Linux
691 LINXY(__NR_sysinfo, sys_sysinfo), // 116
692 // _____(__NR_ipc, sys_ipc), // 117
693 GENX_(__NR_fsync, sys_fsync), // 118
694 PLAX_(__NR_sigreturn, sys_sigreturn), // 119 ?/Linux
695
696 LINX_(__NR_clone, sys_clone), // 120
697 //zz // (__NR_setdomainname, sys_setdomainname), // 121 */*(?)
698 GENXY(__NR_uname, sys_newuname), // 122
699 // PLAX_(__NR_modify_ldt, sys_modify_ldt), // 123
700 //zz LINXY(__NR_adjtimex, sys_adjtimex), // 124
701 //zz
702 GENXY(__NR_mprotect, sys_mprotect), // 125
703 LINXY(__NR_sigprocmask, sys_sigprocmask), // 126
704 //zz // Nb: create_module() was removed 2.4-->2.6
705 // GENX_(__NR_create_module, sys_ni_syscall), // 127
706 LINX_(__NR_init_module, sys_init_module), // 128
707 LINX_(__NR_delete_module, sys_delete_module), // 129
708 //zz
709 //zz // Nb: get_kernel_syms() was removed 2.4-->2.6
710 // GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130
711 LINX_(__NR_quotactl, sys_quotactl), // 131
712 GENX_(__NR_getpgid, sys_getpgid), // 132
713 GENX_(__NR_fchdir, sys_fchdir), // 133
714 //zz // (__NR_bdflush, sys_bdflush), // 134 */Linux
715 //zz
716 //zz // (__NR_sysfs, sys_sysfs), // 135 SVr4
717 LINX_(__NR_personality, sys_personality), // 136
718 // GENX_(__NR_afs_syscall, sys_ni_syscall), // 137
719 LINX_(__NR_setfsuid, sys_setfsuid16), // 138
720 LINX_(__NR_setfsgid, sys_setfsgid16), // 139
721
722 LINXY(__NR__llseek, sys_llseek), // 140
723 GENXY(__NR_getdents, sys_getdents), // 141
724 GENX_(__NR__newselect, sys_select), // 142
725 GENX_(__NR_flock, sys_flock), // 143
726 GENX_(__NR_msync, sys_msync), // 144
727
728 GENXY(__NR_readv, sys_readv), // 145
729 GENX_(__NR_writev, sys_writev), // 146
730 GENX_(__NR_getsid, sys_getsid), // 147
731 GENX_(__NR_fdatasync, sys_fdatasync), // 148
732 LINXY(__NR__sysctl, sys_sysctl), // 149
733
734 GENX_(__NR_mlock, sys_mlock), // 150
735 GENX_(__NR_munlock, sys_munlock), // 151
736 GENX_(__NR_mlockall, sys_mlockall), // 152
737 LINX_(__NR_munlockall, sys_munlockall), // 153
738 LINXY(__NR_sched_setparam, sys_sched_setparam), // 154
739
740 LINXY(__NR_sched_getparam, sys_sched_getparam), // 155
741 LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156
742 LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157
743 LINX_(__NR_sched_yield, sys_sched_yield), // 158
744 LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
745
746 LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
747 //zz //LINX?(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 */*
748 GENXY(__NR_nanosleep, sys_nanosleep), // 162
749 GENX_(__NR_mremap, sys_mremap), // 163
750 LINX_(__NR_setresuid, sys_setresuid16), // 164
751
752 LINXY(__NR_getresuid, sys_getresuid16), // 165
753 // PLAXY(__NR_vm86, sys_vm86), // 166 x86/Linux-only
754 // GENX_(__NR_query_module, sys_ni_syscall), // 167
755 GENXY(__NR_poll, sys_poll), // 168
756 //zz // (__NR_nfsservctl, sys_nfsservctl), // 169 */Linux
757 //zz
758 LINX_(__NR_setresgid, sys_setresgid16), // 170
759 LINXY(__NR_getresgid, sys_getresgid16), // 171
760 LINXY(__NR_prctl, sys_prctl), // 172
761 PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 173
762 LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 174
763
764 LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 175
765 LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 176
766 LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait),// 177
767 LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),// 178
768 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 179
769
770 GENXY(__NR_pread64, sys_pread64), // 180
771 GENX_(__NR_pwrite64, sys_pwrite64), // 181
772 LINX_(__NR_chown, sys_chown16), // 182
773 GENXY(__NR_getcwd, sys_getcwd), // 183
774 LINXY(__NR_capget, sys_capget), // 184
775
776 LINX_(__NR_capset, sys_capset), // 185
777 GENXY(__NR_sigaltstack, sys_sigaltstack), // 186
778 LINXY(__NR_sendfile, sys_sendfile), // 187
779 // GENXY(__NR_getpmsg, sys_getpmsg), // 188
780 // GENX_(__NR_putpmsg, sys_putpmsg), // 189
781
782 // Nb: we treat vfork as fork
783 GENX_(__NR_vfork, sys_fork), // 190
784 GENXY(__NR_ugetrlimit, sys_getrlimit), // 191
785 PLAX_(__NR_mmap2, sys_mmap2), // 192
786 GENX_(__NR_truncate64, sys_truncate64), // 193
787 GENX_(__NR_ftruncate64, sys_ftruncate64), // 194
788
789 PLAXY(__NR_stat64, sys_stat64), // 195
790 PLAXY(__NR_lstat64, sys_lstat64), // 196
791 PLAXY(__NR_fstat64, sys_fstat64), // 197
792 GENX_(__NR_lchown32, sys_lchown), // 198
793 GENX_(__NR_getuid32, sys_getuid), // 199
794
795 GENX_(__NR_getgid32, sys_getgid), // 200
796 GENX_(__NR_geteuid32, sys_geteuid), // 201
797 GENX_(__NR_getegid32, sys_getegid), // 202
798 GENX_(__NR_setreuid32, sys_setreuid), // 203
799 GENX_(__NR_setregid32, sys_setregid), // 204
800
801 GENXY(__NR_getgroups32, sys_getgroups), // 205
802 GENX_(__NR_setgroups32, sys_setgroups), // 206
803 GENX_(__NR_fchown32, sys_fchown), // 207
804 LINX_(__NR_setresuid32, sys_setresuid), // 208
805 LINXY(__NR_getresuid32, sys_getresuid), // 209
806
807 LINX_(__NR_setresgid32, sys_setresgid), // 210
808 LINXY(__NR_getresgid32, sys_getresgid), // 211
809 GENX_(__NR_chown32, sys_chown), // 212
810 GENX_(__NR_setuid32, sys_setuid), // 213
811 GENX_(__NR_setgid32, sys_setgid), // 214
812
813 LINX_(__NR_setfsuid32, sys_setfsuid), // 215
814 LINX_(__NR_setfsgid32, sys_setfsgid), // 216
815 LINX_(__NR_pivot_root, sys_pivot_root), // 217
816 GENXY(__NR_mincore, sys_mincore), // 218
817 GENX_(__NR_madvise, sys_madvise), // 219
818
819 GENXY(__NR_getdents64, sys_getdents64), // 220
820 LINXY(__NR_fcntl64, sys_fcntl64), // 221
821 // GENX_(222, sys_ni_syscall), // 222
822 // PLAXY(223, sys_syscall223), // 223 // sys_bproc?
823 LINX_(__NR_gettid, sys_gettid), // 224
824
825 LINX_(__NR_readahead, sys_readahead), // 225 */Linux
826 LINX_(__NR_setxattr, sys_setxattr), // 226
827 LINX_(__NR_lsetxattr, sys_lsetxattr), // 227
828 LINX_(__NR_fsetxattr, sys_fsetxattr), // 228
829 LINXY(__NR_getxattr, sys_getxattr), // 229
830
831 LINXY(__NR_lgetxattr, sys_lgetxattr), // 230
832 LINXY(__NR_fgetxattr, sys_fgetxattr), // 231
833 LINXY(__NR_listxattr, sys_listxattr), // 232
834 LINXY(__NR_llistxattr, sys_llistxattr), // 233
835 LINXY(__NR_flistxattr, sys_flistxattr), // 234
836
837 LINX_(__NR_removexattr, sys_removexattr), // 235
838 LINX_(__NR_lremovexattr, sys_lremovexattr), // 236
839 LINX_(__NR_fremovexattr, sys_fremovexattr), // 237
840 LINXY(__NR_tkill, sys_tkill), // 238 */Linux
841 LINXY(__NR_sendfile64, sys_sendfile64), // 239
842
843 LINXY(__NR_futex, sys_futex), // 240
844 LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 241
845 LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 242
846 // PLAX_(__NR_set_thread_area, sys_set_thread_area), // 243
847 // PLAX_(__NR_get_thread_area, sys_get_thread_area), // 244
848
849 LINXY(__NR_io_setup, sys_io_setup), // 245
850 LINX_(__NR_io_destroy, sys_io_destroy), // 246
851 LINXY(__NR_io_getevents, sys_io_getevents), // 247
852 LINX_(__NR_io_submit, sys_io_submit), // 248
853 LINXY(__NR_io_cancel, sys_io_cancel), // 249
854
855 // LINX_(__NR_fadvise64, sys_fadvise64), // 250 */(Linux?)
856 GENX_(251, sys_ni_syscall), // 251
857 LINX_(__NR_exit_group, sys_exit_group), // 252
858 // GENXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 253
859 LINXY(__NR_epoll_create, sys_epoll_create), // 254
860
861 LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 255
862 LINXY(__NR_epoll_wait, sys_epoll_wait), // 256
863 //zz // (__NR_remap_file_pages, sys_remap_file_pages), // 257 */Linux
864 LINX_(__NR_set_tid_address, sys_set_tid_address), // 258
865 LINXY(__NR_timer_create, sys_timer_create), // 259
866
867 LINXY(__NR_timer_settime, sys_timer_settime), // (timer_create+1)
868 LINXY(__NR_timer_gettime, sys_timer_gettime), // (timer_create+2)
869 LINX_(__NR_timer_getoverrun, sys_timer_getoverrun),//(timer_create+3)
870 LINX_(__NR_timer_delete, sys_timer_delete), // (timer_create+4)
871 LINX_(__NR_clock_settime, sys_clock_settime), // (timer_create+5)
872
873 LINXY(__NR_clock_gettime, sys_clock_gettime), // (timer_create+6)
874 LINXY(__NR_clock_getres, sys_clock_getres), // (timer_create+7)
875 LINXY(__NR_clock_nanosleep, sys_clock_nanosleep),// (timer_create+8) */*
876 GENXY(__NR_statfs64, sys_statfs64), // 268
877 GENXY(__NR_fstatfs64, sys_fstatfs64), // 269
878
879 LINX_(__NR_tgkill, sys_tgkill), // 270 */Linux
880 GENX_(__NR_utimes, sys_utimes), // 271
881 GENX_(__NR_vserver, sys_ni_syscall), // 273
882 LINX_(__NR_mbind, sys_mbind), // 274 ?/?
883
884 LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 275 ?/?
885 LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 276 ?/?
886 LINXY(__NR_mq_open, sys_mq_open), // 277
887 LINX_(__NR_mq_unlink, sys_mq_unlink), // (mq_open+1)
888 LINX_(__NR_mq_timedsend, sys_mq_timedsend), // (mq_open+2)
889
890 LINXY(__NR_mq_timedreceive, sys_mq_timedreceive),// (mq_open+3)
891 LINX_(__NR_mq_notify, sys_mq_notify), // (mq_open+4)
892 LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // (mq_open+5)
893 LINXY(__NR_waitid, sys_waitid), // 280
894
895 LINXY(__NR_socket, sys_socket), // 281
896 LINX_(__NR_bind, sys_bind), // 282
897 LINX_(__NR_connect, sys_connect), // 283
898 LINX_(__NR_listen, sys_listen), // 284
899 LINXY(__NR_accept, sys_accept), // 285
900 LINXY(__NR_getsockname, sys_getsockname), // 286
901 LINXY(__NR_getpeername, sys_getpeername), // 287
902 LINXY(__NR_socketpair, sys_socketpair), // 288
903 LINX_(__NR_send, sys_send),
904 LINX_(__NR_sendto, sys_sendto), // 290
905 LINXY(__NR_recv, sys_recv),
906 LINXY(__NR_recvfrom, sys_recvfrom), // 292
907 LINX_(__NR_shutdown, sys_shutdown), // 293
908 LINX_(__NR_setsockopt, sys_setsockopt), // 294
909 LINXY(__NR_getsockopt, sys_getsockopt), // 295
910 LINX_(__NR_sendmsg, sys_sendmsg), // 296
911 LINXY(__NR_recvmsg, sys_recvmsg), // 297
912 LINX_(__NR_semop, sys_semop), // 298
913 LINX_(__NR_semget, sys_semget), // 299
914 LINXY(__NR_semctl, sys_semctl), // 300
915 LINX_(__NR_msgget, sys_msgget),
916 LINX_(__NR_msgsnd, sys_msgsnd),
917 LINXY(__NR_msgrcv, sys_msgrcv),
918 LINXY(__NR_msgctl, sys_msgctl), // 304
919 LINX_(__NR_semtimedop, sys_semtimedop), // 312
920
921 LINX_(__NR_add_key, sys_add_key), // 286
922 LINX_(__NR_request_key, sys_request_key), // 287
923 LINXY(__NR_keyctl, sys_keyctl), // not 288...
924 // LINX_(__NR_ioprio_set, sys_ioprio_set), // 289
925
926 // LINX_(__NR_ioprio_get, sys_ioprio_get), // 290
927 LINX_(__NR_inotify_init, sys_inotify_init), // 291
928 LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 292
929 LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 293
930 // LINX_(__NR_migrate_pages, sys_migrate_pages), // 294
931
932 LINXY(__NR_openat, sys_openat), // 295
933 LINX_(__NR_mkdirat, sys_mkdirat), // 296
934 LINX_(__NR_mknodat, sys_mknodat), // 297
935 LINX_(__NR_fchownat, sys_fchownat), // 298
936 LINX_(__NR_futimesat, sys_futimesat), // 326 on arm
937
938 PLAXY(__NR_fstatat64, sys_fstatat64), // 300
939 LINX_(__NR_unlinkat, sys_unlinkat), // 301
940 LINX_(__NR_renameat, sys_renameat), // 302
941 LINX_(__NR_linkat, sys_linkat), // 303
942 LINX_(__NR_symlinkat, sys_symlinkat), // 304
943
944 LINX_(__NR_readlinkat, sys_readlinkat), //
945 LINX_(__NR_fchmodat, sys_fchmodat), //
946 LINX_(__NR_faccessat, sys_faccessat), //
947 LINXY(__NR_shmat, sys_shmat), //305
948 LINXY(__NR_shmdt, sys_shmdt), //306
949 LINX_(__NR_shmget, sys_shmget), //307
950 LINXY(__NR_shmctl, sys_shmctl), // 308
951 // LINX_(__NR_pselect6, sys_pselect6), //
952
953 LINX_(__NR_unshare, sys_unshare), // 310
954 LINX_(__NR_set_robust_list, sys_set_robust_list), // 311
955 LINXY(__NR_get_robust_list, sys_get_robust_list), // 312
956 // LINX_(__NR_splice, sys_ni_syscall), // 313
957 // LINX_(__NR_sync_file_range, sys_sync_file_range), // 314
958
959 // LINX_(__NR_tee, sys_ni_syscall), // 315
960 // LINX_(__NR_vmsplice, sys_ni_syscall), // 316
961 LINXY(__NR_move_pages, sys_move_pages), // 317
962 // LINX_(__NR_getcpu, sys_ni_syscall), // 318
963
964 LINX_(__NR_utimensat, sys_utimensat), // 320
965 LINXY(__NR_signalfd, sys_signalfd), // 321
966 LINXY(__NR_timerfd_create, sys_timerfd_create), // 322
967 LINXY(__NR_eventfd, sys_eventfd), // 323
968
969 LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 325
970 LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 326
971
972 ///////////////
973
974 // JRS 2010-Jan-03: I believe that all the numbers listed
975 // in comments in the table prior to this point (eg "// 326",
976 // etc) are bogus since it looks to me like they are copied
977 // verbatim from syswrap-x86-linux.c and they certainly do not
978 // correspond to what's in include/vki/vki-scnums-arm-linux.h.
979 // From here onwards, please ensure the numbers are correct.
980
981 LINX_(__NR_arm_fadvise64_64, sys_fadvise64_64), // 270 */(Linux?)
982
983 LINXY(__NR_pselect6, sys_pselect6), // 335
984 LINXY(__NR_ppoll, sys_ppoll), // 336
985
986 LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 346
987
988 LINX_(__NR_fallocate, sys_fallocate), // 352
989
990 LINXY(__NR_signalfd4, sys_signalfd4), // 355
991 LINXY(__NR_eventfd2, sys_eventfd2), // 356
992 LINXY(__NR_epoll_create1, sys_epoll_create1), // 357
993 LINXY(__NR_dup3, sys_dup3), // 358
994 LINXY(__NR_pipe2, sys_pipe2), // 359
995 LINXY(__NR_inotify_init1, sys_inotify_init1), // 360
996 LINXY(__NR_preadv, sys_preadv), // 361
997 LINX_(__NR_pwritev, sys_pwritev), // 362
998 LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 363
999 LINXY(__NR_perf_event_open, sys_perf_event_open), // 364
1000 LINXY(__NR_recvmmsg, sys_recvmmsg), // 365
1001 LINXY(__NR_accept4, sys_accept4), // 366
1002 LINXY(__NR_fanotify_init, sys_fanotify_init), // 367
1003 LINX_(__NR_fanotify_mark, sys_fanotify_mark), // 368
1004 LINXY(__NR_prlimit64, sys_prlimit64), // 369
1005 LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 370
1006 LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 371
1007 LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 372
1008 LINX_(__NR_syncfs, sys_syncfs), // 373
1009 LINXY(__NR_sendmmsg, sys_sendmmsg), // 374
1010
1011 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 376
1012 LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 377
1013
1014 LINX_(__NR_renameat2, sys_renameat2), // 382
1015
1016 LINXY(__NR_getrandom, sys_getrandom), // 384
1017 LINXY(__NR_memfd_create, sys_memfd_create), // 385
1018
1019 LINXY(__NR_statx, sys_statx), // 397
1020 };
1021
1022
1023 /* These are not in the main table because there indexes are not small
1024 integers, but rather values close to one million. So their
1025 inclusion would force the main table to be huge (about 8 MB). */
1026
1027 static SyscallTableEntry ste___ARM_set_tls
1028 = { WRAPPER_PRE_NAME(arm_linux,sys_set_tls), NULL };
1029
1030 static SyscallTableEntry ste___ARM_cacheflush
1031 = { WRAPPER_PRE_NAME(arm_linux,sys_cacheflush), NULL };
1032
ML_(get_linux_syscall_entry)1033 SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1034 {
1035 const UInt syscall_main_table_size
1036 = sizeof(syscall_main_table) / sizeof(syscall_main_table[0]);
1037
1038 /* Is it in the contiguous initial section of the table? */
1039 if (sysno < syscall_main_table_size) {
1040 SyscallTableEntry* sys = &syscall_main_table[sysno];
1041 if (sys->before == NULL)
1042 return NULL; /* no entry */
1043 else
1044 return sys;
1045 }
1046
1047 /* Check if it's one of the out-of-line entries. */
1048 switch (sysno) {
1049 case __NR_ARM_set_tls: return &ste___ARM_set_tls;
1050 case __NR_ARM_cacheflush: return &ste___ARM_cacheflush;
1051 default: break;
1052 }
1053
1054 /* Can't find a wrapper */
1055 return NULL;
1056 }
1057
1058 #endif // defined(VGP_arm_linux)
1059
1060 /*--------------------------------------------------------------------*/
1061 /*--- end syswrap-arm-linux.c ---*/
1062 /*--------------------------------------------------------------------*/
1063