2 /*--------------------------------------------------------------------*/
3 /*--- Platform-specific syscalls stuff. syswrap-ppc64-linux.c ---*/
4 /*--------------------------------------------------------------------*/
7 This file is part of Valgrind, a dynamic binary instrumentation
10 Copyright (C) 2005-2010 Nicholas Nethercote <njn@valgrind.org>
11 Copyright (C) 2005-2010 Cerion Armour-Brown <cerion@open-works.co.uk>
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.
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.
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
28 The GNU General Public License is contained in the file COPYING.
31 #if defined(VGP_ppc64_linux)
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)
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"
59 /* ---------------------------------------------------------------------
61 ------------------------------------------------------------------ */
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,
73 // r5 = function descriptor
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. */
81 " .globl vgModuleLocal_call_on_new_stack_0_1\n"
82 " .section \".opd\",\"aw\"\n"
84 "vgModuleLocal_call_on_new_stack_0_1:\n"
85 " .quad .vgModuleLocal_call_on_new_stack_0_1,.TOC.@tocbase,0\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
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
132 Perform a clone system call. clone is strange because it has
133 fork()-like return-twice semantics, so it needs special
138 word (fn)(void*) in r3
139 void* child_stack in r4
142 pid_t* child_tid in r7
143 pid_t* parent_tid in r8
146 Note: r3 contains fn desc ptr, not fn ptr -- p_fn = p_fn_desc[0]
147 System call requires:
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)
157 Returns a ULong encoded as: top half is %cr following syscall,
158 low half is syscall return value (r3).
160 #define __NR_CLONE VG_STRINGIFY(__NR_clone)
161 #define __NR_EXIT VG_STRINGIFY(__NR_exit)
164 ULong do_syscall_clone_ppc64_linux ( Word (*fn)(void *),
170 void/*vki_modify_ldt_t*/ * );
173 " .globl do_syscall_clone_ppc64_linux\n"
174 " .section \".opd\",\"aw\"\n"
176 "do_syscall_clone_ppc64_linux:\n"
177 " .quad .do_syscall_clone_ppc64_linux,.TOC.@tocbase,0\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"
186 " mr 30,3\n" // preserve fn
187 " mr 31,6\n" // preserve arg
190 " rldicr 4,4, 0,59\n" // trim sp to multiple of 16 bytes
193 " stdu 0,-32(4)\n" // make initial stack frame
194 " mr 29,4\n" // preserve sp
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: ????
208 " mfcr 4\n" // CR now in low half r4
209 " sldi 4,4,32\n" // CR now in hi half r4
212 " srdi 3,3,32\n" // zero out hi half r3
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
218 /* CHILD - call thread function */
219 /* Note: 2.4 kernel doesn't set the child stack pointer,
221 That does leave a small window for a signal to be delivered
222 on the wrong stack, unfortunately. */
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()
230 " li 0,"__NR_EXIT"\n"
236 // PARENT or ERROR - return
247 // forward declarations
248 static void setup_child ( ThreadArchState*, ThreadArchState* );
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
254 2. initialize the thread's new VCPU state
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
260 static SysRes do_clone ( ThreadId ptid,
266 const Bool debug = False;
268 ThreadId ctid = VG_(alloc_ThreadState)();
269 ThreadState* ptst = VG_(get_ThreadState)(ptid);
270 ThreadState* ctst = VG_(get_ThreadState)(ctid);
275 vki_sigset_t blockall, savedmask;
277 VG_(sigfillset)(&blockall);
279 vg_assert(VG_(is_running_thread)(ptid));
280 vg_assert(VG_(is_valid_tid)(ctid));
282 stack = (UWord*)ML_(allocstack)(ctid);
284 res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
288 //? /* make a stack frame */
290 //? *(UWord *)stack = 0;
293 /* Copy register state
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.
299 The parent gets the child's new tid returned from clone, but the
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.
305 The child's TLS register (r2) gets set to the tlsaddr argument
306 if the CLONE_SETTLS flag is set.
308 setup_child( &ctst->arch, &ptst->arch );
310 /* Make sys_clone appear to have returned Success(0) in the
312 { UInt old_cr = LibVEX_GuestPPC64_get_CR( &ctst->arch.vex );
314 ctst->arch.vex.guest_GPR3 = 0;
316 LibVEX_GuestPPC64_put_CR( old_cr & ~(1<<28), &ctst->arch.vex );
320 ctst->arch.vex.guest_GPR1 = sp;
322 ctst->os_state.parent = ptid;
324 /* inherit signal mask */
325 ctst->sig_mask = ptst->sig_mask;
326 ctst->tmp_sig_mask = ptst->sig_mask;
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.
337 ctst->os_state.threadgroup = ptst->os_state.threadgroup;
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;
349 VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
352 VG_(printf)("\ntid %d: guessed client stack range %#lx-%#lx\n",
353 ctid, seg->start, VG_PGROUNDUP(sp));
355 VG_(message)(Vg_UserMsg,
356 "!? New thread %d starts with R1(%#lx) unmapped\n",
358 ctst->client_stack_szB = 0;
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 );
367 if (flags & VKI_CLONE_SETTLS) {
369 VG_(printf)("clone child has SETTLS: tls at %#lx\n", child_tls);
370 ctst->arch.vex.guest_GPR13 = child_tls;
373 flags &= ~VKI_CLONE_SETTLS;
375 /* start the thread with everything blocked */
376 VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
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
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)
393 VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
396 if (sr_isError(res)) {
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 );
409 /* ---------------------------------------------------------------------
411 ------------------------------------------------------------------ */
413 void VG_(cleanup_thread) ( ThreadArchState* arch )
417 void setup_child ( /*OUT*/ ThreadArchState *child,
418 /*IN*/ ThreadArchState *parent )
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;
427 /* ---------------------------------------------------------------------
428 PRE/POST wrappers for ppc64/Linux-specific syscalls
429 ------------------------------------------------------------------ */
431 #define PRE(name) DEFN_PRE_TEMPLATE(ppc64_linux, name)
432 #define POST(name) DEFN_POST_TEMPLATE(ppc64_linux, name)
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
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);
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])
462 *flags |= SfMayBlock;
463 PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
464 PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
466 switch (ARG1 /* request */) {
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 );
475 /* int socket(int domain, int type, int protocol); */
476 PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
480 /* int bind(int sockfd, struct sockaddr *my_addr,
482 PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
483 ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
487 /* int listen(int s, int backlog); */
488 PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
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 );
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 );
506 /* int sendto(int s, const void *msg, int len,
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 );
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 );
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 );
529 /* int recv(int s, void *buf, int len, unsigned int flags); */
531 The recv call is normally used only on a connected socket
532 (see connect(2)) and is identical to recvfrom with a NULL
535 PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
536 ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
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 );
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,
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,
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 );
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 );
574 case VKI_SYS_SHUTDOWN:
575 /* int shutdown(int s, int how); */
576 PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
579 case VKI_SYS_SENDMSG: {
580 /* int sendmsg(int s, const struct msghdr *msg, int flags); */
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) );
586 ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 );
590 case VKI_SYS_RECVMSG: {
591 /* int recvmsg(int s, struct msghdr *msg, int flags); */
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) );
597 ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
602 VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1);
603 SET_STATUS_Failure( VKI_EINVAL );
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])
625 switch (ARG1 /* request */) {
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
632 SET_STATUS_from_SysRes(r);
636 r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
637 SET_STATUS_from_SysRes(r);
641 /* int bind(int sockfd, struct sockaddr *my_addr,
646 /* int listen(int s, int backlog); */
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);
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 );
671 ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
674 case VKI_SYS_CONNECT:
677 case VKI_SYS_SETSOCKOPT:
680 case VKI_SYS_GETSOCKOPT:
681 ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
683 ARG2_2, ARG2_3, ARG2_4 );
686 case VKI_SYS_GETSOCKNAME:
687 ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
688 ARG2_0, ARG2_1, ARG2_2 );
691 case VKI_SYS_GETPEERNAME:
692 ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
693 ARG2_0, ARG2_1, ARG2_2 );
696 case VKI_SYS_SHUTDOWN:
699 case VKI_SYS_SENDMSG:
702 case VKI_SYS_RECVMSG:
703 ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
707 VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1);
708 VG_(core_panic)("... bye!\n");
709 break; /*NOTREACHED*/
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);
730 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
732 SET_STATUS_from_SysRes(r);
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);
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);
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
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) );
766 //zz POST(sys_stat64)
768 //zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
771 //zz PRE(sys_lstat64)
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) );
779 //zz POST(sys_lstat64)
781 //zz vg_assert(SUCCESS);
783 //zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
787 //zz PRE(sys_fstat64)
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) );
794 //zz POST(sys_fstat64)
796 //zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
799 static Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
801 Addr* a_p = (Addr*)a;
802 PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
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)
814 switch (ARG1 /* call */) {
816 ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
817 *flags |= SfMayBlock;
823 UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
824 ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
828 ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
829 *flags |= SfMayBlock;
832 ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
833 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
834 *flags |= SfMayBlock;
841 msgp = deref_Addr( tid,
842 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
844 msgtyp = deref_Addr( tid,
845 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
848 ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
850 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
851 *flags |= SfMayBlock;
857 ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
862 PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
863 w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
865 SET_STATUS_Failure( VKI_EINVAL );
871 if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
872 SET_STATUS_Failure( VKI_EINVAL );
876 case VKI_SHMCTL: /* IPCOP_shmctl */
877 ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
880 VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %ld\n", ARG1 );
881 VG_(core_panic)("... bye!\n");
882 break; /*NOTREACHED*/
889 switch (ARG1 /* call */) {
895 UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
896 ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
907 msgp = deref_Addr( tid,
908 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
910 msgtyp = deref_Addr( tid,
911 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
914 ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
920 ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
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 ) );
931 addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
932 ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
936 ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
941 ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
944 VG_(message)(Vg_DebugMsg,
945 "FATAL: unhandled syscall(ipc) %ld\n",
947 VG_(core_panic)("... bye!\n");
948 break; /*NOTREACHED*/
956 PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
957 PRE_REG_READ5(int, "clone",
958 unsigned long, flags,
960 int *, parent_tidptr,
962 int *, child_tidptr);
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),
968 SET_STATUS_Failure( VKI_EFAULT );
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),
976 SET_STATUS_Failure( VKI_EFAULT );
983 if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
984 SET_STATUS_Failure( VKI_EINVAL );
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(
996 (Addr)ARG2, /* child SP */
997 (Int *)ARG3, /* parent_tidptr */
998 (Int *)ARG5, /* child_tidptr */
999 (Addr)ARG4)); /* child_tls */
1002 case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
1003 /* FALLTHROUGH - assume vfork == fork */
1004 cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
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 */
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");
1022 ("Valgrind does not support general clone().");
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));
1031 /* Thread creation was successful; let the child have the chance
1033 *flags |= SfYieldAfter;
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);
1044 PRE(sys_rt_sigreturn)
1046 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
1047 an explanation of what follows. */
1050 PRINT("sys_rt_sigreturn ( )");
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));
1056 ///* Adjust esp to point to start of frame; skip back up over handler
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.
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.
1067 /* Restore register state from frame and remove it */
1068 VG_(sigframe_destroy)(tid, True);
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);
1075 /* Check to see if any signals arose as a result of this. */
1076 *flags |= SfPollAfter;
1079 //zz /* Convert from non-RT to RT sigset_t's */
1081 //zz void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigset_t *set)
1083 //zz VG_(sigemptyset)(set);
1084 //zz set->sig[0] = *oldset;
1086 //zz PRE(sys_sigaction)
1088 //zz struct vki_sigaction new, old;
1089 //zz struct vki_sigaction *newp, *oldp;
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);
1096 //zz newp = oldp = NULL;
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));
1108 //zz if (ARG3 != 0) {
1109 //zz PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction));
1113 //zz //jrs 20050207: what?! how can this make any sense?
1114 //zz //if (VG_(is_kerror)(SYSRES))
1117 //zz if (ARG2 != 0) {
1118 //zz struct vki_old_sigaction *oldnew = (struct vki_old_sigaction *)ARG2;
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);
1127 //zz SET_STATUS_from_SysRes( VG_(do_sys_sigaction)(ARG1, newp, oldp) );
1129 //zz if (ARG3 != 0 && SUCCESS && RES == 0) {
1130 //zz struct vki_old_sigaction *oldold = (struct vki_old_sigaction *)ARG3;
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];
1139 //zz POST(sys_sigaction)
1141 //zz vg_assert(SUCCESS);
1142 //zz if (RES == 0 && ARG3 != 0)
1143 //zz POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
1149 /* ---------------------------------------------------------------------
1150 The ppc64/Linux syscall table
1151 ------------------------------------------------------------------ */
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)
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).
1161 // For those syscalls not handled by Valgrind, the annotation indicate its
1162 // arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
1394 GENXY(__NR_ugetrlimit, sys_getrlimit), // 190
1395 // _____(__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 */
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
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 */
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
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
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 */
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
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
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
1462 // _____(__NR_swapcontext, sys_swapcontext), // 249
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 */
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
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
1482 LINX_(__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
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
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
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
1537 SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1539 const UInt syscall_table_size
1540 = sizeof(syscall_table) / sizeof(syscall_table[0]);
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 */
1551 /* Can't find a wrapper */
1555 #endif // defined(VGP_ppc64_linux)
1557 /*--------------------------------------------------------------------*/
1559 /*--------------------------------------------------------------------*/