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)) 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,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. 106asm( 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 144static 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 152void 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*/ 160static 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 215DECL_TEMPLATE(arm_linux, sys_mmap2); 216DECL_TEMPLATE(arm_linux, sys_stat64); 217DECL_TEMPLATE(arm_linux, sys_lstat64); 218DECL_TEMPLATE(arm_linux, sys_fstatat64); 219DECL_TEMPLATE(arm_linux, sys_fstat64); 220DECL_TEMPLATE(arm_linux, sys_sigreturn); 221DECL_TEMPLATE(arm_linux, sys_rt_sigreturn); 222DECL_TEMPLATE(arm_linux, sys_sigsuspend); 223DECL_TEMPLATE(arm_linux, sys_set_tls); 224DECL_TEMPLATE(arm_linux, sys_cacheflush); 225DECL_TEMPLATE(arm_linux, sys_ptrace); 226 227PRE(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 254PRE(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 262POST(sys_lstat64) 263{ 264 vg_assert(SUCCESS); 265 if (RES == 0) { 266 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 267 } 268} 269 270PRE(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 278POST(sys_stat64) 279{ 280 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 281} 282 283PRE(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 293POST(sys_fstatat64) 294{ 295 POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) ); 296} 297 298PRE(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 305POST(sys_fstat64) 306{ 307 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 308} 309 310PRE(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 333PRE(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. */ 358PRE(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 378PRE(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 386PRE(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. 400PRE(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 482POST(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 551static 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 1020 1021/* These are not in the main table because there indexes are not small 1022 integers, but rather values close to one million. So their 1023 inclusion would force the main table to be huge (about 8 MB). */ 1024 1025static SyscallTableEntry ste___ARM_set_tls 1026 = { WRAPPER_PRE_NAME(arm_linux,sys_set_tls), NULL }; 1027 1028static SyscallTableEntry ste___ARM_cacheflush 1029 = { WRAPPER_PRE_NAME(arm_linux,sys_cacheflush), NULL }; 1030 1031SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) 1032{ 1033 const UInt syscall_main_table_size 1034 = sizeof(syscall_main_table) / sizeof(syscall_main_table[0]); 1035 1036 /* Is it in the contiguous initial section of the table? */ 1037 if (sysno < syscall_main_table_size) { 1038 SyscallTableEntry* sys = &syscall_main_table[sysno]; 1039 if (sys->before == NULL) 1040 return NULL; /* no entry */ 1041 else 1042 return sys; 1043 } 1044 1045 /* Check if it's one of the out-of-line entries. */ 1046 switch (sysno) { 1047 case __NR_ARM_set_tls: return &ste___ARM_set_tls; 1048 case __NR_ARM_cacheflush: return &ste___ARM_cacheflush; 1049 default: break; 1050 } 1051 1052 /* Can't find a wrapper */ 1053 return NULL; 1054} 1055 1056#endif // defined(VGP_arm_linux) 1057 1058/*--------------------------------------------------------------------*/ 1059/*--- end syswrap-arm-linux.c ---*/ 1060/*--------------------------------------------------------------------*/ 1061