syswrap-ppc64-linux.c revision e1dc03d3d421750c9128529bd05bb8554209d77d
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*--------------------------------------------------------------------*/
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*--- Platform-specific syscalls stuff.      syswrap-ppc64-linux.c ---*/
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*--------------------------------------------------------------------*/
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
60f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com/*
70f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   This file is part of Valgrind, a dynamic binary instrumentation
80f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   framework.
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
100f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   Copyright (C) 2005-2010 Nicholas Nethercote <njn@valgrind.org>
110f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   Copyright (C) 2005-2010 Cerion Armour-Brown <cerion@open-works.co.uk>
120f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
131744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com   This program is free software; you can redistribute it and/or
141744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com   modify it under the terms of the GNU General Public License as
151744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com   published by the Free Software Foundation; either version 2 of the
161744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com   License, or (at your option) any later version.
171744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com
180f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   This program is distributed in the hope that it will be useful, but
190f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   WITHOUT ANY WARRANTY; without even the implied warranty of
200f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
210f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   General Public License for more details.
220f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
230f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   You should have received a copy of the GNU General Public License
240f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   along with this program; if not, write to the Free Software
250f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
260f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   02111-1307, USA.
270f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
280f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   The GNU General Public License is contained in the file COPYING.
290f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com*/
300f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
310f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#if defined(VGP_ppc64_linux)
320f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
330f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_basics.h"
340f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_vki.h"
350f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_vkiscnums.h"
360f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_libcsetjmp.h"    // to keep _threadstate.h happy
370f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_threadstate.h"
380f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_aspacemgr.h"
390f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_debuglog.h"
400f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_libcbase.h"
410f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_libcassert.h"
420f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_libcprint.h"
430f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_libcproc.h"
440f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_libcsignal.h"
450f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_options.h"
460f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_scheduler.h"
470f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#include "pub_core_sigframe.h"      // For VG_(sigframe_destroy)()
48bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton#include "pub_core_signals.h"
49bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton#include "pub_core_syscall.h"
50bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton#include "pub_core_syswrap.h"
51bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton#include "pub_core_tooliface.h"
52bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton#include "pub_core_stacks.h"        // VG_(register_stack)
53bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton
54bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton#include "priv_types_n_macros.h"
55bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton#include "priv_syswrap-generic.h"   /* for decls of generic wrappers */
56bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton#include "priv_syswrap-linux.h"     /* for decls of linux-ish wrappers */
57bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton#include "priv_syswrap-main.h"
58bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton
59bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton
60bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton/* ---------------------------------------------------------------------
61bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton   clone() handling
62bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton   ------------------------------------------------------------------ */
63bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton
64bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton/* Call f(arg1), but first switch stacks, using 'stack' as the new
65bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton   stack, and use 'retaddr' as f's return-to address.  Also, clear all
66bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton   the integer registers before entering f.*/
67bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton__attribute__((noreturn))
68bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdaltonvoid ML_(call_on_new_stack_0_1) ( Addr stack,
69bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton                                  Addr retaddr,
700f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                                  void (*f_desc)(Word),
710f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                                  Word arg1 );
720f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//    r3 = stack
730f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//    r4 = retaddr
740f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//    r5 = function descriptor
750f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//    r6 = arg1
760f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com/* On PPC64, a func ptr is represented by a TOC entry ptr.
770f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   This TOC entry contains three words; the first word is the function
780f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   address, the second word is the TOC ptr (r2), and the third word is
790f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   the static chain value. */
800f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.comasm(
810f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .align   2\n"
820f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .globl   vgModuleLocal_call_on_new_stack_0_1\n"
830f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .section \".opd\",\"aw\"\n"
840f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .align   3\n"
850f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"vgModuleLocal_call_on_new_stack_0_1:\n"
860f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .quad    .vgModuleLocal_call_on_new_stack_0_1,.TOC.@tocbase,0\n"
870f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .previous\n"
880f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .type    .vgModuleLocal_call_on_new_stack_0_1,@function\n"
890f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .globl   .vgModuleLocal_call_on_new_stack_0_1\n"
900f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com".vgModuleLocal_call_on_new_stack_0_1:\n"
91271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com"   mr    %r1,%r3\n\t"     // stack to %sp
92271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com"   mtlr  %r4\n\t"         // retaddr to %lr
93271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com"   ld 5,0(5)\n\t"         // load f_ptr from f_desc[0]
94271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com"   mtctr %r5\n\t"         // f_ptr to count reg
95271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com"   mr %r3,%r6\n\t"        // arg1 to %r3
96271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com"   li 0,0\n\t"            // zero all GP regs
970f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 4,0\n\t"
980f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 5,0\n\t"
990f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 6,0\n\t"
1000f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 7,0\n\t"
1010f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 8,0\n\t"
1020f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 9,0\n\t"
1030f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 10,0\n\t"
1040f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 11,0\n\t"
1050f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 12,0\n\t"
1060f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 13,0\n\t"
1070f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 14,0\n\t"
1080f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 15,0\n\t"
1090f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 16,0\n\t"
1100f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 17,0\n\t"
1110f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 18,0\n\t"
1120f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 19,0\n\t"
11373063dc517f424ad5660db0fbc5fe6fcc13f77f7jvanverth"   li 20,0\n\t"
11473063dc517f424ad5660db0fbc5fe6fcc13f77f7jvanverth"   li 21,0\n\t"
1150f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 22,0\n\t"
116d7a2c1f5fd710581d6233de5c202d3f2627948e0jvanverth"   li 23,0\n\t"
117d7a2c1f5fd710581d6233de5c202d3f2627948e0jvanverth"   li 24,0\n\t"
118d7a2c1f5fd710581d6233de5c202d3f2627948e0jvanverth"   li 25,0\n\t"
1190f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 26,0\n\t"
12073063dc517f424ad5660db0fbc5fe6fcc13f77f7jvanverth"   li 27,0\n\t"
1210f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 28,0\n\t"
1220f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 29,0\n\t"
1230f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 30,0\n\t"
1240f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   li 31,0\n\t"
1250f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   mtxer 0\n\t"           // CAB: Need this?
1260f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   mtcr 0\n\t"            // CAB: Need this?
1270f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   bctr\n\t"              // jump to dst
1280f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   trap\n"                // should never get here
1290f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com);
1300f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
1310f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
1320f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com/*
1330f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        Perform a clone system call.  clone is strange because it has
1340f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        fork()-like return-twice semantics, so it needs special
1350f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        handling here.
1360f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
1370f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        Upon entry, we have:
1380f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
1390f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            word (fn)(void*)    in r3
1400f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            void* child_stack   in r4
1410f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            word flags          in r5
1420f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            void* arg           in r6
1430f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            pid_t* child_tid    in r7
1440f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            pid_t* parent_tid   in r8
1450f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            void* ???           in r9
1460f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
1470f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        Note: r3 contains fn desc ptr, not fn ptr -- p_fn = p_fn_desc[0]
1480f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        System call requires:
1490f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
1500f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            int    $__NR_clone  in r0  (sc number)
1510f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            int    flags        in r3  (sc arg1)
1520f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            void*  child_stack  in r4  (sc arg2)
1530f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            pid_t* parent_tid   in r5  (sc arg3)
1540f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            ??     child_tls    in r6  (sc arg4)
155469d0dd944833444a363591be1ee6a76bdecf96dbsalomon@google.com            pid_t* child_tid    in r7  (sc arg5)
156469d0dd944833444a363591be1ee6a76bdecf96dbsalomon@google.com            void*  ???          in r8  (sc arg6)
157469d0dd944833444a363591be1ee6a76bdecf96dbsalomon@google.com
158469d0dd944833444a363591be1ee6a76bdecf96dbsalomon@google.com        Returns a ULong encoded as: top half is %cr following syscall,
159469d0dd944833444a363591be1ee6a76bdecf96dbsalomon@google.com        low half is syscall return value (r3).
160469d0dd944833444a363591be1ee6a76bdecf96dbsalomon@google.com */
161469d0dd944833444a363591be1ee6a76bdecf96dbsalomon@google.com#define __NR_CLONE        VG_STRINGIFY(__NR_clone)
162469d0dd944833444a363591be1ee6a76bdecf96dbsalomon@google.com#define __NR_EXIT         VG_STRINGIFY(__NR_exit)
16399babf2848095febfc5f98b47f3a6c232411147fjvanverth
1642279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholasextern
1650f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.comULong do_syscall_clone_ppc64_linux ( Word (*fn)(void *),
1660f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                                     void* stack,
1670f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                                     Int   flags,
1680f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                                     void* arg,
1690f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                                     Int*  child_tid,
1700f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                                     Int*  parent_tid,
1710f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                                     void/*vki_modify_ldt_t*/ * );
1720f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.comasm(
1730f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .align   2\n"
1740f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .globl   do_syscall_clone_ppc64_linux\n"
1750f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .section \".opd\",\"aw\"\n"
1760f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .align   3\n"
1770f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"do_syscall_clone_ppc64_linux:\n"
1780f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .quad    .do_syscall_clone_ppc64_linux,.TOC.@tocbase,0\n"
1790f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .previous\n"
1800f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .type    .do_syscall_clone_ppc64_linux,@function\n"
1810f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"   .globl   .do_syscall_clone_ppc64_linux\n"
1820f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com".do_syscall_clone_ppc64_linux:\n"
1830f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       stdu    1,-64(1)\n"
1840f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       std     29,40(1)\n"
1850f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       std     30,48(1)\n"
1860f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       std     31,56(1)\n"
1870f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mr      30,3\n"              // preserve fn
1880f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mr      31,6\n"              // preserve arg
1890f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
1900f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        // setup child stack
1910f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       rldicr  4,4, 0,59\n"         // trim sp to multiple of 16 bytes
1920f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                                     // (r4 &= ~0xF)
1930f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       li      0,0\n"
1940f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       stdu    0,-32(4)\n"          // make initial stack frame
1950f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mr      29,4\n"              // preserve sp
1960f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
1970f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        // setup syscall
1980f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       li      0,"__NR_CLONE"\n"    // syscall number
1990f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mr      3,5\n"               // syscall arg1: flags
2000f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        // r4 already setup          // syscall arg2: child_stack
2010f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mr      5,8\n"               // syscall arg3: parent_tid
2020f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mr      6,13\n"              // syscall arg4: REAL THREAD tls
2030f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mr      7,7\n"               // syscall arg5: child_tid
2040f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mr      8,8\n"               // syscall arg6: ????
2050f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mr      9,9\n"               // syscall arg7: ????
2060f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
2070f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       sc\n"                        // clone()
2080f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
2098ef3fd0ca6595adb9a8172c84dc0c55c9c096e09bsalomon@google.com"       mfcr    4\n"                 // CR now in low half r4
2100f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       sldi    4,4,32\n"            // CR now in hi half r4
21156d11e097b1975371d0e0b1452ac0c4d5fc46930bsalomon@google.com
2120f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       sldi    3,3,32\n"
2130f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       srdi    3,3,32\n"            // zero out hi half r3
2140f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
2150f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       or      3,3,4\n"             // r3 = CR : syscall-retval
2160f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       cmpwi   3,0\n"               // child if retval == 0 (note, cmpw)
2170f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       bne     1f\n"                // jump if !child
2180f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
2190f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        /* CHILD - call thread function */
2200f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        /* Note: 2.4 kernel doesn't set the child stack pointer,
2210f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com           so we do it here.
2220f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com           That does leave a small window for a signal to be delivered
2230f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com           on the wrong stack, unfortunately. */
2240f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mr      1,29\n"
2250f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       ld      30, 0(30)\n"         // convert fn desc ptr to fn ptr
2260f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mtctr   30\n"                // ctr reg = fn
2270f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       mr      3,31\n"              // r3 = arg
2280f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       bctrl\n"                     // call fn()
229c9668ecdb7188a90b050771727da899c54dc7013bsalomon@google.com
230c9668ecdb7188a90b050771727da899c54dc7013bsalomon@google.com        // exit with result
231c9668ecdb7188a90b050771727da899c54dc7013bsalomon@google.com"       li      0,"__NR_EXIT"\n"
232c9668ecdb7188a90b050771727da899c54dc7013bsalomon@google.com"       sc\n"
2330f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
2340f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        // Exit returned?!
2350f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       .long   0\n"
2360f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
2370f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com        // PARENT or ERROR - return
2380f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"1:     ld      29,40(1)\n"
2390f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       ld      30,48(1)\n"
2400f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       ld      31,56(1)\n"
2410f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       addi    1,1,64\n"
2420f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com"       blr\n"
243c2dbbb6ac2fee5461a906d1a18e5f410acadb452commit-bot@chromium.org);
244d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel
245d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel#undef __NR_CLONE
246d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel#undef __NR_EXIT
247d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel
248d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel// forward declarations
249d588c01c7e48663d6d61686e47daf63b9b0b3d12egdanielstatic void setup_child ( ThreadArchState*, ThreadArchState* );
250d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel
251d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel/*
252d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   When a client clones, we need to keep track of the new thread.  This means:
253d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   1. allocate a ThreadId+ThreadState+stack for the the thread
254d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel
255d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   2. initialize the thread's new VCPU state
256d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel
257d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   3. create the thread using the same args as the client requested,
258d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   but using the scheduler entrypoint for IP, and a separate stack
259d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   for SP.
260d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel */
261d588c01c7e48663d6d61686e47daf63b9b0b3d12egdanielstatic SysRes do_clone ( ThreadId ptid,
262d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel                         UInt flags, Addr sp,
263d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel                         Int *parent_tidptr,
264d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel                         Int *child_tidptr,
265d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel                         Addr child_tls)
266d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel{
267d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   const Bool debug = False;
268d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel
269d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   ThreadId     ctid = VG_(alloc_ThreadState)();
270d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   ThreadState* ptst = VG_(get_ThreadState)(ptid);
271d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   ThreadState* ctst = VG_(get_ThreadState)(ctid);
272d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   ULong        word64;
273d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   UWord*       stack;
274d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   NSegment const* seg;
275d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   SysRes       res;
276d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   vki_sigset_t blockall, savedmask;
277d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel
278d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   VG_(sigfillset)(&blockall);
279d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel
280d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   vg_assert(VG_(is_running_thread)(ptid));
281d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   vg_assert(VG_(is_valid_tid)(ctid));
282d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel
283d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   stack = (UWord*)ML_(allocstack)(ctid);
284d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   if (stack == NULL) {
285d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel      res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
286d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel      goto out;
287d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel   }
288d588c01c7e48663d6d61686e47daf63b9b0b3d12egdaniel
28954c6fe8519f2927181a0847d22a61190529645e8bsalomon//?   /* make a stack frame */
29054c6fe8519f2927181a0847d22a61190529645e8bsalomon//?   stack -= 16;
29154c6fe8519f2927181a0847d22a61190529645e8bsalomon//?   *(UWord *)stack = 0;
29254c6fe8519f2927181a0847d22a61190529645e8bsalomon
29354c6fe8519f2927181a0847d22a61190529645e8bsalomon
29454c6fe8519f2927181a0847d22a61190529645e8bsalomon   /* Copy register state
29554c6fe8519f2927181a0847d22a61190529645e8bsalomon
29654c6fe8519f2927181a0847d22a61190529645e8bsalomon      Both parent and child return to the same place, and the code
29754c6fe8519f2927181a0847d22a61190529645e8bsalomon      following the clone syscall works out which is which, so we
29854c6fe8519f2927181a0847d22a61190529645e8bsalomon      don't need to worry about it.
29954c6fe8519f2927181a0847d22a61190529645e8bsalomon
30054c6fe8519f2927181a0847d22a61190529645e8bsalomon      The parent gets the child's new tid returned from clone, but the
30154c6fe8519f2927181a0847d22a61190529645e8bsalomon      child gets 0.
30254c6fe8519f2927181a0847d22a61190529645e8bsalomon
30354c6fe8519f2927181a0847d22a61190529645e8bsalomon      If the clone call specifies a NULL SP for the new thread, then
30454c6fe8519f2927181a0847d22a61190529645e8bsalomon      it actually gets a copy of the parent's SP.
30554c6fe8519f2927181a0847d22a61190529645e8bsalomon
30654c6fe8519f2927181a0847d22a61190529645e8bsalomon      The child's TLS register (r2) gets set to the tlsaddr argument
30754c6fe8519f2927181a0847d22a61190529645e8bsalomon      if the CLONE_SETTLS flag is set.
30854c6fe8519f2927181a0847d22a61190529645e8bsalomon   */
30954c6fe8519f2927181a0847d22a61190529645e8bsalomon   setup_child( &ctst->arch, &ptst->arch );
31054c6fe8519f2927181a0847d22a61190529645e8bsalomon
31154c6fe8519f2927181a0847d22a61190529645e8bsalomon   /* Make sys_clone appear to have returned Success(0) in the
31254c6fe8519f2927181a0847d22a61190529645e8bsalomon      child. */
31354c6fe8519f2927181a0847d22a61190529645e8bsalomon   { UInt old_cr = LibVEX_GuestPPC64_get_CR( &ctst->arch.vex );
31454c6fe8519f2927181a0847d22a61190529645e8bsalomon     /* %r3 = 0 */
31554c6fe8519f2927181a0847d22a61190529645e8bsalomon     ctst->arch.vex.guest_GPR3 = 0;
31654c6fe8519f2927181a0847d22a61190529645e8bsalomon     /* %cr0.so = 0 */
31754c6fe8519f2927181a0847d22a61190529645e8bsalomon     LibVEX_GuestPPC64_put_CR( old_cr & ~(1<<28), &ctst->arch.vex );
318c2dbbb6ac2fee5461a906d1a18e5f410acadb452commit-bot@chromium.org   }
3190f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3200f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   if (sp != 0)
3210f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ctst->arch.vex.guest_GPR1 = sp;
3220f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3230f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   ctst->os_state.parent = ptid;
3240f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3250f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   /* inherit signal mask */
3260f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   ctst->sig_mask = ptst->sig_mask;
3270f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   ctst->tmp_sig_mask = ptst->sig_mask;
3280f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3290f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   /* Start the child with its threadgroup being the same as the
3300f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      parent's.  This is so that any exit_group calls that happen
3310f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      after the child is created but before it sets its
3320f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      os_state.threadgroup field for real (in thread_wrapper in
3330f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      syswrap-linux.c), really kill the new thread.  a.k.a this avoids
3340f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      a race condition in which the thread is unkillable (via
33528f9c606e4c8e61015e864219c4bc83a3fdb4a86jvanverth      exit_group) because its threadgroup is not set.  The race window
3360f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      is probably only a few hundred or a few thousand cycles long.
33728f9c606e4c8e61015e864219c4bc83a3fdb4a86jvanverth      See #226116. */
3380f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   ctst->os_state.threadgroup = ptst->os_state.threadgroup;
3390f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3400f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   /* We don't really know where the client stack is, because its
3410f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      allocated by the client.  The best we can do is look at the
3420f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      memory mappings and try to derive some useful information.  We
3430f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      assume that esp starts near its highest possible value, and can
3440f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      only go down to the start of the mmaped segment. */
3450f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   seg = VG_(am_find_nsegment)(sp);
3460f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   if (seg && seg->kind != SkResvn) {
3470f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp);
3480f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
3490f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3500f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
3510f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3520f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      if (debug)
3530f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com	 VG_(printf)("\ntid %d: guessed client stack range %#lx-%#lx\n",
3540f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com		     ctid, seg->start, VG_PGROUNDUP(sp));
3550f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   } else {
3560f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      VG_(message)(Vg_UserMsg,
3570f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                   "!? New thread %d starts with R1(%#lx) unmapped\n",
3580f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com		   ctid, sp);
3590f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ctst->client_stack_szB  = 0;
3600f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   }
3610f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3620f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   /* Assume the clone will succeed, and tell any tool that wants to
3630f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      know that this thread has come into existence.  If the clone
3640f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      fails, we'll send out a ll_exit notification for it at the out:
3650f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      label below, to clean up. */
3660f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   VG_TRACK ( pre_thread_ll_create, ptid, ctid );
3670f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3680f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   if (flags & VKI_CLONE_SETTLS) {
3690f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      if (debug)
3700f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com         VG_(printf)("clone child has SETTLS: tls at %#lx\n", child_tls);
3710f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ctst->arch.vex.guest_GPR13 = child_tls;
3720f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   }
3730f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3740f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   flags &= ~VKI_CLONE_SETTLS;
3750f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3760f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   /* start the thread with everything blocked */
3770f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
3780f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3790f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   /* Create the new thread */
3800f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   word64 = do_syscall_clone_ppc64_linux(
3810f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com               ML_(start_thread_NORETURN),
3820f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com               stack, flags, &VG_(threads)[ctid],
3830f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com               child_tidptr, parent_tidptr, NULL
3840f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            );
3850f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3860f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   /* Low half word64 is syscall return value.  Hi half is
3870f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      the entire CR, from which we need to extract CR0.SO. */
3880f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   /* VG_(printf)("word64 = 0x%llx\n", word64); */
3890f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   res = VG_(mk_SysRes_ppc64_linux)(
3900f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            /*val*/(UInt)(word64 & 0xFFFFFFFFULL),
3910f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com            /*errflag*/ (UInt)((word64 >> (32+28)) & 1)
3920f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com         );
3930f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3940f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
3950f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
3960f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  out:
3970f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   if (sr_isError(res)) {
3980f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      /* clone failed */
3990f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      VG_(cleanup_thread)(&ctst->arch);
4000f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ctst->status = VgTs_Empty;
40185b505bedc35369283ca3aa4449962622842b720bsalomon@google.com      /* oops.  Better tell the tool the thread exited in a hurry :-) */
40285b505bedc35369283ca3aa4449962622842b720bsalomon@google.com      VG_TRACK( pre_thread_ll_exit, ctid );
40385b505bedc35369283ca3aa4449962622842b720bsalomon@google.com   }
4040f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
4050f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   return res;
4060f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com}
407c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com
4080f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
4090f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
410c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com/* ---------------------------------------------------------------------
411280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com   More thread stuff
4120f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   ------------------------------------------------------------------ */
413443e5a52b7e85070c26a068cd3b0aad126502395robertphillips@google.com
41428f9c606e4c8e61015e864219c4bc83a3fdb4a86jvanverthvoid VG_(cleanup_thread) ( ThreadArchState* arch )
415fb5df43af87e77beeb7ca0759678f0cc95a8c6dajvanverth{
41628f9c606e4c8e61015e864219c4bc83a3fdb4a86jvanverth}
417443e5a52b7e85070c26a068cd3b0aad126502395robertphillips@google.com
4180f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.comvoid setup_child ( /*OUT*/ ThreadArchState *child,
4190f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                   /*IN*/  ThreadArchState *parent )
4200f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com{
4210f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   /* We inherit our parent's guest state. */
4220f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   child->vex = parent->vex;
4230f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   child->vex_shadow1 = parent->vex_shadow1;
4240f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   child->vex_shadow2 = parent->vex_shadow2;
4252279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas}
4262279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas
4272279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas
4282279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas/* ---------------------------------------------------------------------
4292279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas   PRE/POST wrappers for ppc64/Linux-specific syscalls
4302279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas   ------------------------------------------------------------------ */
4312279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas
4322279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas#define PRE(name)       DEFN_PRE_TEMPLATE(ppc64_linux, name)
4332279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas#define POST(name)      DEFN_POST_TEMPLATE(ppc64_linux, name)
4342279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas
4352279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas/* Add prototypes for the wrappers declared here, so that gcc doesn't
4362279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas   harass us for not having prototypes.  Really this is a kludge --
4372279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas   the right thing to do is to make these wrappers 'static' since they
4382279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas   aren't visible outside this file, but that requires even more macro
4392279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas   magic. */
4402279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas
4412279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholasDECL_TEMPLATE(ppc64_linux, sys_socketcall);
4422279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholasDECL_TEMPLATE(ppc64_linux, sys_mmap);
4432279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas//zz DECL_TEMPLATE(ppc64_linux, sys_mmap2);
4442279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas//zz DECL_TEMPLATE(ppc64_linux, sys_stat64);
4452279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas//zz DECL_TEMPLATE(ppc64_linux, sys_lstat64);
4462279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholas//zz DECL_TEMPLATE(ppc64_linux, sys_fstat64);
4472279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholasDECL_TEMPLATE(ppc64_linux, sys_ipc);
4482279325d539700ee3da29d6e874b3b3ce1dcf49cethannicholasDECL_TEMPLATE(ppc64_linux, sys_clone);
4490f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz DECL_TEMPLATE(ppc64_linux, sys_sigreturn);
4500f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.comDECL_TEMPLATE(ppc64_linux, sys_rt_sigreturn);
4510f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.comDECL_TEMPLATE(ppc64_linux, sys_fadvise64);
4520f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
4530f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.comPRE(sys_socketcall)
4540f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com{
4550f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_0  (((UWord*)ARG2)[0])
4560f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_1  (((UWord*)ARG2)[1])
4570f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_2  (((UWord*)ARG2)[2])
4580f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_3  (((UWord*)ARG2)[3])
4590f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_4  (((UWord*)ARG2)[4])
4600f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_5  (((UWord*)ARG2)[5])
4610f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
4620f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   *flags |= SfMayBlock;
4630f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
4640f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
4650f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
4660f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   switch (ARG1 /* request */) {
4670f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
4680f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_SOCKETPAIR:
4690f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int socketpair(int d, int type, int protocol, int sv[2]); */
4700f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
4710f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
4720f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      break;
4730f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
4740f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_SOCKET:
4750f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int socket(int domain, int type, int protocol); */
4761744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com      PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
4771744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com      break;
4781744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com
4790f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_BIND:
480c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com     /* int bind(int sockfd, struct sockaddr *my_addr,
481c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com	int addrlen); */
482c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com      PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
4830f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
4840f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      break;
4850f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
4860f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_LISTEN:
4870f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int listen(int s, int backlog); */
4880f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
4890f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      break;
4900f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
4910f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_ACCEPT: {
4920f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int accept(int s, struct sockaddr *addr, int *addrlen); */
4930f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
4940f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
4950f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      break;
49607dd2bfd7451ef7052cf53958e6561fd6c5563a3bsalomon@google.com   }
49707dd2bfd7451ef7052cf53958e6561fd6c5563a3bsalomon@google.com
49807dd2bfd7451ef7052cf53958e6561fd6c5563a3bsalomon@google.com   case VKI_SYS_ACCEPT4: {
4990f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
5000f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      PRE_MEM_READ( "socketcall.accept4(args)", ARG2, 4*sizeof(Addr) );
5010f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
5020f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      break;
5030f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   }
50407dd2bfd7451ef7052cf53958e6561fd6c5563a3bsalomon@google.com
5050f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_SENDTO:
5060f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int sendto(int s, const void *msg, int len,
5070f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                    unsigned int flags,
5080f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                    const struct sockaddr *to, int tolen); */
5090f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
5100f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
5110f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com				  ARG2_3, ARG2_4, ARG2_5 );
5120f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     break;
5130f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
5140f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_SEND:
5150f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int send(int s, const void *msg, size_t len, int flags); */
5160f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
5170f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
5180f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     break;
5190f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
5200f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_RECVFROM:
5210f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int recvfrom(int s, void *buf, int len, unsigned int flags,
5220f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com	struct sockaddr *from, int *fromlen); */
5230f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
5240f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
5250f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com				    ARG2_3, ARG2_4, ARG2_5 );
5260f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     break;
5270f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
5280f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_RECV:
5290f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int recv(int s, void *buf, int len, unsigned int flags); */
5300f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* man 2 recv says:
5310f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com         The  recv call is normally used only on a connected socket
5320f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com         (see connect(2)) and is identical to recvfrom with a  NULL
5330f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com         from parameter.
5340f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     */
5350f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
5360f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
5370f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     break;
5380f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
5390f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_CONNECT:
5400f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int connect(int sockfd,
5410f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com	struct sockaddr *serv_addr, int addrlen ); */
5420f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
5430f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
5440f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     break;
5450f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
5460f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_SETSOCKOPT:
5470f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int setsockopt(int s, int level, int optname,
5480f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com	const void *optval, int optlen); */
5490f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
5500f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
5510f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com				      ARG2_3, ARG2_4 );
5520f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     break;
5530f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
55446fbfe0cd1bbe60fd15ce52e784f5d51450ff5fdcommit-bot@chromium.org   case VKI_SYS_GETSOCKOPT:
5550f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int getsockopt(int s, int level, int optname,
5560f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com	void *optval, socklen_t *optlen); */
5570f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
5580f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
5590f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com				    ARG2_3, ARG2_4 );
5600f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     break;
56185b505bedc35369283ca3aa4449962622842b720bsalomon@google.com
56285b505bedc35369283ca3aa4449962622842b720bsalomon@google.com   case VKI_SYS_GETSOCKNAME:
56385b505bedc35369283ca3aa4449962622842b720bsalomon@google.com     /* int getsockname(int s, struct sockaddr* name, int* namelen) */
56485b505bedc35369283ca3aa4449962622842b720bsalomon@google.com     PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
56585b505bedc35369283ca3aa4449962622842b720bsalomon@google.com     ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
56685b505bedc35369283ca3aa4449962622842b720bsalomon@google.com     break;
56785b505bedc35369283ca3aa4449962622842b720bsalomon@google.com
5680f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_GETPEERNAME:
56985b505bedc35369283ca3aa4449962622842b720bsalomon@google.com     /* int getpeername(int s, struct sockaddr* name, int* namelen) */
57085b505bedc35369283ca3aa4449962622842b720bsalomon@google.com     PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
57185b505bedc35369283ca3aa4449962622842b720bsalomon@google.com     ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
572cee661af926cc977addc6e039b7022975a448acebsalomon@google.com     break;
573cee661af926cc977addc6e039b7022975a448acebsalomon@google.com
574cee661af926cc977addc6e039b7022975a448acebsalomon@google.com   case VKI_SYS_SHUTDOWN:
575cee661af926cc977addc6e039b7022975a448acebsalomon@google.com     /* int shutdown(int s, int how); */
576cee661af926cc977addc6e039b7022975a448acebsalomon@google.com     PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
5770f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     break;
5780f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
5790f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_SENDMSG: {
58046fbfe0cd1bbe60fd15ce52e784f5d51450ff5fdcommit-bot@chromium.org     /* int sendmsg(int s, const struct msghdr *msg, int flags); */
58146fbfe0cd1bbe60fd15ce52e784f5d51450ff5fdcommit-bot@chromium.org
5820f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* this causes warnings, and I don't get why. glibc bug?
5830f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      * (after all it's glibc providing the arguments array)
5840f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com       PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
5850f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     */
5860f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 );
5870f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     break;
5880f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   }
5890f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
5900f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   case VKI_SYS_RECVMSG: {
5910f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* int recvmsg(int s, struct msghdr *msg, int flags); */
5920f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
5930f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     /* this causes warnings, and I don't get why. glibc bug?
594cee661af926cc977addc6e039b7022975a448acebsalomon@google.com      * (after all it's glibc providing the arguments array)
595cee661af926cc977addc6e039b7022975a448acebsalomon@google.com       PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
596cee661af926cc977addc6e039b7022975a448acebsalomon@google.com     */
597cee661af926cc977addc6e039b7022975a448acebsalomon@google.com     ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
598cee661af926cc977addc6e039b7022975a448acebsalomon@google.com     break;
5990f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   }
6000f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6010f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   default:
6020f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1);
6030f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     SET_STATUS_Failure( VKI_EINVAL );
6040f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com     break;
6050f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   }
606fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com#  undef ARG2_0
607fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com#  undef ARG2_1
6080f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  undef ARG2_2
6090f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  undef ARG2_3
6100f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  undef ARG2_4
6110f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  undef ARG2_5
6120f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com}
6130f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6140f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.comPOST(sys_socketcall)
6150f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com{
6160f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_0  (((UWord*)ARG2)[0])
6170f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_1  (((UWord*)ARG2)[1])
6180f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_2  (((UWord*)ARG2)[2])
6190f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_3  (((UWord*)ARG2)[3])
6200f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_4  (((UWord*)ARG2)[4])
6210f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  define ARG2_5  (((UWord*)ARG2)[5])
6220f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6230f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  SysRes r;
6240f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  vg_assert(SUCCESS);
6250f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  switch (ARG1 /* request */) {
6260f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6270f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_SOCKETPAIR:
6280f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    r = ML_(generic_POST_sys_socketpair)(
6290f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com					 tid, VG_(mk_SysRes_Success)(RES),
6300f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com					 ARG2_0, ARG2_1, ARG2_2, ARG2_3
6310f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com					 );
6320f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    SET_STATUS_from_SysRes(r);
6330f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6340f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6350f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_SOCKET:
6360f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
6370f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    SET_STATUS_from_SysRes(r);
6380f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6390f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6400f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_BIND:
6410f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    /* int bind(int sockfd, struct sockaddr *my_addr,
6420f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com       int addrlen); */
6430f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6440f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6450f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_LISTEN:
6460f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    /* int listen(int s, int backlog); */
6470f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6480f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6490f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_ACCEPT:
6500f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_ACCEPT4:
6510f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    /* int accept(int s, struct sockaddr *addr, int *addrlen); */
6520f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
6530f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
6540f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com				      ARG2_0, ARG2_1, ARG2_2 );
6550f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    SET_STATUS_from_SysRes(r);
6560f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6570f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6580f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_SENDTO:
6590f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6600f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6610f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_SEND:
6620f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6630f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6640f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_RECVFROM:
6650f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
6660f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com				    ARG2_0, ARG2_1, ARG2_2,
6670f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com				    ARG2_3, ARG2_4, ARG2_5 );
6680f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6690f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6700f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_RECV:
6710f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
6720f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6730f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
674ce6da4d96ae00a66c56c45a3b902224d8b3e6cf7commit-bot@chromium.org  case VKI_SYS_CONNECT:
6750f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6760f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6770f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_SETSOCKOPT:
6780f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6790f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6800f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_GETSOCKOPT:
6810f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
6820f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com				    ARG2_0, ARG2_1,
6830f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com				    ARG2_2, ARG2_3, ARG2_4 );
6840f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6850f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6860f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_GETSOCKNAME:
6870f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
6880f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com				       ARG2_0, ARG2_1, ARG2_2 );
6890f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6900f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6910f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_GETPEERNAME:
6920f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
6930f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com				       ARG2_0, ARG2_1, ARG2_2 );
6940f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6950f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6960f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_SHUTDOWN:
6970f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
6980f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
6990f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_SENDMSG:
7000f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
7010f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
7020f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  case VKI_SYS_RECVMSG:
7030f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
7040f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break;
7050f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
7060f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  default:
7070f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1);
7080f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    VG_(core_panic)("... bye!\n");
7090f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    break; /*NOTREACHED*/
7100f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com  }
7110f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  undef ARG2_0
7120f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com#  undef ARG2_1
713d7a2c1f5fd710581d6233de5c202d3f2627948e0jvanverth#  undef ARG2_2
714d7a2c1f5fd710581d6233de5c202d3f2627948e0jvanverth#  undef ARG2_3
715c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com#  undef ARG2_4
716c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com#  undef ARG2_5
717160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org}
718160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org
719160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.orgPRE(sys_mmap)
720160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org{
721160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org   SysRes r;
722160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org
723160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org   PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %ld, %ld )",
724160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org         ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
7250f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   PRE_REG_READ6(long, "mmap",
7260f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                 unsigned long, start, unsigned long, length,
7270f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                 unsigned long, prot,  unsigned long, flags,
7280f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                 unsigned long, fd,    unsigned long, offset);
7290f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
7300f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
7310f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com                                       (Off64T)ARG6 );
7320f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   SET_STATUS_from_SysRes(r);
7330f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com}
7340f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
7350f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz PRE(sys_mmap2)
7360f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz {
7370f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz    SysRes r;
7380f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz
7390f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz    // Exactly like old_mmap() except:
7400f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz    //  - the file offset is specified in 4K units rather than bytes,
7410f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz    //    so that it can be used for files bigger than 2^32 bytes.
7420f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz    PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )",
7430f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz          ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
7440f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz    PRE_REG_READ6(long, "mmap2",
7450f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz                  unsigned long, start, unsigned long, length,
7460f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz                  unsigned long, prot,  unsigned long, flags,
747373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz                  unsigned long, fd,    unsigned long, offset);
748373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz
749373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz    r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
750373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz                                        4096 * (Off64T)ARG6 );
751373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz    SET_STATUS_from_SysRes(r);
752373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz }
753373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz
754373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz // XXX: lstat64/fstat64/stat64 are generic, but not necessarily
755373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz // applicable to every architecture -- I think only to 32-bit archs.
756373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz // We're going to need something like linux/core_os32.h for such
757373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz // things, eventually, I think.  --njn
758373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz PRE(sys_stat64)
759373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com//zz {
7600f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz    PRINT("sys_stat64 ( %p, %p )",ARG1,ARG2);
7610f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz    PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
762c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com//zz    PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
763c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com//zz    PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
764c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com//zz }
7650f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz
7660f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz POST(sys_stat64)
7670f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz {
7680f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz    POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
7690f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz }
770c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com//zz
771ee5da55477d1679eaf50b56b6017cbfc07af02a7joshualitt//zz PRE(sys_lstat64)
7723f801cbb67895fa9fa29498aa017a7666960a627jvanverth//zz {
773cee661af926cc977addc6e039b7022975a448acebsalomon@google.com//zz    PRINT("sys_lstat64 ( %p(%s), %p )",ARG1,ARG1,ARG2);
774280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com//zz    PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
775cee661af926cc977addc6e039b7022975a448acebsalomon@google.com//zz    PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
776cee661af926cc977addc6e039b7022975a448acebsalomon@google.com//zz    PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
777cee661af926cc977addc6e039b7022975a448acebsalomon@google.com//zz }
778cee661af926cc977addc6e039b7022975a448acebsalomon@google.com//zz
7790f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz POST(sys_lstat64)
7800f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz {
781c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com//zz    vg_assert(SUCCESS);
7820f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz    if (RES == 0) {
783c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com//zz       POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
784c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com//zz    }
785c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com//zz }
786c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com//zz
787c312bf9935ef56a44e277bbd6d28b4f5f35fc19absalomon@google.com//zz PRE(sys_fstat64)
788f3a60c09b975f50bbd14215df10effffd2fd46e8bsalomon@google.com//zz {
789f3a60c09b975f50bbd14215df10effffd2fd46e8bsalomon@google.com//zz   PRINT("sys_fstat64 ( %d, %p )",ARG1,ARG2);
7900f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz   PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
7910f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz   PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
7920f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz }
7930f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz
7940f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz POST(sys_fstat64)
7950f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz {
7960f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
7970f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com//zz }
7980f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com
7990f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.comstatic Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
8000f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com{
8010f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   Addr* a_p = (Addr*)a;
8020f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
8030f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com   return *a_p;
8040f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com}
805cee661af926cc977addc6e039b7022975a448acebsalomon@google.com
806fa1e8a7cefd71f7b75f0b85f8eefe111814dd86fjvanverthPRE(sys_ipc)
807fa1e8a7cefd71f7b75f0b85f8eefe111814dd86fjvanverth{
808cee661af926cc977addc6e039b7022975a448acebsalomon@google.com  PRINT("sys_ipc ( %ld, %ld, %ld, %ld, %#lx, %ld )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
809cee661af926cc977addc6e039b7022975a448acebsalomon@google.com  // XXX: this is simplistic -- some args are not used in all circumstances.
810cee661af926cc977addc6e039b7022975a448acebsalomon@google.com  PRE_REG_READ6(int, "ipc",
811cee661af926cc977addc6e039b7022975a448acebsalomon@google.com		vki_uint, call, int, first, int, second, int, third,
812cee661af926cc977addc6e039b7022975a448acebsalomon@google.com		void *, ptr, long, fifth)
813cee661af926cc977addc6e039b7022975a448acebsalomon@google.com
8140f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    switch (ARG1 /* call */) {
8150f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    case VKI_SEMOP:
8160f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
8170f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      *flags |= SfMayBlock;
8180f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      break;
81928361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org    case VKI_SEMGET:
82028361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org      break;
82128361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org    case VKI_SEMCTL:
82228361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org      {
82328361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org	UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
8240f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com	ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
8257354a4b193aaaeae43fb9ede90e1158fa46c372brobertphillips	break;
8260f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      }
8270f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    case VKI_SEMTIMEDOP:
8280f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
8290f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      *flags |= SfMayBlock;
8300f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      break;
8310f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    case VKI_MSGSND:
8320f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
8330f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      if ((ARG4 & VKI_IPC_NOWAIT) == 0)
8340f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com	*flags |= SfMayBlock;
8350f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      break;
8360f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    case VKI_MSGRCV:
8370f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com      {
8380f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com	Addr msgp;
839fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	Word msgtyp;
840fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com
841fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	msgp = deref_Addr( tid,
842fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com			   (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
843fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com			   "msgrcv(msgp)" );
844fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	msgtyp = deref_Addr( tid,
845fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com			     (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
846e097be50bdfac597119db2a170f96bae07dbcab1kkinnunen			     "msgrcv(msgp)" );
847fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com
848fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
849fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com
850542ecbb2bd1c8706f280edc3015d67b118d37817kkinnunen	if ((ARG4 & VKI_IPC_NOWAIT) == 0)
851fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	  *flags |= SfMayBlock;
852fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	break;
85355e4783b5175fe43103c871ad8ad5cdcad208af4kkinnunen      }
854fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com    case VKI_MSGGET:
855fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com      break;
856fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com    case VKI_MSGCTL:
857fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com      ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
858fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com      break;
859fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com    case VKI_SHMAT:
860fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com      {
861fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	UWord w;
862fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
863fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
864fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	if (w == 0)
865fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	  SET_STATUS_Failure( VKI_EINVAL );
866fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	else
867fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	  ARG5 = w;
868fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	break;
869fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com      }
870fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com    case VKI_SHMDT:
871fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com      if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
872fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com	SET_STATUS_Failure( VKI_EINVAL );
873fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com      break;
874fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com    case VKI_SHMGET:
875fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com      break;
876149b3ec2b1ccaf00e40bf296d2a3394852d73fe9cdalton    case VKI_SHMCTL: /* IPCOP_shmctl */
877149b3ec2b1ccaf00e40bf296d2a3394852d73fe9cdalton      ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
878149b3ec2b1ccaf00e40bf296d2a3394852d73fe9cdalton      break;
879149b3ec2b1ccaf00e40bf296d2a3394852d73fe9cdalton    default:
88032b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen      VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %ld\n", ARG1 );
88132b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen      VG_(core_panic)("... bye!\n");
88232b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen      break; /*NOTREACHED*/
88332b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen    }
884fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com}
885ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen
886ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunenPOST(sys_ipc)
887ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen{
888ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen  vg_assert(SUCCESS);
889ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen  switch (ARG1 /* call */) {
890ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen  case VKI_SEMOP:
8915816233d237e5c214f14f1c92eda4a87c898ea11joshualitt  case VKI_SEMGET:
8925816233d237e5c214f14f1c92eda4a87c898ea11joshualitt    break;
8935816233d237e5c214f14f1c92eda4a87c898ea11joshualitt  case VKI_SEMCTL:
8940edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton    {
8950edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton      UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
8960edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton      ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
8970edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton      break;
8980edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton    }
8990edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton  case VKI_SEMTIMEDOP:
9000edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton  case VKI_MSGSND:
9010edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton    break;
902626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton  case VKI_MSGRCV:
903626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    {
904626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      Addr msgp;
905626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      Word msgtyp;
906626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton
907626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      msgp = deref_Addr( tid,
908626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton                         (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
909626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton                         "msgrcv(msgp)" );
910626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      msgtyp = deref_Addr( tid,
911626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton                           (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
912626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton                           "msgrcv(msgp)" );
913626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton
914626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
915626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      break;
916626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    }
917626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton  case VKI_MSGGET:
918626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    break;
919626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton  case VKI_MSGCTL:
920626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
921626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    break;
922626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton  case VKI_SHMAT:
923626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    {
924626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      Addr addr;
925626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton
926626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      /* force readability. before the syscall it is
927626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton       * indeed uninitialized, as can be seen in
928626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton       * glibc/sysdeps/unix/sysv/linux/shmat.c */
929626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      POST_MEM_WRITE( ARG4, sizeof( Addr ) );
930626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton
931626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
932626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
933626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton      break;
934626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    }
935626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton  case VKI_SHMDT:
936626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
937626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    break;
938626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton  case VKI_SHMGET:
939626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    break;
940626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton  case VKI_SHMCTL:
9417ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon    ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
9427ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon    break;
9437ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon  default:
944e5286e0b37abe4d0db67a6b3d87b2d5a12a70ab3bsalomon    VG_(message)(Vg_DebugMsg,
945e5286e0b37abe4d0db67a6b3d87b2d5a12a70ab3bsalomon		 "FATAL: unhandled syscall(ipc) %ld\n",
946e5286e0b37abe4d0db67a6b3d87b2d5a12a70ab3bsalomon		 ARG1 );
947b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon    VG_(core_panic)("... bye!\n");
948b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon    break; /*NOTREACHED*/
949b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon  }
9507ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon}
9517ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon
9527ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomonPRE(sys_clone)
9537ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon{
9547ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon   UInt cloneflags;
9557ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon
9567ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon   PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5);
957b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon   PRE_REG_READ5(int, "clone",
958a03ec86e997ce08fad354a4102080b3163244b6areed@google.com                 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
1037PRE(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
1044PRE(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#undef PRE
1080#undef POST
1081
1082/* ---------------------------------------------------------------------
1083   The ppc64/Linux syscall table
1084   ------------------------------------------------------------------ */
1085
1086/* Add an ppc64-linux specific wrapper to a syscall table. */
1087#define PLAX_(sysno, name)    WRAPPER_ENTRY_X_(ppc64_linux, sysno, name)
1088#define PLAXY(sysno, name)    WRAPPER_ENTRY_XY(ppc64_linux, sysno, name)
1089
1090// This table maps from __NR_xxx syscall numbers (from
1091// linux/include/asm-ppc/unistd.h) to the appropriate PRE/POST sys_foo()
1092// wrappers on ppc64 (as per sys_call_table in linux/arch/ppc/kernel/entry.S).
1093//
1094// For those syscalls not handled by Valgrind, the annotation indicate its
1095// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
1096// (unknown).
1097
1098static SyscallTableEntry syscall_table[] = {
1099// _____(__NR_restart_syscall,   sys_restart_syscall),    //   0
1100   GENX_(__NR_exit,              sys_exit),               //   1
1101   GENX_(__NR_fork,              sys_fork),               //   2
1102   GENXY(__NR_read,              sys_read),               //   3
1103   GENX_(__NR_write,             sys_write),              //   4
1104
1105   GENXY(__NR_open,              sys_open),               //   5
1106   GENXY(__NR_close,             sys_close),              //   6
1107   GENXY(__NR_waitpid,           sys_waitpid),            //   7
1108   GENXY(__NR_creat,             sys_creat),              //   8
1109   GENX_(__NR_link,              sys_link),               //   9
1110
1111   GENX_(__NR_unlink,            sys_unlink),             //  10
1112   GENX_(__NR_execve,            sys_execve),             //  11
1113   GENX_(__NR_chdir,             sys_chdir),              //  12
1114   GENXY(__NR_time,              sys_time),               //  13
1115   GENX_(__NR_mknod,             sys_mknod),              //  14
1116
1117   GENX_(__NR_chmod,             sys_chmod),              //  15
1118   GENX_(__NR_lchown,            sys_lchown),             //  16
1119// _____(__NR_break,             sys_break),              //  17
1120// _____(__NR_oldstat,           sys_oldstat),            //  18
1121   LINX_(__NR_lseek,             sys_lseek),              //  19
1122
1123   GENX_(__NR_getpid,            sys_getpid),             //  20
1124   LINX_(__NR_mount,             sys_mount),              //  21
1125// _____(__NR_umount,            sys_umount),             //  22
1126   GENX_(__NR_setuid,            sys_setuid),             //  23
1127   GENX_(__NR_getuid,            sys_getuid),             //  24
1128
1129// _____(__NR_stime,             sys_stime),              //  25
1130// _____(__NR_ptrace,            sys_ptrace),             //  26
1131   GENX_(__NR_alarm,             sys_alarm),              //  27
1132// _____(__NR_oldfstat,          sys_oldfstat),           //  28
1133   GENX_(__NR_pause,             sys_pause),              //  29
1134
1135   LINX_(__NR_utime,             sys_utime),              //  30
1136// _____(__NR_stty,              sys_stty),               //  31
1137// _____(__NR_gtty,              sys_gtty),               //  32
1138   GENX_(__NR_access,            sys_access),             //  33
1139// _____(__NR_nice,              sys_nice),               //  34
1140
1141// _____(__NR_ftime,             sys_ftime),              //  35
1142// _____(__NR_sync,              sys_sync),               //  36
1143   GENX_(__NR_kill,              sys_kill),               //  37
1144   GENX_(__NR_rename,            sys_rename),             //  38
1145   GENX_(__NR_mkdir,             sys_mkdir),              //  39
1146
1147   GENX_(__NR_rmdir,             sys_rmdir),              //  40
1148   GENXY(__NR_dup,               sys_dup),                //  41
1149   LINXY(__NR_pipe,              sys_pipe),               //  42
1150   GENXY(__NR_times,             sys_times),              //  43
1151// _____(__NR_prof,              sys_prof),               //  44
1152
1153   GENX_(__NR_brk,               sys_brk),                //  45
1154   GENX_(__NR_setgid,            sys_setgid),             //  46
1155   GENX_(__NR_getgid,            sys_getgid),             //  47
1156// _____(__NR_signal,            sys_signal),             //  48
1157   GENX_(__NR_geteuid,           sys_geteuid),            //  49
1158
1159   GENX_(__NR_getegid,           sys_getegid),            //  50
1160// _____(__NR_acct,              sys_acct),               //  51
1161   LINX_(__NR_umount2,           sys_umount),             //  52
1162// _____(__NR_lock,              sys_lock),               //  53
1163   LINXY(__NR_ioctl,             sys_ioctl),              //  54
1164
1165   LINXY(__NR_fcntl,             sys_fcntl),              //  55
1166// _____(__NR_mpx,               sys_mpx),                //  56
1167   GENX_(__NR_setpgid,           sys_setpgid),            //  57
1168// _____(__NR_ulimit,            sys_ulimit),             //  58
1169// _____(__NR_oldolduname,       sys_oldolduname),        //  59
1170
1171   GENX_(__NR_umask,             sys_umask),              //  60
1172   GENX_(__NR_chroot,            sys_chroot),             //  61
1173// _____(__NR_ustat,             sys_ustat),              //  62
1174   GENXY(__NR_dup2,              sys_dup2),               //  63
1175   GENX_(__NR_getppid,           sys_getppid),            //  64
1176
1177   GENX_(__NR_getpgrp,           sys_getpgrp),            //  65
1178   GENX_(__NR_setsid,            sys_setsid),             //  66
1179// _____(__NR_sigaction,         sys_sigaction),          //  67
1180// _____(__NR_sgetmask,          sys_sgetmask),           //  68
1181// _____(__NR_ssetmask,          sys_ssetmask),           //  69
1182
1183   GENX_(__NR_setreuid,          sys_setreuid),           //  70
1184   GENX_(__NR_setregid,          sys_setregid),           //  71
1185// _____(__NR_sigsuspend,        sys_sigsuspend),         //  72
1186// _____(__NR_sigpending,        sys_sigpending),         //  73
1187// _____(__NR_sethostname,       sys_sethostname),        //  74
1188
1189   GENX_(__NR_setrlimit,         sys_setrlimit),          //  75
1190// _____(__NR_getrlimit,         sys_getrlimit),          //  76
1191   GENXY(__NR_getrusage,         sys_getrusage),          //  77
1192   GENXY(__NR_gettimeofday,      sys_gettimeofday),       //  78
1193// _____(__NR_settimeofday,      sys_settimeofday),       //  79
1194
1195   GENXY(__NR_getgroups,         sys_getgroups),          //  80
1196   GENX_(__NR_setgroups,         sys_setgroups),          //  81
1197// _____(__NR_select,            sys_select),             //  82
1198   GENX_(__NR_symlink,           sys_symlink),            //  83
1199// _____(__NR_oldlstat,          sys_oldlstat),           //  84
1200
1201   GENX_(__NR_readlink,          sys_readlink),           //  85
1202// _____(__NR_uselib,            sys_uselib),             //  86
1203// _____(__NR_swapon,            sys_swapon),             //  87
1204// _____(__NR_reboot,            sys_reboot),             //  88
1205// _____(__NR_readdir,           sys_readdir),            //  89
1206
1207   PLAX_(__NR_mmap,              sys_mmap),               //  90
1208   GENXY(__NR_munmap,            sys_munmap),             //  91
1209   GENX_(__NR_truncate,          sys_truncate),           //  92
1210   GENX_(__NR_ftruncate,         sys_ftruncate),          //  93
1211   GENX_(__NR_fchmod,            sys_fchmod),             //  94
1212
1213   GENX_(__NR_fchown,            sys_fchown),             //  95
1214// _____(__NR_getpriority,       sys_getpriority),        //  96
1215// _____(__NR_setpriority,       sys_setpriority),        //  97
1216// _____(__NR_profil,            sys_profil),             //  98
1217   GENXY(__NR_statfs,            sys_statfs),             //  99
1218
1219   GENXY(__NR_fstatfs,           sys_fstatfs),            // 100
1220// _____(__NR_ioperm,            sys_ioperm),             // 101
1221   PLAXY(__NR_socketcall,        sys_socketcall),         // 102
1222   LINXY(__NR_syslog,            sys_syslog),             // 103
1223   GENXY(__NR_setitimer,         sys_setitimer),          // 104
1224
1225   GENXY(__NR_getitimer,         sys_getitimer),          // 105
1226   GENXY(__NR_stat,              sys_newstat),            // 106
1227   GENXY(__NR_lstat,             sys_newlstat),           // 107
1228   GENXY(__NR_fstat,             sys_newfstat),           // 108
1229// _____(__NR_olduname,          sys_olduname),           // 109
1230
1231// _____(__NR_iopl,              sys_iopl),               // 110
1232   LINX_(__NR_vhangup,           sys_vhangup),            // 111
1233// _____(__NR_idle,              sys_idle),               // 112
1234// _____(__NR_vm86,              sys_vm86),               // 113
1235   GENXY(__NR_wait4,             sys_wait4),              // 114
1236
1237// _____(__NR_swapoff,           sys_swapoff),            // 115
1238   LINXY(__NR_sysinfo,           sys_sysinfo),            // 116
1239   PLAXY(__NR_ipc,               sys_ipc),                // 117
1240   GENX_(__NR_fsync,             sys_fsync),              // 118
1241// _____(__NR_sigreturn,         sys_sigreturn),          // 119
1242
1243   PLAX_(__NR_clone,             sys_clone),              // 120
1244// _____(__NR_setdomainname,     sys_setdomainname),      // 121
1245   GENXY(__NR_uname,             sys_newuname),           // 122
1246// _____(__NR_modify_ldt,        sys_modify_ldt),         // 123
1247   LINXY(__NR_adjtimex,          sys_adjtimex),           // 124
1248
1249   GENXY(__NR_mprotect,          sys_mprotect),           // 125
1250// _____(__NR_sigprocmask,       sys_sigprocmask),        // 126
1251   GENX_(__NR_create_module,     sys_ni_syscall),         // 127
1252   LINX_(__NR_init_module,       sys_init_module),        // 128
1253   LINX_(__NR_delete_module,     sys_delete_module),      // 129
1254
1255// _____(__NR_get_kernel_syms,   sys_get_kernel_syms),    // 130
1256// _____(__NR_quotactl,          sys_quotactl),           // 131
1257   GENX_(__NR_getpgid,           sys_getpgid),            // 132
1258   GENX_(__NR_fchdir,            sys_fchdir),             // 133
1259// _____(__NR_bdflush,           sys_bdflush),            // 134
1260
1261// _____(__NR_sysfs,             sys_sysfs),              // 135
1262   LINX_(__NR_personality,       sys_personality),        // 136
1263// _____(__NR_afs_syscall,       sys_afs_syscall),        // 137
1264   LINX_(__NR_setfsuid,          sys_setfsuid),           // 138
1265   LINX_(__NR_setfsgid,          sys_setfsgid),           // 139
1266
1267   LINXY(__NR__llseek,           sys_llseek),             // 140
1268   GENXY(__NR_getdents,          sys_getdents),           // 141
1269   GENX_(__NR__newselect,        sys_select),             // 142
1270   GENX_(__NR_flock,             sys_flock),              // 143
1271   GENX_(__NR_msync,             sys_msync),              // 144
1272
1273   GENXY(__NR_readv,             sys_readv),              // 145
1274   GENX_(__NR_writev,            sys_writev),             // 146
1275// _____(__NR_getsid,            sys_getsid),             // 147
1276   GENX_(__NR_fdatasync,         sys_fdatasync),          // 148
1277   LINXY(__NR__sysctl,           sys_sysctl),             // 149
1278
1279   GENX_(__NR_mlock,             sys_mlock),              // 150
1280   GENX_(__NR_munlock,           sys_munlock),            // 151
1281   GENX_(__NR_mlockall,          sys_mlockall),           // 152
1282   LINX_(__NR_munlockall,        sys_munlockall),         // 153
1283   LINXY(__NR_sched_setparam,    sys_sched_setparam),     // 154
1284
1285   LINXY(__NR_sched_getparam,         sys_sched_getparam),        // 155
1286   LINX_(__NR_sched_setscheduler,     sys_sched_setscheduler),    // 156
1287   LINX_(__NR_sched_getscheduler,     sys_sched_getscheduler),    // 157
1288   LINX_(__NR_sched_yield,            sys_sched_yield),           // 158
1289   LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
1290
1291   LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
1292   LINXY(__NR_sched_rr_get_interval,  sys_sched_rr_get_interval), // 161
1293   GENXY(__NR_nanosleep,         sys_nanosleep),          // 162
1294   GENX_(__NR_mremap,            sys_mremap),             // 163
1295// _____(__NR_setresuid,         sys_setresuid),          // 164
1296
1297   LINXY(__NR_getresuid,         sys_getresuid),          // 165
1298// _____(__NR_query_module,      sys_query_module),       // 166
1299   GENXY(__NR_poll,              sys_poll),               // 167
1300// _____(__NR_nfsservctl,        sys_nfsservctl),         // 168
1301// _____(__NR_setresgid,         sys_setresgid),          // 169
1302
1303   LINXY(__NR_getresgid,         sys_getresgid),          // 170
1304// _____(__NR_prctl,             sys_prctl),              // 171
1305   PLAX_(__NR_rt_sigreturn,      sys_rt_sigreturn),       // 172
1306   LINXY(__NR_rt_sigaction,      sys_rt_sigaction),       // 173
1307   LINXY(__NR_rt_sigprocmask,    sys_rt_sigprocmask),     // 174
1308
1309// _____(__NR_rt_sigpending,     sys_rt_sigpending),      // 175
1310   LINXY(__NR_rt_sigtimedwait,   sys_rt_sigtimedwait),    // 176
1311   LINXY(__NR_rt_sigqueueinfo,   sys_rt_sigqueueinfo),    // 177
1312// _____(__NR_rt_sigsuspend,     sys_rt_sigsuspend),      // 178
1313   GENXY(__NR_pread64,           sys_pread64),            // 179
1314
1315   GENX_(__NR_pwrite64,          sys_pwrite64),           // 180
1316   GENX_(__NR_chown,             sys_chown),              // 181
1317   GENXY(__NR_getcwd,            sys_getcwd),             // 182
1318   LINXY(__NR_capget,            sys_capget),             // 183
1319   LINX_(__NR_capset,            sys_capset),             // 184
1320
1321   GENXY(__NR_sigaltstack,       sys_sigaltstack),        // 185
1322   LINXY(__NR_sendfile,          sys_sendfile),           // 186
1323// _____(__NR_getpmsg,           sys_getpmsg),            // 187
1324// _____(__NR_putpmsg,           sys_putpmsg),            // 188
1325   GENX_(__NR_vfork,             sys_fork),               // 189 treat as fork
1326
1327   GENXY(__NR_ugetrlimit,        sys_getrlimit),          // 190
1328   LINX_(__NR_readahead,         sys_readahead),          // 191
1329// /* #define __NR_mmap2           192     32bit only */
1330// /* #define __NR_truncate64      193     32bit only */
1331// /* #define __NR_ftruncate64     194     32bit only */
1332
1333// /* #define __NR_stat64          195     32bit only */
1334// /* #define __NR_lstat64         196     32bit only */
1335// /* #define __NR_fstat64         197     32bit only */
1336// _____(__NR_pciconfig_read,    sys_pciconfig_read),     // 198
1337// _____(__NR_pciconfig_write,   sys_pciconfig_write),    // 199
1338
1339// _____(__NR_pciconfig_iobase,  sys_pciconfig_iobase),   // 200
1340// _____(__NR_multiplexer,       sys_multiplexer),        // 201
1341   GENXY(__NR_getdents64,        sys_getdents64),         // 202
1342// _____(__NR_pivot_root,        sys_pivot_root),         // 203
1343   LINXY(__NR_fcntl64,           sys_fcntl64),            // 204 !!!!?? 32bit only */
1344
1345   GENX_(__NR_madvise,           sys_madvise),            // 205
1346// _____(__NR_mincore,           sys_mincore),            // 206
1347   LINX_(__NR_gettid,            sys_gettid),             // 207
1348// _____(__NR_tkill,             sys_tkill),              // 208
1349// _____(__NR_setxattr,          sys_setxattr),           // 209
1350
1351// _____(__NR_lsetxattr,         sys_lsetxattr),          // 210
1352// _____(__NR_fsetxattr,         sys_fsetxattr),          // 211
1353   LINXY(__NR_getxattr,          sys_getxattr),           // 212
1354   LINXY(__NR_lgetxattr,         sys_lgetxattr),          // 213
1355   LINXY(__NR_fgetxattr,         sys_fgetxattr),          // 214
1356   LINXY(__NR_listxattr,         sys_listxattr),          // 215
1357   LINXY(__NR_llistxattr,        sys_llistxattr),         // 216
1358   LINXY(__NR_flistxattr,        sys_flistxattr),         // 217
1359   LINX_(__NR_removexattr,       sys_removexattr),        // 218
1360   LINX_(__NR_lremovexattr,      sys_lremovexattr),       // 219
1361   LINX_(__NR_fremovexattr,      sys_fremovexattr),       // 220
1362
1363   LINXY(__NR_futex,             sys_futex),              // 221
1364   LINX_(__NR_sched_setaffinity, sys_sched_setaffinity),  // 222
1365   LINXY(__NR_sched_getaffinity, sys_sched_getaffinity),  // 223
1366// /* 224 currently unused */
1367
1368// _____(__NR_tuxcall,           sys_tuxcall),            // 225
1369// /* #define __NR_sendfile64      226     32bit only */
1370   LINX_(__NR_io_setup,          sys_io_setup),           // 227
1371   LINX_(__NR_io_destroy,        sys_io_destroy),         // 228
1372   LINXY(__NR_io_getevents,      sys_io_getevents),       // 229
1373   LINX_(__NR_io_submit,         sys_io_submit),          // 230
1374   LINXY(__NR_io_cancel,         sys_io_cancel),          // 231
1375   LINX_(__NR_set_tid_address,   sys_set_tid_address),    // 232
1376   PLAX_(__NR_fadvise64,         sys_fadvise64),          // 233
1377   LINX_(__NR_exit_group,        sys_exit_group),         // 234
1378
1379// _____(__NR_lookup_dcookie,    sys_lookup_dcookie),     // 235
1380   LINXY(__NR_epoll_create,      sys_epoll_create),       // 236
1381   LINX_(__NR_epoll_ctl,         sys_epoll_ctl),          // 237
1382   LINXY(__NR_epoll_wait,        sys_epoll_wait),         // 238
1383// _____(__NR_remap_file_pages,  sys_remap_file_pages),   // 239
1384
1385   LINXY(__NR_timer_create,      sys_timer_create),       // 240
1386   LINXY(__NR_timer_settime,     sys_timer_settime),      // 241
1387   LINXY(__NR_timer_gettime,     sys_timer_gettime),      // 242
1388   LINX_(__NR_timer_getoverrun,  sys_timer_getoverrun),   // 243
1389   LINX_(__NR_timer_delete,      sys_timer_delete),       // 244
1390   LINX_(__NR_clock_settime,     sys_clock_settime),      // 245
1391   LINXY(__NR_clock_gettime,     sys_clock_gettime),      // 246
1392   LINXY(__NR_clock_getres,      sys_clock_getres),       // 247
1393   LINXY(__NR_clock_nanosleep,   sys_clock_nanosleep),    // 248
1394
1395// _____(__NR_swapcontext,       sys_swapcontext),        // 249
1396
1397   LINXY(__NR_tgkill,            sys_tgkill),             // 250
1398// _____(__NR_utimes,            sys_utimes),             // 251
1399// _____(__NR_statfs64,          sys_statfs64),           // 252
1400// _____(__NR_fstatfs64,         sys_fstatfs64),          // 253
1401// /* #define __NR_fadvise64_64    254     32bit only */
1402
1403// _____(__NR_rtas,              sys_rtas),               // 255
1404// /* Number 256 is reserved for sys_debug_setcontext */
1405// /* Number 257 is reserved for vserver */
1406// /* 258 currently unused */
1407// _____(__NR_mbind,             sys_mbind),              // 259
1408
1409// _____(__NR_get_mempolicy,     sys_get_mempolicy),      // 260
1410// _____(__NR_set_mempolicy,     sys_set_mempolicy),      // 261
1411   LINXY(__NR_mq_open,           sys_mq_open),            // 262
1412   LINX_(__NR_mq_unlink,         sys_mq_unlink),          // 263
1413   LINX_(__NR_mq_timedsend,      sys_mq_timedsend),       // 264
1414
1415   LINXY(__NR_mq_timedreceive,   sys_mq_timedreceive),    // 265
1416   LINX_(__NR_mq_notify,         sys_mq_notify),          // 266
1417   LINXY(__NR_mq_getsetattr,     sys_mq_getsetattr),      // 267
1418// _____(__NR_kexec_load,        sys_kexec_load),         // 268
1419   LINX_(__NR_add_key,           sys_add_key),            // 269
1420
1421   LINX_(__NR_request_key,       sys_request_key),        // 270
1422   LINXY(__NR_keyctl,            sys_keyctl),             // 271
1423// _____(__NR_waitid,            sys_waitid),             // 272
1424   LINX_(__NR_ioprio_set,        sys_ioprio_set),         // 273
1425   LINX_(__NR_ioprio_get,        sys_ioprio_get),         // 274
1426
1427   LINX_(__NR_inotify_init,  sys_inotify_init),           // 275
1428   LINX_(__NR_inotify_add_watch,  sys_inotify_add_watch), // 276
1429   LINX_(__NR_inotify_rm_watch,   sys_inotify_rm_watch),  // 277
1430
1431   LINXY(__NR_ppoll,             sys_ppoll),              // 281
1432
1433   LINXY(__NR_openat,            sys_openat),             // 286
1434   LINX_(__NR_mkdirat,           sys_mkdirat),            // 287
1435   LINX_(__NR_mknodat,           sys_mknodat),            // 288
1436   LINX_(__NR_fchownat,          sys_fchownat),           // 289
1437   LINX_(__NR_futimesat,         sys_futimesat),          // 290
1438   LINXY(__NR_newfstatat,        sys_newfstatat),         // 291
1439   LINX_(__NR_unlinkat,          sys_unlinkat),           // 292
1440   LINX_(__NR_renameat,          sys_renameat),           // 293
1441   LINX_(__NR_linkat,            sys_linkat),             // 294
1442   LINX_(__NR_symlinkat,         sys_symlinkat),          // 295
1443   LINX_(__NR_readlinkat,        sys_readlinkat),         // 296
1444   LINX_(__NR_fchmodat,          sys_fchmodat),           // 297
1445   LINX_(__NR_faccessat,         sys_faccessat),          // 298
1446   LINX_(__NR_set_robust_list,   sys_set_robust_list),    // 299
1447   LINXY(__NR_get_robust_list,   sys_get_robust_list),    // 300
1448//   LINX_(__NR_move_pages,        sys_ni_syscall),        // 301
1449   LINXY(__NR_getcpu,            sys_getcpu),            // 302
1450   LINXY(__NR_epoll_pwait,       sys_epoll_pwait),       // 303
1451   LINX_(__NR_utimensat,         sys_utimensat),         // 304
1452   LINXY(__NR_signalfd,          sys_signalfd),          // 305
1453   LINXY(__NR_timerfd_create,    sys_timerfd_create),    // 306
1454   LINX_(__NR_eventfd,           sys_eventfd),           // 307
1455   LINX_(__NR_sync_file_range2,  sys_sync_file_range2),  // 308
1456   LINX_(__NR_fallocate,         sys_fallocate),         // 309
1457//   LINXY(__NR_subpage_prot,       sys_ni_syscall),       // 310
1458   LINXY(__NR_timerfd_settime,   sys_timerfd_settime),  // 311
1459   LINXY(__NR_timerfd_gettime,   sys_timerfd_gettime),  // 312
1460   LINXY(__NR_signalfd4,         sys_signalfd4),        // 313
1461   LINX_(__NR_eventfd2,          sys_eventfd2),         // 314
1462   LINXY(__NR_epoll_create1,     sys_epoll_create1),    // 315
1463   LINXY(__NR_dup3,              sys_dup3),             // 316
1464   LINXY(__NR_pipe2,             sys_pipe2),            // 317
1465   LINXY(__NR_inotify_init1,     sys_inotify_init1),    // 318
1466   LINXY(__NR_perf_event_open,   sys_perf_event_open),  // 319
1467   LINXY(__NR_preadv,            sys_preadv),           // 320
1468   LINX_(__NR_pwritev,           sys_pwritev),          // 321
1469   LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo) // 322
1470};
1471
1472SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1473{
1474   const UInt syscall_table_size
1475      = sizeof(syscall_table) / sizeof(syscall_table[0]);
1476
1477   /* Is it in the contiguous initial section of the table? */
1478   if (sysno < syscall_table_size) {
1479      SyscallTableEntry* sys = &syscall_table[sysno];
1480      if (sys->before == NULL)
1481         return NULL; /* no entry */
1482      else
1483         return sys;
1484   }
1485
1486   /* Can't find a wrapper */
1487   return NULL;
1488}
1489
1490#endif // defined(VGP_ppc64_linux)
1491
1492/*--------------------------------------------------------------------*/
1493/*--- end                                                          ---*/
1494/*--------------------------------------------------------------------*/
1495