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