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