• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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-2010 Nicholas Nethercote <njn@valgrind.org>
11    Copyright (C) 2005-2010 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_ppc64_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 #include "pub_core_stacks.h"        // VG_(register_stack)
52 
53 #include "priv_types_n_macros.h"
54 #include "priv_syswrap-generic.h"   /* for decls of generic wrappers */
55 #include "priv_syswrap-linux.h"     /* for decls of linux-ish wrappers */
56 #include "priv_syswrap-main.h"
57 
58 
59 /* ---------------------------------------------------------------------
60    clone() handling
61    ------------------------------------------------------------------ */
62 
63 /* Call f(arg1), but first switch stacks, using 'stack' as the new
64    stack, and use 'retaddr' as f's return-to address.  Also, clear all
65    the integer registers before entering f.*/
66 __attribute__((noreturn))
67 void ML_(call_on_new_stack_0_1) ( Addr stack,
68                                   Addr retaddr,
69                                   void (*f_desc)(Word),
70                                   Word arg1 );
71 //    r3 = stack
72 //    r4 = retaddr
73 //    r5 = function descriptor
74 //    r6 = arg1
75 /* On PPC64, a func ptr is represented by a TOC entry ptr.
76    This TOC entry contains three words; the first word is the function
77    address, the second word is the TOC ptr (r2), and the third word is
78    the static chain value. */
79 asm(
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 );
129 
130 
131 /*
132         Perform a clone system call.  clone is strange because it has
133         fork()-like return-twice semantics, so it needs special
134         handling here.
135 
136         Upon entry, we have:
137 
138             word (fn)(void*)    in r3
139             void* child_stack   in r4
140             word flags          in r5
141             void* arg           in r6
142             pid_t* child_tid    in r7
143             pid_t* parent_tid   in r8
144             void* ???           in r9
145 
146         Note: r3 contains fn desc ptr, not fn ptr -- p_fn = p_fn_desc[0]
147         System call requires:
148 
149             int    $__NR_clone  in r0  (sc number)
150             int    flags        in r3  (sc arg1)
151             void*  child_stack  in r4  (sc arg2)
152             pid_t* parent_tid   in r5  (sc arg3)
153             ??     child_tls    in r6  (sc arg4)
154             pid_t* child_tid    in r7  (sc arg5)
155             void*  ???          in r8  (sc arg6)
156 
157         Returns a ULong encoded as: top half is %cr following syscall,
158         low half is syscall return value (r3).
159  */
160 #define __NR_CLONE        VG_STRINGIFY(__NR_clone)
161 #define __NR_EXIT         VG_STRINGIFY(__NR_exit)
162 
163 extern
164 ULong do_syscall_clone_ppc64_linux ( Word (*fn)(void *),
165                                      void* stack,
166                                      Int   flags,
167                                      void* arg,
168                                      Int*  child_tid,
169                                      Int*  parent_tid,
170                                      void/*vki_modify_ldt_t*/ * );
171 asm(
172 "   .align   2\n"
173 "   .globl   do_syscall_clone_ppc64_linux\n"
174 "   .section \".opd\",\"aw\"\n"
175 "   .align   3\n"
176 "do_syscall_clone_ppc64_linux:\n"
177 "   .quad    .do_syscall_clone_ppc64_linux,.TOC.@tocbase,0\n"
178 "   .previous\n"
179 "   .type    .do_syscall_clone_ppc64_linux,@function\n"
180 "   .globl   .do_syscall_clone_ppc64_linux\n"
181 ".do_syscall_clone_ppc64_linux:\n"
182 "       stdu    1,-64(1)\n"
183 "       std     29,40(1)\n"
184 "       std     30,48(1)\n"
185 "       std     31,56(1)\n"
186 "       mr      30,3\n"              // preserve fn
187 "       mr      31,6\n"              // preserve arg
188 
189         // setup child stack
190 "       rldicr  4,4, 0,59\n"         // trim sp to multiple of 16 bytes
191                                      // (r4 &= ~0xF)
192 "       li      0,0\n"
193 "       stdu    0,-32(4)\n"          // make initial stack frame
194 "       mr      29,4\n"              // preserve sp
195 
196         // setup syscall
197 "       li      0,"__NR_CLONE"\n"    // syscall number
198 "       mr      3,5\n"               // syscall arg1: flags
199         // r4 already setup          // syscall arg2: child_stack
200 "       mr      5,8\n"               // syscall arg3: parent_tid
201 "       mr      6,13\n"              // syscall arg4: REAL THREAD tls
202 "       mr      7,7\n"               // syscall arg5: child_tid
203 "       mr      8,8\n"               // syscall arg6: ????
204 "       mr      9,9\n"               // syscall arg7: ????
205 
206 "       sc\n"                        // clone()
207 
208 "       mfcr    4\n"                 // CR now in low half r4
209 "       sldi    4,4,32\n"            // CR now in hi half r4
210 
211 "       sldi    3,3,32\n"
212 "       srdi    3,3,32\n"            // zero out hi half r3
213 
214 "       or      3,3,4\n"             // r3 = CR : syscall-retval
215 "       cmpwi   3,0\n"               // child if retval == 0 (note, cmpw)
216 "       bne     1f\n"                // jump if !child
217 
218         /* CHILD - call thread function */
219         /* Note: 2.4 kernel doesn't set the child stack pointer,
220            so we do it here.
221            That does leave a small window for a signal to be delivered
222            on the wrong stack, unfortunately. */
223 "       mr      1,29\n"
224 "       ld      30, 0(30)\n"         // convert fn desc ptr to fn ptr
225 "       mtctr   30\n"                // ctr reg = fn
226 "       mr      3,31\n"              // r3 = arg
227 "       bctrl\n"                     // call fn()
228 
229         // exit with result
230 "       li      0,"__NR_EXIT"\n"
231 "       sc\n"
232 
233         // Exit returned?!
234 "       .long   0\n"
235 
236         // PARENT or ERROR - return
237 "1:     ld      29,40(1)\n"
238 "       ld      30,48(1)\n"
239 "       ld      31,56(1)\n"
240 "       addi    1,1,64\n"
241 "       blr\n"
242 );
243 
244 #undef __NR_CLONE
245 #undef __NR_EXIT
246 
247 // forward declarations
248 static void setup_child ( ThreadArchState*, ThreadArchState* );
249 
250 /*
251    When a client clones, we need to keep track of the new thread.  This means:
252    1. allocate a ThreadId+ThreadState+stack for the the thread
253 
254    2. initialize the thread's new VCPU state
255 
256    3. create the thread using the same args as the client requested,
257    but using the scheduler entrypoint for IP, and a separate stack
258    for SP.
259  */
do_clone(ThreadId ptid,UInt flags,Addr sp,Int * parent_tidptr,Int * child_tidptr,Addr child_tls)260 static SysRes do_clone ( ThreadId ptid,
261                          UInt flags, Addr sp,
262                          Int *parent_tidptr,
263                          Int *child_tidptr,
264                          Addr child_tls)
265 {
266    const Bool debug = False;
267 
268    ThreadId     ctid = VG_(alloc_ThreadState)();
269    ThreadState* ptst = VG_(get_ThreadState)(ptid);
270    ThreadState* ctst = VG_(get_ThreadState)(ctid);
271    ULong        word64;
272    UWord*       stack;
273    NSegment const* seg;
274    SysRes       res;
275    vki_sigset_t blockall, savedmask;
276 
277    VG_(sigfillset)(&blockall);
278 
279    vg_assert(VG_(is_running_thread)(ptid));
280    vg_assert(VG_(is_valid_tid)(ctid));
281 
282    stack = (UWord*)ML_(allocstack)(ctid);
283    if (stack == NULL) {
284       res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
285       goto out;
286    }
287 
288 //?   /* make a stack frame */
289 //?   stack -= 16;
290 //?   *(UWord *)stack = 0;
291 
292 
293    /* Copy register state
294 
295       Both parent and child return to the same place, and the code
296       following the clone syscall works out which is which, so we
297       don't need to worry about it.
298 
299       The parent gets the child's new tid returned from clone, but the
300       child gets 0.
301 
302       If the clone call specifies a NULL SP for the new thread, then
303       it actually gets a copy of the parent's SP.
304 
305       The child's TLS register (r2) gets set to the tlsaddr argument
306       if the CLONE_SETTLS flag is set.
307    */
308    setup_child( &ctst->arch, &ptst->arch );
309 
310    /* Make sys_clone appear to have returned Success(0) in the
311       child. */
312    { UInt old_cr = LibVEX_GuestPPC64_get_CR( &ctst->arch.vex );
313      /* %r3 = 0 */
314      ctst->arch.vex.guest_GPR3 = 0;
315      /* %cr0.so = 0 */
316      LibVEX_GuestPPC64_put_CR( old_cr & ~(1<<28), &ctst->arch.vex );
317    }
318 
319    if (sp != 0)
320       ctst->arch.vex.guest_GPR1 = sp;
321 
322    ctst->os_state.parent = ptid;
323 
324    /* inherit signal mask */
325    ctst->sig_mask = ptst->sig_mask;
326    ctst->tmp_sig_mask = ptst->sig_mask;
327 
328    /* Start the child with its threadgroup being the same as the
329       parent's.  This is so that any exit_group calls that happen
330       after the child is created but before it sets its
331       os_state.threadgroup field for real (in thread_wrapper in
332       syswrap-linux.c), really kill the new thread.  a.k.a this avoids
333       a race condition in which the thread is unkillable (via
334       exit_group) because its threadgroup is not set.  The race window
335       is probably only a few hundred or a few thousand cycles long.
336       See #226116. */
337    ctst->os_state.threadgroup = ptst->os_state.threadgroup;
338 
339    /* We don't really know where the client stack is, because its
340       allocated by the client.  The best we can do is look at the
341       memory mappings and try to derive some useful information.  We
342       assume that esp starts near its highest possible value, and can
343       only go down to the start of the mmaped segment. */
344    seg = VG_(am_find_nsegment)(sp);
345    if (seg && seg->kind != SkResvn) {
346       ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp);
347       ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
348 
349       VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
350 
351       if (debug)
352 	 VG_(printf)("\ntid %d: guessed client stack range %#lx-%#lx\n",
353 		     ctid, seg->start, VG_PGROUNDUP(sp));
354    } else {
355       VG_(message)(Vg_UserMsg,
356                    "!? New thread %d starts with R1(%#lx) unmapped\n",
357 		   ctid, sp);
358       ctst->client_stack_szB  = 0;
359    }
360 
361    /* Assume the clone will succeed, and tell any tool that wants to
362       know that this thread has come into existence.  If the clone
363       fails, we'll send out a ll_exit notification for it at the out:
364       label below, to clean up. */
365    VG_TRACK ( pre_thread_ll_create, ptid, ctid );
366 
367    if (flags & VKI_CLONE_SETTLS) {
368       if (debug)
369          VG_(printf)("clone child has SETTLS: tls at %#lx\n", child_tls);
370       ctst->arch.vex.guest_GPR13 = child_tls;
371    }
372 
373    flags &= ~VKI_CLONE_SETTLS;
374 
375    /* start the thread with everything blocked */
376    VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
377 
378    /* Create the new thread */
379    word64 = do_syscall_clone_ppc64_linux(
380                ML_(start_thread_NORETURN),
381                stack, flags, &VG_(threads)[ctid],
382                child_tidptr, parent_tidptr, NULL
383             );
384 
385    /* Low half word64 is syscall return value.  Hi half is
386       the entire CR, from which we need to extract CR0.SO. */
387    /* VG_(printf)("word64 = 0x%llx\n", word64); */
388    res = VG_(mk_SysRes_ppc64_linux)(
389             /*val*/(UInt)(word64 & 0xFFFFFFFFULL),
390             /*errflag*/ (UInt)((word64 >> (32+28)) & 1)
391          );
392 
393    VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
394 
395   out:
396    if (sr_isError(res)) {
397       /* clone failed */
398       VG_(cleanup_thread)(&ctst->arch);
399       ctst->status = VgTs_Empty;
400       /* oops.  Better tell the tool the thread exited in a hurry :-) */
401       VG_TRACK( pre_thread_ll_exit, ctid );
402    }
403 
404    return res;
405 }
406 
407 
408 
409 /* ---------------------------------------------------------------------
410    More thread stuff
411    ------------------------------------------------------------------ */
412 
VG_(cleanup_thread)413 void VG_(cleanup_thread) ( ThreadArchState* arch )
414 {
415 }
416 
setup_child(ThreadArchState * child,ThreadArchState * parent)417 void setup_child ( /*OUT*/ ThreadArchState *child,
418                    /*IN*/  ThreadArchState *parent )
419 {
420    /* We inherit our parent's guest state. */
421    child->vex = parent->vex;
422    child->vex_shadow1 = parent->vex_shadow1;
423    child->vex_shadow2 = parent->vex_shadow2;
424 }
425 
426 
427 /* ---------------------------------------------------------------------
428    PRE/POST wrappers for ppc64/Linux-specific syscalls
429    ------------------------------------------------------------------ */
430 
431 #define PRE(name)       DEFN_PRE_TEMPLATE(ppc64_linux, name)
432 #define POST(name)      DEFN_POST_TEMPLATE(ppc64_linux, name)
433 
434 /* Add prototypes for the wrappers declared here, so that gcc doesn't
435    harass us for not having prototypes.  Really this is a kludge --
436    the right thing to do is to make these wrappers 'static' since they
437    aren't visible outside this file, but that requires even more macro
438    magic. */
439 
440 DECL_TEMPLATE(ppc64_linux, sys_socketcall);
441 DECL_TEMPLATE(ppc64_linux, sys_mmap);
442 //zz DECL_TEMPLATE(ppc64_linux, sys_mmap2);
443 //zz DECL_TEMPLATE(ppc64_linux, sys_stat64);
444 //zz DECL_TEMPLATE(ppc64_linux, sys_lstat64);
445 //zz DECL_TEMPLATE(ppc64_linux, sys_fstat64);
446 DECL_TEMPLATE(ppc64_linux, sys_ipc);
447 DECL_TEMPLATE(ppc64_linux, sys_clone);
448 //zz DECL_TEMPLATE(ppc64_linux, sys_sigreturn);
449 DECL_TEMPLATE(ppc64_linux, sys_rt_sigreturn);
450 //zz DECL_TEMPLATE(ppc64_linux, sys_sigaction);
451 DECL_TEMPLATE(ppc64_linux, sys_fadvise64);
452 
PRE(sys_socketcall)453 PRE(sys_socketcall)
454 {
455 #  define ARG2_0  (((UWord*)ARG2)[0])
456 #  define ARG2_1  (((UWord*)ARG2)[1])
457 #  define ARG2_2  (((UWord*)ARG2)[2])
458 #  define ARG2_3  (((UWord*)ARG2)[3])
459 #  define ARG2_4  (((UWord*)ARG2)[4])
460 #  define ARG2_5  (((UWord*)ARG2)[5])
461 
462    *flags |= SfMayBlock;
463    PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
464    PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
465 
466    switch (ARG1 /* request */) {
467 
468    case VKI_SYS_SOCKETPAIR:
469      /* int socketpair(int d, int type, int protocol, int sv[2]); */
470       PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
471       ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
472       break;
473 
474    case VKI_SYS_SOCKET:
475      /* int socket(int domain, int type, int protocol); */
476       PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
477       break;
478 
479    case VKI_SYS_BIND:
480      /* int bind(int sockfd, struct sockaddr *my_addr,
481 	int addrlen); */
482       PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
483       ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
484       break;
485 
486    case VKI_SYS_LISTEN:
487      /* int listen(int s, int backlog); */
488       PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
489       break;
490 
491    case VKI_SYS_ACCEPT: {
492      /* int accept(int s, struct sockaddr *addr, int *addrlen); */
493       PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
494       ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
495       break;
496    }
497 
498    case VKI_SYS_ACCEPT4: {
499      /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
500       PRE_MEM_READ( "socketcall.accept4(args)", ARG2, 4*sizeof(Addr) );
501       ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
502       break;
503    }
504 
505    case VKI_SYS_SENDTO:
506      /* int sendto(int s, const void *msg, int len,
507                     unsigned int flags,
508                     const struct sockaddr *to, int tolen); */
509      PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
510      ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
511 				  ARG2_3, ARG2_4, ARG2_5 );
512      break;
513 
514    case VKI_SYS_SEND:
515      /* int send(int s, const void *msg, size_t len, int flags); */
516      PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
517      ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
518      break;
519 
520    case VKI_SYS_RECVFROM:
521      /* int recvfrom(int s, void *buf, int len, unsigned int flags,
522 	struct sockaddr *from, int *fromlen); */
523      PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
524      ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
525 				    ARG2_3, ARG2_4, ARG2_5 );
526      break;
527 
528    case VKI_SYS_RECV:
529      /* int recv(int s, void *buf, int len, unsigned int flags); */
530      /* man 2 recv says:
531          The  recv call is normally used only on a connected socket
532          (see connect(2)) and is identical to recvfrom with a  NULL
533          from parameter.
534      */
535      PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
536      ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
537      break;
538 
539    case VKI_SYS_CONNECT:
540      /* int connect(int sockfd,
541 	struct sockaddr *serv_addr, int addrlen ); */
542      PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
543      ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
544      break;
545 
546    case VKI_SYS_SETSOCKOPT:
547      /* int setsockopt(int s, int level, int optname,
548 	const void *optval, int optlen); */
549      PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
550      ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
551 				      ARG2_3, ARG2_4 );
552      break;
553 
554    case VKI_SYS_GETSOCKOPT:
555      /* int getsockopt(int s, int level, int optname,
556 	void *optval, socklen_t *optlen); */
557      PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
558      ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
559 				    ARG2_3, ARG2_4 );
560      break;
561 
562    case VKI_SYS_GETSOCKNAME:
563      /* int getsockname(int s, struct sockaddr* name, int* namelen) */
564      PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
565      ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
566      break;
567 
568    case VKI_SYS_GETPEERNAME:
569      /* int getpeername(int s, struct sockaddr* name, int* namelen) */
570      PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
571      ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
572      break;
573 
574    case VKI_SYS_SHUTDOWN:
575      /* int shutdown(int s, int how); */
576      PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
577      break;
578 
579    case VKI_SYS_SENDMSG: {
580      /* int sendmsg(int s, const struct msghdr *msg, int flags); */
581 
582      /* this causes warnings, and I don't get why. glibc bug?
583       * (after all it's glibc providing the arguments array)
584        PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
585      */
586      ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 );
587      break;
588    }
589 
590    case VKI_SYS_RECVMSG: {
591      /* int recvmsg(int s, struct msghdr *msg, int flags); */
592 
593      /* this causes warnings, and I don't get why. glibc bug?
594       * (after all it's glibc providing the arguments array)
595        PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
596      */
597      ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
598      break;
599    }
600 
601    default:
602      VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1);
603      SET_STATUS_Failure( VKI_EINVAL );
604      break;
605    }
606 #  undef ARG2_0
607 #  undef ARG2_1
608 #  undef ARG2_2
609 #  undef ARG2_3
610 #  undef ARG2_4
611 #  undef ARG2_5
612 }
613 
POST(sys_socketcall)614 POST(sys_socketcall)
615 {
616 #  define ARG2_0  (((UWord*)ARG2)[0])
617 #  define ARG2_1  (((UWord*)ARG2)[1])
618 #  define ARG2_2  (((UWord*)ARG2)[2])
619 #  define ARG2_3  (((UWord*)ARG2)[3])
620 #  define ARG2_4  (((UWord*)ARG2)[4])
621 #  define ARG2_5  (((UWord*)ARG2)[5])
622 
623   SysRes r;
624   vg_assert(SUCCESS);
625   switch (ARG1 /* request */) {
626 
627   case VKI_SYS_SOCKETPAIR:
628     r = ML_(generic_POST_sys_socketpair)(
629 					 tid, VG_(mk_SysRes_Success)(RES),
630 					 ARG2_0, ARG2_1, ARG2_2, ARG2_3
631 					 );
632     SET_STATUS_from_SysRes(r);
633     break;
634 
635   case VKI_SYS_SOCKET:
636     r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
637     SET_STATUS_from_SysRes(r);
638     break;
639 
640   case VKI_SYS_BIND:
641     /* int bind(int sockfd, struct sockaddr *my_addr,
642        int addrlen); */
643     break;
644 
645   case VKI_SYS_LISTEN:
646     /* int listen(int s, int backlog); */
647     break;
648 
649   case VKI_SYS_ACCEPT:
650   case VKI_SYS_ACCEPT4:
651     /* int accept(int s, struct sockaddr *addr, int *addrlen); */
652     /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
653     r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
654 				      ARG2_0, ARG2_1, ARG2_2 );
655     SET_STATUS_from_SysRes(r);
656     break;
657 
658   case VKI_SYS_SENDTO:
659     break;
660 
661   case VKI_SYS_SEND:
662     break;
663 
664   case VKI_SYS_RECVFROM:
665     ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
666 				    ARG2_0, ARG2_1, ARG2_2,
667 				    ARG2_3, ARG2_4, ARG2_5 );
668     break;
669 
670   case VKI_SYS_RECV:
671     ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
672     break;
673 
674   case VKI_SYS_CONNECT:
675     break;
676 
677   case VKI_SYS_SETSOCKOPT:
678     break;
679 
680   case VKI_SYS_GETSOCKOPT:
681     ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
682 				    ARG2_0, ARG2_1,
683 				    ARG2_2, ARG2_3, ARG2_4 );
684     break;
685 
686   case VKI_SYS_GETSOCKNAME:
687     ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
688 				       ARG2_0, ARG2_1, ARG2_2 );
689     break;
690 
691   case VKI_SYS_GETPEERNAME:
692     ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
693 				       ARG2_0, ARG2_1, ARG2_2 );
694     break;
695 
696   case VKI_SYS_SHUTDOWN:
697     break;
698 
699   case VKI_SYS_SENDMSG:
700     break;
701 
702   case VKI_SYS_RECVMSG:
703     ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
704     break;
705 
706   default:
707     VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1);
708     VG_(core_panic)("... bye!\n");
709     break; /*NOTREACHED*/
710   }
711 #  undef ARG2_0
712 #  undef ARG2_1
713 #  undef ARG2_2
714 #  undef ARG2_3
715 #  undef ARG2_4
716 #  undef ARG2_5
717 }
718 
PRE(sys_mmap)719 PRE(sys_mmap)
720 {
721    SysRes r;
722 
723    PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %ld, %ld )",
724          ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
725    PRE_REG_READ6(long, "mmap",
726                  unsigned long, start, unsigned long, length,
727                  unsigned long, prot,  unsigned long, flags,
728                  unsigned long, fd,    unsigned long, offset);
729 
730    r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
731                                        (Off64T)ARG6 );
732    SET_STATUS_from_SysRes(r);
733 }
734 
735 //zz PRE(sys_mmap2)
736 //zz {
737 //zz    SysRes r;
738 //zz
739 //zz    // Exactly like old_mmap() except:
740 //zz    //  - the file offset is specified in 4K units rather than bytes,
741 //zz    //    so that it can be used for files bigger than 2^32 bytes.
742 //zz    PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )",
743 //zz          ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
744 //zz    PRE_REG_READ6(long, "mmap2",
745 //zz                  unsigned long, start, unsigned long, length,
746 //zz                  unsigned long, prot,  unsigned long, flags,
747 //zz                  unsigned long, fd,    unsigned long, offset);
748 //zz
749 //zz    r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
750 //zz                                        4096 * (Off64T)ARG6 );
751 //zz    SET_STATUS_from_SysRes(r);
752 //zz }
753 //zz
754 //zz // XXX: lstat64/fstat64/stat64 are generic, but not necessarily
755 //zz // applicable to every architecture -- I think only to 32-bit archs.
756 //zz // We're going to need something like linux/core_os32.h for such
757 //zz // things, eventually, I think.  --njn
758 //zz PRE(sys_stat64)
759 //zz {
760 //zz    PRINT("sys_stat64 ( %p, %p )",ARG1,ARG2);
761 //zz    PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
762 //zz    PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
763 //zz    PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
764 //zz }
765 //zz
766 //zz POST(sys_stat64)
767 //zz {
768 //zz    POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
769 //zz }
770 //zz
771 //zz PRE(sys_lstat64)
772 //zz {
773 //zz    PRINT("sys_lstat64 ( %p(%s), %p )",ARG1,ARG1,ARG2);
774 //zz    PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
775 //zz    PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
776 //zz    PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
777 //zz }
778 //zz
779 //zz POST(sys_lstat64)
780 //zz {
781 //zz    vg_assert(SUCCESS);
782 //zz    if (RES == 0) {
783 //zz       POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
784 //zz    }
785 //zz }
786 //zz
787 //zz PRE(sys_fstat64)
788 //zz {
789 //zz   PRINT("sys_fstat64 ( %d, %p )",ARG1,ARG2);
790 //zz   PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
791 //zz   PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
792 //zz }
793 //zz
794 //zz POST(sys_fstat64)
795 //zz {
796 //zz   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
797 //zz }
798 
deref_Addr(ThreadId tid,Addr a,Char * s)799 static Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
800 {
801    Addr* a_p = (Addr*)a;
802    PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
803    return *a_p;
804 }
805 
PRE(sys_ipc)806 PRE(sys_ipc)
807 {
808   PRINT("sys_ipc ( %ld, %ld, %ld, %ld, %#lx, %ld )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
809   // XXX: this is simplistic -- some args are not used in all circumstances.
810   PRE_REG_READ6(int, "ipc",
811 		vki_uint, call, int, first, int, second, int, third,
812 		void *, ptr, long, fifth)
813 
814     switch (ARG1 /* call */) {
815     case VKI_SEMOP:
816       ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
817       *flags |= SfMayBlock;
818       break;
819     case VKI_SEMGET:
820       break;
821     case VKI_SEMCTL:
822       {
823 	UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
824 	ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
825 	break;
826       }
827     case VKI_SEMTIMEDOP:
828       ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
829       *flags |= SfMayBlock;
830       break;
831     case VKI_MSGSND:
832       ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
833       if ((ARG4 & VKI_IPC_NOWAIT) == 0)
834 	*flags |= SfMayBlock;
835       break;
836     case VKI_MSGRCV:
837       {
838 	Addr msgp;
839 	Word msgtyp;
840 
841 	msgp = deref_Addr( tid,
842 			   (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
843 			   "msgrcv(msgp)" );
844 	msgtyp = deref_Addr( tid,
845 			     (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
846 			     "msgrcv(msgp)" );
847 
848 	ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
849 
850 	if ((ARG4 & VKI_IPC_NOWAIT) == 0)
851 	  *flags |= SfMayBlock;
852 	break;
853       }
854     case VKI_MSGGET:
855       break;
856     case VKI_MSGCTL:
857       ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
858       break;
859     case VKI_SHMAT:
860       {
861 	UWord w;
862 	PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
863 	w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
864 	if (w == 0)
865 	  SET_STATUS_Failure( VKI_EINVAL );
866 	else
867 	  ARG5 = w;
868 	break;
869       }
870     case VKI_SHMDT:
871       if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
872 	SET_STATUS_Failure( VKI_EINVAL );
873       break;
874     case VKI_SHMGET:
875       break;
876     case VKI_SHMCTL: /* IPCOP_shmctl */
877       ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
878       break;
879     default:
880       VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %ld\n", ARG1 );
881       VG_(core_panic)("... bye!\n");
882       break; /*NOTREACHED*/
883     }
884 }
885 
POST(sys_ipc)886 POST(sys_ipc)
887 {
888   vg_assert(SUCCESS);
889   switch (ARG1 /* call */) {
890   case VKI_SEMOP:
891   case VKI_SEMGET:
892     break;
893   case VKI_SEMCTL:
894     {
895       UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
896       ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
897       break;
898     }
899   case VKI_SEMTIMEDOP:
900   case VKI_MSGSND:
901     break;
902   case VKI_MSGRCV:
903     {
904       Addr msgp;
905       Word msgtyp;
906 
907       msgp = deref_Addr( tid,
908                          (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
909                          "msgrcv(msgp)" );
910       msgtyp = deref_Addr( tid,
911                            (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
912                            "msgrcv(msgp)" );
913 
914       ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
915       break;
916     }
917   case VKI_MSGGET:
918     break;
919   case VKI_MSGCTL:
920     ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
921     break;
922   case VKI_SHMAT:
923     {
924       Addr addr;
925 
926       /* force readability. before the syscall it is
927        * indeed uninitialized, as can be seen in
928        * glibc/sysdeps/unix/sysv/linux/shmat.c */
929       POST_MEM_WRITE( ARG4, sizeof( Addr ) );
930 
931       addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
932       ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
933       break;
934     }
935   case VKI_SHMDT:
936     ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
937     break;
938   case VKI_SHMGET:
939     break;
940   case VKI_SHMCTL:
941     ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
942     break;
943   default:
944     VG_(message)(Vg_DebugMsg,
945 		 "FATAL: unhandled syscall(ipc) %ld\n",
946 		 ARG1 );
947     VG_(core_panic)("... bye!\n");
948     break; /*NOTREACHED*/
949   }
950 }
951 
PRE(sys_clone)952 PRE(sys_clone)
953 {
954    UInt cloneflags;
955 
956    PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
957    PRE_REG_READ5(int, "clone",
958                  unsigned long, flags,
959                  void *,        child_stack,
960                  int *,         parent_tidptr,
961                  void *,        child_tls,
962                  int *,         child_tidptr);
963 
964    if (ARG1 & VKI_CLONE_PARENT_SETTID) {
965       PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
966       if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
967                                              VKI_PROT_WRITE)) {
968          SET_STATUS_Failure( VKI_EFAULT );
969          return;
970       }
971    }
972    if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
973       PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
974       if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int),
975                                              VKI_PROT_WRITE)) {
976          SET_STATUS_Failure( VKI_EFAULT );
977          return;
978       }
979    }
980 
981    cloneflags = ARG1;
982 
983    if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
984       SET_STATUS_Failure( VKI_EINVAL );
985       return;
986    }
987 
988    /* Only look at the flags we really care about */
989    switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
990                          | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
991    case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
992       /* thread creation */
993       SET_STATUS_from_SysRes(
994          do_clone(tid,
995                   ARG1,         /* flags */
996                   (Addr)ARG2,   /* child SP */
997                   (Int *)ARG3,  /* parent_tidptr */
998                   (Int *)ARG5,  /* child_tidptr */
999                   (Addr)ARG4)); /* child_tls */
1000       break;
1001 
1002    case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
1003       /* FALLTHROUGH - assume vfork == fork */
1004       cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
1005 
1006    case 0: /* plain fork */
1007       SET_STATUS_from_SysRes(
1008          ML_(do_fork_clone)(tid,
1009                        cloneflags,      /* flags */
1010                        (Int *)ARG3,     /* parent_tidptr */
1011                        (Int *)ARG5));   /* child_tidptr */
1012       break;
1013 
1014    default:
1015       /* should we just ENOSYS? */
1016       VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx\n", ARG1);
1017       VG_(message)(Vg_UserMsg, "\n");
1018       VG_(message)(Vg_UserMsg, "The only supported clone() uses are:\n");
1019       VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)\n");
1020       VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork\n");
1021       VG_(unimplemented)
1022          ("Valgrind does not support general clone().");
1023    }
1024 
1025    if (SUCCESS) {
1026       if (ARG1 & VKI_CLONE_PARENT_SETTID)
1027          POST_MEM_WRITE(ARG3, sizeof(Int));
1028       if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
1029          POST_MEM_WRITE(ARG5, sizeof(Int));
1030 
1031       /* Thread creation was successful; let the child have the chance
1032          to run */
1033       *flags |= SfYieldAfter;
1034    }
1035 }
1036 
PRE(sys_fadvise64)1037 PRE(sys_fadvise64)
1038 {
1039    PRINT("sys_fadvise64 ( %ld, %ld, %lu, %ld )", ARG1,ARG2,ARG3,ARG4);
1040    PRE_REG_READ4(long, "fadvise64",
1041                  int, fd, vki_loff_t, offset, vki_size_t, len, int, advice);
1042 }
1043 
PRE(sys_rt_sigreturn)1044 PRE(sys_rt_sigreturn)
1045 {
1046    /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
1047       an explanation of what follows. */
1048 
1049    ThreadState* tst;
1050    PRINT("sys_rt_sigreturn ( )");
1051 
1052    vg_assert(VG_(is_valid_tid)(tid));
1053    vg_assert(tid >= 1 && tid < VG_N_THREADS);
1054    vg_assert(VG_(is_running_thread)(tid));
1055 
1056    ///* Adjust esp to point to start of frame; skip back up over handler
1057    //   ret addr */
1058    tst = VG_(get_ThreadState)(tid);
1059    //tst->arch.vex.guest_ESP -= sizeof(Addr);
1060    // Should we do something equivalent on ppc64-linux?  Who knows.
1061 
1062    ///* This is only so that the EIP is (might be) useful to report if
1063    //   something goes wrong in the sigreturn */
1064    //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
1065    // Should we do something equivalent on ppc64?  Who knows.
1066 
1067    /* Restore register state from frame and remove it */
1068    VG_(sigframe_destroy)(tid, True);
1069 
1070    /* Tell the driver not to update the guest state with the "result",
1071       and set a bogus result to keep it happy. */
1072    *flags |= SfNoWriteResult;
1073    SET_STATUS_Success(0);
1074 
1075    /* Check to see if any signals arose as a result of this. */
1076    *flags |= SfPollAfter;
1077 }
1078 
1079 //zz /* Convert from non-RT to RT sigset_t's */
1080 //zz static
1081 //zz void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigset_t *set)
1082 //zz {
1083 //zz    VG_(sigemptyset)(set);
1084 //zz    set->sig[0] = *oldset;
1085 //zz }
1086 //zz PRE(sys_sigaction)
1087 //zz {
1088 //zz    struct vki_sigaction new, old;
1089 //zz    struct vki_sigaction *newp, *oldp;
1090 //zz
1091 //zz    PRINT("sys_sigaction ( %d, %p, %p )", ARG1,ARG2,ARG3);
1092 //zz    PRE_REG_READ3(int, "sigaction",
1093 //zz                  int, signum, const struct old_sigaction *, act,
1094 //zz                  struct old_sigaction *, oldact);
1095 //zz
1096 //zz    newp = oldp = NULL;
1097 //zz
1098 //zz    if (ARG2 != 0) {
1099 //zz       struct vki_old_sigaction *sa = (struct vki_old_sigaction *)ARG2;
1100 //zz       PRE_MEM_READ( "sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
1101 //zz       PRE_MEM_READ( "sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
1102 //zz       PRE_MEM_READ( "sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
1103 //zz       if (ML_(safe_to_deref)(sa,sizeof(sa))
1104 //zz           && (sa->sa_flags & VKI_SA_RESTORER))
1105 //zz          PRE_MEM_READ( "sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
1106 //zz    }
1107 //zz
1108 //zz    if (ARG3 != 0) {
1109 //zz       PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction));
1110 //zz       oldp = &old;
1111 //zz    }
1112 //zz
1113 //zz    //jrs 20050207: what?!  how can this make any sense?
1114 //zz    //if (VG_(is_kerror)(SYSRES))
1115 //zz    //   return;
1116 //zz
1117 //zz    if (ARG2 != 0) {
1118 //zz       struct vki_old_sigaction *oldnew = (struct vki_old_sigaction *)ARG2;
1119 //zz
1120 //zz       new.ksa_handler = oldnew->ksa_handler;
1121 //zz       new.sa_flags = oldnew->sa_flags;
1122 //zz       new.sa_restorer = oldnew->sa_restorer;
1123 //zz       convert_sigset_to_rt(&oldnew->sa_mask, &new.sa_mask);
1124 //zz       newp = &new;
1125 //zz    }
1126 //zz
1127 //zz    SET_STATUS_from_SysRes( VG_(do_sys_sigaction)(ARG1, newp, oldp) );
1128 //zz
1129 //zz    if (ARG3 != 0 && SUCCESS && RES == 0) {
1130 //zz       struct vki_old_sigaction *oldold = (struct vki_old_sigaction *)ARG3;
1131 //zz
1132 //zz       oldold->ksa_handler = oldp->ksa_handler;
1133 //zz       oldold->sa_flags = oldp->sa_flags;
1134 //zz       oldold->sa_restorer = oldp->sa_restorer;
1135 //zz       oldold->sa_mask = oldp->sa_mask.sig[0];
1136 //zz    }
1137 //zz }
1138 //zz
1139 //zz POST(sys_sigaction)
1140 //zz {
1141 //zz    vg_assert(SUCCESS);
1142 //zz    if (RES == 0 && ARG3 != 0)
1143 //zz       POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
1144 //zz }
1145 
1146 #undef PRE
1147 #undef POST
1148 
1149 /* ---------------------------------------------------------------------
1150    The ppc64/Linux syscall table
1151    ------------------------------------------------------------------ */
1152 
1153 /* Add an ppc64-linux specific wrapper to a syscall table. */
1154 #define PLAX_(sysno, name)    WRAPPER_ENTRY_X_(ppc64_linux, sysno, name)
1155 #define PLAXY(sysno, name)    WRAPPER_ENTRY_XY(ppc64_linux, sysno, name)
1156 
1157 // This table maps from __NR_xxx syscall numbers (from
1158 // linux/include/asm-ppc/unistd.h) to the appropriate PRE/POST sys_foo()
1159 // wrappers on ppc64 (as per sys_call_table in linux/arch/ppc/kernel/entry.S).
1160 //
1161 // For those syscalls not handled by Valgrind, the annotation indicate its
1162 // arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
1163 // (unknown).
1164 
1165 static SyscallTableEntry syscall_table[] = {
1166 // _____(__NR_restart_syscall,   sys_restart_syscall),    //   0
1167    GENX_(__NR_exit,              sys_exit),               //   1
1168    GENX_(__NR_fork,              sys_fork),               //   2
1169    GENXY(__NR_read,              sys_read),               //   3
1170    GENX_(__NR_write,             sys_write),              //   4
1171 
1172    GENXY(__NR_open,              sys_open),               //   5
1173    GENXY(__NR_close,             sys_close),              //   6
1174    GENXY(__NR_waitpid,           sys_waitpid),            //   7
1175    GENXY(__NR_creat,             sys_creat),              //   8
1176    GENX_(__NR_link,              sys_link),               //   9
1177 
1178    GENX_(__NR_unlink,            sys_unlink),             //  10
1179    GENX_(__NR_execve,            sys_execve),             //  11
1180    GENX_(__NR_chdir,             sys_chdir),              //  12
1181    GENXY(__NR_time,              sys_time),               //  13
1182    GENX_(__NR_mknod,             sys_mknod),              //  14
1183 
1184    GENX_(__NR_chmod,             sys_chmod),              //  15
1185    GENX_(__NR_lchown,            sys_lchown),             //  16
1186 // _____(__NR_break,             sys_break),              //  17
1187 // _____(__NR_oldstat,           sys_oldstat),            //  18
1188    LINX_(__NR_lseek,             sys_lseek),              //  19
1189 
1190    GENX_(__NR_getpid,            sys_getpid),             //  20
1191    LINX_(__NR_mount,             sys_mount),              //  21
1192 // _____(__NR_umount,            sys_umount),             //  22
1193    GENX_(__NR_setuid,            sys_setuid),             //  23
1194    GENX_(__NR_getuid,            sys_getuid),             //  24
1195 
1196 // _____(__NR_stime,             sys_stime),              //  25
1197 // _____(__NR_ptrace,            sys_ptrace),             //  26
1198    GENX_(__NR_alarm,             sys_alarm),              //  27
1199 // _____(__NR_oldfstat,          sys_oldfstat),           //  28
1200    GENX_(__NR_pause,             sys_pause),              //  29
1201 
1202    LINX_(__NR_utime,             sys_utime),              //  30
1203 // _____(__NR_stty,              sys_stty),               //  31
1204 // _____(__NR_gtty,              sys_gtty),               //  32
1205    GENX_(__NR_access,            sys_access),             //  33
1206 // _____(__NR_nice,              sys_nice),               //  34
1207 
1208 // _____(__NR_ftime,             sys_ftime),              //  35
1209 // _____(__NR_sync,              sys_sync),               //  36
1210    GENX_(__NR_kill,              sys_kill),               //  37
1211    GENX_(__NR_rename,            sys_rename),             //  38
1212    GENX_(__NR_mkdir,             sys_mkdir),              //  39
1213 
1214    GENX_(__NR_rmdir,             sys_rmdir),              //  40
1215    GENXY(__NR_dup,               sys_dup),                //  41
1216    LINXY(__NR_pipe,              sys_pipe),               //  42
1217    GENXY(__NR_times,             sys_times),              //  43
1218 // _____(__NR_prof,              sys_prof),               //  44
1219 
1220    GENX_(__NR_brk,               sys_brk),                //  45
1221    GENX_(__NR_setgid,            sys_setgid),             //  46
1222    GENX_(__NR_getgid,            sys_getgid),             //  47
1223 // _____(__NR_signal,            sys_signal),             //  48
1224    GENX_(__NR_geteuid,           sys_geteuid),            //  49
1225 
1226    GENX_(__NR_getegid,           sys_getegid),            //  50
1227 // _____(__NR_acct,              sys_acct),               //  51
1228    LINX_(__NR_umount2,           sys_umount),             //  52
1229 // _____(__NR_lock,              sys_lock),               //  53
1230    LINXY(__NR_ioctl,             sys_ioctl),              //  54
1231 
1232    LINXY(__NR_fcntl,             sys_fcntl),              //  55
1233 // _____(__NR_mpx,               sys_mpx),                //  56
1234    GENX_(__NR_setpgid,           sys_setpgid),            //  57
1235 // _____(__NR_ulimit,            sys_ulimit),             //  58
1236 // _____(__NR_oldolduname,       sys_oldolduname),        //  59
1237 
1238    GENX_(__NR_umask,             sys_umask),              //  60
1239    GENX_(__NR_chroot,            sys_chroot),             //  61
1240 // _____(__NR_ustat,             sys_ustat),              //  62
1241    GENXY(__NR_dup2,              sys_dup2),               //  63
1242    GENX_(__NR_getppid,           sys_getppid),            //  64
1243 
1244    GENX_(__NR_getpgrp,           sys_getpgrp),            //  65
1245    GENX_(__NR_setsid,            sys_setsid),             //  66
1246 // _____(__NR_sigaction,         sys_sigaction),          //  67
1247 // _____(__NR_sgetmask,          sys_sgetmask),           //  68
1248 // _____(__NR_ssetmask,          sys_ssetmask),           //  69
1249 
1250    GENX_(__NR_setreuid,          sys_setreuid),           //  70
1251    GENX_(__NR_setregid,          sys_setregid),           //  71
1252 // _____(__NR_sigsuspend,        sys_sigsuspend),         //  72
1253 // _____(__NR_sigpending,        sys_sigpending),         //  73
1254 // _____(__NR_sethostname,       sys_sethostname),        //  74
1255 
1256    GENX_(__NR_setrlimit,         sys_setrlimit),          //  75
1257 // _____(__NR_getrlimit,         sys_getrlimit),          //  76
1258    GENXY(__NR_getrusage,         sys_getrusage),          //  77
1259    GENXY(__NR_gettimeofday,      sys_gettimeofday),       //  78
1260 // _____(__NR_settimeofday,      sys_settimeofday),       //  79
1261 
1262    GENXY(__NR_getgroups,         sys_getgroups),          //  80
1263    GENX_(__NR_setgroups,         sys_setgroups),          //  81
1264 // _____(__NR_select,            sys_select),             //  82
1265    GENX_(__NR_symlink,           sys_symlink),            //  83
1266 // _____(__NR_oldlstat,          sys_oldlstat),           //  84
1267 
1268    GENX_(__NR_readlink,          sys_readlink),           //  85
1269 // _____(__NR_uselib,            sys_uselib),             //  86
1270 // _____(__NR_swapon,            sys_swapon),             //  87
1271 // _____(__NR_reboot,            sys_reboot),             //  88
1272 // _____(__NR_readdir,           sys_readdir),            //  89
1273 
1274    PLAX_(__NR_mmap,              sys_mmap),               //  90
1275    GENXY(__NR_munmap,            sys_munmap),             //  91
1276    GENX_(__NR_truncate,          sys_truncate),           //  92
1277    GENX_(__NR_ftruncate,         sys_ftruncate),          //  93
1278    GENX_(__NR_fchmod,            sys_fchmod),             //  94
1279 
1280    GENX_(__NR_fchown,            sys_fchown),             //  95
1281 // _____(__NR_getpriority,       sys_getpriority),        //  96
1282 // _____(__NR_setpriority,       sys_setpriority),        //  97
1283 // _____(__NR_profil,            sys_profil),             //  98
1284    GENXY(__NR_statfs,            sys_statfs),             //  99
1285 
1286    GENXY(__NR_fstatfs,           sys_fstatfs),            // 100
1287 // _____(__NR_ioperm,            sys_ioperm),             // 101
1288    PLAXY(__NR_socketcall,        sys_socketcall),         // 102
1289    LINXY(__NR_syslog,            sys_syslog),             // 103
1290    GENXY(__NR_setitimer,         sys_setitimer),          // 104
1291 
1292    GENXY(__NR_getitimer,         sys_getitimer),          // 105
1293    GENXY(__NR_stat,              sys_newstat),            // 106
1294    GENXY(__NR_lstat,             sys_newlstat),           // 107
1295    GENXY(__NR_fstat,             sys_newfstat),           // 108
1296 // _____(__NR_olduname,          sys_olduname),           // 109
1297 
1298 // _____(__NR_iopl,              sys_iopl),               // 110
1299    LINX_(__NR_vhangup,           sys_vhangup),            // 111
1300 // _____(__NR_idle,              sys_idle),               // 112
1301 // _____(__NR_vm86,              sys_vm86),               // 113
1302    GENXY(__NR_wait4,             sys_wait4),              // 114
1303 
1304 // _____(__NR_swapoff,           sys_swapoff),            // 115
1305    LINXY(__NR_sysinfo,           sys_sysinfo),            // 116
1306    PLAXY(__NR_ipc,               sys_ipc),                // 117
1307    GENX_(__NR_fsync,             sys_fsync),              // 118
1308 // _____(__NR_sigreturn,         sys_sigreturn),          // 119
1309 
1310    PLAX_(__NR_clone,             sys_clone),              // 120
1311 // _____(__NR_setdomainname,     sys_setdomainname),      // 121
1312    GENXY(__NR_uname,             sys_newuname),           // 122
1313 // _____(__NR_modify_ldt,        sys_modify_ldt),         // 123
1314    LINXY(__NR_adjtimex,          sys_adjtimex),           // 124
1315 
1316    GENXY(__NR_mprotect,          sys_mprotect),           // 125
1317 // _____(__NR_sigprocmask,       sys_sigprocmask),        // 126
1318    GENX_(__NR_create_module,     sys_ni_syscall),         // 127
1319    LINX_(__NR_init_module,       sys_init_module),        // 128
1320    LINX_(__NR_delete_module,     sys_delete_module),      // 129
1321 
1322 // _____(__NR_get_kernel_syms,   sys_get_kernel_syms),    // 130
1323 // _____(__NR_quotactl,          sys_quotactl),           // 131
1324    GENX_(__NR_getpgid,           sys_getpgid),            // 132
1325    GENX_(__NR_fchdir,            sys_fchdir),             // 133
1326 // _____(__NR_bdflush,           sys_bdflush),            // 134
1327 
1328 // _____(__NR_sysfs,             sys_sysfs),              // 135
1329    LINX_(__NR_personality,       sys_personality),        // 136
1330 // _____(__NR_afs_syscall,       sys_afs_syscall),        // 137
1331    LINX_(__NR_setfsuid,          sys_setfsuid),           // 138
1332    LINX_(__NR_setfsgid,          sys_setfsgid),           // 139
1333 
1334    LINXY(__NR__llseek,           sys_llseek),             // 140
1335    GENXY(__NR_getdents,          sys_getdents),           // 141
1336    GENX_(__NR__newselect,        sys_select),             // 142
1337    GENX_(__NR_flock,             sys_flock),              // 143
1338    GENX_(__NR_msync,             sys_msync),              // 144
1339 
1340    GENXY(__NR_readv,             sys_readv),              // 145
1341    GENX_(__NR_writev,            sys_writev),             // 146
1342 // _____(__NR_getsid,            sys_getsid),             // 147
1343    GENX_(__NR_fdatasync,         sys_fdatasync),          // 148
1344    LINXY(__NR__sysctl,           sys_sysctl),             // 149
1345 
1346    GENX_(__NR_mlock,             sys_mlock),              // 150
1347    GENX_(__NR_munlock,           sys_munlock),            // 151
1348    GENX_(__NR_mlockall,          sys_mlockall),           // 152
1349    LINX_(__NR_munlockall,        sys_munlockall),         // 153
1350    LINXY(__NR_sched_setparam,    sys_sched_setparam),     // 154
1351 
1352    LINXY(__NR_sched_getparam,         sys_sched_getparam),        // 155
1353    LINX_(__NR_sched_setscheduler,     sys_sched_setscheduler),    // 156
1354    LINX_(__NR_sched_getscheduler,     sys_sched_getscheduler),    // 157
1355    LINX_(__NR_sched_yield,            sys_sched_yield),           // 158
1356    LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
1357 
1358    LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
1359    LINXY(__NR_sched_rr_get_interval,  sys_sched_rr_get_interval), // 161
1360    GENXY(__NR_nanosleep,         sys_nanosleep),          // 162
1361    GENX_(__NR_mremap,            sys_mremap),             // 163
1362 // _____(__NR_setresuid,         sys_setresuid),          // 164
1363 
1364    LINXY(__NR_getresuid,         sys_getresuid),          // 165
1365 // _____(__NR_query_module,      sys_query_module),       // 166
1366    GENXY(__NR_poll,              sys_poll),               // 167
1367 // _____(__NR_nfsservctl,        sys_nfsservctl),         // 168
1368 // _____(__NR_setresgid,         sys_setresgid),          // 169
1369 
1370    LINXY(__NR_getresgid,         sys_getresgid),          // 170
1371 // _____(__NR_prctl,             sys_prctl),              // 171
1372    PLAX_(__NR_rt_sigreturn,      sys_rt_sigreturn),       // 172
1373    LINXY(__NR_rt_sigaction,      sys_rt_sigaction),       // 173
1374    LINXY(__NR_rt_sigprocmask,    sys_rt_sigprocmask),     // 174
1375 
1376 // _____(__NR_rt_sigpending,     sys_rt_sigpending),      // 175
1377    LINXY(__NR_rt_sigtimedwait,   sys_rt_sigtimedwait),    // 176
1378    LINXY(__NR_rt_sigqueueinfo,   sys_rt_sigqueueinfo),    // 177
1379 // _____(__NR_rt_sigsuspend,     sys_rt_sigsuspend),      // 178
1380    GENXY(__NR_pread64,           sys_pread64),            // 179
1381 
1382 // _____(__NR_pwrite64,          sys_pwrite64),           // 180
1383    GENX_(__NR_chown,             sys_chown),              // 181
1384    GENXY(__NR_getcwd,            sys_getcwd),             // 182
1385    LINXY(__NR_capget,            sys_capget),             // 183
1386    LINX_(__NR_capset,            sys_capset),             // 184
1387 
1388    GENXY(__NR_sigaltstack,       sys_sigaltstack),        // 185
1389    LINXY(__NR_sendfile,          sys_sendfile),           // 186
1390 // _____(__NR_getpmsg,           sys_getpmsg),            // 187
1391 // _____(__NR_putpmsg,           sys_putpmsg),            // 188
1392    GENX_(__NR_vfork,             sys_fork),               // 189 treat as fork
1393 
1394    GENXY(__NR_ugetrlimit,        sys_getrlimit),          // 190
1395    LINX_(__NR_readahead,         sys_readahead),          // 191
1396 // /* #define __NR_mmap2           192     32bit only */
1397 // /* #define __NR_truncate64      193     32bit only */
1398 // /* #define __NR_ftruncate64     194     32bit only */
1399 
1400 // /* #define __NR_stat64          195     32bit only */
1401 // /* #define __NR_lstat64         196     32bit only */
1402 // /* #define __NR_fstat64         197     32bit only */
1403 // _____(__NR_pciconfig_read,    sys_pciconfig_read),     // 198
1404 // _____(__NR_pciconfig_write,   sys_pciconfig_write),    // 199
1405 
1406 // _____(__NR_pciconfig_iobase,  sys_pciconfig_iobase),   // 200
1407 // _____(__NR_multiplexer,       sys_multiplexer),        // 201
1408    GENXY(__NR_getdents64,        sys_getdents64),         // 202
1409 // _____(__NR_pivot_root,        sys_pivot_root),         // 203
1410    LINXY(__NR_fcntl64,           sys_fcntl64),            // 204 !!!!?? 32bit only */
1411 
1412    GENX_(__NR_madvise,           sys_madvise),            // 205
1413 // _____(__NR_mincore,           sys_mincore),            // 206
1414    LINX_(__NR_gettid,            sys_gettid),             // 207
1415 // _____(__NR_tkill,             sys_tkill),              // 208
1416 // _____(__NR_setxattr,          sys_setxattr),           // 209
1417 
1418 // _____(__NR_lsetxattr,         sys_lsetxattr),          // 210
1419 // _____(__NR_fsetxattr,         sys_fsetxattr),          // 211
1420    LINXY(__NR_getxattr,          sys_getxattr),           // 212
1421    LINXY(__NR_lgetxattr,         sys_lgetxattr),          // 213
1422    LINXY(__NR_fgetxattr,         sys_fgetxattr),          // 214
1423    LINXY(__NR_listxattr,         sys_listxattr),          // 215
1424    LINXY(__NR_llistxattr,        sys_llistxattr),         // 216
1425    LINXY(__NR_flistxattr,        sys_flistxattr),         // 217
1426    LINX_(__NR_removexattr,       sys_removexattr),        // 218
1427    LINX_(__NR_lremovexattr,      sys_lremovexattr),       // 219
1428    LINX_(__NR_fremovexattr,      sys_fremovexattr),       // 220
1429 
1430    LINXY(__NR_futex,             sys_futex),              // 221
1431    LINX_(__NR_sched_setaffinity, sys_sched_setaffinity),  // 222
1432    LINXY(__NR_sched_getaffinity, sys_sched_getaffinity),  // 223
1433 // /* 224 currently unused */
1434 
1435 // _____(__NR_tuxcall,           sys_tuxcall),            // 225
1436 // /* #define __NR_sendfile64      226     32bit only */
1437    LINX_(__NR_io_setup,          sys_io_setup),           // 227
1438    LINX_(__NR_io_destroy,        sys_io_destroy),         // 228
1439    LINXY(__NR_io_getevents,      sys_io_getevents),       // 229
1440    LINX_(__NR_io_submit,         sys_io_submit),          // 230
1441    LINXY(__NR_io_cancel,         sys_io_cancel),          // 231
1442    LINX_(__NR_set_tid_address,   sys_set_tid_address),    // 232
1443    PLAX_(__NR_fadvise64,         sys_fadvise64),          // 233
1444    LINX_(__NR_exit_group,        sys_exit_group),         // 234
1445 
1446 // _____(__NR_lookup_dcookie,    sys_lookup_dcookie),     // 235
1447    LINXY(__NR_epoll_create,      sys_epoll_create),       // 236
1448    LINX_(__NR_epoll_ctl,         sys_epoll_ctl),          // 237
1449    LINXY(__NR_epoll_wait,        sys_epoll_wait),         // 238
1450 // _____(__NR_remap_file_pages,  sys_remap_file_pages),   // 239
1451 
1452    LINXY(__NR_timer_create,      sys_timer_create),       // 240
1453    LINXY(__NR_timer_settime,     sys_timer_settime),      // 241
1454    LINXY(__NR_timer_gettime,     sys_timer_gettime),      // 242
1455    LINX_(__NR_timer_getoverrun,  sys_timer_getoverrun),   // 243
1456    LINX_(__NR_timer_delete,      sys_timer_delete),       // 244
1457    LINX_(__NR_clock_settime,     sys_clock_settime),      // 245
1458    LINXY(__NR_clock_gettime,     sys_clock_gettime),      // 246
1459    LINXY(__NR_clock_getres,      sys_clock_getres),       // 247
1460    LINXY(__NR_clock_nanosleep,   sys_clock_nanosleep),    // 248
1461 
1462 // _____(__NR_swapcontext,       sys_swapcontext),        // 249
1463 
1464    LINXY(__NR_tgkill,            sys_tgkill),             // 250
1465 // _____(__NR_utimes,            sys_utimes),             // 251
1466 // _____(__NR_statfs64,          sys_statfs64),           // 252
1467 // _____(__NR_fstatfs64,         sys_fstatfs64),          // 253
1468 // /* #define __NR_fadvise64_64    254     32bit only */
1469 
1470 // _____(__NR_rtas,              sys_rtas),               // 255
1471 // /* Number 256 is reserved for sys_debug_setcontext */
1472 // /* Number 257 is reserved for vserver */
1473 // /* 258 currently unused */
1474 // _____(__NR_mbind,             sys_mbind),              // 259
1475 
1476 // _____(__NR_get_mempolicy,     sys_get_mempolicy),      // 260
1477 // _____(__NR_set_mempolicy,     sys_set_mempolicy),      // 261
1478    LINXY(__NR_mq_open,           sys_mq_open),            // 262
1479    LINX_(__NR_mq_unlink,         sys_mq_unlink),          // 263
1480    LINX_(__NR_mq_timedsend,      sys_mq_timedsend),       // 264
1481 
1482    LINXY(__NR_mq_timedreceive,   sys_mq_timedreceive),    // 265
1483    LINX_(__NR_mq_notify,         sys_mq_notify),          // 266
1484    LINXY(__NR_mq_getsetattr,     sys_mq_getsetattr),      // 267
1485 // _____(__NR_kexec_load,        sys_kexec_load),         // 268
1486    LINX_(__NR_add_key,           sys_add_key),            // 269
1487 
1488    LINX_(__NR_request_key,       sys_request_key),        // 270
1489    LINXY(__NR_keyctl,            sys_keyctl),             // 271
1490 // _____(__NR_waitid,            sys_waitid),             // 272
1491    LINX_(__NR_ioprio_set,        sys_ioprio_set),         // 273
1492    LINX_(__NR_ioprio_get,        sys_ioprio_get),         // 274
1493 
1494    LINX_(__NR_inotify_init,  sys_inotify_init),           // 275
1495    LINX_(__NR_inotify_add_watch,  sys_inotify_add_watch), // 276
1496    LINX_(__NR_inotify_rm_watch,   sys_inotify_rm_watch),  // 277
1497 
1498    LINXY(__NR_openat,            sys_openat),             // 286
1499    LINX_(__NR_mkdirat,           sys_mkdirat),            // 287
1500    LINX_(__NR_mknodat,           sys_mknodat),            // 288
1501    LINX_(__NR_fchownat,          sys_fchownat),           // 289
1502    LINX_(__NR_futimesat,         sys_futimesat),          // 290
1503    LINXY(__NR_newfstatat,        sys_newfstatat),         // 291
1504    LINX_(__NR_unlinkat,          sys_unlinkat),           // 292
1505    LINX_(__NR_renameat,          sys_renameat),           // 293
1506    LINX_(__NR_linkat,            sys_linkat),             // 294
1507    LINX_(__NR_symlinkat,         sys_symlinkat),          // 295
1508    LINX_(__NR_readlinkat,        sys_readlinkat),         // 296
1509    LINX_(__NR_fchmodat,          sys_fchmodat),           // 297
1510    LINX_(__NR_faccessat,         sys_faccessat),          // 298
1511    LINX_(__NR_set_robust_list,   sys_set_robust_list),    // 299
1512    LINXY(__NR_get_robust_list,   sys_get_robust_list),    // 300
1513 //   LINX_(__NR_move_pages,        sys_ni_syscall),        // 301
1514    LINXY(__NR_getcpu,            sys_getcpu),            // 302
1515    LINXY(__NR_epoll_pwait,       sys_epoll_pwait),       // 303
1516    LINX_(__NR_utimensat,         sys_utimensat),         // 304
1517    LINXY(__NR_signalfd,          sys_signalfd),          // 305
1518    LINXY(__NR_timerfd_create,    sys_timerfd_create),    // 306
1519    LINX_(__NR_eventfd,           sys_eventfd),           // 307
1520    LINX_(__NR_sync_file_range2,  sys_sync_file_range2),  // 308
1521    LINX_(__NR_fallocate,         sys_fallocate),         // 309
1522 //   LINXY(__NR_subpage_prot,       sys_ni_syscall),       // 310
1523    LINXY(__NR_timerfd_settime,   sys_timerfd_settime),  // 311
1524    LINXY(__NR_timerfd_gettime,   sys_timerfd_gettime),  // 312
1525    LINXY(__NR_signalfd4,         sys_signalfd4),        // 313
1526    LINX_(__NR_eventfd2,          sys_eventfd2),         // 314
1527    LINXY(__NR_epoll_create1,     sys_epoll_create1),    // 315
1528    LINXY(__NR_dup3,              sys_dup3),             // 316
1529    LINXY(__NR_pipe2,             sys_pipe2),            // 317
1530    LINXY(__NR_inotify_init1,     sys_inotify_init1),    // 318
1531    LINXY(__NR_perf_counter_open, sys_perf_counter_open),// 319
1532    LINXY(__NR_preadv,            sys_preadv),           // 320
1533    LINX_(__NR_pwritev,           sys_pwritev),          // 321
1534    LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo) // 322
1535 };
1536 
ML_(get_linux_syscall_entry)1537 SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1538 {
1539    const UInt syscall_table_size
1540       = sizeof(syscall_table) / sizeof(syscall_table[0]);
1541 
1542    /* Is it in the contiguous initial section of the table? */
1543    if (sysno < syscall_table_size) {
1544       SyscallTableEntry* sys = &syscall_table[sysno];
1545       if (sys->before == NULL)
1546          return NULL; /* no entry */
1547       else
1548          return sys;
1549    }
1550 
1551    /* Can't find a wrapper */
1552    return NULL;
1553 }
1554 
1555 #endif // defined(VGP_ppc64_linux)
1556 
1557 /*--------------------------------------------------------------------*/
1558 /*--- end                                                          ---*/
1559 /*--------------------------------------------------------------------*/
1560