1
2/*--------------------------------------------------------------------*/
3/*--- Platform-specific syscalls stuff.      syswrap-ppc64-linux.c ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7   This file is part of Valgrind, a dynamic binary instrumentation
8   framework.
9
10   Copyright (C) 2005-2015 Nicholas Nethercote <njn@valgrind.org>
11   Copyright (C) 2005-2015 Cerion Armour-Brown <cerion@open-works.co.uk>
12
13   This program is free software; you can redistribute it and/or
14   modify it under the terms of the GNU General Public License as
15   published by the Free Software Foundation; either version 2 of the
16   License, or (at your option) any later version.
17
18   This program is distributed in the hope that it will be useful, but
19   WITHOUT ANY WARRANTY; without even the implied warranty of
20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21   General Public License for more details.
22
23   You should have received a copy of the GNU General Public License
24   along with this program; if not, write to the Free Software
25   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26   02111-1307, USA.
27
28   The GNU General Public License is contained in the file COPYING.
29*/
30
31#if defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
32
33#include "pub_core_basics.h"
34#include "pub_core_vki.h"
35#include "pub_core_vkiscnums.h"
36#include "pub_core_threadstate.h"
37#include "pub_core_aspacemgr.h"
38#include "pub_core_debuglog.h"
39#include "pub_core_libcbase.h"
40#include "pub_core_libcassert.h"
41#include "pub_core_libcprint.h"
42#include "pub_core_libcproc.h"
43#include "pub_core_libcsignal.h"
44#include "pub_core_options.h"
45#include "pub_core_scheduler.h"
46#include "pub_core_sigframe.h"      // For VG_(sigframe_destroy)()
47#include "pub_core_signals.h"
48#include "pub_core_syscall.h"
49#include "pub_core_syswrap.h"
50#include "pub_core_tooliface.h"
51
52#include "priv_types_n_macros.h"
53#include "priv_syswrap-generic.h"   /* for decls of generic wrappers */
54#include "priv_syswrap-linux.h"     /* for decls of linux-ish wrappers */
55#include "priv_syswrap-main.h"
56
57
58/* ---------------------------------------------------------------------
59   clone() handling
60   ------------------------------------------------------------------ */
61
62/* Call f(arg1), but first switch stacks, using 'stack' as the new
63   stack, and use 'retaddr' as f's return-to address.  Also, clear all
64   the integer registers before entering f.*/
65__attribute__((noreturn))
66void ML_(call_on_new_stack_0_1) ( Addr stack,
67                                  Addr retaddr,
68                                  void (*f_desc)(Word),
69                                  Word arg1 );
70//    r3 = stack
71//    r4 = retaddr
72//    r5 = function descriptor
73//    r6 = arg1
74/* On PPC64, a func ptr is represented by a TOC entry ptr.
75   This TOC entry contains three words; the first word is the function
76   address, the second word is the TOC ptr (r2), and the third word is
77   the static chain value. */
78asm(
79#if defined(VGP_ppc64be_linux)
80"   .align   2\n"
81"   .globl   vgModuleLocal_call_on_new_stack_0_1\n"
82"   .section \".opd\",\"aw\"\n"
83"   .align   3\n"
84"vgModuleLocal_call_on_new_stack_0_1:\n"
85"   .quad    .vgModuleLocal_call_on_new_stack_0_1,.TOC.@tocbase,0\n"
86"   .previous\n"
87"   .type    .vgModuleLocal_call_on_new_stack_0_1,@function\n"
88"   .globl   .vgModuleLocal_call_on_new_stack_0_1\n"
89".vgModuleLocal_call_on_new_stack_0_1:\n"
90"   mr    %r1,%r3\n\t"     // stack to %sp
91"   mtlr  %r4\n\t"         // retaddr to %lr
92"   ld 5,0(5)\n\t"         // load f_ptr from f_desc[0]
93"   mtctr %r5\n\t"         // f_ptr to count reg
94"   mr %r3,%r6\n\t"        // arg1 to %r3
95"   li 0,0\n\t"            // zero all GP regs
96"   li 4,0\n\t"
97"   li 5,0\n\t"
98"   li 6,0\n\t"
99"   li 7,0\n\t"
100"   li 8,0\n\t"
101"   li 9,0\n\t"
102"   li 10,0\n\t"
103"   li 11,0\n\t"
104"   li 12,0\n\t"
105"   li 13,0\n\t"
106"   li 14,0\n\t"
107"   li 15,0\n\t"
108"   li 16,0\n\t"
109"   li 17,0\n\t"
110"   li 18,0\n\t"
111"   li 19,0\n\t"
112"   li 20,0\n\t"
113"   li 21,0\n\t"
114"   li 22,0\n\t"
115"   li 23,0\n\t"
116"   li 24,0\n\t"
117"   li 25,0\n\t"
118"   li 26,0\n\t"
119"   li 27,0\n\t"
120"   li 28,0\n\t"
121"   li 29,0\n\t"
122"   li 30,0\n\t"
123"   li 31,0\n\t"
124"   mtxer 0\n\t"           // CAB: Need this?
125"   mtcr 0\n\t"            // CAB: Need this?
126"   bctr\n\t"              // jump to dst
127"   trap\n"                // should never get here
128#else
129//  ppc64le_linux
130"   .align   2\n"
131"   .globl   vgModuleLocal_call_on_new_stack_0_1\n"
132"vgModuleLocal_call_on_new_stack_0_1:\n"
133"   .type    .vgModuleLocal_call_on_new_stack_0_1,@function\n"
134"#if _CALL_ELF == 2 \n"
135"0: addis        2,12,.TOC.-0b@ha\n"
136"   addi         2,2,.TOC.-0b@l\n"
137"#endif\n"
138".localentry vgModuleLocal_call_on_new_stack_0_1, .-vgModuleLocal_call_on_new_stack_0_1\n"
139"   mr    %r1,%r3\n\t"     // stack to %sp
140"   mtlr  %r4\n\t"         // retaddr to %lr
141"   mtctr %r5\n\t"         // f_ptr to count reg
142"   mr %r3,%r6\n\t"        // arg1 to %r3
143"   li 0,0\n\t"            // zero all GP regs
144"   li 4,0\n\t"
145"   li 5,0\n\t"
146"   li 6,0\n\t"
147"   li 7,0\n\t"
148"   li 8,0\n\t"
149"   li 9,0\n\t"
150"   li 10,0\n\t"
151"   li 11,0\n\t"
152"   li 12,0\n\t"
153"   li 13,0\n\t"
154"   li 14,0\n\t"
155"   li 15,0\n\t"
156"   li 16,0\n\t"
157"   li 17,0\n\t"
158"   li 18,0\n\t"
159"   li 19,0\n\t"
160"   li 20,0\n\t"
161"   li 21,0\n\t"
162"   li 22,0\n\t"
163"   li 23,0\n\t"
164"   li 24,0\n\t"
165"   li 25,0\n\t"
166"   li 26,0\n\t"
167"   li 27,0\n\t"
168"   li 28,0\n\t"
169"   li 29,0\n\t"
170"   li 30,0\n\t"
171"   li 31,0\n\t"
172"   mtxer 0\n\t"           // CAB: Need this?
173"   mtcr 0\n\t"            // CAB: Need this?
174"   bctr\n\t"              // jump to dst
175"   trap\n"                // should never get here
176#endif
177);
178
179
180/*
181        Perform a clone system call.  clone is strange because it has
182        fork()-like return-twice semantics, so it needs special
183        handling here.
184
185        Upon entry, we have:
186
187            word (fn)(void*)    in r3
188            void* child_stack   in r4
189            word flags          in r5
190            void* arg           in r6
191            pid_t* child_tid    in r7
192            pid_t* parent_tid   in r8
193            void* ???           in r9
194
195        Note: r3 contains fn desc ptr, not fn ptr -- p_fn = p_fn_desc[0]
196        System call requires:
197
198            int    $__NR_clone  in r0  (sc number)
199            int    flags        in r3  (sc arg1)
200            void*  child_stack  in r4  (sc arg2)
201            pid_t* parent_tid   in r5  (sc arg3)
202            ??     child_tls    in r6  (sc arg4)
203            pid_t* child_tid    in r7  (sc arg5)
204            void*  ???          in r8  (sc arg6)
205
206        Returns a ULong encoded as: top half is %cr following syscall,
207        low half is syscall return value (r3).
208 */
209#define __NR_CLONE        VG_STRINGIFY(__NR_clone)
210#define __NR_EXIT         VG_STRINGIFY(__NR_exit)
211
212extern
213ULong do_syscall_clone_ppc64_linux ( Word (*fn)(void *),
214                                     void* stack,
215                                     Int   flags,
216                                     void* arg,
217                                     Int*  child_tid,
218                                     Int*  parent_tid,
219                                     void/*vki_modify_ldt_t*/ * );
220asm(
221#if defined(VGP_ppc64be_linux)
222"   .align   2\n"
223"   .globl   do_syscall_clone_ppc64_linux\n"
224"   .section \".opd\",\"aw\"\n"
225"   .align   3\n"
226"do_syscall_clone_ppc64_linux:\n"
227"   .quad    .do_syscall_clone_ppc64_linux,.TOC.@tocbase,0\n"
228"   .previous\n"
229"   .type    .do_syscall_clone_ppc64_linux,@function\n"
230"   .globl   .do_syscall_clone_ppc64_linux\n"
231".do_syscall_clone_ppc64_linux:\n"
232"       stdu    1,-64(1)\n"
233"       std     29,40(1)\n"
234"       std     30,48(1)\n"
235"       std     31,56(1)\n"
236"       mr      30,3\n"              // preserve fn
237"       mr      31,6\n"              // preserve arg
238
239        // setup child stack
240"       rldicr  4,4, 0,59\n"         // trim sp to multiple of 16 bytes
241                                     // (r4 &= ~0xF)
242"       li      0,0\n"
243"       stdu    0,-32(4)\n"          // make initial stack frame
244"       mr      29,4\n"              // preserve sp
245
246        // setup syscall
247"       li      0,"__NR_CLONE"\n"    // syscall number
248"       mr      3,5\n"               // syscall arg1: flags
249        // r4 already setup          // syscall arg2: child_stack
250"       mr      5,8\n"               // syscall arg3: parent_tid
251"       mr      6,13\n"              // syscall arg4: REAL THREAD tls
252"       mr      7,7\n"               // syscall arg5: child_tid
253"       mr      8,8\n"               // syscall arg6: ????
254"       mr      9,9\n"               // syscall arg7: ????
255
256"       sc\n"                        // clone()
257
258"       mfcr    4\n"                 // CR now in low half r4
259"       sldi    4,4,32\n"            // CR now in hi half r4
260
261"       sldi    3,3,32\n"
262"       srdi    3,3,32\n"            // zero out hi half r3
263
264"       or      3,3,4\n"             // r3 = CR : syscall-retval
265"       cmpwi   3,0\n"               // child if retval == 0 (note, cmpw)
266"       bne     1f\n"                // jump if !child
267
268        /* CHILD - call thread function */
269        /* Note: 2.4 kernel doesn't set the child stack pointer,
270           so we do it here.
271           That does leave a small window for a signal to be delivered
272           on the wrong stack, unfortunately. */
273"       mr      1,29\n"
274"       ld      30, 0(30)\n"         // convert fn desc ptr to fn ptr
275"       mtctr   30\n"                // ctr reg = fn
276"       mr      3,31\n"              // r3 = arg
277"       bctrl\n"                     // call fn()
278
279        // exit with result
280"       li      0,"__NR_EXIT"\n"
281"       sc\n"
282
283        // Exit returned?!
284"       .long   0\n"
285
286        // PARENT or ERROR - return
287"1:     ld      29,40(1)\n"
288"       ld      30,48(1)\n"
289"       ld      31,56(1)\n"
290"       addi    1,1,64\n"
291"       blr\n"
292#else
293"   .align   2\n"
294"   .globl   do_syscall_clone_ppc64_linux\n"
295"   .type    do_syscall_clone_ppc64_linux,@function\n"
296"do_syscall_clone_ppc64_linux:\n"
297"   .globl   .do_syscall_clone_ppc64_linux\n"
298".do_syscall_clone_ppc64_linux:\n"
299"#if _CALL_ELF == 2 \n"
300"0:     addis        2,12,.TOC.-0b@ha \n"
301"       addi         2,2,.TOC.-0b@l \n"
302"#endif \n"
303"   .localentry  do_syscall_clone_ppc64_linux, .-do_syscall_clone_ppc64_linux \n"
304"       stdu    1,-64(1)\n"
305"       std     29,40(1)\n"
306"       std     30,48(1)\n"
307"       std     31,56(1)\n"
308"       mr      30,3\n"              // preserve fn
309"       mr      31,6\n"              // preserve arg
310
311        // setup child stack
312"       rldicr  4,4, 0,59\n"         // trim sp to multiple of 16 bytes
313                                     // (r4 &= ~0xF)
314"       li      0,0\n"
315"       stdu    0,-32(4)\n"          // make initial stack frame
316"       mr      29,4\n"              // preserve sp
317
318        // setup syscall
319"       li      0,"__NR_CLONE"\n"    // syscall number
320"       mr      3,5\n"               // syscall arg1: flags
321        // r4 already setup          // syscall arg2: child_stack
322"       mr      5,8\n"               // syscall arg3: parent_tid
323"       mr      6,13\n"              // syscall arg4: REAL THREAD tls
324"       mr      7,7\n"               // syscall arg5: child_tid
325"       mr      8,8\n"               // syscall arg6: ????
326"       mr      9,9\n"               // syscall arg7: ????
327
328"       sc\n"                        // clone()
329
330"       mfcr    4\n"                 // CR now in low half r4
331"       sldi    4,4,32\n"            // CR now in hi half r4
332
333"       sldi    3,3,32\n"
334"       srdi    3,3,32\n"            // zero out hi half r3
335
336"       or      3,3,4\n"             // r3 = CR : syscall-retval
337"       cmpwi   3,0\n"               // child if retval == 0 (note, cmpw)
338"       bne     1f\n"                // jump if !child
339
340        /* CHILD - call thread function */
341        /* Note: 2.4 kernel doesn't set the child stack pointer,
342           so we do it here.
343           That does leave a small window for a signal to be delivered
344           on the wrong stack, unfortunately. */
345"       mr      1,29\n"
346"       mtctr   30\n"                // ctr reg = fn
347"       mr      3,31\n"              // r3 = arg
348"       bctrl\n"                     // call fn()
349
350        // exit with result
351"       li      0,"__NR_EXIT"\n"
352"       sc\n"
353
354        // Exit returned?!
355"       .long   0\n"
356
357        // PARENT or ERROR - return
358"1:     ld      29,40(1)\n"
359"       ld      30,48(1)\n"
360"       ld      31,56(1)\n"
361"       addi    1,1,64\n"
362"       blr\n"
363#endif
364);
365
366#undef __NR_CLONE
367#undef __NR_EXIT
368
369// forward declarations
370static void setup_child ( ThreadArchState*, ThreadArchState* );
371
372/*
373   When a client clones, we need to keep track of the new thread.  This means:
374   1. allocate a ThreadId+ThreadState+stack for the thread
375
376   2. initialize the thread's new VCPU state
377
378   3. create the thread using the same args as the client requested,
379   but using the scheduler entrypoint for IP, and a separate stack
380   for SP.
381 */
382static SysRes do_clone ( ThreadId ptid,
383                         UInt flags, Addr sp,
384                         Int *parent_tidptr,
385                         Int *child_tidptr,
386                         Addr child_tls)
387{
388   const Bool debug = False;
389
390   ThreadId     ctid = VG_(alloc_ThreadState)();
391   ThreadState* ptst = VG_(get_ThreadState)(ptid);
392   ThreadState* ctst = VG_(get_ThreadState)(ctid);
393   ULong        word64;
394   UWord*       stack;
395   SysRes       res;
396   vki_sigset_t blockall, savedmask;
397
398   VG_(sigfillset)(&blockall);
399
400   vg_assert(VG_(is_running_thread)(ptid));
401   vg_assert(VG_(is_valid_tid)(ctid));
402
403   stack = (UWord*)ML_(allocstack)(ctid);
404   if (stack == NULL) {
405      res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
406      goto out;
407   }
408
409//?   /* make a stack frame */
410//?   stack -= 16;
411//?   *(UWord *)stack = 0;
412
413
414   /* Copy register state
415
416      Both parent and child return to the same place, and the code
417      following the clone syscall works out which is which, so we
418      don't need to worry about it.
419
420      The parent gets the child's new tid returned from clone, but the
421      child gets 0.
422
423      If the clone call specifies a NULL SP for the new thread, then
424      it actually gets a copy of the parent's SP.
425
426      The child's TLS register (r2) gets set to the tlsaddr argument
427      if the CLONE_SETTLS flag is set.
428   */
429   setup_child( &ctst->arch, &ptst->arch );
430
431   /* Make sys_clone appear to have returned Success(0) in the
432      child. */
433   { UInt old_cr = LibVEX_GuestPPC64_get_CR( &ctst->arch.vex );
434     /* %r3 = 0 */
435     ctst->arch.vex.guest_GPR3 = 0;
436     /* %cr0.so = 0 */
437     LibVEX_GuestPPC64_put_CR( old_cr & ~(1<<28), &ctst->arch.vex );
438   }
439
440   if (sp != 0)
441      ctst->arch.vex.guest_GPR1 = sp;
442
443   ctst->os_state.parent = ptid;
444
445   /* inherit signal mask */
446   ctst->sig_mask = ptst->sig_mask;
447   ctst->tmp_sig_mask = ptst->sig_mask;
448
449   /* Start the child with its threadgroup being the same as the
450      parent's.  This is so that any exit_group calls that happen
451      after the child is created but before it sets its
452      os_state.threadgroup field for real (in thread_wrapper in
453      syswrap-linux.c), really kill the new thread.  a.k.a this avoids
454      a race condition in which the thread is unkillable (via
455      exit_group) because its threadgroup is not set.  The race window
456      is probably only a few hundred or a few thousand cycles long.
457      See #226116. */
458   ctst->os_state.threadgroup = ptst->os_state.threadgroup;
459
460   ML_(guess_and_register_stack) (sp, ctst);
461
462   /* Assume the clone will succeed, and tell any tool that wants to
463      know that this thread has come into existence.  If the clone
464      fails, we'll send out a ll_exit notification for it at the out:
465      label below, to clean up. */
466   vg_assert(VG_(owns_BigLock_LL)(ptid));
467   VG_TRACK ( pre_thread_ll_create, ptid, ctid );
468
469   if (flags & VKI_CLONE_SETTLS) {
470      if (debug)
471         VG_(printf)("clone child has SETTLS: tls at %#lx\n", child_tls);
472      ctst->arch.vex.guest_GPR13 = child_tls;
473   }
474
475   flags &= ~VKI_CLONE_SETTLS;
476
477   /* start the thread with everything blocked */
478   VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
479
480   /* Create the new thread */
481   word64 = do_syscall_clone_ppc64_linux(
482               ML_(start_thread_NORETURN),
483               stack, flags, &VG_(threads)[ctid],
484               child_tidptr, parent_tidptr, NULL
485            );
486
487   /* Low half word64 is syscall return value.  Hi half is
488      the entire CR, from which we need to extract CR0.SO. */
489   /* VG_(printf)("word64 = 0x%llx\n", word64); */
490   res = VG_(mk_SysRes_ppc64_linux)(
491            /*val*/(UInt)(word64 & 0xFFFFFFFFULL),
492            /*errflag*/ (UInt)((word64 >> (32+28)) & 1)
493         );
494
495   VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
496
497  out:
498   if (sr_isError(res)) {
499      /* clone failed */
500      VG_(cleanup_thread)(&ctst->arch);
501      ctst->status = VgTs_Empty;
502      /* oops.  Better tell the tool the thread exited in a hurry :-) */
503      VG_TRACK( pre_thread_ll_exit, ctid );
504   }
505
506   return res;
507}
508
509
510
511/* ---------------------------------------------------------------------
512   More thread stuff
513   ------------------------------------------------------------------ */
514
515void VG_(cleanup_thread) ( ThreadArchState* arch )
516{
517}
518
519void setup_child ( /*OUT*/ ThreadArchState *child,
520                   /*IN*/  ThreadArchState *parent )
521{
522   /* We inherit our parent's guest state. */
523   child->vex = parent->vex;
524   child->vex_shadow1 = parent->vex_shadow1;
525   child->vex_shadow2 = parent->vex_shadow2;
526}
527
528
529/* ---------------------------------------------------------------------
530   PRE/POST wrappers for ppc64/Linux-specific syscalls
531   ------------------------------------------------------------------ */
532
533#define PRE(name)       DEFN_PRE_TEMPLATE(ppc64_linux, name)
534#define POST(name)      DEFN_POST_TEMPLATE(ppc64_linux, name)
535
536/* Add prototypes for the wrappers declared here, so that gcc doesn't
537   harass us for not having prototypes.  Really this is a kludge --
538   the right thing to do is to make these wrappers 'static' since they
539   aren't visible outside this file, but that requires even more macro
540   magic. */
541
542DECL_TEMPLATE(ppc64_linux, sys_mmap);
543//zz DECL_TEMPLATE(ppc64_linux, sys_mmap2);
544//zz DECL_TEMPLATE(ppc64_linux, sys_stat64);
545//zz DECL_TEMPLATE(ppc64_linux, sys_lstat64);
546//zz DECL_TEMPLATE(ppc64_linux, sys_fstat64);
547DECL_TEMPLATE(ppc64_linux, sys_clone);
548//zz DECL_TEMPLATE(ppc64_linux, sys_sigreturn);
549DECL_TEMPLATE(ppc64_linux, sys_rt_sigreturn);
550DECL_TEMPLATE(ppc64_linux, sys_fadvise64);
551
552PRE(sys_mmap)
553{
554   SysRes r;
555
556   PRINT("sys_mmap ( %#lx, %lu, %lu, %lu, %lu, %lu )",
557         ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
558   PRE_REG_READ6(long, "mmap",
559                 unsigned long, start, unsigned long, length,
560                 unsigned long, prot,  unsigned long, flags,
561                 unsigned long, fd,    unsigned long, offset);
562
563   r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
564                                       (Off64T)ARG6 );
565   SET_STATUS_from_SysRes(r);
566}
567
568//zz PRE(sys_mmap2)
569//zz {
570//zz    SysRes r;
571//zz
572//zz    // Exactly like old_mmap() except:
573//zz    //  - the file offset is specified in 4K units rather than bytes,
574//zz    //    so that it can be used for files bigger than 2^32 bytes.
575//zz    PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )",
576//zz          ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
577//zz    PRE_REG_READ6(long, "mmap2",
578//zz                  unsigned long, start, unsigned long, length,
579//zz                  unsigned long, prot,  unsigned long, flags,
580//zz                  unsigned long, fd,    unsigned long, offset);
581//zz
582//zz    r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
583//zz                                        4096 * (Off64T)ARG6 );
584//zz    SET_STATUS_from_SysRes(r);
585//zz }
586//zz
587//zz // XXX: lstat64/fstat64/stat64 are generic, but not necessarily
588//zz // applicable to every architecture -- I think only to 32-bit archs.
589//zz // We're going to need something like linux/core_os32.h for such
590//zz // things, eventually, I think.  --njn
591//zz PRE(sys_stat64)
592//zz {
593//zz    PRINT("sys_stat64 ( %p, %p )",ARG1,ARG2);
594//zz    PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
595//zz    PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
596//zz    PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
597//zz }
598//zz
599//zz POST(sys_stat64)
600//zz {
601//zz    POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
602//zz }
603//zz
604//zz PRE(sys_lstat64)
605//zz {
606//zz    PRINT("sys_lstat64 ( %p(%s), %p )",ARG1,ARG1,ARG2);
607//zz    PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
608//zz    PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
609//zz    PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
610//zz }
611//zz
612//zz POST(sys_lstat64)
613//zz {
614//zz    vg_assert(SUCCESS);
615//zz    if (RES == 0) {
616//zz       POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
617//zz    }
618//zz }
619//zz
620//zz PRE(sys_fstat64)
621//zz {
622//zz   PRINT("sys_fstat64 ( %d, %p )",ARG1,ARG2);
623//zz   PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
624//zz   PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
625//zz }
626//zz
627//zz POST(sys_fstat64)
628//zz {
629//zz   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
630//zz }
631
632
633PRE(sys_clone)
634{
635   UInt cloneflags;
636
637   PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
638   PRE_REG_READ5(int, "clone",
639                 unsigned long, flags,
640                 void *,        child_stack,
641                 int *,         parent_tidptr,
642                 void *,        child_tls,
643                 int *,         child_tidptr);
644
645   if (ARG1 & VKI_CLONE_PARENT_SETTID) {
646      PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
647      if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
648                                             VKI_PROT_WRITE)) {
649         SET_STATUS_Failure( VKI_EFAULT );
650         return;
651      }
652   }
653   if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
654      PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
655      if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int),
656                                             VKI_PROT_WRITE)) {
657         SET_STATUS_Failure( VKI_EFAULT );
658         return;
659      }
660   }
661
662   cloneflags = ARG1;
663
664   if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
665      SET_STATUS_Failure( VKI_EINVAL );
666      return;
667   }
668
669   /* Only look at the flags we really care about */
670   switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
671                         | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
672   case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
673      /* thread creation */
674      SET_STATUS_from_SysRes(
675         do_clone(tid,
676                  ARG1,         /* flags */
677                  (Addr)ARG2,   /* child SP */
678                  (Int *)ARG3,  /* parent_tidptr */
679                  (Int *)ARG5,  /* child_tidptr */
680                  (Addr)ARG4)); /* child_tls */
681      break;
682
683   case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
684      /* FALLTHROUGH - assume vfork == fork */
685      cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
686
687   case 0: /* plain fork */
688      SET_STATUS_from_SysRes(
689         ML_(do_fork_clone)(tid,
690                       cloneflags,      /* flags */
691                       (Int *)ARG3,     /* parent_tidptr */
692                       (Int *)ARG5));   /* child_tidptr */
693      break;
694
695   default:
696      /* should we just ENOSYS? */
697      VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx\n", ARG1);
698      VG_(message)(Vg_UserMsg, "\n");
699      VG_(message)(Vg_UserMsg, "The only supported clone() uses are:\n");
700      VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)\n");
701      VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork\n");
702      VG_(unimplemented)
703         ("Valgrind does not support general clone().");
704   }
705
706   if (SUCCESS) {
707      if (ARG1 & VKI_CLONE_PARENT_SETTID)
708         POST_MEM_WRITE(ARG3, sizeof(Int));
709      if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
710         POST_MEM_WRITE(ARG5, sizeof(Int));
711
712      /* Thread creation was successful; let the child have the chance
713         to run */
714      *flags |= SfYieldAfter;
715   }
716}
717
718PRE(sys_fadvise64)
719{
720   PRINT("sys_fadvise64 ( %ld, %ld, %lu, %ld )",  SARG1, SARG2, SARG3, SARG4);
721   PRE_REG_READ4(long, "fadvise64",
722                 int, fd, vki_loff_t, offset, vki_size_t, len, int, advice);
723}
724
725PRE(sys_rt_sigreturn)
726{
727   /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
728      an explanation of what follows. */
729
730   //ThreadState* tst;
731   PRINT("sys_rt_sigreturn ( )");
732
733   vg_assert(VG_(is_valid_tid)(tid));
734   vg_assert(tid >= 1 && tid < VG_N_THREADS);
735   vg_assert(VG_(is_running_thread)(tid));
736
737   ///* Adjust esp to point to start of frame; skip back up over handler
738   //   ret addr */
739   //tst = VG_(get_ThreadState)(tid);
740   //tst->arch.vex.guest_ESP -= sizeof(Addr);
741   // Should we do something equivalent on ppc64-linux?  Who knows.
742
743   ///* This is only so that the EIP is (might be) useful to report if
744   //   something goes wrong in the sigreturn */
745   //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
746   // Should we do something equivalent on ppc64?  Who knows.
747
748   /* Restore register state from frame and remove it */
749   VG_(sigframe_destroy)(tid, True);
750
751   /* Tell the driver not to update the guest state with the "result",
752      and set a bogus result to keep it happy. */
753   *flags |= SfNoWriteResult;
754   SET_STATUS_Success(0);
755
756   /* Check to see if any signals arose as a result of this. */
757   *flags |= SfPollAfter;
758}
759
760#undef PRE
761#undef POST
762
763/* ---------------------------------------------------------------------
764   The ppc64/Linux syscall table
765   ------------------------------------------------------------------ */
766
767/* Add an ppc64-linux specific wrapper to a syscall table. */
768#define PLAX_(sysno, name)    WRAPPER_ENTRY_X_(ppc64_linux, sysno, name)
769#define PLAXY(sysno, name)    WRAPPER_ENTRY_XY(ppc64_linux, sysno, name)
770
771// This table maps from __NR_xxx syscall numbers (from
772// linux/include/asm-ppc/unistd.h) to the appropriate PRE/POST sys_foo()
773// wrappers on ppc64 (as per sys_call_table in linux/arch/ppc/kernel/entry.S).
774//
775// For those syscalls not handled by Valgrind, the annotation indicate its
776// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
777// (unknown).
778
779static SyscallTableEntry syscall_table[] = {
780// _____(__NR_restart_syscall,   sys_restart_syscall),    //   0
781   GENX_(__NR_exit,              sys_exit),               //   1
782   GENX_(__NR_fork,              sys_fork),               //   2
783   GENXY(__NR_read,              sys_read),               //   3
784   GENX_(__NR_write,             sys_write),              //   4
785
786   GENXY(__NR_open,              sys_open),               //   5
787   GENXY(__NR_close,             sys_close),              //   6
788   GENXY(__NR_waitpid,           sys_waitpid),            //   7
789   GENXY(__NR_creat,             sys_creat),              //   8
790   GENX_(__NR_link,              sys_link),               //   9
791
792   GENX_(__NR_unlink,            sys_unlink),             //  10
793   GENX_(__NR_execve,            sys_execve),             //  11
794   GENX_(__NR_chdir,             sys_chdir),              //  12
795   GENXY(__NR_time,              sys_time),               //  13
796   GENX_(__NR_mknod,             sys_mknod),              //  14
797
798   GENX_(__NR_chmod,             sys_chmod),              //  15
799   GENX_(__NR_lchown,            sys_lchown),             //  16
800// _____(__NR_break,             sys_break),              //  17
801// _____(__NR_oldstat,           sys_oldstat),            //  18
802   LINX_(__NR_lseek,             sys_lseek),              //  19
803
804   GENX_(__NR_getpid,            sys_getpid),             //  20
805   LINX_(__NR_mount,             sys_mount),              //  21
806// _____(__NR_umount,            sys_umount),             //  22
807   GENX_(__NR_setuid,            sys_setuid),             //  23
808   GENX_(__NR_getuid,            sys_getuid),             //  24
809
810// _____(__NR_stime,             sys_stime),              //  25
811// When ptrace is supported, memcheck/tests/linux/getregset should be enabled
812// _____(__NR_ptrace,            sys_ptrace),             //  26
813   GENX_(__NR_alarm,             sys_alarm),              //  27
814// _____(__NR_oldfstat,          sys_oldfstat),           //  28
815   GENX_(__NR_pause,             sys_pause),              //  29
816
817   LINX_(__NR_utime,             sys_utime),              //  30
818// _____(__NR_stty,              sys_stty),               //  31
819// _____(__NR_gtty,              sys_gtty),               //  32
820   GENX_(__NR_access,            sys_access),             //  33
821// _____(__NR_nice,              sys_nice),               //  34
822
823// _____(__NR_ftime,             sys_ftime),              //  35
824// _____(__NR_sync,              sys_sync),               //  36
825   GENX_(__NR_kill,              sys_kill),               //  37
826   GENX_(__NR_rename,            sys_rename),             //  38
827   GENX_(__NR_mkdir,             sys_mkdir),              //  39
828
829   GENX_(__NR_rmdir,             sys_rmdir),              //  40
830   GENXY(__NR_dup,               sys_dup),                //  41
831   LINXY(__NR_pipe,              sys_pipe),               //  42
832   GENXY(__NR_times,             sys_times),              //  43
833// _____(__NR_prof,              sys_prof),               //  44
834
835   GENX_(__NR_brk,               sys_brk),                //  45
836   GENX_(__NR_setgid,            sys_setgid),             //  46
837   GENX_(__NR_getgid,            sys_getgid),             //  47
838// _____(__NR_signal,            sys_signal),             //  48
839   GENX_(__NR_geteuid,           sys_geteuid),            //  49
840
841   GENX_(__NR_getegid,           sys_getegid),            //  50
842// _____(__NR_acct,              sys_acct),               //  51
843   LINX_(__NR_umount2,           sys_umount),             //  52
844// _____(__NR_lock,              sys_lock),               //  53
845   LINXY(__NR_ioctl,             sys_ioctl),              //  54
846
847   LINXY(__NR_fcntl,             sys_fcntl),              //  55
848// _____(__NR_mpx,               sys_mpx),                //  56
849   GENX_(__NR_setpgid,           sys_setpgid),            //  57
850// _____(__NR_ulimit,            sys_ulimit),             //  58
851// _____(__NR_oldolduname,       sys_oldolduname),        //  59
852
853   GENX_(__NR_umask,             sys_umask),              //  60
854   GENX_(__NR_chroot,            sys_chroot),             //  61
855// _____(__NR_ustat,             sys_ustat),              //  62
856   GENXY(__NR_dup2,              sys_dup2),               //  63
857   GENX_(__NR_getppid,           sys_getppid),            //  64
858
859   GENX_(__NR_getpgrp,           sys_getpgrp),            //  65
860   GENX_(__NR_setsid,            sys_setsid),             //  66
861// _____(__NR_sigaction,         sys_sigaction),          //  67
862// _____(__NR_sgetmask,          sys_sgetmask),           //  68
863// _____(__NR_ssetmask,          sys_ssetmask),           //  69
864
865   GENX_(__NR_setreuid,          sys_setreuid),           //  70
866   GENX_(__NR_setregid,          sys_setregid),           //  71
867// _____(__NR_sigsuspend,        sys_sigsuspend),         //  72
868// _____(__NR_sigpending,        sys_sigpending),         //  73
869// _____(__NR_sethostname,       sys_sethostname),        //  74
870
871   GENX_(__NR_setrlimit,         sys_setrlimit),          //  75
872// _____(__NR_getrlimit,         sys_getrlimit),          //  76
873   GENXY(__NR_getrusage,         sys_getrusage),          //  77
874   GENXY(__NR_gettimeofday,      sys_gettimeofday),       //  78
875// _____(__NR_settimeofday,      sys_settimeofday),       //  79
876
877   GENXY(__NR_getgroups,         sys_getgroups),          //  80
878   GENX_(__NR_setgroups,         sys_setgroups),          //  81
879// _____(__NR_select,            sys_select),             //  82
880   GENX_(__NR_symlink,           sys_symlink),            //  83
881// _____(__NR_oldlstat,          sys_oldlstat),           //  84
882
883   GENX_(__NR_readlink,          sys_readlink),           //  85
884// _____(__NR_uselib,            sys_uselib),             //  86
885// _____(__NR_swapon,            sys_swapon),             //  87
886// _____(__NR_reboot,            sys_reboot),             //  88
887// _____(__NR_readdir,           sys_readdir),            //  89
888
889   PLAX_(__NR_mmap,              sys_mmap),               //  90
890   GENXY(__NR_munmap,            sys_munmap),             //  91
891   GENX_(__NR_truncate,          sys_truncate),           //  92
892   GENX_(__NR_ftruncate,         sys_ftruncate),          //  93
893   GENX_(__NR_fchmod,            sys_fchmod),             //  94
894
895   GENX_(__NR_fchown,            sys_fchown),             //  95
896   GENX_(__NR_getpriority,       sys_getpriority),        //  96
897   GENX_(__NR_setpriority,       sys_setpriority),        //  97
898// _____(__NR_profil,            sys_profil),             //  98
899   GENXY(__NR_statfs,            sys_statfs),             //  99
900
901   GENXY(__NR_fstatfs,           sys_fstatfs),            // 100
902// _____(__NR_ioperm,            sys_ioperm),             // 101
903   LINXY(__NR_socketcall,        sys_socketcall),         // 102
904   LINXY(__NR_syslog,            sys_syslog),             // 103
905   GENXY(__NR_setitimer,         sys_setitimer),          // 104
906
907   GENXY(__NR_getitimer,         sys_getitimer),          // 105
908   GENXY(__NR_stat,              sys_newstat),            // 106
909   GENXY(__NR_lstat,             sys_newlstat),           // 107
910   GENXY(__NR_fstat,             sys_newfstat),           // 108
911// _____(__NR_olduname,          sys_olduname),           // 109
912
913// _____(__NR_iopl,              sys_iopl),               // 110
914   LINX_(__NR_vhangup,           sys_vhangup),            // 111
915// _____(__NR_idle,              sys_idle),               // 112
916// _____(__NR_vm86,              sys_vm86),               // 113
917   GENXY(__NR_wait4,             sys_wait4),              // 114
918
919// _____(__NR_swapoff,           sys_swapoff),            // 115
920   LINXY(__NR_sysinfo,           sys_sysinfo),            // 116
921   LINXY(__NR_ipc,               sys_ipc),                // 117
922   GENX_(__NR_fsync,             sys_fsync),              // 118
923// _____(__NR_sigreturn,         sys_sigreturn),          // 119
924
925   PLAX_(__NR_clone,             sys_clone),              // 120
926// _____(__NR_setdomainname,     sys_setdomainname),      // 121
927   GENXY(__NR_uname,             sys_newuname),           // 122
928// _____(__NR_modify_ldt,        sys_modify_ldt),         // 123
929   LINXY(__NR_adjtimex,          sys_adjtimex),           // 124
930
931   GENXY(__NR_mprotect,          sys_mprotect),           // 125
932// _____(__NR_sigprocmask,       sys_sigprocmask),        // 126
933   GENX_(__NR_create_module,     sys_ni_syscall),         // 127
934   LINX_(__NR_init_module,       sys_init_module),        // 128
935   LINX_(__NR_delete_module,     sys_delete_module),      // 129
936
937// _____(__NR_get_kernel_syms,   sys_get_kernel_syms),    // 130
938// _____(__NR_quotactl,          sys_quotactl),           // 131
939   GENX_(__NR_getpgid,           sys_getpgid),            // 132
940   GENX_(__NR_fchdir,            sys_fchdir),             // 133
941// _____(__NR_bdflush,           sys_bdflush),            // 134
942
943// _____(__NR_sysfs,             sys_sysfs),              // 135
944   LINX_(__NR_personality,       sys_personality),        // 136
945// _____(__NR_afs_syscall,       sys_afs_syscall),        // 137
946   LINX_(__NR_setfsuid,          sys_setfsuid),           // 138
947   LINX_(__NR_setfsgid,          sys_setfsgid),           // 139
948
949   LINXY(__NR__llseek,           sys_llseek),             // 140
950   GENXY(__NR_getdents,          sys_getdents),           // 141
951   GENX_(__NR__newselect,        sys_select),             // 142
952   GENX_(__NR_flock,             sys_flock),              // 143
953   GENX_(__NR_msync,             sys_msync),              // 144
954
955   GENXY(__NR_readv,             sys_readv),              // 145
956   GENX_(__NR_writev,            sys_writev),             // 146
957// _____(__NR_getsid,            sys_getsid),             // 147
958   GENX_(__NR_fdatasync,         sys_fdatasync),          // 148
959   LINXY(__NR__sysctl,           sys_sysctl),             // 149
960
961   GENX_(__NR_mlock,             sys_mlock),              // 150
962   GENX_(__NR_munlock,           sys_munlock),            // 151
963   GENX_(__NR_mlockall,          sys_mlockall),           // 152
964   LINX_(__NR_munlockall,        sys_munlockall),         // 153
965   LINXY(__NR_sched_setparam,    sys_sched_setparam),     // 154
966
967   LINXY(__NR_sched_getparam,         sys_sched_getparam),        // 155
968   LINX_(__NR_sched_setscheduler,     sys_sched_setscheduler),    // 156
969   LINX_(__NR_sched_getscheduler,     sys_sched_getscheduler),    // 157
970   LINX_(__NR_sched_yield,            sys_sched_yield),           // 158
971   LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
972
973   LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
974   LINXY(__NR_sched_rr_get_interval,  sys_sched_rr_get_interval), // 161
975   GENXY(__NR_nanosleep,         sys_nanosleep),          // 162
976   GENX_(__NR_mremap,            sys_mremap),             // 163
977   LINX_(__NR_setresuid,         sys_setresuid),          // 164
978
979   LINXY(__NR_getresuid,         sys_getresuid),          // 165
980// _____(__NR_query_module,      sys_query_module),       // 166
981   GENXY(__NR_poll,              sys_poll),               // 167
982// _____(__NR_nfsservctl,        sys_nfsservctl),         // 168
983   LINX_(__NR_setresgid,         sys_setresgid),          // 169
984
985   LINXY(__NR_getresgid,         sys_getresgid),          // 170
986   LINXY(__NR_prctl,             sys_prctl),              // 171
987   PLAX_(__NR_rt_sigreturn,      sys_rt_sigreturn),       // 172
988   LINXY(__NR_rt_sigaction,      sys_rt_sigaction),       // 173
989   LINXY(__NR_rt_sigprocmask,    sys_rt_sigprocmask),     // 174
990
991   LINXY(__NR_rt_sigpending,     sys_rt_sigpending),      // 175
992   LINXY(__NR_rt_sigtimedwait,   sys_rt_sigtimedwait),    // 176
993   LINXY(__NR_rt_sigqueueinfo,   sys_rt_sigqueueinfo),    // 177
994   LINX_(__NR_rt_sigsuspend,     sys_rt_sigsuspend),      // 178
995   GENXY(__NR_pread64,           sys_pread64),            // 179
996
997   GENX_(__NR_pwrite64,          sys_pwrite64),           // 180
998   GENX_(__NR_chown,             sys_chown),              // 181
999   GENXY(__NR_getcwd,            sys_getcwd),             // 182
1000   LINXY(__NR_capget,            sys_capget),             // 183
1001   LINX_(__NR_capset,            sys_capset),             // 184
1002
1003   GENXY(__NR_sigaltstack,       sys_sigaltstack),        // 185
1004   LINXY(__NR_sendfile,          sys_sendfile),           // 186
1005// _____(__NR_getpmsg,           sys_getpmsg),            // 187
1006// _____(__NR_putpmsg,           sys_putpmsg),            // 188
1007   GENX_(__NR_vfork,             sys_fork),               // 189 treat as fork
1008
1009   GENXY(__NR_ugetrlimit,        sys_getrlimit),          // 190
1010   LINX_(__NR_readahead,         sys_readahead),          // 191
1011// /* #define __NR_mmap2           192     32bit only */
1012// /* #define __NR_truncate64      193     32bit only */
1013// /* #define __NR_ftruncate64     194     32bit only */
1014
1015// /* #define __NR_stat64          195     32bit only */
1016// /* #define __NR_lstat64         196     32bit only */
1017// /* #define __NR_fstat64         197     32bit only */
1018// _____(__NR_pciconfig_read,    sys_pciconfig_read),     // 198
1019// _____(__NR_pciconfig_write,   sys_pciconfig_write),    // 199
1020
1021// _____(__NR_pciconfig_iobase,  sys_pciconfig_iobase),   // 200
1022// _____(__NR_multiplexer,       sys_multiplexer),        // 201
1023   GENXY(__NR_getdents64,        sys_getdents64),         // 202
1024   LINX_(__NR_pivot_root,        sys_pivot_root),         // 203
1025   LINXY(__NR_fcntl64,           sys_fcntl64),            // 204 !!!!?? 32bit only */
1026
1027   GENX_(__NR_madvise,           sys_madvise),            // 205
1028// _____(__NR_mincore,           sys_mincore),            // 206
1029   LINX_(__NR_gettid,            sys_gettid),             // 207
1030// _____(__NR_tkill,             sys_tkill),              // 208
1031   LINX_(__NR_setxattr,          sys_setxattr),           // 209
1032
1033   LINX_(__NR_lsetxattr,         sys_lsetxattr),          // 210
1034   LINX_(__NR_fsetxattr,         sys_fsetxattr),          // 211
1035   LINXY(__NR_getxattr,          sys_getxattr),           // 212
1036   LINXY(__NR_lgetxattr,         sys_lgetxattr),          // 213
1037   LINXY(__NR_fgetxattr,         sys_fgetxattr),          // 214
1038   LINXY(__NR_listxattr,         sys_listxattr),          // 215
1039   LINXY(__NR_llistxattr,        sys_llistxattr),         // 216
1040   LINXY(__NR_flistxattr,        sys_flistxattr),         // 217
1041   LINX_(__NR_removexattr,       sys_removexattr),        // 218
1042   LINX_(__NR_lremovexattr,      sys_lremovexattr),       // 219
1043   LINX_(__NR_fremovexattr,      sys_fremovexattr),       // 220
1044
1045   LINXY(__NR_futex,             sys_futex),              // 221
1046   LINX_(__NR_sched_setaffinity, sys_sched_setaffinity),  // 222
1047   LINXY(__NR_sched_getaffinity, sys_sched_getaffinity),  // 223
1048// /* 224 currently unused */
1049
1050// _____(__NR_tuxcall,           sys_tuxcall),            // 225
1051// /* #define __NR_sendfile64      226     32bit only */
1052   LINX_(__NR_io_setup,          sys_io_setup),           // 227
1053   LINX_(__NR_io_destroy,        sys_io_destroy),         // 228
1054   LINXY(__NR_io_getevents,      sys_io_getevents),       // 229
1055   LINX_(__NR_io_submit,         sys_io_submit),          // 230
1056   LINXY(__NR_io_cancel,         sys_io_cancel),          // 231
1057   LINX_(__NR_set_tid_address,   sys_set_tid_address),    // 232
1058   PLAX_(__NR_fadvise64,         sys_fadvise64),          // 233
1059   LINX_(__NR_exit_group,        sys_exit_group),         // 234
1060
1061// _____(__NR_lookup_dcookie,    sys_lookup_dcookie),     // 235
1062   LINXY(__NR_epoll_create,      sys_epoll_create),       // 236
1063   LINX_(__NR_epoll_ctl,         sys_epoll_ctl),          // 237
1064   LINXY(__NR_epoll_wait,        sys_epoll_wait),         // 238
1065// _____(__NR_remap_file_pages,  sys_remap_file_pages),   // 239
1066
1067   LINXY(__NR_timer_create,      sys_timer_create),       // 240
1068   LINXY(__NR_timer_settime,     sys_timer_settime),      // 241
1069   LINXY(__NR_timer_gettime,     sys_timer_gettime),      // 242
1070   LINX_(__NR_timer_getoverrun,  sys_timer_getoverrun),   // 243
1071   LINX_(__NR_timer_delete,      sys_timer_delete),       // 244
1072   LINX_(__NR_clock_settime,     sys_clock_settime),      // 245
1073   LINXY(__NR_clock_gettime,     sys_clock_gettime),      // 246
1074   LINXY(__NR_clock_getres,      sys_clock_getres),       // 247
1075   LINXY(__NR_clock_nanosleep,   sys_clock_nanosleep),    // 248
1076
1077// _____(__NR_swapcontext,       sys_swapcontext),        // 249
1078
1079   LINXY(__NR_tgkill,            sys_tgkill),             // 250
1080// _____(__NR_utimes,            sys_utimes),             // 251
1081// _____(__NR_statfs64,          sys_statfs64),           // 252
1082// _____(__NR_fstatfs64,         sys_fstatfs64),          // 253
1083// /* #define __NR_fadvise64_64    254     32bit only */
1084
1085// _____(__NR_rtas,              sys_rtas),               // 255
1086// /* Number 256 is reserved for sys_debug_setcontext */
1087// /* Number 257 is reserved for vserver */
1088// /* 258 currently unused */
1089   LINX_(__NR_mbind,             sys_mbind),              // 259
1090
1091   LINXY(__NR_get_mempolicy,     sys_get_mempolicy),      // 260
1092   LINX_(__NR_set_mempolicy,     sys_set_mempolicy),      // 261
1093   LINXY(__NR_mq_open,           sys_mq_open),            // 262
1094   LINX_(__NR_mq_unlink,         sys_mq_unlink),          // 263
1095   LINX_(__NR_mq_timedsend,      sys_mq_timedsend),       // 264
1096
1097   LINXY(__NR_mq_timedreceive,   sys_mq_timedreceive),    // 265
1098   LINX_(__NR_mq_notify,         sys_mq_notify),          // 266
1099   LINXY(__NR_mq_getsetattr,     sys_mq_getsetattr),      // 267
1100// _____(__NR_kexec_load,        sys_kexec_load),         // 268
1101   LINX_(__NR_add_key,           sys_add_key),            // 269
1102
1103   LINX_(__NR_request_key,       sys_request_key),        // 270
1104   LINXY(__NR_keyctl,            sys_keyctl),             // 271
1105// _____(__NR_waitid,            sys_waitid),             // 272
1106   LINX_(__NR_ioprio_set,        sys_ioprio_set),         // 273
1107   LINX_(__NR_ioprio_get,        sys_ioprio_get),         // 274
1108
1109   LINX_(__NR_inotify_init,  sys_inotify_init),           // 275
1110   LINX_(__NR_inotify_add_watch,  sys_inotify_add_watch), // 276
1111   LINX_(__NR_inotify_rm_watch,   sys_inotify_rm_watch),  // 277
1112
1113   LINX_(__NR_pselect6,          sys_pselect6),           // 280
1114   LINXY(__NR_ppoll,             sys_ppoll),              // 281
1115
1116   LINXY(__NR_openat,            sys_openat),             // 286
1117   LINX_(__NR_mkdirat,           sys_mkdirat),            // 287
1118   LINX_(__NR_mknodat,           sys_mknodat),            // 288
1119   LINX_(__NR_fchownat,          sys_fchownat),           // 289
1120   LINX_(__NR_futimesat,         sys_futimesat),          // 290
1121   LINXY(__NR_newfstatat,        sys_newfstatat),         // 291
1122   LINX_(__NR_unlinkat,          sys_unlinkat),           // 292
1123   LINX_(__NR_renameat,          sys_renameat),           // 293
1124   LINX_(__NR_linkat,            sys_linkat),             // 294
1125   LINX_(__NR_symlinkat,         sys_symlinkat),          // 295
1126   LINX_(__NR_readlinkat,        sys_readlinkat),         // 296
1127   LINX_(__NR_fchmodat,          sys_fchmodat),           // 297
1128   LINX_(__NR_faccessat,         sys_faccessat),          // 298
1129   LINX_(__NR_set_robust_list,   sys_set_robust_list),    // 299
1130   LINXY(__NR_get_robust_list,   sys_get_robust_list),    // 300
1131   LINXY(__NR_move_pages,        sys_move_pages),        // 301
1132   LINXY(__NR_getcpu,            sys_getcpu),            // 302
1133   LINXY(__NR_epoll_pwait,       sys_epoll_pwait),       // 303
1134   LINX_(__NR_utimensat,         sys_utimensat),         // 304
1135   LINXY(__NR_signalfd,          sys_signalfd),          // 305
1136   LINXY(__NR_timerfd_create,    sys_timerfd_create),    // 306
1137   LINXY(__NR_eventfd,           sys_eventfd),           // 307
1138   LINX_(__NR_sync_file_range2,  sys_sync_file_range2),  // 308
1139   LINX_(__NR_fallocate,         sys_fallocate),         // 309
1140//   LINXY(__NR_subpage_prot,       sys_ni_syscall),       // 310
1141   LINXY(__NR_timerfd_settime,   sys_timerfd_settime),  // 311
1142   LINXY(__NR_timerfd_gettime,   sys_timerfd_gettime),  // 312
1143   LINXY(__NR_signalfd4,         sys_signalfd4),        // 313
1144   LINXY(__NR_eventfd2,          sys_eventfd2),         // 314
1145   LINXY(__NR_epoll_create1,     sys_epoll_create1),    // 315
1146   LINXY(__NR_dup3,              sys_dup3),             // 316
1147   LINXY(__NR_pipe2,             sys_pipe2),            // 317
1148   LINXY(__NR_inotify_init1,     sys_inotify_init1),    // 318
1149   LINXY(__NR_perf_event_open,   sys_perf_event_open),  // 319
1150   LINXY(__NR_preadv,            sys_preadv),           // 320
1151   LINX_(__NR_pwritev,           sys_pwritev),          // 321
1152   LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 322
1153
1154   LINXY(__NR_recvmmsg,          sys_recvmmsg),         // 343
1155   LINXY(__NR_accept4,           sys_accept4),          // 344
1156
1157   LINXY(__NR_clock_adjtime,     sys_clock_adjtime),    // 347
1158   LINX_(__NR_syncfs,            sys_syncfs),           // 348
1159   LINXY(__NR_sendmmsg,          sys_sendmmsg),         // 349
1160
1161   LINXY(__NR_process_vm_readv,  sys_process_vm_readv), // 351
1162   LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 352
1163
1164   LINXY(__NR_getrandom,         sys_getrandom),        // 359
1165   LINXY(__NR_memfd_create,      sys_memfd_create)      // 360
1166};
1167
1168SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1169{
1170   const UInt syscall_table_size
1171      = sizeof(syscall_table) / sizeof(syscall_table[0]);
1172
1173   /* Is it in the contiguous initial section of the table? */
1174   if (sysno < syscall_table_size) {
1175      SyscallTableEntry* sys = &syscall_table[sysno];
1176      if (sys->before == NULL)
1177         return NULL; /* no entry */
1178      else
1179         return sys;
1180   }
1181
1182   /* Can't find a wrapper */
1183   return NULL;
1184}
1185
1186#endif // defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
1187
1188/*--------------------------------------------------------------------*/
1189/*--- end                                                          ---*/
1190/*--------------------------------------------------------------------*/
1191