1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Darwin-specific syscalls, etc.              syswrap-darwin.c ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of Valgrind, a dynamic binary instrumentation
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   framework.
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Copyright (C) 2005-2012 Apple Inc.
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Greg Parker  gparker@apple.com
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02111-1307, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGO_darwin)
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_basics.h"
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vki.h"
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vkiscnums.h"
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_libcsetjmp.h"   // to keep _threadstate.h happy
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_threadstate.h"
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_aspacemgr.h"
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_xarray.h"
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_clientstate.h"
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_debuglog.h"
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_debuginfo.h"    // VG_(di_notify_*)
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_transtab.h"     // VG_(discard_translations)
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcbase.h"
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcassert.h"
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcfile.h"
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcprint.h"
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcproc.h"
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcsignal.h"
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_machine.h"      // VG_(get_SP)
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_mallocfree.h"
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_options.h"
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_oset.h"
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_scheduler.h"
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_sigframe.h"      // For VG_(sigframe_destroy)()
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_signals.h"
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syscall.h"
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_syswrap.h"
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_tooliface.h"
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_types_n_macros.h"
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-generic.h"   /* for decls of generic wrappers */
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-darwin.h"    /* for decls of darwin-ish wrappers */
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_syswrap-main.h"
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --- !!! --- EXTERNAL HEADERS start --- !!! --- */
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <mach/mach.h>
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <mach/mach_vm.h>
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <semaphore.h>
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --- !!! --- EXTERNAL HEADERS end --- !!! --- */
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define msgh_request_port      msgh_remote_port
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define msgh_reply_port        msgh_local_port
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define BOOTSTRAP_MAX_NAME_LEN                  128
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef char name_t[BOOTSTRAP_MAX_NAME_LEN];
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef uint64_t mig_addr_t;
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Saved ports
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic mach_port_t vg_host_port = 0;
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic mach_port_t vg_task_port = 0;
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic mach_port_t vg_bootstrap_port = 0;
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Run a thread from beginning to end and return the thread's
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// scheduler-return-code.
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic VgSchedReturnCode thread_wrapper(Word /*ThreadId*/ tidW)
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VgSchedReturnCode ret;
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId     tid = (ThreadId)tidW;
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst = VG_(get_ThreadState)(tid);
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(1, "syswrap-darwin",
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "thread_wrapper(tid=%lld): entry\n",
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (ULong)tidW);
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tst->status == VgTs_Init);
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* make sure we get the CPU lock before doing anything significant */
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(acquire_BigLock)(tid, "thread_wrapper");
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (0)
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("thread tid %d started: stack = %p\n",
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  tid, &tid);
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Make sure error reporting is enabled in the new thread. */
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   tst->err_disablement_level = 0;
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_TRACK(pre_thread_first_insn, tid);
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst->os_state.lwpid = VG_(gettid)();
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst->os_state.threadgroup = VG_(getpid)();
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Thread created with all signals blocked; scheduler will set the
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      appropriate mask */
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ret = VG_(scheduler)(tid);
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_exiting)(tid));
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tst->status == VgTs_Runnable);
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(1, "syswrap-darwin",
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "thread_wrapper(tid=%lld): done\n",
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (ULong)tidW);
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Return to caller, still holding the lock. */
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return ret;
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Allocate a stack for this thread, if it doesn't already have one.
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Returns the initial stack pointer value to use, or 0 if allocation
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   failed. */
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownAddr allocstack ( ThreadId tid )
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst = VG_(get_ThreadState)(tid);
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VgStack*     stack;
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr         initial_SP;
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Either the stack_base and stack_init_SP are both zero (in which
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case a stack hasn't been allocated) or they are both non-zero,
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      in which case it has. */
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (tst->os_state.valgrind_stack_base == 0)
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(tst->os_state.valgrind_stack_init_SP == 0);
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (tst->os_state.valgrind_stack_base != 0)
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(tst->os_state.valgrind_stack_init_SP != 0);
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* If no stack is present, allocate one. */
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (tst->os_state.valgrind_stack_base == 0) {
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      stack = VG_(am_alloc_VgStack)( &initial_SP );
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (stack) {
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         tst->os_state.valgrind_stack_base    = (Addr)stack;
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         tst->os_state.valgrind_stack_init_SP = initial_SP;
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)( 2, "syswrap-darwin", "stack for tid %d at %p; init_SP=%p\n",
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   tid,
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   (void*)tst->os_state.valgrind_stack_base,
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   (void*)tst->os_state.valgrind_stack_init_SP );
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_IS_32_ALIGNED(tst->os_state.valgrind_stack_init_SP));
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return tst->os_state.valgrind_stack_init_SP;
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid find_stack_segment(ThreadId tid, Addr sp)
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* We don't really know where the client stack is, because it's
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      allocated by the client.  The best we can do is look at the
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      memory mappings and try to derive some useful information.  We
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assume that esp starts near its highest possible value, and can
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      only go down to the start of the mmaped segment. */
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState *tst = VG_(get_ThreadState)(tid);
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const NSegment *seg = VG_(am_find_nsegment)(sp);
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (seg && seg->kind != SkResvn) {
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp);
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->client_stack_szB = tst->client_stack_highest_word - seg->start;
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (1)
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n",
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     tid, seg->start, VG_PGROUNDUP(sp));
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       VG_(printf)("couldn't find user stack\n");
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "!? New thread %d starts with SP(%#lx) unmapped\n",
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   tid, sp);
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->client_stack_szB  = 0;
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Run a thread all the way to the end, then do appropriate exit actions
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (this is the last-one-out-turn-off-the-lights bit).
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void run_a_thread_NORETURN ( Word tidW )
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int               c;
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VgSchedReturnCode src;
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ThreadId          tid = (ThreadId)tidW;
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ThreadState*      tst;
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(1, "syswrap-darwin",
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "run_a_thread_NORETURN(tid=%lld): pre-thread_wrapper\n",
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (ULong)tidW);
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   tst = VG_(get_ThreadState)(tid);
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vg_assert(tst);
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Run the thread all the way through. */
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   src = thread_wrapper(tid);
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(1, "syswrap-darwin",
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "run_a_thread_NORETURN(tid=%lld): post-thread_wrapper\n",
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (ULong)tidW);
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   c = VG_(count_living_threads)();
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(c >= 1); /* stay sane */
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Tell the tool this thread is exiting
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_TRACK( pre_thread_ll_exit, tid );
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If the thread is exiting with errors disabled, complain loudly;
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      doing so is bad (does the user know this has happened?)  Also,
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      in all cases, be paranoid and clear the flag anyway so that the
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      thread slot is safe in this respect if later reallocated.  This
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      should be unnecessary since the flag should be cleared when the
235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      slot is reallocated, in thread_wrapper(). */
236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (tst->err_disablement_level > 0) {
237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(umsg)(
238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         "WARNING: exiting thread has error reporting disabled.\n"
239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         "WARNING: possibly as a result of some mistake in the use\n"
240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         "WARNING: of the VALGRIND_DISABLE_ERROR_REPORTING macros.\n"
241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      );
242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(debugLog)(
243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         1, "syswrap-linux",
244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            "run_a_thread_NORETURN(tid=%lld): "
245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            "WARNING: exiting thread has err_disablement_level = %u\n",
246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            (ULong)tidW, tst->err_disablement_level
247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      );
248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   tst->err_disablement_level = 0;
250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (c == 1) {
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(debugLog)(1, "syswrap-darwin",
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       "run_a_thread_NORETURN(tid=%lld): "
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          "last one standing\n",
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          (ULong)tidW);
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* We are the last one standing.  Keep hold of the lock and
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         carry on to show final tool results, then exit the entire system.
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Use the continuation pointer set at startup in m_main. */
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ( * VG_(address_of_m_main_shutdown_actions_NORETURN) ) (tid, src);
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t msg;
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(debugLog)(1, "syswrap-darwin",
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       "run_a_thread_NORETURN(tid=%lld): "
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          "not last one standing\n",
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          (ULong)tidW);
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* OK, thread is dead, but others still exist.  Just exit. */
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* This releases the run lock */
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(exit_thread)(tid);
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(tst->status == VgTs_Zombie);
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* tid is now invalid. */
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme exit race
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      msg.msgh_bits = MACH_MSGH_BITS(17, MACH_MSG_TYPE_MAKE_SEND_ONCE);
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      msg.msgh_request_port = VG_(gettid)();
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      msg.msgh_reply_port = 0;
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      msg.msgh_id = 3600;  // thread_terminate
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->status = VgTs_Empty;
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme race here! new thread may claim this V thread stack
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // before we get out here!
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme use bsdthread_terminate for safe cleanup?
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg(&msg, MACH_SEND_MSG|MACH_MSG_OPTION_NONE,
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               sizeof(msg), 0, 0, MACH_MSG_TIMEOUT_NONE, 0);
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // DDD: This is reached sometimes on none/tests/manythreads, maybe
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // because of the race above.
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(core_panic)("Thread exit failed?\n");
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*NOTREACHED*/
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(0);
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Allocate a stack for the main thread, and run it all the way to the
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   end.  Although we already have a working VgStack
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (VG_(interim_stack)) it's better to allocate a new one, so that
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   overflow detection works uniformly for all threads.
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(main_thread_wrapper_NORETURN)(ThreadId tid)
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr sp;
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(1, "syswrap-darwin",
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "entering VG_(main_thread_wrapper_NORETURN)\n");
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sp = allocstack(tid);
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* If we can't even allocate the first thread's stack, we're hosed.
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Give up. */
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert2(sp != 0, "Cannot allocate main thread's stack.");
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* shouldn't be any other threads around yet */
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert( VG_(count_living_threads)() == 1 );
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   call_on_new_stack_0_1(
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (Addr)sp,             /* stack */
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      0,                     /*bogus return address*/
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      run_a_thread_NORETURN,  /* fn to call */
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (Word)tid              /* arg to give it */
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*NOTREACHED*/
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(0);
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid start_thread_NORETURN ( Word arg )
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst = (ThreadState*)arg;
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId     tid = tst->tid;
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   run_a_thread_NORETURN ( (Word)tid );
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*NOTREACHED*/
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(0);
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(cleanup_thread) ( ThreadArchState* arch )
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Mach port tracking (based on syswrap-generic's fd tracker)
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* One of these is allocated for each open port.  */
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct OpenPort
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_port_t port;
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_port_type_t type;         /* right type(s) */
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int send_count;                /* number of send rights */
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Char *name;                    /* bootstrap name or NULL */
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ExeContext *where;             /* first allocation only */
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct OpenPort *next, *prev;
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} OpenPort;
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// strlen("0x12345678")
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PORT_STRLEN (2+2*sizeof(mach_port_t))
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* List of allocated ports. */
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic OpenPort *allocated_ports;
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Count of open ports. */
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic Int allocated_port_count = 0;
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((unused))
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic Bool port_exists(mach_port_t port)
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OpenPort *i;
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if this port is already open. */
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i = allocated_ports;
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   while (i) {
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->port == port) {
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return True;
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      i = i->next;
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return False;
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic OpenPort *info_for_port(mach_port_t port)
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OpenPort *i;
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!port) return NULL;
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i = allocated_ports;
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   while (i) {
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->port == port) {
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return i;
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      i = i->next;
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return NULL;
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Give a port a name, without changing its refcount
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GrP fixme don't override name if it already has a specific one
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__private_extern__ void assign_port_name(mach_port_t port, const char *name)
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OpenPort *i;
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!port) return;
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(name);
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i = info_for_port(port);
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(i);
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (i->name) VG_(arena_free)(VG_AR_CORE, i->name);
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->name =
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       VG_(arena_malloc)(VG_AR_CORE, "syswrap-darwin.mach-port-name",
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         VG_(strlen)(name) + PORT_STRLEN + 1);
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sprintf)(i->name, name, port);
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Return the name of the given port or "UNKNOWN 0x1234" if not known.
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic const char *name_for_port(mach_port_t port)
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static char buf[8 + PORT_STRLEN + 1];
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OpenPort *i;
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // hack
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (port == VG_(gettid)()) return "mach_thread_self()";
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (port == 0) return "NULL";
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i = allocated_ports;
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   while (i) {
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->port == port) {
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return i->name;
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      i = i->next;
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sprintf)(buf, "NONPORT-%#x", port);
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return buf;
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Note the fact that a port was just deallocated. */
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid record_port_mod_refs(mach_port_t port, mach_port_type_t right, Int delta)
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OpenPort *i = allocated_ports;
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!port) return;
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   while(i) {
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if(i->port == port) {
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vg_assert(right != MACH_PORT_TYPE_DEAD_NAME);
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (right & MACH_PORT_TYPE_SEND) {
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // send rights are refcounted
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (delta == INT_MIN) delta = -i->send_count; // INT_MIN == destroy
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            i->send_count += delta;
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (i->send_count > 0) i->type |= MACH_PORT_TYPE_SEND;
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else i->type &= ~MACH_PORT_TYPE_SEND;
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         right = right & ~MACH_PORT_TYPE_SEND;
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (right) {
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // other rights are not refcounted
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (delta > 0) {
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               i->type |= right;
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else if (delta < 0) {
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               i->type &= ~right;
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (i->type != 0) return;
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Port has no rights left. Kill it.
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // VG_(printf)("deleting port %p %s", i->port, i->name);
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if(i->prev)
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            i->prev->next = i->next;
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            allocated_ports = i->next;
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if(i->next)
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            i->next->prev = i->prev;
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if(i->name)
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            VG_(arena_free) (VG_AR_CORE, i->name);
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(arena_free) (VG_AR_CORE, i);
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         allocated_port_count--;
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      i = i->next;
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(printf)("UNKNOWN Mach port modified (port %#x delta %d)\n", port, delta);
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid record_port_insert_rights(mach_port_t port, mach_msg_type_name_t type)
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (type) {
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case MACH_MSG_TYPE_PORT_NAME:
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // this task has no rights for the name
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case MACH_MSG_TYPE_PORT_RECEIVE:
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // this task gets receive rights
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      record_port_mod_refs(port, MACH_PORT_TYPE_RECEIVE, 1);
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case MACH_MSG_TYPE_PORT_SEND:
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // this task gets a send right
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      record_port_mod_refs(port, MACH_PORT_TYPE_SEND, 1);
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case MACH_MSG_TYPE_PORT_SEND_ONCE:
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // this task gets send-once rights
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      record_port_mod_refs(port, MACH_PORT_TYPE_SEND_ONCE, 1);
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(0);
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid record_port_dealloc(mach_port_t port)
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // deletes 1 send or send-once right (port can't have both)
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   record_port_mod_refs(port, MACH_PORT_TYPE_SEND_RIGHTS, -1);
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid record_port_destroy(mach_port_t port)
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // deletes all rights to port
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   record_port_mod_refs(port, MACH_PORT_TYPE_ALL_RIGHTS, INT_MIN);
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Note the fact that a Mach port was just allocated or transferred.
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   If the port is already known, increment its reference count. */
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid record_named_port(ThreadId tid, mach_port_t port,
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       mach_port_right_t right, const char *name)
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OpenPort *i;
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!port) return;
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if this port is already open. */
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i = allocated_ports;
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   while (i) {
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->port == port) {
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (right != -1) record_port_mod_refs(port, MACH_PORT_TYPE(right), 1);
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      i = i->next;
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Not already one: allocate an OpenPort */
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (i == NULL) {
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      i = VG_(arena_malloc)(VG_AR_CORE, "syswrap-darwin.mach-port",
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            sizeof(OpenPort));
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      i->prev = NULL;
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      i->next = allocated_ports;
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if(allocated_ports) allocated_ports->prev = i;
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      allocated_ports = i;
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      allocated_port_count++;
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      i->port = port;
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      i->where = (tid == -1) ? NULL : VG_(record_ExeContext)(tid, 0);
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      i->name = NULL;
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (right != -1) {
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         i->type = MACH_PORT_TYPE(right);
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         i->send_count = (right == MACH_PORT_RIGHT_SEND) ? 1 : 0;
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         i->type = 0;
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         i->send_count = 0;
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assign_port_name(port, name);
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Record opening of a nameless port.
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void record_unnamed_port(ThreadId tid, mach_port_t port, mach_port_right_t right)
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   record_named_port(tid, port, right, "unnamed-%p");
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Dump summary of open Mach ports, like VG_(show_open_fds) */
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(show_open_ports)(void)
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OpenPort *i;
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(message)(Vg_UserMsg,
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "MACH PORTS: %d open at exit.", allocated_port_count);
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = allocated_ports; i; i = i->next) {
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->name) {
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(message)(Vg_UserMsg, "Open Mach port 0x%x: %s", i->port, i->name);
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(message)(Vg_UserMsg, "Open Mach port 0x%x", i->port);
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->where) {
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(pp_ExeContext)(i->where);
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(message)(Vg_UserMsg, "");
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(message)(Vg_UserMsg, "");
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sync_mappings
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ML_(sync_mappings)(const HChar *when, const HChar *where, Int num)
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Usually the number of segments added/removed in a single calls is very
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // small e.g. 1.  But it sometimes gets up to at least 100 or so (eg. for
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Quicktime).  So we use a repeat-with-bigger-buffers-until-success model,
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // because we can't do dynamic allocation within VG_(get_changed_segments),
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // because it's in m_aspacemgr.
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ChangedSeg* css = NULL;
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int         css_size;
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int         css_used;
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int         i;
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Bool        ok;
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (VG_(clo_trace_syscalls)) {
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       VG_(debugLog)(0, "syswrap-darwin",
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     "sync_mappings(\"%s\", \"%s\", %d)\n",
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     when, where, num);
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // 16 is enough for most cases, but small enough that overflow happens
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // occasionally and thus the overflow path gets some test coverage.
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   css_size = 16;
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ok = False;
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   while (!ok) {
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(free)(css);   // css is NULL on first iteration;  that's ok.
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      css = VG_(malloc)("sys_wrap.sync_mappings", css_size*sizeof(ChangedSeg));
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ok = VG_(get_changed_segments)(when, where, css, css_size, &css_used);
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      css_size *= 2;
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Now add/remove them.
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < css_used; i++) {
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ChangedSeg* cs = &css[i];
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Char* action;
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cs->is_added) {
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(notify_core_and_tool_of_mmap)(
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               cs->start, cs->end - cs->start + 1,
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               cs->prot, VKI_MAP_PRIVATE, 0, cs->offset);
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // should this call VG_(di_notify_mmap) also?
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         action = "added";
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(notify_core_and_tool_of_munmap)(
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               cs->start, cs->end - cs->start + 1);
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         action = "removed";
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_trace_syscalls)) {
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          VG_(debugLog)(0, "syswrap-darwin",
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        "  %s region 0x%010lx..0x%010lx at %s (%s)\n",
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        action, cs->start, cs->end + 1, where, when);
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(free)(css);
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   wrappers
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE(name)       DEFN_PRE_TEMPLATE(darwin, name)
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST(name)      DEFN_POST_TEMPLATE(darwin, name)
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PRE_FN(name)    vgSysWrap_darwin_##name##_before
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define POST_FN(name)   vgSysWrap_darwin_##name##_after
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CALL_PRE(name) PRE_FN(name)(tid, layout, arrghs, status, flags)
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CALL_POST(name) POST_FN(name)(tid, arrghs, status)
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Combine two 32-bit values into a 64-bit value
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Always use with low-numbered arg first (e.g. LOHI64(ARG1,ARG2) )
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# if defined(VGA_x86)
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  define LOHI64(lo,hi)   ( (lo) | ((ULong)(hi) << 32) )
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# else
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  error unknown architecture
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# endif
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Retrieve the current Mach thread
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MACH_THREAD ((Addr)VG_(get_ThreadState)(tid)->os_state.lwpid)
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Set the POST handler for a mach_msg derivative
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define AFTER VG_(get_ThreadState)(tid)->os_state.post_mach_trap_fn
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Set or get values saved from Mach messages
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MACH_ARG(x) VG_(get_ThreadState)(tid)->os_state.mach_args.x
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MACH_REMOTE VG_(get_ThreadState)(tid)->os_state.remote_port
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MACH_MSGH_ID VG_(get_ThreadState)(tid)->os_state.msgh_id
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   darwin ioctl wrapper
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(ioctl)
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Handle ioctls that don't take an arg first */
721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (ARG2 /* request */) {
722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_TIOCSCTTY:
723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_TIOCEXCL:
724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_TIOCPTYGRANT:
725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_TIOCPTYUNLK:
726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case VKI_DTRACEHIOC_REMOVE:
727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRINT("ioctl ( %ld, 0x%lx )",ARG1,ARG2);
728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_REG_READ2(long, "ioctl",
729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    unsigned int, fd, unsigned int, request);
730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRINT("ioctl ( %ld, 0x%lx, %#lx )",ARG1,ARG2,ARG3);
733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      PRE_REG_READ3(long, "ioctl",
734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    unsigned int, fd, unsigned int, request, unsigned long, arg);
735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG2 /* request */) {
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGWINSZ:
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TIOCGWINSZ)", ARG3, sizeof(struct vki_winsize) );
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSWINSZ:
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TIOCSWINSZ)",  ARG3, sizeof(struct vki_winsize) );
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMBIS:
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TIOCMBIS)",    ARG3, sizeof(unsigned int) );
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMBIC:
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TIOCMBIC)",    ARG3, sizeof(unsigned int) );
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMSET:
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(TIOCMSET)",    ARG3, sizeof(unsigned int) );
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMGET:
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TIOCMGET)",   ARG3, sizeof(unsigned int) );
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGPGRP:
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Get process group ID for foreground processing group. */
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSPGRP:
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Set a process group ID? */
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(TIOCGPGRP)", ARG3, sizeof(vki_pid_t) );
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIONBIO:
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(FIONBIO)",    ARG3, sizeof(int) );
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIOASYNC:
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(FIOASYNC)",   ARG3, sizeof(int) );
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIONREAD:                /* identical to SIOCINQ */
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(FIONREAD)",  ARG3, sizeof(int) );
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* These all use struct ifreq AFAIK */
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* GrP fixme is sizeof(struct vki_if_req) correct if it's using a sockaddr? */
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFFLAGS:        /* get flags                    */
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFFLAGS)",
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFFLAGS)", ARG3, sizeof(struct vki_ifreq));
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFMTU:          /* get MTU size                 */
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMTU)",
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFMTU)", ARG3, sizeof(struct vki_ifreq));
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFADDR:         /* get PA address               */
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFADDR)",
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFADDR)", ARG3, sizeof(struct vki_ifreq));
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFNETMASK:      /* get network PA mask          */
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFNETMASK)",
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFNETMASK)", ARG3, sizeof(struct vki_ifreq));
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFMETRIC:       /* get metric                   */
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFMETRIC)",
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFMETRIC)", ARG3, sizeof(struct vki_ifreq));
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFDSTADDR:      /* get remote PA address        */
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFDSTADDR)",
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFDSTADDR)", ARG3, sizeof(struct vki_ifreq));
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFBRDADDR:      /* get broadcast PA address     */
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCGIFBRDADDR)",
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGIFBRDADDR)", ARG3, sizeof(struct vki_ifreq));
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFCONF:         /* get iface list               */
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* WAS:
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE( "ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         KERNEL_DO_SYSCALL(tid,RES);
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (!VG_(is_kerror)(RES) && RES == 0)
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      */
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_ifconf *)ARG3)->ifc_len,
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_ifconf *)ARG3)->ifc_len));
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCGIFCONF)",
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&((struct vki_ifconf *)ARG3)->vki_ifc_buf,
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(((struct vki_ifconf *)ARG3)->vki_ifc_buf));
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( ARG3 ) {
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // TODO len must be readable and writable
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // buf pointer only needs to be readable
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE( "ioctl(SIOCGIFCONF).ifc_buf",
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        (Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFFLAGS:        /* set flags                    */
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFFLAGS)",
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIFFLAGS)",
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFADDR:         /* set PA address               */
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFDSTADDR:      /* set remote PA address        */
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFBRDADDR:      /* set broadcast PA address     */
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFNETMASK:      /* set network PA mask          */
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSIF*ADDR)",
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIF*ADDR)",
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->ifr_addr,
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->ifr_addr) );
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFMETRIC:       /* set metric                   */
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMETRIC)",
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIFMETRIC)",
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFMTU:          /* set MTU size                 */
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "ioctl(SIOCSIFMTU)",
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)((struct vki_ifreq *)ARG3)->vki_ifr_name );
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSIFMTU)",
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Routing table calls.  */
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef VKI_SIOCADDRT
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCADDRT:           /* add routing table entry      */
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCDELRT:           /* delete routing table entry   */
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCADDRT/DELRT)", ARG3,
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(struct vki_rtentry));
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGPGRP:
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(SIOCGPGRP)", ARG3, sizeof(int) );
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSPGRP:
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "ioctl(SIOCSPGRP)", ARG3, sizeof(int) );
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //tst->sys_flags &= ~SfMayBlock;
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIODTYPE:
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "ioctl(FIONREAD)", ARG3, sizeof(int) );
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_DTRACEHIOC_ADDDOF:
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // ttycom.h
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGETA:
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRE_MEM_WRITE( "ioctl(TIOCGETA)", ARG3, sizeof(struct vki_termios) );
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSETA:
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRE_MEM_READ( "ioctl(TIOCSETA)", ARG3, sizeof(struct vki_termios) );
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGETD:
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRE_MEM_WRITE( "ioctl(TIOCGETD)", ARG3, sizeof(int) );
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSETD:
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRE_MEM_READ( "ioctl(TIOCSETD)", ARG3, sizeof(int) );
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCPTYGNAME:
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRE_MEM_WRITE( "ioctl(TIOCPTYGNAME)", ARG3, 128 );
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(PRE_unknown_ioctl)(tid, ARG2, ARG3);
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(ioctl)
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG2 /* request */) {
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGWINSZ:
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_winsize) );
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSWINSZ:
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMBIS:
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMBIC:
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMSET:
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCMGET:
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(unsigned int) );
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGPGRP:
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Get process group ID for foreground processing group. */
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSPGRP:
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Set a process group ID? */
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_pid_t) );
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSCTTY:
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIONBIO:
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIOASYNC:
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIONREAD:                /* identical to SIOCINQ */
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* These all use struct ifreq AFAIK */
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFFLAGS:        /* get flags                    */
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_flags,
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_flags) );
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFMTU:          /* get MTU size                 */
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_mtu,
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_mtu) );
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFADDR:         /* get PA address               */
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFDSTADDR:      /* get remote PA address        */
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFBRDADDR:      /* get broadcast PA address     */
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFNETMASK:      /* get network PA mask          */
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                (Addr)&((struct vki_ifreq *)ARG3)->ifr_addr,
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                sizeof(((struct vki_ifreq *)ARG3)->ifr_addr) );
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFMETRIC:       /* get metric                   */
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                (Addr)&((struct vki_ifreq *)ARG3)->vki_ifr_metric,
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                sizeof(((struct vki_ifreq *)ARG3)->vki_ifr_metric) );
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGIFCONF:         /* get iface list               */
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* WAS:
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("ioctl(SIOCGIFCONF)", ARG3, sizeof(struct ifconf));
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         KERNEL_DO_SYSCALL(tid,RES);
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (!VG_(is_kerror)(RES) && RES == 0)
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG3, sizeof(struct ifconf));
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      */
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (RES == 0 && ARG3 ) {
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_ifconf *ifc = (struct vki_ifconf *) ARG3;
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (ifc->vki_ifc_buf != NULL)
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            POST_MEM_WRITE( (Addr)(ifc->vki_ifc_buf), ifc->ifc_len );
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFFLAGS:        /* set flags                    */
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFDSTADDR:      /* set remote PA address        */
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFBRDADDR:      /* set broadcast PA address     */
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFNETMASK:      /* set network PA mask          */
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFMETRIC:       /* set metric                   */
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFADDR:         /* set PA address               */
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSIFMTU:          /* set MTU size                 */
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef VKI_SIOCADDRT
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Routing table calls.  */
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCADDRT:           /* add routing table entry      */
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCDELRT:           /* delete routing table entry   */
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCGPGRP:
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(int));
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SIOCSPGRP:
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FIODTYPE:
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(int) );
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_DTRACEHIOC_REMOVE:
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_DTRACEHIOC_ADDDOF:
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // ttycom.h
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGETA:
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       POST_MEM_WRITE( ARG3, sizeof(struct vki_termios));
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSETA:
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCGETD:
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       POST_MEM_WRITE( ARG3, sizeof(int) );
1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCSETD:
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCPTYGNAME:
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       POST_MEM_WRITE( ARG3, 128);
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCPTYGRANT:
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_TIOCPTYUNLK:
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   darwin fcntl wrapper
1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic const char *name_for_fcntl(UWord cmd) {
1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define F(n) case VKI_##n: return #n
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (cmd) {
1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_CHKCLEAN);
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_RDAHEAD);
1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_NOCACHE);
1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_FULLFSYNC);
1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_FREEZE_FS);
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_THAW_FS);
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_GLOBAL_NOCACHE);
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_PREALLOCATE);
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_SETSIZE);
1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_RDADVISE);
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_READBOOTSTRAP);
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_WRITEBOOTSTRAP);
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_LOG2PHYS);
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_GETPATH);
1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_PATHPKG_CHECK);
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      F(F_ADDSIGS);
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return "UNKNOWN";
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef F
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fcntl)
1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG2) {
1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // These ones ignore ARG3.
1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETFD:
1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETFL:
1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETOWN:
1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl ( %ld, %ld )", ARG1,ARG2);
1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "fcntl", unsigned int, fd, unsigned int, cmd);
1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // These ones use ARG3 as "arg".
1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_DUPFD:
1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETFD:
1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETFL:
1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETOWN:
1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl[ARG3=='arg'] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd, unsigned long, arg);
1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // These ones use ARG3 as "lock".
1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETLK:
1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLK:
1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLKW:
1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl[ARG3=='lock'] ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3);
1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd,
1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    struct flock64 *, lock);
1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme mem read sizeof(flock64)
1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG2 == VKI_F_SETLKW)
1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *flags |= SfMayBlock;
1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // none
1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_CHKCLEAN:
1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_RDAHEAD:
1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_NOCACHE:
1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_FULLFSYNC:
1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_FREEZE_FS:
1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_THAW_FS:
1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GLOBAL_NOCACHE:
1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl ( %ld, %s )", ARG1, name_for_fcntl(ARG1));
1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(long, "fcntl", unsigned int, fd, unsigned int, cmd);
1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // struct fstore
1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_PREALLOCATE:
1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl ( %ld, %s, %#lx )", ARG1, name_for_fcntl(ARG2), ARG3);
1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd,
1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    struct fstore *, fstore);
1116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
1117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_fstore *fstore = (struct vki_fstore *)ARG3;
1118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_FIELD_READ( "fcntl(F_PREALLOCATE, fstore->fst_flags)",
1119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         fstore->fst_flags );
1120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_FIELD_READ( "fcntl(F_PREALLOCATE, fstore->fst_flags)",
1121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         fstore->fst_posmode );
1122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_FIELD_READ( "fcntl(F_PREALLOCATE, fstore->fst_flags)",
1123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         fstore->fst_offset );
1124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_FIELD_READ( "fcntl(F_PREALLOCATE, fstore->fst_flags)",
1125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         fstore->fst_length );
1126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_FIELD_WRITE( "fcntl(F_PREALLOCATE, fstore->fst_bytesalloc)",
1127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          fstore->fst_bytesalloc);
1128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // off_t
1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETSIZE:
1133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl ( %ld, %s, %#lx )", ARG1, name_for_fcntl(ARG2), ARG3);
1134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
1135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd,
1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_off_t *, offset);
1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // struct radvisory
1140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_RDADVISE:
1141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl ( %ld, %s, %#lx )", ARG1, name_for_fcntl(ARG2), ARG3);
1142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
1143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd,
1144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    struct vki_radvisory *, radvisory);
1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_radvisory *radvisory = (struct vki_radvisory *)ARG3;
1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_FIELD_READ( "fcntl(F_PREALLOCATE, radvisory->ra_offset)",
1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         radvisory->ra_offset );
1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_FIELD_READ( "fcntl(F_PREALLOCATE, radvisory->ra_count)",
1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         radvisory->ra_count );
1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // struct fbootstraptransfer
1155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_READBOOTSTRAP:
1156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_WRITEBOOTSTRAP:
1157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl ( %ld, %s, %#lx )", ARG1, name_for_fcntl(ARG2), ARG3);
1158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
1159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd,
1160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    struct fbootstraptransfer *, bootstrap);
1161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "fcntl(F_READ/WRITEBOOTSTRAP, bootstrap)",
1162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    ARG3, sizeof(struct vki_fbootstraptransfer) );
1163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // struct log2phys (out)
1166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_LOG2PHYS:
1167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl ( %ld, %s, %#lx )", ARG1, name_for_fcntl(ARG2), ARG3);
1168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
1169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd,
1170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    struct log2phys *, l2p);
1171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "fcntl(F_LOG2PHYS, l2p)",
1172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     ARG3, sizeof(struct vki_log2phys) );
1173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // char[maxpathlen] (out)
1176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETPATH:
1177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl ( %ld, %s, %#lx )", ARG1, name_for_fcntl(ARG2), ARG3);
1178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
1179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd,
1180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    char *, pathbuf);
1181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "fcntl(F_GETPATH, pathbuf)",
1182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     ARG3, VKI_MAXPATHLEN );
1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // char[maxpathlen] (in)
1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_PATHPKG_CHECK:
1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl ( %ld, %s, %#lx '%s')", ARG1, name_for_fcntl(ARG2), ARG3,
1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (char *)ARG3);
1189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
1190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd,
1191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    char *, pathbuf);
1192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( "fcntl(F_PATHPKG_CHECK, pathbuf)", ARG3);
1193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_ADDSIGS: /* Add detached signatures (for code signing) */
1196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl ( %ld, %s )", ARG1, name_for_fcntl(ARG2));
1197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "fcntl",
1198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, fd, unsigned int, cmd,
1199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    vki_fsignatures_t *, sigs);
1200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
1202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vki_fsignatures_t *fsigs = (vki_fsignatures_t*)ARG3;
1203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_FIELD_READ( "fcntl(F_ADDSIGS, fsigs->fs_blob_start)",
1204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         fsigs->fs_blob_start);
1205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_FIELD_READ( "fcntl(F_ADDSIGS, fsigs->fs_blob_size)",
1206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         fsigs->fs_blob_size);
1207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (fsigs->fs_blob_start)
1209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRE_MEM_READ( "fcntl(F_ADDSIGS, fsigs->fs_blob_start)",
1210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          (Addr)fsigs->fs_blob_start, fsigs->fs_blob_size);
1211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
1215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("fcntl ( %ld, %ld [??] )", ARG1, ARG2);
1216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("UNKNOWN fcntl %ld!", ARG2);
1217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(fcntl)
1222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG2) {
1225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_DUPFD:
1226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!ML_(fd_allowed)(RES, "fcntl(DUPFD)", tid, True)) {
1227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(close)(RES);
1228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EMFILE );
1229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
1230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (VG_(clo_track_fds))
1231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(record_fd_open_named)(tid, RES);
1232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETFD:
1236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETFL:
1237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETOWN:
1238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETFD:
1239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETFL:
1240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETOWN:
1241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETLK:
1242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLK:
1243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_SETLKW:
1244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
1245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_PREALLOCATE:
1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct vki_fstore *fstore = (struct vki_fstore *)ARG3;
1249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_FIELD_WRITE( fstore->fst_bytesalloc );
1250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_LOG2PHYS:
1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(struct vki_log2phys) );
1255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_F_GETPATH:
1258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, 1+VG_(strlen)((char *)ARG3) );
1259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("\"%s\"", (char*)ARG3);
1260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
1263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // DDD: ugh, missing lots of cases here, not nice
1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
1269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unix syscalls
1270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
1271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(futimes)
1273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("futimes ( %ld, %#lx )", ARG1,ARG2);
1275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "futimes", int, fd, struct timeval *, tvp);
1276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "futimes", tid, False)) {
1277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
1278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else if (ARG2 != 0) {
1279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_timeval_READ( "futimes(tvp[0])", ARG2 );
1280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_timeval_READ( "futimes(tvp[1])", ARG2+sizeof(struct vki_timeval) );
1281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semget)
1285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("semget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
1287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "semget", vki_key_t, key, int, nsems, int, semflg);
1288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semop)
1291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("semop ( %ld, %#lx, %lu )",ARG1,ARG2,ARG3);
1294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "semop",
1295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, semid, struct sembuf *, sops, vki_size_t, nsoops);
1296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_semop)(tid, ARG1,ARG2,ARG3);
1297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semctl)
1300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG3) {
1302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_STAT:
1303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_IPC_SET:
1304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
1305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "semctl",
1306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd, struct semid_ds *, arg);
1307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_GETALL:
1309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SETALL:
1310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
1311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "semctl",
1312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd, unsigned short *, arg);
1313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_SETVAL:
1315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("semctl ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
1316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(long, "semctl",
1317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd, int, arg);
1318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
1320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("semctl ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
1321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ3(long, "semctl",
1322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int, semid, int, semnum, int, cmd);
1323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_semctl)(tid, ARG1,ARG2,ARG3,ARG4);
1326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(semctl)
1328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_semctl)(tid, RES,ARG1,ARG2,ARG3,ARG4);
1330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sem_open)
1333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 & VKI_O_CREAT) {
1335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // 4-arg version
1336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sem_open ( %#lx(%s), %ld, %ld, %ld )",
1337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ARG1,(char*)ARG1,ARG2,ARG3,ARG4);
1338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ4(vki_sem_t *, "sem_open",
1339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    const char *, name, int, oflag, vki_mode_t, mode,
1340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unsigned int, value);
1341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
1342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // 2-arg version
1343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("sem_open ( %#lx(%s), %ld )",ARG1,(char*)ARG1,ARG2);
1344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_REG_READ2(vki_sem_t *, "sem_open",
1345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    const char *, name, int, oflag);
1346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "sem_open(name)", ARG1 );
1348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Otherwise handle normally */
1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sem_close)
1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sem_close( %#lx )", ARG1);
1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(int, "sem_close", vki_sem_t *, sem);
1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sem_unlink)
1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sem_unlink(  %#lx(%s) )", ARG1,(char*)ARG1);
1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(int, "sem_unlink", const char *, name);
1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "sem_unlink(name)", ARG1 );
1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sem_post)
1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sem_post( %#lx )", ARG1);
1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(int, "sem_post", vki_sem_t *, sem);
1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sem_destroy)
1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRINT("sem_destroy( %#lx )", ARG1);
1376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRE_REG_READ1(int, "sem_destroy", vki_sem_t *, sem);
1377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRE_MEM_READ("sem_destroy(sem)", ARG1, sizeof(vki_sem_t));
1378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sem_init)
1381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRINT("sem_init( %#lx, %ld, %ld )", ARG1, ARG2, ARG3);
1383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRE_REG_READ3(int, "sem_init", vki_sem_t *, sem,
1384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                int, pshared, unsigned int, value);
1385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRE_MEM_WRITE("sem_init(sem)", ARG1, sizeof(vki_sem_t));
1386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sem_init)
1389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  POST_MEM_WRITE(ARG1, sizeof(vki_sem_t));
1391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sem_wait)
1394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sem_wait( %#lx )", ARG1);
1396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(int, "sem_wait", vki_sem_t *, sem);
1397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sem_trywait)
1401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sem_trywait( %#lx )", ARG1);
1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(int, "sem_trywait", vki_sem_t *, sem);
1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(kqueue)
1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRINT("kqueue()");
1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(kqueue)
1413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "kqueue", tid, True)) {
1415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
1416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
1417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
1418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds)) {
1419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_with_given_name)(tid, RES, NULL);
1420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(kevent)
1425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("kevent( %ld, %#lx, %ld, %#lx, %ld, %#lx )",
1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(int,"kevent", int,kq,
1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct vki_kevent *,changelist, int,nchanges,
1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct vki_kevent *,eventlist, int,nevents,
1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct vki_timespec *,timeout);
1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3) PRE_MEM_READ ("kevent(changelist)",
1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           ARG2, ARG3 * sizeof(struct vki_kevent));
1435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5) PRE_MEM_WRITE("kevent(eventlist)",
1436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           ARG4, ARG5 * sizeof(struct vki_kevent));
1437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG6) PRE_MEM_READ ("kevent(timeout)",
1438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           ARG6, sizeof(struct vki_timespec));
1439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(kevent)
1444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("kevent ret %ld dst %#lx (%zu)", RES, ARG4, sizeof(struct vki_kevent));
1446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > 0) POST_MEM_WRITE(ARG4, RES * sizeof(struct vki_kevent));
1447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownAddr pthread_starter = 0;
1451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownAddr wqthread_starter = 0;
1452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSizeT pthread_structsize = 0;
1453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(bsdthread_register)
1455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("bsdthread_register( %#lx, %#lx, %lu )", ARG1, ARG2, ARG3);
1457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int,"__bsdthread_register", void *,"threadstart",
1458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *,"wqthread", size_t,"pthsize");
1459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   pthread_starter = ARG1;
1461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   wqthread_starter = ARG2;
1462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   pthread_structsize = ARG3;
1463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARG1 = (Word)&pthread_hijack_asm;
1464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARG2 = (Word)&wqthread_hijack_asm;
1465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(workq_open)
1468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("workq_open()");
1470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(int, "workq_open");
1471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // This creates lots of threads and thread stacks under the covers,
1473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // but we ignore them all until some work item starts running on it.
1474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic const char *workqop_name(int op)
1477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (op) {
1479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_WQOPS_QUEUE_ADD:        return "QUEUE_ADD";
1480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_WQOPS_QUEUE_REMOVE:     return "QUEUE_REMOVE";
1481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_WQOPS_THREAD_RETURN:    return "THREAD_RETURN";
1482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_WQOPS_THREAD_SETCONC:   return "THREAD_SETCONC";
1483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_WQOPS_QUEUE_NEWSPISUPP: return "QUEUE_NEWSPISUPP";
1484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_WQOPS_QUEUE_REQTHREADS: return "QUEUE_REQTHREADS";
1485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default: return "?";
1486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(workq_ops)
1491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("workq_ops( %ld(%s), %#lx, %ld )", ARG1, workqop_name(ARG1), ARG2,
1493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG3);
1494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int,"workq_ops", int,"options", void *,"item",
1495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"priority");
1496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1) {
1498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_WQOPS_QUEUE_ADD:
1499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_WQOPS_QUEUE_REMOVE:
1500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme need anything here?
1501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme may block?
1502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case VKI_WQOPS_QUEUE_NEWSPISUPP:
1504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break; // JRS don't think we need to do anything here
1505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_WQOPS_THREAD_RETURN: {
1507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // The interesting case. The kernel will do one of two things:
1508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // 1. Return normally. We continue; libc proceeds to stop the thread.
1509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //    V does nothing special here.
1510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // 2. Jump to wqthread_hijack. This wipes the stack and runs a
1511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //    new work item, and never returns from workq_ops.
1512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //    V handles this by longjmp() from wqthread_hijack back to the
1513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //    scheduler, which continues at the new client SP/IP/state.
1514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //    This works something like V's signal handling.
1515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //    To the tool, this looks like workq_ops() sometimes returns
1516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //    to a strange address.
1517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ThreadState *tst = VG_(get_ThreadState)(tid);
1518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->os_state.wq_jmpbuf_valid = True;
1519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfMayBlock;  // GrP fixme true?
1520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
1524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("UNKNOWN workq_ops option %ld\n", ARG1);
1525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(workq_ops)
1529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState *tst = VG_(get_ThreadState)(tid);
1531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst->os_state.wq_jmpbuf_valid = False;
1532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(__mac_syscall)
1537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("__mac_syscall( %#lx, %ld, %#lx )", ARG1, ARG2, ARG3);
1539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int,"__mac_syscall", char *,"policy",
1540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"call", void *,"arg");
1541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme check call's arg?
1543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme check policy?
1544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Not like syswrap-generic's sys_exit, which exits only one thread.
1548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   More like syswrap-generic's sys_exit_group. */
1549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(exit)
1550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadId     t;
1552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState* tst;
1553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("darwin exit( %ld )", ARG1);
1555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(void, "exit", int, status);
1556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst = VG_(get_ThreadState)(tid);
1558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* A little complex; find all the threads with the same threadgroup
1560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      as this one (including this one), and mark them to exit */
1561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (t = 1; t < VG_N_THREADS; t++) {
1562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ( /* not alive */
1563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           VG_(threads)[t].status == VgTs_Empty
1564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           /* GrP fixme zombie? */
1565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         )
1566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
1567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(threads)[t].exitreason = VgSrc_ExitProcess;
1569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(threads)[t].os_state.exitcode = ARG1;
1570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (t != tid)
1572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(get_thread_out_of_syscall)(t);     /* unblock it, if blocked */
1573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* We have to claim the syscall already succeeded. */
1576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
1577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sigaction)
1581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sigaction ( %ld, %#lx, %#lx )", ARG1,ARG2,ARG3);
1583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "sigaction",
1584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, signum, vki_sigaction_toK_t *, act,
1585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_sigaction_fromK_t *, oldact);
1586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0) {
1588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vki_sigaction_toK_t *sa = (vki_sigaction_toK_t *)ARG2;
1589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "sigaction(act->sa_handler)",
1590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
1591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "sigaction(act->sa_mask)",
1592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
1593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "sigaction(act->sa_flags)",
1594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
1595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
1597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "sigaction(oldact)",
1598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     ARG3, sizeof(vki_sigaction_fromK_t));
1599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(
1601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(do_sys_sigaction)(ARG1, (const vki_sigaction_toK_t *)ARG2,
1602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  (vki_sigaction_fromK_t *)ARG3)
1603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
1604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sigaction)
1606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0 && ARG3 != 0)
1609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_sigaction_fromK_t));
1610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(__pthread_kill)
1614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("__pthread_kill ( %ld, %ld )", ARG1, ARG2);
1616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "__pthread_kill", vki_pthread_t*, thread, int, sig);
1617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(__pthread_sigmask)
1621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme
1623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // JRS: arguments are identical to sigprocmask
1624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // (how, sigset_t*, sigset_t*).  Perhaps behave identically?
1625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static Bool warned;
1626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!warned) {
1627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("UNKNOWN __pthread_sigmask is unsupported. "
1628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  "This warning will not be repeated.\n");
1629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      warned = True;
1630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success( 0 );
1632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(__pthread_canceled)
1636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock; /* might kill this thread??? */
1638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* I don't think so -- I think it just changes the cancellation
1639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      state.  But taking no chances. */
1640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("__pthread_canceled ( %ld )", ARG1);
1641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "__pthread_canceled", void*, arg1);
1642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(__pthread_markcancel)
1646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock; /* might kill this thread??? */
1648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("__pthread_markcancel ( %#lx )", ARG1);
1649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "__pthread_markcancel", void*, arg1);
1650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Just let it go through.  No idea if this is correct. */
1651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(__disable_threadsignal)
1655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_sigset_t set;
1657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("__disable_threadsignal(%ld, %ld, %ld)", ARG1, ARG2, ARG3);
1658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* I don't think this really looks at its arguments.  So don't
1659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      bother to check them. */
1660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigfillset)( &set );
1662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(
1663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(do_sys_sigprocmask) ( tid, VKI_SIG_BLOCK, &set, NULL )
1664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
1665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* We don't expect that blocking all signals for this thread could
1667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      cause any more to be delivered (how could it?), but just in case
1668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      .. */
1669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS)
1670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfPollAfter;
1671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(kdebug_trace)
1675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("kdebug_trace(%ld, %ld, %ld, %ld, %ld, %ld)",
1677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
1678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*
1679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Don't check anything - some clients pass fewer arguments.
1680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "kdebug_trace",
1681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"code", int,"arg1", int,"arg2",
1682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"arg3", int,"arg4", int,"arg5");
1683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
1684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(seteuid)
1688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRINT("seteuid(%ld)", ARG1);
1690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRE_REG_READ1(long, "seteuid", vki_uid_t, "uid");
1691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(setegid)
1695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRINT("setegid(%ld)", ARG1);
1697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRE_REG_READ1(long, "setegid", vki_uid_t, "uid");
1698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(settid)
1701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRINT("settid(%ld, %ld)", ARG1, ARG2);
1703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRE_REG_READ2(long, "settid", vki_uid_t, "uid", vki_gid_t, "gid");
1704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* XXX need to check whether we need POST operations for
1707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * waitevent, watchevent, modwatch -- jpeach
1708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
1709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(watchevent)
1710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRINT("watchevent(%#lx, %#lx)", ARG1, ARG2);
1712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRE_REG_READ2(long, "watchevent",
1713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        vki_eventreq *, "event", unsigned int, "eventmask");
1714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRE_MEM_READ("watchevent(event)", ARG1, sizeof(vki_eventreq));
1716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRE_MEM_READ("watchevent(eventmask)", ARG2, sizeof(unsigned int));
1717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    *flags |= SfMayBlock;
1718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define WAITEVENT_FAST_POLL ((Addr)(struct timeval *)-1)
1721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(waitevent)
1722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("waitevent(%#lx, %#lx)", ARG1, ARG2);
1724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "waitevent",
1725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vki_eventreq *, "event", struct timeval *, "timeout");
1726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("waitevent(event)", ARG1, sizeof(vki_eventreq));
1727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2  &&  ARG2 != WAITEVENT_FAST_POLL) {
1729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_timeval_READ("waitevent(timeout)", ARG2);
1730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* XXX ((timeval*)-1) is valid for ARG2 -- jpeach */
1733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(waitevent)
1737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG1, sizeof(vki_eventreq));
1739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(modwatch)
1742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("modwatch(%#lx, %#lx)", ARG1, ARG2);
1744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "modwatch",
1745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vki_eventreq *, "event", unsigned int, "eventmask");
1746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("modwatch(event)", ARG1, sizeof(vki_eventreq));
1748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("modwatch(eventmask)", ARG2, sizeof(unsigned int));
1749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getxattr)
1752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getxattr(%#lx(%s), %#lx(%s), %#lx, %lu, %lu, %ld)",
1754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (char *)ARG1, ARG2, (char *)ARG2, ARG3, ARG4, ARG5, ARG6);
1755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(vki_ssize_t, "getxattr",
1757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                const char *, path, char *, name, void *, value,
1758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                vki_size_t, size, uint32_t, position, int, options);
1759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("getxattr(path)", ARG1);
1760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("getxattr(name)", ARG2);
1761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getxattr(value)", ARG3, ARG4);
1762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getxattr)
1765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert((vki_ssize_t)RES >= 0);
1767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG3, (vki_ssize_t)RES);
1768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fgetxattr)
1771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("fgetxattr(%ld, %#lx(%s), %#lx, %lu, %lu, %ld)",
1773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1, ARG2, (char *)ARG2, ARG3, ARG4, ARG5, ARG6);
1774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(vki_ssize_t, "fgetxattr",
1776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, char *, name, void *, value,
1777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t, size, uint32_t, position, int, options);
1778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("getxattr(name)", ARG2);
1779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "getxattr(value)", ARG3, ARG4);
1780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(fgetxattr)
1783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert((vki_ssize_t)RES >= 0);
1785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG3, (vki_ssize_t)RES);
1786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(setxattr)
1789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("setxattr ( %#lx(%s), %#lx(%s), %#lx, %lu, %lu, %ld )",
1791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (char *)ARG1, ARG2, (char*)ARG2, ARG3, ARG4, ARG5, ARG6 );
1792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(int, "setxattr",
1793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *,"path", char *,"name", void *,"value",
1794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t,"size", uint32_t,"position", int,"options" );
1795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "setxattr(path)", ARG1 );
1797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "setxattr(name)", ARG2 );
1798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "setxattr(value)", ARG3, ARG4 );
1799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fsetxattr)
1803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "fsetxattr ( %ld, %#lx(%s), %#lx, %lu, %lu, %ld )",
1805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          ARG1, ARG2, (char*)ARG2, ARG3, ARG4, ARG5, ARG6 );
1806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(int, "fsetxattr",
1807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"fd", char *,"name", void *,"value",
1808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t,"size", uint32_t,"position", int,"options" );
1809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "fsetxattr(name)", ARG2 );
1811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "fsetxattr(value)", ARG3, ARG4 );
1812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(removexattr)
1816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "removexattr ( %#lx(%s), %#lx(%s), %ld )",
1818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          ARG1, (HChar*)ARG1, ARG2, (HChar*)ARG2, ARG3 );
1819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int, "removexattr",
1820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char*, "path", char*, "attrname", int, "options");
1821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "removexattr(path)", ARG1 );
1822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "removexattr(attrname)", ARG2 );
1823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fremovexattr)
1827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "fremovexattr ( %ld, %#lx(%s), %ld )",
1829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          ARG1, ARG2, (HChar*)ARG2, ARG3 );
1830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int, "fremovexattr",
1831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, "fd", char*, "attrname", int, "options");
1832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "removexattr(attrname)", ARG2 );
1833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(listxattr)
1837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "listxattr ( %#lx(%s), %#lx, %lu, %ld )",
1839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          ARG1, (char *)ARG1, ARG2, ARG3, ARG4 );
1840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4 (long, "listxattr",
1841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *,"path", char *,"namebuf",
1842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t,"size", int,"options" );
1843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "listxattr(path)", ARG1 );
1845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "listxattr(namebuf)", ARG2, ARG3 );
1846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(listxattr)
1849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert((vki_ssize_t)RES >= 0);
1852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, (vki_ssize_t)RES );
1853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(flistxattr)
1857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "flistxattr ( %ld, %#lx, %lu, %ld )",
1859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          ARG1, ARG2, ARG3, ARG4 );
1860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4 (long, "flistxattr",
1861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  int, "fd", char *,"namebuf",
1862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_size_t,"size", int,"options" );
1863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "flistxattr(namebuf)", ARG2, ARG3 );
1864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(flistxattr)
1867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert((vki_ssize_t)RES >= 0);
1870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, (vki_ssize_t)RES );
1871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(shmat)
1875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UWord arg2tmp;
1877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("shmat ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
1878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "shmat",
1879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, shmid, const void *, shmaddr, int, shmflg);
1880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg2tmp = ML_(generic_PRE_sys_shmat)(tid, ARG1,ARG2,ARG3);
1881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (arg2tmp == 0)
1882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
1883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else
1884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG2 = arg2tmp;  // used in POST
1885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(shmat)
1887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_shmat)(tid, RES,ARG1,ARG2,ARG3);
1889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(shmctl)
1892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("shmctl ( %ld, %ld, %#lx )",ARG1,ARG2,ARG3);
1894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "shmctl",
1895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, shmid, int, cmd, struct vki_shmid_ds *, buf);
1896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_shmctl)(tid, ARG1,ARG2,ARG3);
1897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(shmctl)
1899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_shmctl)(tid, RES,ARG1,ARG2,ARG3);
1901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(shmdt)
1904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("shmdt ( %#lx )",ARG1);
1906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "shmdt", const void *, shmaddr);
1907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(generic_PRE_sys_shmdt)(tid, ARG1))
1908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
1909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(shmdt)
1911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_shmdt)(tid, RES,ARG1);
1913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(shmget)
1916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("shmget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
1918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "shmget", vki_key_t, key, vki_size_t, size, int, shmflg);
1919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(shm_open)
1922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("shm_open(%#lx(%s), %ld, %ld)", ARG1, (char *)ARG1, ARG2, ARG3);
1924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "shm_open",
1925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *,"name", int,"flags", vki_mode_t,"mode");
1926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "shm_open(filename)", ARG1 );
1928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
1930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(shm_open)
1932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
1934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(RES, "shm_open", tid, True)) {
1935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(RES);
1936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
1937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
1938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds))
1939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_with_given_name)(tid, RES, (Char*)ARG1);
1940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1943663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(shm_unlink)
1944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   *flags |= SfMayBlock;
1946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("shm_unlink ( %#lx(%s) )", ARG1,(char*)ARG1);
1947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_REG_READ1(long, "shm_unlink", const char *, pathname);
1948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRE_MEM_RASCIIZ( "shm_unlink(pathname)", ARG1 );
1949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1950663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPOST(shm_unlink)
1951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* My reading of the man page suggests that a call may cause memory
1953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mappings to change: "if no references exist at the time of the
1954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      call to shm_unlink(), the resources are reclaimed immediately".
1955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      So we need to resync here, sigh. */
1956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ML_(sync_mappings)("after", "shm_unlink", 0);
1957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(stat_extended)
1960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("stat_extended( %#lx(%s), %#lx, %#lx, %#lx )",
1962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1, (char *)ARG1, ARG2, ARG3, ARG4);
1963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int, "stat_extended", char *, file_name, struct stat *, buf,
1964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, fsacl, vki_size_t *, fsacl_size);
1965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "stat_extended(file_name)",  ARG1 );
1966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE(   "stat_extended(buf)",        ARG2, sizeof(struct vki_stat) );
1967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
1968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("stat_extended(fsacl)",      ARG3, *(vki_size_t *)ARG4 );
1969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ(    "stat_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
1970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(stat_extended)
1972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) );
1974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
1975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, *(vki_size_t *)ARG4 );
1976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG4, sizeof(vki_size_t) );
1977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(lstat_extended)
1981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("lstat_extended( %#lx(%s), %#lx, %#lx, %#lx )",
1983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1, (char *)ARG1, ARG2, ARG3, ARG4);
1984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int, "lstat_extended", char *, file_name, struct stat *, buf,
1985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, fsacl, vki_size_t *, fsacl_size);
1986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "lstat_extended(file_name)",  ARG1 );
1987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE(   "lstat_extended(buf)",        ARG2, sizeof(struct vki_stat) );
1988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
1989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("lstat_extended(fsacl)",      ARG3, *(vki_size_t *)ARG4 );
1990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ(    "lstat_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
1991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(lstat_extended)
1993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) );
1995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
1996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, *(vki_size_t *)ARG4 );
1997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG4, sizeof(vki_size_t) );
1998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fstat_extended)
2002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("fstat_extended( %ld, %#lx, %#lx, %#lx )",
2004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1, ARG2, ARG3, ARG4);
2005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int, "fstat_extended", int, fd, struct stat *, buf,
2006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, fsacl, vki_size_t *, fsacl_size);
2007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE(   "fstat_extended(buf)",        ARG2, sizeof(struct vki_stat) );
2008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
2009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("fstat_extended(fsacl)",      ARG3, *(vki_size_t *)ARG4 );
2010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ(    "fstat_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
2011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(fstat_extended)
2013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) );
2015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
2016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, *(vki_size_t *)ARG4 );
2017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG4, sizeof(vki_size_t) );
2018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(stat64_extended)
2022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("stat64_extended( %#lx(%s), %#lx, %#lx, %#lx )",
2024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1, (char *)ARG1, ARG2, ARG3, ARG4);
2025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int, "stat64_extended", char *, file_name, struct stat64 *, buf,
2026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, fsacl, vki_size_t *, fsacl_size);
2027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "stat64_extended(file_name)",  ARG1 );
2028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE(   "stat64_extended(buf)",        ARG2, sizeof(struct vki_stat64) );
2029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
2030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("stat64_extended(fsacl)",      ARG3, *(vki_size_t *)ARG4 );
2031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ(    "stat64_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
2032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(stat64_extended)
2034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
2036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
2037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, *(vki_size_t *)ARG4 );
2038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG4, sizeof(vki_size_t) );
2039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(lstat64_extended)
2043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("lstat64_extended( %#lx(%s), %#lx, %#lx, %#lx )",
2045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1, (char *)ARG1, ARG2, ARG3, ARG4);
2046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int, "lstat64_extended", char *, file_name, struct stat64 *, buf,
2047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, fsacl, vki_size_t *, fsacl_size);
2048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "lstat64_extended(file_name)",  ARG1 );
2049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE(   "lstat64_extended(buf)",        ARG2, sizeof(struct vki_stat64) );
2050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
2051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE(   "lstat64_extended(fsacl)",   ARG3, *(vki_size_t *)ARG4 );
2052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ(    "lstat64_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
2053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(lstat64_extended)
2055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
2057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
2058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, *(vki_size_t *)ARG4 );
2059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG4, sizeof(vki_size_t) );
2060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fstat64_extended)
2064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("fstat64_extended( %ld, %#lx, %#lx, %#lx )",
2066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1, ARG2, ARG3, ARG4);
2067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int, "fstat64_extended", int, fd, struct stat64 *, buf,
2068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, fsacl, vki_size_t *, fsacl_size);
2069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE(   "fstat64_extended(buf)",        ARG2, sizeof(struct vki_stat64) );
2070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
2071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("fstat64_extended(fsacl)",      ARG3, *(vki_size_t *)ARG4 );
2072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ(    "fstat64_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
2073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(fstat64_extended)
2075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
2077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
2078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, *(vki_size_t *)ARG4 );
2079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG4, sizeof(vki_size_t) );
2080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fchmod_extended)
2084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* DDD: Note: this is not really correct.  Handling of
2086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      chmod_extended is broken in the same way. */
2087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("fchmod_extended ( %ld, %ld, %ld, %ld, %#lx )",
2088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3, ARG4, ARG5);
2089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "fchmod_extended",
2090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, fildes,
2091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 uid_t, uid,
2092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 gid_t, gid,
2093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_mode_t, mode,
2094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void* /*really,user_addr_t*/, xsecurity);
2095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* DDD: relative to the xnu sources (kauth_copyinfilesec), this
2096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      is just way wrong.  [The trouble is with the size, which depends on a
2097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      non-trival kernel computation] */
2098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5) {
2099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "fchmod_extended(xsecurity)", ARG5,
2100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(struct vki_kauth_filesec) );
2101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(chmod_extended)
2105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* DDD: Note: this is not really correct.  Handling of
2107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fchmod_extended is broken in the same way. */
2108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("chmod_extended ( %#lx(%s), %ld, %ld, %ld, %#lx )",
2109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG1 ? (HChar*)ARG1 : "(null)", ARG2, ARG3, ARG4, ARG5);
2110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "chmod_extended",
2111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, fildes,
2112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 uid_t, uid,
2113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 gid_t, gid,
2114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_mode_t, mode,
2115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void* /*really,user_addr_t*/, xsecurity);
2116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("chmod_extended(path)", ARG1);
2117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* DDD: relative to the xnu sources (kauth_copyinfilesec), this
2118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      is just way wrong.  [The trouble is with the size, which depends on a
2119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      non-trival kernel computation] */
2120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5) {
2121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "chmod_extended(xsecurity)", ARG5,
2122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(struct vki_kauth_filesec) );
2123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(open_extended)
2127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* DDD: Note: this is not really correct.  Handling of
2129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {,f}chmod_extended is broken in the same way. */
2130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("open_extended ( %#lx(%s), 0x%lx, %ld, %ld, %ld, %#lx )",
2131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG1 ? (HChar*)ARG1 : "(null)",
2132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 ARG2, ARG3, ARG4, ARG5, ARG6);
2133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "open_extended",
2134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char*, path,
2135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,   flags,
2136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 uid_t, uid,
2137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 gid_t, gid,
2138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_mode_t, mode,
2139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void* /*really,user_addr_t*/, xsecurity);
2140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("open_extended(path)", ARG1);
2141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* DDD: relative to the xnu sources (kauth_copyinfilesec), this
2142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      is just way wrong.  [The trouble is with the size, which depends on a
2143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      non-trival kernel computation] */
2144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG6)
2145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "open_extended(xsecurity)", ARG6,
2146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    sizeof(struct vki_kauth_filesec) );
2147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This is a ridiculous syscall.  Specifically, the 'entries' argument points
2150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// to a buffer that contains one or more 'accessx_descriptor' structs followed
2151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// by one or more strings.  Each accessx_descriptor contains a field,
2152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 'ad_name_offset', which points to one of the strings (or it can contain
2153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// zero which means "reuse the string from the previous accessx_descriptor").
2154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
2155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// What's really ridiculous is that we are only given the size of the overall
2156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// buffer, not the number of accessx_descriptors, nor the number of strings.
2157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// The kernel determines the number of accessx_descriptors by walking through
2158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// them one by one, checking that the ad_name_offset points within the buffer,
2159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// past the current point (or that it's a zero, unless its the first
2160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// descriptor);  if so, we assume that this really is an accessx_descriptor,
2161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// if not, we assume we've hit the strings section.  Gah.
2162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
2163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This affects us here because number of entries in the 'results' buffer is
2164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// determined by the number of accessx_descriptors.  So we have to know that
2165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// number in order to do PRE_MEM_WRITE/POST_MEM_WRITE of 'results'.  In
2166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// practice, we skip the PRE_MEM_WRITE step because it's easier to do the
2167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// computation after the syscall has succeeded, because the kernel will have
2168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// checked for all the zillion different ways this syscall can fail, and we'll
2169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// know we have a well-formed 'entries' buffer.  This means we might miss some
2170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// uses of unaddressable memory but oh well.
2171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
2172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(access_extended)
2173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("access_extended( %#lx(%s), %lu, %#lx, %lu )",
2175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1, (char *)ARG1, ARG2, ARG3, ARG4);
2176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // XXX: the accessx_descriptor struct contains padding, so this can cause
2177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // unnecessary undefined value errors.  But you arguably shouldn't be
2178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // passing undefined values to the kernel anyway...
2179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int, "access_extended", void *, entries, vki_size_t, size,
2180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_errno_t *, results, vki_uid_t *, uid);
2181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("access_extended(entries)", ARG1, ARG2 );
2182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // XXX: as mentioned above, this check is too hard to do before the
2184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // syscall.
2185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //PRE_MEM_WRITE("access_extended(results)", ARG3, ??? );
2186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(access_extended)
2188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // 'n_descs' is the number of descriptors we think are in the buffer.  We
2190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // start with the maximum possible value, which occurs if we have the
2191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // shortest possible string section.  The shortest string section allowed
2192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // consists of a single one-char string (plus the NUL char).  Hence the
2193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // '2'.
2194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_accessx_descriptor* entries = (struct vki_accessx_descriptor*)ARG1;
2195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SizeT size = ARG2;
2196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int n_descs = (size - 2) / sizeof(struct accessx_descriptor);
2197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int i;         // Current position in the descriptors section array.
2198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int u;         // Upper bound on the length of the descriptors array
2199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  //   (recomputed each time around the loop)
2200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(n_descs > 0);
2201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Step through the descriptors, lowering 'n_descs' until we know we've
2203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // reached the string section.
2204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; True; i++) {
2205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // If we're past our estimate, we must be one past the end of the
2206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // descriptors section (ie. at the start of the string section).  Stop.
2207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i >= n_descs)
2208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
2209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Get the array index for the string, but pretend momentarily that it
2211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // is actually another accessx_descriptor.  That gives us an upper bound
2212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // on the length of the descriptors section.  (Unless the index is zero,
2213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // in which case we have no new info.)
2214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      u = entries[i].ad_name_offset / sizeof(struct vki_accessx_descriptor);
2215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (u == 0) {
2216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vg_assert(i != 0);
2217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
2218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // If the upper bound is below our current estimate, revise that
2221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // estimate downwards.
2222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (u < n_descs)
2223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         n_descs = u;
2224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Sanity check.
2227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(n_descs <= VKI_ACCESSX_MAX_DESCRIPTORS);
2228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG3, n_descs * sizeof(vki_errno_t) );
2230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(chflags)
2234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("chflags ( %#lx(%s), %lu )", ARG1, (char *)ARG1, ARG2);
2236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(int, "chflags", const char *,path, unsigned int,flags);
2237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("chflags(path)", ARG1);
2238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme sanity-check flags value?
2240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fchflags)
2243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("fchflags ( %ld, %lu )", ARG1, ARG2);
2245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(int, "fchflags", int,fd, unsigned int,flags);
2246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme sanity-check flags value?
2248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(stat64)
2251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("stat64 ( %#lx(%s), %#lx )", ARG1, (char *)ARG1, ARG2);
2253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "stat", const char *,path, struct stat64 *,buf);
2254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("stat64(path)", ARG1);
2255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
2256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(stat64)
2258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
2260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(lstat64)
2263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("lstat64 ( %#lx(%s), %#lx )", ARG1, (char *)ARG1, ARG2);
2265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "stat", const char *,path, struct stat64 *,buf);
2266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("lstat64(path)", ARG1);
2267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
2268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(lstat64)
2270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
2272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fstat64)
2275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("fstat64 ( %ld, %#lx )", ARG1,ARG2);
2277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "fstat", unsigned int, fd, struct stat64 *, buf);
2278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
2279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(fstat64)
2281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
2283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getfsstat)
2286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getfsstat(%#lx, %ld, %ld)", ARG1, ARG2, ARG3);
2288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int, "getfsstat",
2289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct vki_statfs *, buf, int, bufsize, int, flags);
2290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1) {
2291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // ARG2 is a BYTE SIZE
2292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("getfsstat(buf)", ARG1, ARG2);
2293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getfsstat)
2296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1) {
2298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // RES is a STRUCT COUNT
2299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG1, RES * sizeof(struct vki_statfs));
2300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getfsstat64)
2304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getfsstat64(%#lx, %ld, %ld)", ARG1, ARG2, ARG3);
2306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int, "getfsstat64",
2307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct vki_statfs64 *, buf, int, bufsize, int, flags);
2308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1) {
2309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // ARG2 is a BYTE SIZE
2310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("getfsstat64(buf)", ARG1, ARG2);
2311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getfsstat64)
2314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1) {
2316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // RES is a STRUCT COUNT
2317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG1, RES * sizeof(struct vki_statfs64));
2318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mount)
2322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Nb: depending on 'flags', the 'type' and 'data' args may be ignored.
2324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // We are conservative and check everything, except the memory pointed to
2325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // by 'data'.
2326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sys_mount( %#lx(%s), %#lx(%s), %#lx, %#lx )",
2328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1,(Char*)ARG1, ARG2,(Char*)ARG2, ARG3, ARG4);
2329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "mount",
2330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *, type, const char *, dir,
2331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, flags, void *, data);
2332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "mount(type)", ARG1);
2333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "mount(dir)", ARG2);
2334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void scan_attrlist(ThreadId tid, struct vki_attrlist *attrList,
2338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          void *attrBuf, SizeT attrBufSize,
2339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          void (*fn)(ThreadId, void *attrData, SizeT size)
2340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          )
2341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
2343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint32_t attrBit;
2344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int32_t attrSize;
2345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } attrspec;
2346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static const attrspec commonattr[] = {
2347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // This order is important.
2348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
2349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_RETURNED_ATTRS,  sizeof(attribute_set_t) },
2350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
2351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_NAME,            -1 },
2352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_DEVID,           sizeof(dev_t) },
2353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_FSID,            sizeof(fsid_t) },
2354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_OBJTYPE,         sizeof(fsobj_type_t) },
2355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_OBJTAG,          sizeof(fsobj_tag_t) },
2356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_OBJID,           sizeof(fsobj_id_t) },
2357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_OBJPERMANENTID,  sizeof(fsobj_id_t) },
2358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_PAROBJID,        sizeof(fsobj_id_t) },
2359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_SCRIPT,          sizeof(text_encoding_t) },
2360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_CRTIME,          sizeof(struct timespec) },
2361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_MODTIME,         sizeof(struct timespec) },
2362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_CHGTIME,         sizeof(struct timespec) },
2363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_ACCTIME,         sizeof(struct timespec) },
2364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_BKUPTIME,        sizeof(struct timespec) },
2365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_FNDRINFO,        32 /*FileInfo+ExtendedFileInfo, or FolderInfo+ExtendedFolderInfo*/ },
2366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_OWNERID,         sizeof(uid_t) },
2367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_GRPID,           sizeof(gid_t) },
2368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_ACCESSMASK,      sizeof(uint32_t) },
2369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_NAMEDATTRCOUNT,  sizeof(uint32_t) },
2370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_NAMEDATTRLIST,   -1 },
2371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_FLAGS,           sizeof(uint32_t) },
2372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_USERACCESS,      sizeof(uint32_t) },
2373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_EXTENDED_SECURITY, -1 },
2374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_UUID,            sizeof(guid_t) },
2375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_GRPUUID,         sizeof(guid_t) },
2376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_FILEID,          sizeof(uint64_t) },
2377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_PARENTID,        sizeof(uint64_t) },
2378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
2379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_CMN_FULLPATH,        -1 },
2380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
2381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { 0,                        0 }
2382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   };
2383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static const attrspec volattr[] = {
2384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // This order is important.
2385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_INFO,            0 },
2386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_FSTYPE,          sizeof(uint32_t) },
2387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_SIGNATURE,       sizeof(uint32_t) },
2388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_SIZE,            sizeof(off_t) },
2389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_SPACEFREE,       sizeof(off_t) },
2390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_SPACEAVAIL,      sizeof(off_t) },
2391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_MINALLOCATION,   sizeof(off_t) },
2392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_ALLOCATIONCLUMP, sizeof(off_t) },
2393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_IOBLOCKSIZE,     sizeof(uint32_t) },
2394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_OBJCOUNT,        sizeof(uint32_t) },
2395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_FILECOUNT,       sizeof(uint32_t) },
2396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_DIRCOUNT,        sizeof(uint32_t) },
2397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_MAXOBJCOUNT,     sizeof(uint32_t) },
2398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_MOUNTPOINT,      -1 },
2399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_NAME,            -1 },
2400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_MOUNTFLAGS,      sizeof(uint32_t) },
2401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_MOUNTEDDEVICE,   -1 },
2402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_ENCODINGSUSED,   sizeof(uint64_t) },
2403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_CAPABILITIES,    sizeof(vol_capabilities_attr_t) },
2404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
2405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_UUID,            sizeof(uuid_t) },
2406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
2407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_VOL_ATTRIBUTES,      sizeof(vol_attributes_attr_t) },
2408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { 0,                        0 }
2409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   };
2410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static const attrspec dirattr[] = {
2411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // This order is important.
2412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_DIR_LINKCOUNT,       sizeof(uint32_t) },
2413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_DIR_ENTRYCOUNT,      sizeof(uint32_t) },
2414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_DIR_MOUNTSTATUS,     sizeof(uint32_t) },
2415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { 0,                        0 }
2416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   };
2417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static const attrspec fileattr[] = {
2418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // This order is important.
2419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_LINKCOUNT,      sizeof(uint32_t) },
2420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_TOTALSIZE,      sizeof(off_t) },
2421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_ALLOCSIZE,      sizeof(off_t) },
2422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_IOBLOCKSIZE,    sizeof(uint32_t) },
2423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_CLUMPSIZE,      sizeof(uint32_t) },
2424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_DEVTYPE,        sizeof(uint32_t) },
2425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_FILETYPE,       sizeof(uint32_t) },
2426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_FORKCOUNT,      sizeof(uint32_t) },
2427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_FORKLIST,       -1 },
2428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_DATALENGTH,     sizeof(off_t) },
2429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_DATAALLOCSIZE,  sizeof(off_t) },
2430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_DATAEXTENTS,    sizeof(extentrecord) },
2431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_RSRCLENGTH,     sizeof(off_t) },
2432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_RSRCALLOCSIZE,  sizeof(off_t) },
2433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FILE_RSRCEXTENTS,    sizeof(extentrecord) },
2434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { 0,                        0 }
2435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   };
2436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static const attrspec forkattr[] = {
2437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // This order is important.
2438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FORK_TOTALSIZE,      sizeof(off_t) },
2439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { ATTR_FORK_ALLOCSIZE,      sizeof(off_t) },
2440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      { 0,                        0 }
2441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   };
2442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static const attrspec *attrdefs[5] = {
2444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      commonattr, volattr, dirattr, fileattr, forkattr
2445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   };
2446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   attrgroup_t a[5];
2447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint8_t *d, *dend;
2448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int g, i;
2449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(attrList->bitmapcount == 5);
2451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(memcpy)(a, &attrList->commonattr, sizeof(a));
2452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   d = attrBuf;
2453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   dend = d + attrBufSize;
2454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
2456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // ATTR_CMN_RETURNED_ATTRS tells us what's really here, if set
2457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (a[0] & ATTR_CMN_RETURNED_ATTRS) {
2458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // fixme range check this?
2459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       a[0] &= ~ATTR_CMN_RETURNED_ATTRS;
2460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       fn(tid, d, sizeof(attribute_set_t));
2461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       VG_(memcpy)(a, d, sizeof(a));
2462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
2464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (g = 0; g < 5; g++) {
2466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (i = 0; attrdefs[g][i].attrBit; i++) {
2467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         uint32_t bit = attrdefs[g][i].attrBit;
2468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         int32_t size = attrdefs[g][i].attrSize;
2469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (a[g] & bit) {
2471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             a[g] &= ~bit;  // clear bit for error check later
2472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (size == -1) {
2473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               attrreference_t *ref = (attrreference_t *)d;
2474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               size = MIN(sizeof(attrreference_t), dend - d);
2475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               fn(tid, d, size);
2476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if (size >= sizeof(attrreference_t)  &&
2477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   d + ref->attr_dataoffset < dend)
2478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               {
2479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  fn(tid, d + ref->attr_dataoffset,
2480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     MIN(ref->attr_length, dend - (d + ref->attr_dataoffset)));
2481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               }
2482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               d += size;
2483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
2484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else {
2485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               size = MIN(size, dend - d);
2486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               fn(tid, d, size);
2487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               d += size;
2488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
2489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if ((uintptr_t)d % 4) d += 4 - ((uintptr_t)d % 4);
2491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (d > dend) d = dend;
2492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
2493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Known bits are cleared. Die if any bits are left.
2496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (a[g] != 0) {
2497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(message)(Vg_UserMsg, "UNKNOWN attrlist flags %d:0x%x\n", g, a[g]);
2498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void get1attr(ThreadId tid, void *attrData, SizeT attrDataSize)
2503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE((Addr)attrData, attrDataSize);
2505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void set1attr(ThreadId tid, void *attrData, SizeT attrDataSize)
2508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("setattrlist(attrBuf value)", (Addr)attrData, attrDataSize);
2510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getattrlist)
2513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getattrlist(%#lx(%s), %#lx, %#lx, %lu, %lu)",
2515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (char *)ARG1, ARG2, ARG3, ARG4, ARG5);
2516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(int, "getattrlist",
2517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *,path, struct vki_attrlist *,attrList,
2518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *,attrBuf, vki_size_t,attrBufSize, unsigned int,options);
2519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("getattrlist(path)", ARG1);
2520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("getattrlist(attrList)", ARG2, sizeof(struct vki_attrlist));
2521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("getattrlist(attrBuf)", ARG3, ARG4);
2522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getattrlist)
2525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4 > sizeof(vki_uint32_t)) {
2527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // attrBuf is uint32_t size followed by attr data
2528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vki_uint32_t *sizep = (vki_uint32_t *)ARG3;
2529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG3, sizeof(vki_uint32_t));
2530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG5 & FSOPT_REPORT_FULLSIZE) {
2531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // *sizep is bytes required for return value, including *sizep
2532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
2533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // *sizep is actual bytes returned, including *sizep
2534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      scan_attrlist(tid, (struct vki_attrlist *)ARG2, sizep+1, MIN(*sizep, ARG4), &get1attr);
2536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(setattrlist)
2541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("setattrlist(%#lx(%s), %#lx, %#lx, %lu, %lu)",
2543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (char *)ARG1, ARG2, ARG3, ARG4, ARG5);
2544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(int, "setattrlist",
2545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const char *,path, struct vki_attrlist *,attrList,
2546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *,attrBuf, vki_size_t,attrBufSize, unsigned int,options);
2547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("setattrlist(path)", ARG1);
2548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("setattrlist(attrList)", ARG2, sizeof(struct vki_attrlist));
2549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   scan_attrlist(tid, (struct vki_attrlist *)ARG2, (void*)ARG3, ARG4, &set1attr);
2550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getdirentriesattr)
2554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getdirentriesattr(%ld, %#lx, %#lx, %ld, %#lx, %#lx, %#lx, %ld)",
2556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8);
2557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ8(int, "getdirentriesattr",
2558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,fd, struct vki_attrlist *,attrList,
2559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *,attrBuf, size_t,attrBufSize,
2560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int *,count, unsigned int *,basep,
2561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int *,newState, unsigned int,options);
2562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("getdirentriesattr(attrList)",
2563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                ARG2, sizeof(struct vki_attrlist));
2564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("getdirentriesattr(attrBuf)", ARG3, ARG4);
2565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("getdirentriesattr(count)", ARG5, sizeof(unsigned int));
2566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("getdirentriesattr(count)", ARG5, sizeof(unsigned int));
2567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("getdirentriesattr(basep)", ARG6, sizeof(unsigned int));
2568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("getdirentriesattr(newState)", ARG7, sizeof(unsigned int));
2569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getdirentriesattr)
2571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   char *p, *end;
2573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int count;
2574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int i;
2575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG5, sizeof(unsigned int));
2577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG6, sizeof(unsigned int));
2578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG7, sizeof(unsigned int));
2579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // return buffer is concatenation of variable-size structs
2581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   count = *(unsigned int *)ARG5;
2582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   p = (char *)ARG3;
2583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   end = (char *)ARG3 + ARG4;
2584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < count; i++) {
2585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(p < end);  // failure is kernel bug or Valgrind bug
2586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p += *(unsigned int *)p;
2587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG3, p - (char *)ARG3);
2590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("got %d records, %ld/%lu bytes\n",
2592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         count, (Addr)p-(Addr)ARG3, ARG4);
2593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fsgetpath)
2597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
2599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("fsgetpath(%#lx, %ld, %#lx {%u,%u}, %llu)",
2600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3,
2601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ((unsigned int *)ARG3)[0], ((unsigned int *)ARG3)[1],
2602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         LOHI64(ARG4, ARG5));
2603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(ssize_t, "fsgetpath",
2604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void*,"buf", size_t,"bufsize",
2605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 fsid_t *,"fsid",
2606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_uint32_t, "objid_low32", vki_uint32_t, "objid_high32");
2607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
2608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("fsgetpath(%#lx, %ld, %#lx {%u,%u}, %lu)",
2609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3,
2610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ((unsigned int *)ARG3)[0],
2611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ((unsigned int *)ARG3)[1], ARG4);
2612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(ssize_t, "fsgetpath",
2613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void*,"buf", size_t,"bufsize",
2614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 fsid_t *,"fsid", uint64_t,"objid");
2615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
2616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("fsgetpath(fsid)", ARG3, sizeof(fsid_t));
2617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("fsgetpath(buf)", ARG1, ARG2);
2618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(fsgetpath)
2621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG1, RES);
2623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(audit_session_self)
2626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRINT("audit_session_self()");
2628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(audit_session_self)
2631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  record_named_port(tid, RES, MACH_PORT_RIGHT_SEND, "audit-session-%p");
2633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  PRINT("audit-session %#lx", RES);
2634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(exchangedata)
2637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("exchangedata(%#lx(%s), %#lx(%s), %lu)",
2639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, (char*)ARG1, ARG2, (char*)ARG2, ARG3);
2640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int, "exchangedata",
2641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char *, path1, char *, path2, unsigned long, options);
2642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "exchangedata(path1)", ARG1 );
2643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "exchangedata(path2)", ARG2 );
2644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fsctl)
2647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("fsctl ( %#lx(%s), %ld, %#lx, %ld )",
2649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1, (char *)ARG1, ARG2, ARG3, ARG4);
2650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4( long, "fsctl",
2651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  char *,"path", unsigned int,"request",
2652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  void *,"data", unsigned int,"options");
2653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "fsctl(path)", ARG1 );
2655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG2) {
2657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_afpfsByteRangeLock2FSCTL: {
2658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      struct vki_ByteRangeLockPB2 *pb = (struct vki_ByteRangeLockPB2 *)ARG3;
2659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_FIELD_READ("fsctl(afpfsByteRangeLock2, pb->offset)",
2660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     pb->offset);
2661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_FIELD_READ("fsctl(afpfsByteRangeLock2, pb->length)",
2662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     pb->length);
2663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_FIELD_READ("fsctl(afpfsByteRangeLock2, pb->unLockFlag)",
2664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     pb->unLockFlag);
2665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_FIELD_READ("fsctl(afpfsByteRangeLock2, pb->startEndFlag)",
2666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     pb->startEndFlag);
2667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_FIELD_READ("fsctl(afpfsByteRangeLock2, pb->fd)",
2668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     pb->fd);
2669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_FIELD_WRITE("fsctl(afpfsByteRangeLock2, pb->retRangeStart)",
2671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      pb->retRangeStart);
2672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme check fd
2674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
2675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FSIOC_SYNC_VOLUME:
2677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRE_MEM_READ( "fsctl(FSIOC_SYNC_VOLUME)", ARG3, sizeof(int) );
2678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
2679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
2681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // fsctl requests use ioctl encoding
2682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(PRE_unknown_ioctl)(tid, ARG2, ARG3);
2683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
2684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(fsctl)
2688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG2) {
2690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_afpfsByteRangeLock2FSCTL: {
2691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      struct vki_ByteRangeLockPB2 *pb = (struct vki_ByteRangeLockPB2 *)ARG3;
2692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_FIELD_WRITE(pb->retRangeStart);
2693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
2694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_FSIOC_SYNC_VOLUME:
2696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       break;
2697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
2699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // fsctl requests use ioctl encoding
2700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(POST_unknown_ioctl)(tid, RES, ARG2, ARG3);
2701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
2702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(initgroups)
2706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRINT("initgroups(%s, %#lx, %lu)", (char *)ARG1, ARG2, ARG3);
2708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRE_REG_READ3(long, "initgroups",
2709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        int, setlen, vki_gid_t *, gidset, vki_uid_t, gmuid);
2710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRE_MEM_READ("gidset", ARG2, ARG1 * sizeof(vki_gid_t));
2711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//--------- posix_spawn ---------//
2715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Largely copied from PRE(sys_execve) in syswrap-generic.c, and from
2716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the simpler AIX equivalent (syswrap-aix5.c). */
2717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Pre_read a char** argument.
2718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void pre_argv_envp(Addr a, ThreadId tid, Char* s1, Char* s2)
2719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   while (True) {
2721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Addr a_deref;
2722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Addr* a_p = (Addr*)a;
2723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( s1, (Addr)a_p, sizeof(Addr) );
2724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      a_deref = *a_p;
2725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (0 == a_deref)
2726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
2727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_RASCIIZ( s2, a_deref );
2728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      a += sizeof(char*);
2729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic SysRes simple_pre_exec_check ( const HChar* exe_name,
2732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      Bool trace_this_child )
2733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int fd, ret;
2735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes res;
2736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Bool setuid_allowed;
2737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Check it's readable
2739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = VG_(open)(exe_name, VKI_O_RDONLY, 0);
2740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sr_isError(res)) {
2741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return res;
2742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fd = sr_Res(res);
2744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(close)(fd);
2745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Check we have execute permissions.  We allow setuid executables
2747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // to be run only in the case when we are not simulating them, that
2748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // is, they to be run natively.
2749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   setuid_allowed = trace_this_child  ? False  : True;
2750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ret = VG_(check_executable)(NULL/*&is_setuid*/,
2751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               (HChar*)exe_name, setuid_allowed);
2752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (0 != ret) {
2753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return VG_(mk_SysRes_Error)(ret);
2754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return VG_(mk_SysRes_Success)(0);
2756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(posix_spawn)
2758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Char*        path = NULL;       /* path to executable */
2760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Char**       envp = NULL;
2761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Char**       argv = NULL;
2762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Char**       arg2copy;
2763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Char*        launcher_basename = NULL;
2764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int          i, j, tot_args;
2765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes       res;
2766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Bool         trace_this_child;
2767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* args: pid_t* pid
2769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            char*  path
2770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            posix_spawn_file_actions_t* file_actions
2771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            char** argv
2772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            char** envp
2773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
2774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("posix_spawn( %#lx, %#lx(%s), %#lx, %#lx, %#lx )",
2775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG2 ? (HChar*)ARG2 : "(null)", ARG3, ARG4, ARG5 );
2776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Standard pre-syscall checks */
2778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(int, "posix_spawn", vki_pid_t*, pid, char*, path,
2780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void*, file_actions, char**, argv, char**, envp );
2781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("posix_spawn(pid)", ARG1, sizeof(vki_pid_t) );
2782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("posix_spawn(path)", ARG2);
2783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // DDD: check file_actions
2784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4 != 0)
2785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      pre_argv_envp( ARG4, tid, "posix_spawn(argv)",
2786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "posix_spawn(argv[i])" );
2787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5 != 0)
2788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      pre_argv_envp( ARG5, tid, "posix_spawn(envp)",
2789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "posix_spawn(envp[i])" );
2790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (0)
2792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(printf)("posix_spawn( %#lx, %#lx(%s), %#lx, %#lx, %#lx )\n",
2793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG2 ? (HChar*)ARG2 : "(null)", ARG3, ARG4, ARG5 );
2794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Now follows a bunch of logic copied from PRE(sys_execve) in
2796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      syswrap-generic.c. */
2797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check that the name at least begins in client-accessible storage. */
2799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == 0 /* obviously bogus */
2800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       || !VG_(am_is_valid_for_client)( ARG2, 1, VKI_PROT_READ )) {
2801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EFAULT );
2802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Decide whether or not we want to follow along
2806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   { // Make 'child_argv' be a pointer to the child's arg vector
2807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     // (skipping the exe name)
2808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     HChar** child_argv = (HChar**)ARG4;
2809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     if (child_argv && child_argv[0] == NULL)
2810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        child_argv = NULL;
2811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     trace_this_child = VG_(should_we_trace_this_child)( (HChar*)ARG2, child_argv );
2812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
2813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Do the important checks:  it is a file, is executable, permissions are
2815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // ok, etc.  We allow setuid executables to run only in the case when
2816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // we are not simulating them, that is, they to be run natively.
2817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = simple_pre_exec_check( (const HChar*)ARG2, trace_this_child );
2818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sr_isError(res)) {
2819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( sr_Err(res) );
2820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* If we're tracing the child, and the launcher name looks bogus
2824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (possibly because launcher.c couldn't figure it out, see
2825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      comments therein) then we have no option but to fail. */
2826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (trace_this_child
2827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       && (VG_(name_of_launcher) == NULL
2828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           || VG_(name_of_launcher)[0] != '/')) {
2829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_ECHILD ); /* "No child processes" */
2830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Ok.  So let's give it a try. */
2834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(1, "syswrap", "Posix_spawn of %s\n", (Char*)ARG2);
2835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* posix_spawn on Darwin is combining the fork and exec in one syscall.
2837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      So, we should not terminate gdbserver : this is still the parent
2838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      running, which will terminate its gdbserver when exiting.
2839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      If the child process is traced, it will start a fresh gdbserver
2840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      after posix_spawn. */
2841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Set up the child's exe path.
2843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //
2844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (trace_this_child) {
2845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // We want to exec the launcher.  Get its pre-remembered path.
2847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      path = VG_(name_of_launcher);
2848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // VG_(name_of_launcher) should have been acquired by m_main at
2849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // startup.  The following two assertions should be assured by
2850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // the "If we're tracking the child .." test just above here.
2851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(path);
2852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(path[0] == '/');
2853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      launcher_basename = path;
2854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
2856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      path = (Char*)ARG2;
2857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Set up the child's environment.
2860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //
2861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Remove the valgrind-specific stuff from the environment so the
2862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // child doesn't get vgpreload_core.so, vgpreload_<tool>.so, etc.
2863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // This is done unconditionally, since if we are tracing the child,
2864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // the child valgrind will set up the appropriate client environment.
2865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Nb: we make a copy of the environment before trying to mangle it
2866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // as it might be in read-only memory (this was bug #101881).
2867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //
2868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Then, if tracing the child, set VALGRIND_LIB for it.
2869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //
2870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5 == 0) {
2871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      envp = NULL;
2872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
2873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      envp = VG_(env_clone)( (Char**)ARG5 );
2874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(envp);
2875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(env_remove_valgrind_env_stuff)( envp );
2876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (trace_this_child) {
2879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Set VALGRIND_LIB in ARG5 (the environment)
2880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(env_setenv)( &envp, VALGRIND_LIB, VG_(libdir));
2881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Set up the child's args.  If not tracing it, they are
2884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // simply ARG4.  Otherwise, they are
2885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //
2886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // [launcher_basename] ++ VG_(args_for_valgrind) ++ [ARG2] ++ ARG4[1..]
2887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //
2888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // except that the first VG_(args_for_valgrind_noexecpass) args
2889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // are omitted.
2890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //
2891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!trace_this_child) {
2892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      argv = (Char**)ARG4;
2893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
2894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert( VG_(args_for_valgrind) );
2895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert( VG_(args_for_valgrind_noexecpass) >= 0 );
2896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert( VG_(args_for_valgrind_noexecpass)
2897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   <= VG_(sizeXA)( VG_(args_for_valgrind) ) );
2898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* how many args in total will there be? */
2899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // launcher basename
2900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tot_args = 1;
2901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // V's args
2902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tot_args += VG_(sizeXA)( VG_(args_for_valgrind) );
2903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tot_args -= VG_(args_for_valgrind_noexecpass);
2904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // name of client exe
2905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tot_args++;
2906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // args for client exe, skipping [0]
2907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      arg2copy = (Char**)ARG4;
2908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (arg2copy && arg2copy[0]) {
2909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (i = 1; arg2copy[i]; i++)
2910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            tot_args++;
2911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // allocate
2913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      argv = VG_(malloc)( "di.syswrap.pre_sys_execve.1",
2914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          (tot_args+1) * sizeof(HChar*) );
2915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(argv);
2916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // copy
2917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      j = 0;
2918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      argv[j++] = launcher_basename;
2919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (i = 0; i < VG_(sizeXA)( VG_(args_for_valgrind) ); i++) {
2920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (i < VG_(args_for_valgrind_noexecpass))
2921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            continue;
2922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         argv[j++] = * (HChar**) VG_(indexXA)( VG_(args_for_valgrind), i );
2923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      argv[j++] = (Char*)ARG2;
2925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (arg2copy && arg2copy[0])
2926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (i = 1; arg2copy[i]; i++)
2927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            argv[j++] = arg2copy[i];
2928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      argv[j++] = NULL;
2929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // check
2930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(j == tot_args+1);
2931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* DDD: sort out the signal state.  What signal
2934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      state does the child inherit from the parent?  */
2935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (0) {
2937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Char **cpp;
2938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("posix_spawn: %s\n", path);
2939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (cpp = argv; cpp && *cpp; cpp++)
2940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("argv: %s\n", *cpp);
2941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (1)
2942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (cpp = envp; cpp && *cpp; cpp++)
2943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            VG_(printf)("env: %s\n", *cpp);
2944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Let the call go through as usual.  However, we have to poke
2947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      the altered arguments back into the argument slots. */
2948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARG2 = (UWord)path;
2949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARG4 = (UWord)argv;
2950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARG5 = (UWord)envp;
2951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* not to mention .. */
2953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
2954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(posix_spawn)
2956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
2958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (ARG1 != 0) {
2959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      POST_MEM_WRITE( ARG1, sizeof(vki_pid_t) );
2960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
2961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(socket)
2965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("socket ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
2967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "socket", int, domain, int, type, int, protocol);
2968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(socket)
2971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
2973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
2974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_POST_sys_socket)(tid, VG_(mk_SysRes_Success)(RES));
2975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
2976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(setsockopt)
2980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("setsockopt ( %ld, %ld, %ld, %#lx, %ld )",
2982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1,ARG2,ARG3,ARG4,ARG5);
2983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "setsockopt",
2984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, int, level, int, optname,
2985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const void *, optval, vki_socklen_t, optlen);
2986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_setsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
2987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getsockopt)
2991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr optval_p = ARG4;
2993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr optlen_p = ARG5;
2994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getsockopt ( %ld, %ld, %ld, %#lx, %#lx )",
2995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1,ARG2,ARG3,ARG4,ARG5);
2996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(long, "getsockopt",
2997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, int, level, int, optname,
2998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, optval, vki_socklen_t *, optlen);
2999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* int getsockopt(int socket, int level, int option_name,
3000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     void *restrict option_value,
3001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     socklen_t *restrict option_len); */
3002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* vg_assert(sizeof(socklen_t) == sizeof(UInt)); */
3003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (optval_p != (Addr)NULL) {
3004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(buf_and_len_pre_check) ( tid, optval_p, optlen_p,
3005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   "socketcall.getsockopt(optval)",
3006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   "socketcall.getsockopt(optlen)" );
3007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // DDD: #warning GrP fixme darwin-specific sockopts
3009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getsockopt)
3012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr optval_p = ARG4;
3014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr optlen_p = ARG5;
3015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (optval_p != (Addr)NULL) {
3017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(buf_and_len_post_check) ( tid, VG_(mk_SysRes_Success)(RES),
3018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    optval_p, optlen_p,
3019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    "socketcall.getsockopt(optlen_out)" );
3020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // DDD: #warning GrP fixme darwin-specific sockopts
3021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(connect)
3026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("connect ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
3029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "connect",
3030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, sockfd, struct sockaddr *, serv_addr, int, addrlen);
3031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_connect)(tid, ARG1,ARG2,ARG3);
3032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(accept)
3036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("accept ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
3039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "accept",
3040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, struct sockaddr *, addr, int, *addrlen);
3041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3);
3042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(accept)
3045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SysRes r;
3047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES),
3049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                         ARG1,ARG2,ARG3);
3050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(r);
3051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sendto)
3055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sendto ( %ld, %s, %ld, %lu, %#lx, %ld )",
3058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1,(char *)ARG2,ARG3,ARG4,ARG5,ARG6);
3059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "sendto",
3060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, const void *, msg, int, len,
3061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, flags,
3062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct sockaddr *, to, int, tolen);
3063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_sendto)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
3064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sendfile)
3067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
3069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sendfile(%ld, %ld, %llu, %#lx, %#lx, %ld)",
3070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, LOHI64(ARG3, ARG4), ARG5, ARG6, ARG7);
3071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ7(long, "sendfile",
3073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int, fromfd, int, tofd,
3074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vki_uint32_t, offset_low32, vki_uint32_t, offset_high32,
3075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vki_uint64_t *, nwritten, struct sf_hdtr *, sf_header, int, flags);
3076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("sendfile(nwritten)", ARG5, sizeof(vki_uint64_t));
3077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG6) PRE_MEM_WRITE("sendfile(sf_header)", ARG6, sizeof(struct sf_hdtr));
3078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
3079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sendfile(%ld, %ld, %ld, %#lx, %#lx, %ld)",
3080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
3081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "sendfile",
3083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int, fromfd, int, tofd,
3084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vki_uint64_t, offset,
3085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vki_uint64_t *, nwritten, struct sf_hdtr *, sf_header, int, flags);
3086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("sendfile(nwritten)", ARG4, sizeof(vki_uint64_t));
3087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5) PRE_MEM_WRITE("sendfile(sf_header)", ARG5, sizeof(struct sf_hdtr));
3088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sendfile)
3093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
3095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG5, sizeof(vki_uint64_t));
3096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG6) POST_MEM_WRITE(ARG6, sizeof(struct sf_hdtr));
3097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
3098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG4, sizeof(vki_uint64_t));
3099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5) POST_MEM_WRITE(ARG5, sizeof(struct sf_hdtr));
3100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(recvfrom)
3104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("recvfrom ( %ld, %#lx, %ld, %lu, %#lx, %#lx )",
3107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
3108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "recvfrom",
3109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, void *, buf, int, len, unsigned int, flags,
3110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 struct sockaddr *, from, int *, fromlen);
3111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_recvfrom)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
3112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(recvfrom)
3115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_recvfrom)(tid, VG_(mk_SysRes_Success)(RES),
3118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
3119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sendmsg)
3123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sendmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
3126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "sendmsg",
3127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, const struct msghdr *, msg, int, flags);
3128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ML_(generic_PRE_sys_sendmsg)(tid, "msg", (struct vki_msghdr *)ARG2);
3129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(recvmsg)
3133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("recvmsg ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
3136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "recvmsg", int, s, struct msghdr *, msg, int, flags);
3137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ML_(generic_PRE_sys_recvmsg)(tid, "msg", (struct vki_msghdr *)ARG2);
3138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(recvmsg)
3141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ML_(generic_POST_sys_recvmsg)(tid, "msg", (struct vki_msghdr *)ARG2, RES);
3143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(shutdown)
3147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("shutdown ( %ld, %ld )",ARG1,ARG2);
3150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(int, "shutdown", int, s, int, how);
3151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(bind)
3155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("bind ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
3157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "bind",
3158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, sockfd, struct sockaddr *, my_addr, int, addrlen);
3159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_bind)(tid, ARG1,ARG2,ARG3);
3160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(listen)
3164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("listen ( %ld, %ld )",ARG1,ARG2);
3166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "listen", int, s, int, backlog);
3167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getsockname)
3171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getsockname ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3);
3173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "getsockname",
3174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, struct sockaddr *, name, int *, namelen);
3175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_getsockname)(tid, ARG1,ARG2,ARG3);
3176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getsockname)
3179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_getsockname)(tid, VG_(mk_SysRes_Success)(RES),
3182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          ARG1,ARG2,ARG3);
3183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getpeername)
3187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getpeername ( %ld, %#lx, %#lx )",ARG1,ARG2,ARG3);
3189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "getpeername",
3190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, s, struct sockaddr *, name, int *, namelen);
3191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_getpeername)(tid, ARG1,ARG2,ARG3);
3192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getpeername)
3195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_getpeername)(tid, VG_(mk_SysRes_Success)(RES),
3198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          ARG1,ARG2,ARG3);
3199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(socketpair)
3203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("socketpair ( %ld, %ld, %ld, %#lx )",ARG1,ARG2,ARG3,ARG4);
3205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "socketpair",
3206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, d, int, type, int, protocol, int *, sv);
3207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_PRE_sys_socketpair)(tid, ARG1,ARG2,ARG3,ARG4);
3208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(socketpair)
3211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(generic_POST_sys_socketpair)(tid, VG_(mk_SysRes_Success)(RES),
3214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                         ARG1,ARG2,ARG3,ARG4);
3215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(gethostuuid)
3219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("gethostuuid ( %#lx, %#lx )", ARG1, ARG2);
3221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(int,"gethostuuid",
3222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char *,"uuid_buf",
3223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct vki_timespec *,"timeout");
3224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("uuid_buf", ARG1, 16);
3226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("timeout", ARG2, sizeof(struct vki_timespec));
3227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(gethostuuid)
3233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG1, 16);
3235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Darwin pipe() returns the two descriptors in two registers. */
3238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(pipe)
3239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("pipe ( )");
3241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(int, "pipe");
3242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(pipe)
3245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int p0, p1;
3247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   p0 = RES;
3249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   p1 = RESHI;
3250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(p0, "pipe", tid, True) ||
3252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       !ML_(fd_allowed)(p1, "pipe", tid, True)) {
3253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(p0);
3254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(close)(p1);
3255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EMFILE );
3256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
3257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (VG_(clo_track_fds)) {
3258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless)(tid, p0);
3259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ML_(record_fd_open_nameless)(tid, p1);
3260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getlogin)
3266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getlogin ( %#lx, %ld )", ARG1, ARG2);
3268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "getlogin",
3269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 char *,"namebuf", unsigned int,"namelen");
3270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("getlogin(namebuf)", ARG1, ARG2);
3272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getlogin)
3275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG1, ARG2);
3277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(ptrace)
3281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("ptrace ( %ld, %ld, %#lx, %ld )", ARG1, ARG2, ARG3, ARG4);
3283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "ptrace",
3284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"request", vki_pid_t,"pid",
3285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_caddr_t,"addr", int,"data");
3286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Note: some code uses ptrace(random, 0, 0, 0) as a profiling mechanism.
3288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme anything needed?
3290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(issetugid)
3294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("issetugid ( )");
3296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "issetugid");
3297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getdtablesize)
3301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getdtablesize ( )");
3303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "getdtablesize");
3304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getdtablesize)
3307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Subtract Valgrind's fd range from client's dtable
3309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES > VG_(fd_hard_limit)) SET_STATUS_Success(VG_(fd_hard_limit));
3310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(lseek)
3313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("lseek ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
3315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(vki_off_t, "lseek",
3316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int,fd, int,offset_hi, int,offset_lo,
3317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int,whence);
3318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(pathconf)
3322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("pathconf(%#lx(%s), %ld)", ARG1,(char *)ARG1,ARG2);
3324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long,"pathconf", const char *,"path", int,"name");
3325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ("pathconf(path)", ARG1);
3326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fpathconf)
3330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("fpathconf(%ld, %ld)", ARG1,ARG2);
3332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long,"fpathconf", int,"fd", int,"name");
3333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ML_(fd_allowed)(ARG1, "fpathconf", tid, False))
3335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EBADF );
3336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getdirentries)
3340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getdirentries(%ld, %#lx, %ld, %#lx)", ARG1, ARG2, ARG3, ARG4);
3342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int, "getdirentries",
3343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, fd, char *, buf, int, nbytes, long *, basep);
3344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("getdirentries(basep)", ARG4, sizeof(long));
3345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("getdirentries(buf)", ARG2, ARG3);
3346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getdirentries)
3349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG4, sizeof(long));
3351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme be specific about d_name?
3352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG2, RES);
3353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(getdirentries64)
3357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("getdirentries64(%ld, %#lx, %lu, %#lx)", ARG1, ARG2, ARG3, ARG4);
3359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(vki_ssize_t, "getdirentries",
3360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,fd, char *,buf, vki_size_t,nbytes, vki_off_t *,basep);
3361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("getdirentries(position)", ARG4, sizeof(vki_off_t));
3362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("getdirentries(buf)", ARG2, ARG3);
3363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(getdirentries64)
3365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG4, sizeof(vki_off_t));
3367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme be specific about d_name? (fixme copied from 32 bit version)
3368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG2, RES);
3369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(statfs64)
3373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("statfs64 ( %#lx(%s), %#lx )",ARG1,(char *)ARG1,ARG2);
3375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "statfs64", const char *, path, struct statfs64 *, buf);
3376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_RASCIIZ( "statfs64(path)", ARG1 );
3377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "statfs64(buf)", ARG2, sizeof(struct vki_statfs64) );
3378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(statfs64)
3380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs64) );
3382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(fstatfs64)
3386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("fstatfs64 ( %ld, %#lx )",ARG1,ARG2);
3388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "fstatfs64",
3389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned int, fd, struct statfs *, buf);
3390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "fstatfs64(buf)", ARG2, sizeof(struct vki_statfs64) );
3391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(fstatfs64)
3393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs64) );
3395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(csops)
3398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("csops ( %ld, %#lx, %#lx, %lu )", ARG1, ARG2, ARG3, ARG4);
3400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int, "csops",
3401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_pid_t, pid, uint32_t, ops,
3402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *, useraddr, vki_size_t, usersize);
3403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "csops(useraddr)", ARG3, ARG4 );
3405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // If the pid is ours, don't mark the program as KILL or HARD
3407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Maybe we should keep track of this for later calls to STATUS
3408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!ARG1 || VG_(getpid)() == ARG1) {
3409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (ARG2) {
3410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_CS_OPS_MARKINVALID:
3411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_CS_OPS_MARKHARD:
3412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case VKI_CS_OPS_MARKKILL:
3413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Success(0);
3414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(csops)
3418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG3, ARG4 );
3420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(auditon)
3423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("auditon ( %ld, %#lx, %ld )", ARG1, ARG2, ARG3);
3425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(int,"auditon",
3426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"cmd", void*,"data", unsigned int,"length");
3427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1) {
3429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETPOLICY:
3431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETKMASK:
3432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETQCTRL:
3433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETCOND:
3434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETCLASS:
3435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETPMASK:
3436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETFSIZE:
3437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
3438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SENDTRIGGER:
3439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // kernel reads data..data+length
3441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("auditon(data)", ARG2, ARG3);
3442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETKMASK:
3445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETPOLICY:
3446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETQCTRL:
3447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETFSIZE:
3448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETCOND:
3449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // kernel writes data..data+length
3450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme be precise about what gets written
3451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("auditon(data)", ARG2, ARG3);
3452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETCLASS:
3456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETPINFO:
3457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETPINFO_ADDR:
3458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
3459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETSINFO_ADDR:
3460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // kernel reads and writes data..data+length
3462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme be precise about what gets read and written
3463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("auditon(data)", ARG2, ARG3);
3464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("auditon(data)", ARG2, ARG3);
3465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETKAUDIT:
3468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETSTAT:
3469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETUMASK:
3470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETSMASK:
3471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETKAUDIT:
3472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETCWD:
3473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETCAR:
3474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETSTAT:
3475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // unimplemented on darwin
3476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
3479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(message)(Vg_UserMsg, "UNKNOWN auditon cmd %ld", ARG1);
3480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(auditon)
3484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (ARG1) {
3486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETPOLICY:
3488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETKMASK:
3489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETQCTRL:
3490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETCOND:
3491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETCLASS:
3492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETPMASK:
3493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETFSIZE:
3494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
3495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SENDTRIGGER:
3496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // kernel reads data..data+length
3498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETKMASK:
3501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETPOLICY:
3502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETQCTRL:
3503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETFSIZE:
3504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETCOND:
3505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // kernel writes data..data+length
3506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme be precise about what gets written
3507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, ARG3);
3508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETCLASS:
3512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETPINFO:
3513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETPINFO_ADDR:
3514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
3515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETSINFO_ADDR:
3516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // kernel reads and writes data..data+length
3518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme be precise about what gets read and written
3519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, ARG3);
3520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETKAUDIT:
3523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETSTAT:
3524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETUMASK:
3525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_SETSMASK:
3526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETKAUDIT:
3527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETCWD:
3528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETCAR:
3529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case VKI_A_GETSTAT:
3530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // unimplemented on darwin
3531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
3534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mmap)
3540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // SysRes r;
3542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (0) VG_(am_do_sync_check)("(PRE_MMAP)",__FILE__,__LINE__);
3543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
3545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mmap ( %#lx, %lu, %ld, %ld, %ld, %lld )",
3546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3, ARG4, ARG5, LOHI64(ARG6, ARG7) );
3547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ7(Addr, "mmap",
3548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 Addr,start, vki_size_t,length, int,prot, int,flags, int,fd,
3549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long,offset_hi, unsigned long,offset_lo);
3550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme V mmap and kernel mach_msg collided once - don't use
3551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // V's mechanism for now
3552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
3553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // (Off64T)LOHI64(ARG6, ARG7) );
3554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
3555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mmap ( %#lx, %lu, %ld, %ld, %ld, %ld )",
3556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
3557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "mmap",
3558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 Addr,start, vki_size_t,length, int,prot, int,flags, int,fd,
3559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 Off64T,offset);
3560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
3561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // SET_STATUS_from_SysRes(r);
3565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mmap)
3568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES != -1) {
3570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(notify_core_and_tool_of_mmap)(RES, ARG2, ARG3, ARG4, ARG5, ARG6);
3571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Try to load symbols from the region
3572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(di_notify_mmap)( (Addr)RES, False/*allow_SkFileV*/,
3573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           -1/*don't use_fd*/ );
3574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(__sysctl)
3579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "__sysctl ( %#lx, %ld, %#lx, %#lx, %#lx, %ld )",
3581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
3582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(int, "__sysctl", int*, name, unsigned int, namelen,
3584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void*, oldp, vki_size_t *, oldlenp,
3585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void*, newp, vki_size_t *, newlenp);
3586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("sysctl(name)", ARG1, ARG2);  // reads name[0..namelen-1]
3588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4) {
3589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // writes *ARG4
3590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("sysctl(oldlenp)", ARG4, sizeof(size_t));
3591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3) {
3592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // also reads *ARG4, and writes as much as ARG3[0..ARG4-1]
3593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ("sysctl(oldlenp)", ARG4, sizeof(size_t));
3594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("sysctl(oldp)", ARG3, *(size_t *)ARG4);
3595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG5) {
3598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("sysctl(newp)", ARG5, ARG6);
3599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (VG_(clo_trace_syscalls)) {
3602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      unsigned int i;
3603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int *name = (int *)ARG1;
3604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)(" mib: [ ");
3605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (i = 0; i < ARG2; i++) {
3606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("%d ", name[i]);
3607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("]");
3609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme intercept KERN_PROCARGS and KERN_PROC_PID for our pid
3612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // (executable path and arguments and environment
3613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
3615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Intercept sysctl(kern.usrstack). The kernel's reply would be
3616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Valgrind's stack, not the client's stack.
3617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme kern_usrstack64
3618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG1  &&  ARG2 == 2  &&
3619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          ((int *)ARG1)[0] == VKI_CTL_KERN  &&
3620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
3621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          ((int *)ARG1)[1] == VKI_KERN_USRSTACK32
3622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
3623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          ((int *)ARG1)[1] == VKI_KERN_USRSTACK64
3624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          )
3626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
3627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (ARG5/*newp*/  ||  ARG6/*newlen*/) {
3628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            SET_STATUS_Failure(VKI_EPERM); // USRSTACK is read-only
3629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr *oldp = (Addr *)ARG3;
3631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            size_t *oldlenp = (size_t *)ARG4;
3632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (oldlenp) {
3633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               Addr stack_end = VG_(clstk_end)+1;
3634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               size_t oldlen = *oldlenp;
3635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               // always return actual size
3636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               *oldlenp = sizeof(Addr);
3637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if (oldp  &&  oldlen >= sizeof(Addr)) {
3638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  // oldp is big enough
3639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  // copy value and return 0
3640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  *oldp = stack_end;
3641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  SET_STATUS_Success(0);
3642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               } else {
3643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  // oldp isn't big enough
3644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  // copy as much as possible and return ENOMEM
3645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  if (oldp) VG_(memcpy)(oldp, &stack_end, oldlen);
3646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  SET_STATUS_Failure(VKI_ENOMEM);
3647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               }
3648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!SUCCESS  &&  !FAILURE) {
3654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Don't set SfPostOnFail if we've already handled it locally.
3655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfPostOnFail;
3656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(__sysctl)
3660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS  ||  ERR == VKI_ENOMEM) {
3662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // sysctl can write truncated data and return VKI_ENOMEM
3663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG4) {
3664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG4, sizeof(size_t));
3665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ARG3  &&  ARG4) {
3667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(ARG3, *(size_t *)ARG4);
3668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sigpending)
3674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "sigpending ( %#lx )", ARG1 );
3676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "sigpending", vki_sigset_t *, set);
3677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE( "sigpending(set)", ARG1, sizeof(vki_sigset_t));
3678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sigpending)
3680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE( ARG1, sizeof(vki_sigset_t) ) ;
3682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sigprocmask)
3686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UWord arg1;
3688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sigprocmask ( %ld, %#lx, %#lx )", ARG1, ARG2, ARG3);
3689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "sigprocmask",
3690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, how, vki_sigset_t *, set, vki_sigset_t *, oldset);
3691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 != 0)
3692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ( "sigprocmask(set)", ARG2, sizeof(vki_sigset_t));
3693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3 != 0)
3694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE( "sigprocmask(oldset)", ARG3, sizeof(vki_sigset_t));
3695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Massage ARG1 ('how').  If ARG2 (the new mask) is NULL then the
3697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      value of 'how' is irrelevant, and it appears that Darwin's libc
3698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      passes zero, which is not equal to any of
3699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SIG_{BLOCK,UNBLOCK,SETMASK}.  This causes
3700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(do_sys_sigprocmask) to complain, since it checks the 'how'
3701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      value independently of the other args.  Solution: in this case,
3702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      simply pass a valid (but irrelevant) value for 'how'. */
3703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Also, in this case the new set is passed to the kernel by
3704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      reference, not value, as in some other sigmask related Darwin
3705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      syscalls. */
3706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg1 = ARG1;
3707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == 0  /* the new-set is NULL */
3708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       && ARG1 != VKI_SIG_BLOCK
3709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       && ARG1 != VKI_SIG_UNBLOCK && ARG1 != VKI_SIG_SETMASK) {
3710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      arg1 = VKI_SIG_SETMASK;
3711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_from_SysRes(
3713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(do_sys_sigprocmask) ( tid, arg1, (vki_sigset_t*)ARG2,
3714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                           (vki_sigset_t*)ARG3 )
3715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
3716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (SUCCESS)
3718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags |= SfPollAfter;
3719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(sigprocmask)
3722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (RES == 0 && ARG3 != 0)
3725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE( ARG3, sizeof(vki_sigset_t));
3726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sigsuspend)
3730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Just hand this off to the kernel.  Is that really correct?  And
3732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      shouldn't we at least set SfPollAfter?  These questions apply to
3733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      all the Linux versions too. */
3734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* I think the first arg is the 32-bit signal mask (by value), and
3735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      the other two args are ignored. */
3736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
3737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sigsuspend ( mask=0x%08lx )", ARG1 );
3738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(int, "sigsuspend", int, sigmask);
3739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Be careful about the 4th arg, since that is a uint64_t.  Hence 64-
3743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   and 32-bit wrappers are different.
3744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARG5 and ARG6 (buffer, buffersize) specify a buffer start and
3746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   length in the usual way.  I have seen values NULL, 0 passed in some
3747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cases.  I left the calls to PRE_MEM_WRITE/READ unconditional on the
3748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   basis that they don't do anything if the length is zero, so it's OK
3749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for the buffer pointer to be NULL in that case (meaning they don't
3750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   complain).
3751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int proc_info(int32_t callnum, int32_t pid,
3753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 uint32_t flavor, uint64_t arg,
3754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 user_addr_t buffer, int32_t buffersize)
3755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
3756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
3757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(proc_info)
3758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
3760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("proc_info(%d, %d, %u, %llu, %#lx, %d)",
3761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (Int)ARG1, (Int)ARG2, (UInt)ARG3, LOHI64(ARG4,ARG5), ARG6, (Int)ARG7);
3762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ7(int, "proc_info",
3763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, callnum, int, pid, unsigned int, flavor,
3764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_uint32_t, arg_low32,
3765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_uint32_t, arg_high32,
3766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void*, buffer, int, buffersize);
3767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("proc_info(buffer)", ARG6, ARG7);
3768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
3769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("proc_info(%d, %d, %u, %llu, %#lx, %d)",
3770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (Int)ARG1, (Int)ARG2, (UInt)ARG3, (ULong)ARG4, ARG5, (Int)ARG6);
3771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(int, "proc_info",
3772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int, callnum, int, pid, unsigned int, flavor,
3773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long long int, arg,
3774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void*, buffer, int, buffersize);
3775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("proc_info(buffer)", ARG5, ARG6);
3776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(proc_info)
3780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 4
3782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG6, ARG7);
3784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
3785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(SUCCESS);
3786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG5, ARG6);
3787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* DARWIN_VERS >= DARWIN_10_6 */
3791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
3793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   aio_*
3794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
3795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// We must record the aiocbp for each aio_read() in a table so that when
3797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// aio_return() is called we can mark the memory written asynchronously by
3798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// aio_read() as having been written.  We don't have to do this for
3799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// aio_write().  See bug 197227 for more details.
3800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic OSet* aiocbp_table = NULL;
3801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic Bool aio_init_done = False;
3802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void aio_init(void)
3804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   aiocbp_table = VG_(OSetWord_Create)(VG_(malloc), "syswrap.aio", VG_(free));
3806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   aio_init_done = True;
3807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic Bool was_a_successful_aio_read = False;
3810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(aio_return)
3812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_aiocb* aiocbp = (struct vki_aiocb*)ARG1;
3814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // This assumes that the kernel looks at the struct pointer, but not the
3815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // contents of the struct.
3816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "aio_return ( %#lx )", ARG1 );
3817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "aio_return", struct vki_aiocb*, aiocbp);
3818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!aio_init_done) aio_init();
3820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   was_a_successful_aio_read = VG_(OSetWord_Remove)(aiocbp_table, (UWord)aiocbp);
3821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(aio_return)
3823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // If we found the aiocbp in our own table it must have been an aio_read(),
3825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // so mark the buffer as written.  If we didn't find it, it must have been
3826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // an aio_write() or a bogus aio_return() (eg. a second one on the same
3827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // aiocbp).  Either way, the buffer won't have been written so we don't
3828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // have to mark the buffer as written.
3829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (was_a_successful_aio_read) {
3830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      struct vki_aiocb* aiocbp = (struct vki_aiocb*)ARG1;
3831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE((Addr)aiocbp->aio_buf, aiocbp->aio_nbytes);
3832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      was_a_successful_aio_read = False;
3833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(aio_suspend)
3837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // This assumes that the kernel looks at the struct pointers in the list,
3839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // but not the contents of the structs.
3840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "aio_suspend ( %#lx )", ARG1 );
3841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "aio_suspend",
3842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct vki_aiocb *, aiocbp, int, nent,
3843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 const struct vki_timespec *, timeout);
3844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 > 0)
3845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("aio_suspend(list)", ARG1, ARG2 * sizeof(struct vki_aiocb *));
3846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG3)
3847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ ("aio_suspend(timeout)", ARG3, sizeof(struct vki_timespec));
3848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(aio_error)
3851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // This assumes that the kernel looks at the struct pointer, but not the
3853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // contents of the struct.
3854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "aio_error ( %#lx )", ARG1 );
3855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "aio_error", struct vki_aiocb*, aiocbp);
3856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(aio_read)
3859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_aiocb* aiocbp = (struct vki_aiocb*)ARG1;
3861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "aio_read ( %#lx )", ARG1 );
3863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "aio_read", struct vki_aiocb*, aiocbp);
3864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "aio_read(aiocbp)", ARG1, sizeof(struct vki_aiocb));
3865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)(aiocbp, sizeof(struct vki_aiocb))) {
3867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ML_(fd_allowed)(aiocbp->aio_fildes, "aio_read", tid, /*isNewFd*/False)) {
3868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_WRITE("aio_read(aiocbp->aio_buf)",
3869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       (Addr)aiocbp->aio_buf, aiocbp->aio_nbytes);
3870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
3871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EBADF );
3872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
3874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
3875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(aio_read)
3878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // We have to record the fact that there is an asynchronous read request
3880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // pending.  When a successful aio_return() occurs for this aiocb, then we
3881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // will mark the memory as having been defined.
3882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_aiocb* aiocbp = (struct vki_aiocb*)ARG1;
3883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!aio_init_done) aio_init();
3884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // aiocbp shouldn't already be in the table -- if it was a dup, the kernel
3885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // should have caused the aio_read() to fail and we shouldn't have reached
3886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // here.
3887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(OSetWord_Insert)(aiocbp_table, (UWord)aiocbp);
3888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(aio_write)
3891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct vki_aiocb* aiocbp = (struct vki_aiocb*)ARG1;
3893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT( "aio_write ( %#lx )", ARG1 );
3895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "aio_write", struct vki_aiocb*, aiocbp);
3896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ( "aio_write(aiocbp)", ARG1, sizeof(struct vki_aiocb));
3897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ML_(safe_to_deref)(aiocbp, sizeof(struct vki_aiocb))) {
3899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (ML_(fd_allowed)(aiocbp->aio_fildes, "aio_write", tid, /*isNewFd*/False)) {
3900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRE_MEM_READ("aio_write(aiocbp->aio_buf)",
3901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      (Addr)aiocbp->aio_buf, aiocbp->aio_nbytes);
3902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
3903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_STATUS_Failure( VKI_EBADF );
3904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
3906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Failure( VKI_EINVAL );
3907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
3911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg: formatted messages
3912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
3913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic size_t desc_size(mach_msg_descriptor_t *desc)
3915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (desc->type.type) {
3917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case MACH_MSG_PORT_DESCRIPTOR:          return sizeof(desc->port);
3918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case MACH_MSG_OOL_DESCRIPTOR:           return sizeof(desc->out_of_line);
3919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case MACH_MSG_OOL_VOLATILE_DESCRIPTOR:  return sizeof(desc->out_of_line);
3920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case MACH_MSG_OOL_PORTS_DESCRIPTOR:     return sizeof(desc->ool_ports);
3921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
3922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("UNKNOWN mach message descriptor %d\n", desc->type.type);
3923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return sizeof(desc->type); // guess
3924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void assign_port_names(mach_msg_ool_ports_descriptor_t *desc,
3929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              const char *name)
3930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_size_t i;
3932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_port_t *ports = (mach_port_t *)desc->address;
3933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < desc->count; i++) {
3934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assign_port_name(ports[i], name);
3935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void import_complex_message(ThreadId tid, mach_msg_header_t *mh)
3940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_body_t *body;
3942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_size_t count, i;
3943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint8_t *p;
3944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_descriptor_t *desc;
3945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(mh->msgh_bits & MACH_MSGH_BITS_COMPLEX);
3947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   body = (mach_msg_body_t *)(mh+1);
3949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   count = body->msgh_descriptor_count;
3950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   p = (uint8_t *)(body+1);
3951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < count; i++) {
3953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      desc = (mach_msg_descriptor_t *)p;
3954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p += desc_size(desc);
3955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (desc->type.type) {
3957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case MACH_MSG_PORT_DESCRIPTOR:
3958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // single port
3959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         record_unnamed_port(tid, desc->port.name, -1);
3960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         record_port_insert_rights(desc->port.name, desc->port.disposition);
3961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRINT("got port %s;\n", name_for_port(desc->port.name));
3962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case MACH_MSG_OOL_DESCRIPTOR:
3965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case MACH_MSG_OOL_VOLATILE_DESCRIPTOR:
3966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // out-of-line memory - map it
3967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme how is VOLATILE different? do we care?
3968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme do other flags tell us anything? assume shared for now
3969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme more SF_ flags marking mach_msg memory might be nice
3970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme protection
3971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (desc->out_of_line.size > 0) {
3972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr start = VG_PGROUNDDN((Addr)desc->out_of_line.address);
3973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr end = VG_PGROUNDUP((Addr)desc->out_of_line.address +
3974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    (Addr)desc->out_of_line.size);
3975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRINT("got ool mem %p..%#lx;\n", desc->out_of_line.address,
3976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)desc->out_of_line.address+desc->out_of_line.size);
3977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(notify_core_and_tool_of_mmap)(
3979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               start, end - start, VKI_PROT_READ|VKI_PROT_WRITE,
3980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               VKI_MAP_PRIVATE, -1, 0);
3981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme mark only un-rounded part as initialized
3983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case MACH_MSG_OOL_PORTS_DESCRIPTOR:
3986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // out-of-line array of ports - map it
3987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme see fixmes above
3988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRINT("got %d ool ports %p..%#lx", desc->ool_ports.count, desc->ool_ports.address, (Addr)desc->ool_ports.address+desc->ool_ports.count*sizeof(mach_port_t));
3989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (desc->ool_ports.count > 0) {
3991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr start = VG_PGROUNDDN((Addr)desc->ool_ports.address);
3992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr end = VG_PGROUNDUP((Addr)desc->ool_ports.address + desc->ool_ports.count * sizeof(mach_port_t));
3993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            mach_port_t *ports = (mach_port_t *)desc->ool_ports.address;
3994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(notify_core_and_tool_of_mmap)(
3996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               start, end - start, VKI_PROT_READ|VKI_PROT_WRITE,
3997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               VKI_MAP_PRIVATE, -1, 0);
3998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRINT(":");
4000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for (i = 0; i < desc->ool_ports.count; i++) {
4001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               record_unnamed_port(tid, ports[i], -1);
4002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               record_port_insert_rights(ports[i], desc->port.disposition);
4003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               PRINT(" %s", name_for_port(ports[i]));
4004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
4005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRINT(";\n");
4007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("UNKNOWN Mach descriptor type %u!\n", desc->type.type);
4011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void pre_port_desc_read(ThreadId tid, mach_msg_port_descriptor_t *desc2)
4018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
4021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_t name;
4022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_size_t pad1;
4023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint16_t pad2;
4024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint8_t disposition;
4025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint8_t type;
4026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } *desc = (void*)desc2;
4027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.port.name",        desc->name);
4030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.port.disposition", desc->disposition);
4031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.port.type",        desc->type);
4032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void pre_ool_desc_read(ThreadId tid, mach_msg_ool_descriptor_t *desc2)
4036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
4039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Addr address;
4040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE != 8
4041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_size_t size;
4042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint8_t deallocate;
4044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint8_t copy;
4045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint8_t pad1;
4046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint8_t type;
4047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 8
4048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_size_t size;
4049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } *desc = (void*)desc2;
4051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.out_of_line.address",    desc->address);
4054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.out_of_line.size",       desc->size);
4055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.out_of_line.deallocate", desc->deallocate);
4056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.out_of_line.copy",       desc->copy);
4057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.out_of_line.type",       desc->type);
4058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void pre_oolports_desc_read(ThreadId tid,
4061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   mach_msg_ool_ports_descriptor_t *desc2)
4062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
4065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Addr address;
4066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE != 8
4067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_size_t size;
4068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint8_t deallocate;
4070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint8_t copy;
4071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint8_t disposition;
4072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      uint8_t type;
4073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 8
4074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_size_t size;
4075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } *desc = (void*)desc2;
4077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.ool_ports.address",     desc->address);
4080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.ool_ports.size",        desc->size);
4081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.ool_ports.deallocate",  desc->deallocate);
4082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.ool_ports.copy",        desc->copy);
4083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.ool_ports.disposition", desc->disposition);
4084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_FIELD_READ("msg->desc.ool_ports.type",        desc->type);
4085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Returns the size of the descriptor area
4089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// (mach_msg_body_t + any mach_msg_descriptor_t)
4090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic size_t export_complex_message(ThreadId tid, mach_msg_header_t *mh)
4091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_body_t *body;
4093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_size_t count, i;
4094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint8_t *p;
4095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_descriptor_t *desc;
4096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(mh->msgh_bits & MACH_MSGH_BITS_COMPLEX);
4098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   body = (mach_msg_body_t *)(mh+1);
4100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_READ("msg->msgh_descriptor_count)", (Addr)body, sizeof(*body));
4101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   count = body->msgh_descriptor_count;
4103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   p = (uint8_t *)(body+1);
4104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < count; i++) {
4106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      desc = (mach_msg_descriptor_t *)p;
4107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p += desc_size(desc);
4108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (desc->type.type) {
4110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case MACH_MSG_PORT_DESCRIPTOR:
4111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // single port; no memory map effects
4112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         pre_port_desc_read(tid, &desc->port);
4113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case MACH_MSG_OOL_DESCRIPTOR:
4116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case MACH_MSG_OOL_VOLATILE_DESCRIPTOR:
4117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // out-of-line memory - unmap it if it's marked dealloc
4118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme need to remap if message fails?
4119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme how is VOLATILE different? do we care?
4120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme struct is different for lp64
4121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         pre_ool_desc_read(tid, &desc->out_of_line);
4122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (desc->out_of_line.deallocate  &&  desc->out_of_line.size > 0) {
4124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vm_size_t size = desc->out_of_line.size;
4125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr start = VG_PGROUNDDN((Addr)desc->out_of_line.address);
4126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr end = VG_PGROUNDUP((Addr)desc->out_of_line.address + size);
4127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRINT("kill ool mem %p..%#lx; ", desc->out_of_line.address,
4128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)desc->out_of_line.address + size);
4129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(notify_core_and_tool_of_munmap)(start, end - start);
4130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case MACH_MSG_OOL_PORTS_DESCRIPTOR:
4134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // out-of-line array of ports - unmap it if it's marked dealloc
4135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme need to remap if message fails?
4136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme struct different for lp64
4137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         pre_oolports_desc_read(tid, &desc->ool_ports);
4138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (desc->ool_ports.deallocate  &&  desc->ool_ports.count > 0) {
4140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vm_size_t size = desc->ool_ports.count * sizeof(mach_port_t);
4141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr start = VG_PGROUNDDN((Addr)desc->ool_ports.address);
4142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr end = VG_PGROUNDUP((Addr)desc->ool_ports.address + size);
4143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PRINT("kill ool port array %p..%#lx; ", desc->ool_ports.address,
4144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  (Addr)desc->ool_ports.address + size);
4145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(notify_core_and_tool_of_munmap)(start, end - start);
4146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("UNKNOWN Mach descriptor type %u!\n", desc->type.type);
4150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return (size_t)((Addr)p - (Addr)body);
4155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
4159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg: host-related messages
4160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
4161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(host_info)
4164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
4170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t host_info_outCnt;
4171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      integer_t host_info_out[14];
4172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
4176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (reply->RetCode) PRINT("mig return %d", reply->RetCode);
4178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(host_info)
4181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      host_flavor_t flavor;
4187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t host_info_outCnt;
4188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("host_info(mach_host_self(), flavor %d)", req->flavor);
4194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(host_info);
4196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(host_page_size)
4200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
4206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_size_t out_page_size;
4207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
4211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
4213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRINT("page size %llu", (ULong)reply->out_page_size);
4214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
4216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(host_page_size)
4220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("host_page_size(mach_host_self(), ...)");
4222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(host_page_size);
4224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(host_get_io_master)
4228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
4233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
4234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t io_master;
4235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
4236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
4240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assign_port_name(reply->io_master.name, "io_master-%p");
4242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("%s", name_for_port(reply->io_master.name));
4243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(host_get_io_master)
4246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Request *req = (Request *)ARG1;
4254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("host_get_io_master(mach_host_self())");
4256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(host_get_io_master);
4258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(host_get_clock_service)
4262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
4267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
4268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t clock_serv;
4269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
4270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
4274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assign_port_name(reply->clock_serv.name, "clock-%p");
4276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("%s", name_for_port(reply->clock_serv.name));
4277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(host_get_clock_service)
4280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      clock_id_t clock_id;
4286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("host_get_clock_service(mach_host_self(), %d)", req->clock_id);
4292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(host_get_clock_service);
4294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(host_request_notification)
4298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
4303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
4304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t notify_port;
4305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
4306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      host_flavor_t notify_type;
4308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (MACH_REMOTE == mach_task_self()) {
4314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (req->notify_type == 0) {
4315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRINT("host_request_notification(mach_host_self(), %s, %s)",
4316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               "HOST_NOTIFY_CALENDAR_CHANGE",
4317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               name_for_port(req->notify_port.name));
4318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRINT("host_request_notification(mach_host_self(), %d, %s)",
4320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               req->notify_type,
4321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               name_for_port(req->notify_port.name));
4322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("host_request_notification(%s, %d, %s)",
4325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            name_for_port(MACH_REMOTE),
4326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            req->notify_type,
4327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            name_for_port(req->notify_port.name));
4328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    // GrP fixme only do this on success
4331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assign_port_name(req->notify_port.name, "host_notify-%p");
4332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
4336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg: messages to a task
4337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
4338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// JRS 2011-Aug-25: just guessing here.  I have no clear idea how
4340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// these structs are derived.  They obviously relate to the various
4341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// .def files in the xnu sources, and can also be found in some
4342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// form in /usr/include/mach/*.h, but not sure how these all
4343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// relate to each other.
4344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(mach_port_set_context)
4346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#pragma pack(4)
4348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   typedef struct {
4349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mach_msg_header_t Head;
4350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      NDR_record_t NDR;
4351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mach_port_name_t name;
4352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mach_vm_address_t context;
4353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } Request;
4354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#pragma pack()
4355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Request *req = (Request *)ARG1;
4357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("mach_port_set_context(%s, %s, 0x%llx)",
4359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        name_for_port(MACH_REMOTE),
4360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        name_for_port(req->name), req->context);
4361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   AFTER = POST_FN(mach_port_set_context);
4363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(mach_port_set_context)
4366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#pragma pack(4)
4368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   typedef struct {
4369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mach_msg_header_t Head;
4370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      NDR_record_t NDR;
4371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      kern_return_t RetCode;
4372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } Reply;
4373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#pragma pack()
4374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// JRS 2011-Aug-25 FIXME completely bogus
4378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(task_get_exception_ports)
4379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#pragma pack(4)
4381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   typedef struct {
4382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mach_msg_header_t Head;
4383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      NDR_record_t NDR;
4384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      exception_mask_t exception_mask;
4385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } Request;
4386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#pragma pack()
4387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("task_get_exception_ports(BOGUS)");
4389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   AFTER = POST_FN(task_get_exception_ports);
4390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(task_get_exception_ports)
4393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#pragma pack(4)
4395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   typedef struct {
4396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mach_msg_header_t Head;
4397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* start of the kernel processed data */
4398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mach_msg_body_t msgh_body;
4399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mach_msg_port_descriptor_t old_handlers[32];
4400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* end of the kernel processed data */
4401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      NDR_record_t NDR;
4402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mach_msg_type_number_t masksCnt;
4403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      exception_mask_t masks[32];
4404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      exception_behavior_t old_behaviors[32];
4405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      thread_state_flavor_t old_flavors[32];
4406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } Reply;
4407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#pragma pack()
4408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov///////////////////////////////////////////////////
4412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_type)
4414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_type(%s, %s, ...)",
4426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE), name_for_port(req->name));
4427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_type);
4429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_type)
4432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_extract_member)
4437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t pset;
4444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_extract_member(%s, 0x%x, 0x%x)",
4450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
4451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->name, req->pset);
4452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_extract_member);
4454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme port tracker?
4456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_extract_member)
4459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
4465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
4469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (reply->RetCode) PRINT("mig return %d", reply->RetCode);
4471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_allocate)
4475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_right_t right;
4481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_allocate(mach_task_self(), %d, ...)", req->right);
4487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_port_allocate.right) = req->right;
4489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_allocate);
4491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_allocate)
4494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
4500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
4505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
4507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
4508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme port tracking is too imprecise
4509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // vg_assert(!port_exists(reply->name));
4510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         record_unnamed_port(tid, reply->name, MACH_ARG(mach_port_allocate.right));
4511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRINT("got port 0x%x", reply->name);
4512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("UNKNOWN inserted port 0x%x into remote task\n", reply->name);
4514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
4517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_deallocate)
4522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_deallocate(%s, %s)",
4534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
4535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->name));
4536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_port.port) = req->name;
4538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_deallocate);
4540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Must block to prevent race (other thread allocates and
4542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // notifies after we deallocate but before we notify)
4543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags &= ~SfMayBlock;
4544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_deallocate)
4547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
4553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
4557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
4559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
4560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Must have cleared SfMayBlock in PRE to prevent race
4561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         record_port_dealloc(MACH_ARG(mach_port.port));
4562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("UNKNOWN remote port dealloc\n");
4564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
4567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_get_refs)
4572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_right_t right;
4579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_get_refs(%s, %s, 0x%x)",
4585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
4586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->name), req->right);
4587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_port_mod_refs.port) = req->name;
4589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_port_mod_refs.right) = req->right;
4590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_get_refs);
4592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_get_refs)
4595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
4601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_urefs_t refs;
4602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
4606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
4608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("got refs=%d", reply->refs);
4609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
4611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_mod_refs)
4616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_right_t right;
4623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_delta_t delta;
4624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_mod_refs(%s, %s, 0x%x, 0x%x)",
4630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
4631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->name), req->right, req->delta);
4632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_port_mod_refs.port) = req->name;
4634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_port_mod_refs.right) = req->right;
4635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_port_mod_refs.delta) = req->delta;
4636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_mod_refs);
4638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Must block to prevent race (other thread allocates and
4640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // notifies after we deallocate but before we notify)
4641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags &= ~SfMayBlock;
4642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_mod_refs)
4645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
4651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
4655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
4657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
4658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Must have cleared SfMayBlock in PRE to prevent race
4659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         record_port_mod_refs(MACH_ARG(mach_port_mod_refs.port),
4660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              MACH_PORT_TYPE(MACH_ARG(mach_port_mod_refs.right)),
4661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              MACH_ARG(mach_port_mod_refs.delta));
4662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("UNKNOWN remote port mod refs\n");
4664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
4667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_get_set_status)
4672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_get_set_status(%s, %s)",
4684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
4685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->name));
4686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_get_set_status);
4688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_get_set_status)
4691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
4696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
4697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_ool_descriptor_t members;
4698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
4699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t membersCnt;
4701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
4702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Reply *reply = (Reply *)ARG1;
4706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme nothing to do?
4708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_move_member)
4712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    typedef struct {
4715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mach_msg_header_t Head;
4716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        NDR_record_t NDR;
4717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mach_port_name_t member;
4718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mach_port_name_t after;
4719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    } Request;
4720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Request *req = (Request *)ARG1;
4723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PRINT("mach_port_move_member(%s, %s, %s)",
4725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          name_for_port(MACH_REMOTE),
4726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          name_for_port(req->member),
4727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          name_for_port(req->after));
4728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /*
4729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    MACH_ARG(mach_port_move_member.member) = req->member;
4730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    MACH_ARG(mach_port_move_member.after) = req->after;
4731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    */
4732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    AFTER = POST_FN(mach_port_move_member);
4733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_move_member)
4736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
4742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
4743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
4747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
4749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // fixme port set tracker?
4750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
4752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_destroy)
4757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_destroy(%s, %s)",
4769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
4770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->name));
4771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_port.port) = req->name;
4773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_destroy);
4775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Must block to prevent race (other thread allocates and
4777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // notifies after we deallocate but before we notify)
4778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags &= ~SfMayBlock;
4779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_destroy)
4782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
4788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
4789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
4792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
4794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
4795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Must have cleared SfMayBlock in PRE to prevent race
4796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         record_port_destroy(MACH_ARG(mach_port.port));
4797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(printf)("UNKNOWN remote port destroy\n");
4799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
4802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_request_notification)
4807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
4812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
4813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t notify;
4814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
4815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_id_t msgid;
4818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_mscount_t sync;
4819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_request_notification(%s, %s, %d, %d, %d, %d, ...)",
4825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
4826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->name), req->msgid, req->sync,
4827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->notify.name, req->notify.disposition);
4828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_request_notification);
4830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_request_notification)
4833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme port tracker? not sure
4835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_insert_right)
4839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
4844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
4845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t poly;
4846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
4847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_insert_right(%s, %s, %d, %d)",
4855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
4856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->name), req->poly.name, req->poly.disposition);
4857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_insert_right);
4859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (MACH_REMOTE == mach_task_self()) {
4861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme import_complex_message handles everything?
4862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // what about export_complex_message for MOVE variants?
4863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
4864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("UNKNOWN mach_port_insert_right into remote task!\n");
4865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme also may remove rights from this task?
4866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme port tracker?
4869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_insert_right)
4872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_extract_right)
4877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_name_t msgt_name;
4884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_extract_right(%s, %s, %d)",
4890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
4891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->name), req->msgt_name);
4892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_extract_right);
4894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // fixme port tracker?
4896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_extract_right)
4899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // fixme import_complex_message handles the returned result, right?
4901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_get_attributes)
4905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_flavor_t flavor;
4912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t port_info_outCnt;
4913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_get_attributes(%s, %s, %d, ..., %d)",
4919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
4920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->name), req->flavor, req->port_info_outCnt);
4921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_get_attributes);
4923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_get_attributes)
4926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_set_attributes)
4931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_flavor_t flavor;
4938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t port_infoCnt;
4939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      integer_t port_info[10];
4940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_set_attributes(%s, %s, %d, ..., %d)",
4946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        name_for_port(MACH_REMOTE),
4947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        name_for_port(req->name), req->flavor, req->port_infoCnt);
4948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_set_attributes);
4950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_set_attributes)
4953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_port_insert_member)
4958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t name;
4964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t pset;
4965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_port_insert_member(%s, 0x%x, 0x%x)",
4971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE), req->name, req->pset);
4972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_port_insert_member);
4974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme port tracker?
4976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_port_insert_member)
4979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(task_get_special_port)
4984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
4986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
4987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
4988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
4989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int which_port;
4990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
4991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
4992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
4994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (req->which_port) {
4996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case TASK_KERNEL_PORT:
4997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("task_get_special_port(%s, TASK_KERNEL_PORT)",
4998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            name_for_port(MACH_REMOTE));
4999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case TASK_HOST_PORT:
5001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("task_get_special_port(%s, TASK_HOST_PORT)",
5002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            name_for_port(MACH_REMOTE));
5003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case TASK_BOOTSTRAP_PORT:
5005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("task_get_special_port(%s, TASK_BOOTSTRAP_PORT)",
5006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            name_for_port(MACH_REMOTE));
5007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if DARWIN_VERS != DARWIN_10_8
5009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* These disappeared in 10.8 */
5010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case TASK_WIRED_LEDGER_PORT:
5011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("task_get_special_port(%s, TASK_WIRED_LEDGER_PORT)",
5012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            name_for_port(MACH_REMOTE));
5013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case TASK_PAGED_LEDGER_PORT:
5015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("task_get_special_port(%s, TASK_PAGED_LEDGER_PORT)",
5016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            name_for_port(MACH_REMOTE));
5017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
5019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
5020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("task_get_special_port(%s, %d)",
5021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            name_for_port(MACH_REMOTE), req->which_port);
5022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(task_get_special_port.which_port) = req->which_port;
5026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(task_get_special_port);
5028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(task_get_special_port)
5031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
5036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
5037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t special_port;
5038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
5039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("got port %#x ", reply->special_port.name);
5045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (MACH_ARG(task_get_special_port.which_port)) {
5047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case TASK_BOOTSTRAP_PORT:
5048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_bootstrap_port = reply->special_port.name;
5049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assign_port_name(reply->special_port.name, "bootstrap");
5050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case TASK_KERNEL_PORT:
5052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assign_port_name(reply->special_port.name, "kernel");
5053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case TASK_HOST_PORT:
5055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assign_port_name(reply->special_port.name, "host");
5056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if DARWIN_VERS != DARWIN_10_8
5058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* These disappeared in 10.8 */
5059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case TASK_WIRED_LEDGER_PORT:
5060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assign_port_name(reply->special_port.name, "wired-ledger");
5061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case TASK_PAGED_LEDGER_PORT:
5063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assign_port_name(reply->special_port.name, "paged-ledger");
5064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
5066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
5067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assign_port_name(reply->special_port.name, "special-%p");
5068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
5069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("%s", name_for_port(reply->special_port.name));
5072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semaphore_create)
5076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int policy;
5082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int value;
5083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("semaphore_create(%s, ..., %d, %d)",
5089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE), req->policy, req->value);
5090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(semaphore_create);
5092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(semaphore_create)
5095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
5100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
5101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t semaphore;
5102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
5103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assign_port_name(reply->semaphore.name, "semaphore-%p");
5110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("%s", name_for_port(reply->semaphore.name));
5111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semaphore_destroy)
5115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
5120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
5121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t semaphore;
5122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
5123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("semaphore_destroy(%s, %s)",
5130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE), name_for_port(req->semaphore.name));
5131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   record_port_destroy(req->semaphore.name);
5133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(semaphore_destroy);
5135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(semaphore_destroy)
5138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
5150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
5152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_ports_lookup)
5157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       mach_msg_header_t Head;
5161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Request *req = (Request *)ARG1;
5165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_ports_lookup(%s)", name_for_port(MACH_REMOTE));
5167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_ports_lookup);
5169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_ports_lookup)
5172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
5177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
5178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_ool_ports_descriptor_t init_port_set;
5179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
5180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t init_port_setCnt;
5182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    // Reply *reply = (Reply *)ARG1;
5186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(task_threads)
5190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Request *req = (Request *)ARG1;
5198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("task_threads(%s)", name_for_port(MACH_REMOTE));
5200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(task_threads);
5202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(task_threads)
5205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
5210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
5211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_ool_ports_descriptor_t act_list;
5212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
5213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t act_listCnt;
5215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (MACH_REMOTE == vg_task_port) {
5222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assign_port_names(&reply->act_list, "thread-%p");
5223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assign_port_names(&reply->act_list, "remote-thread-%p");
5225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(task_suspend)
5230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("task_suspend(%s)", name_for_port(MACH_REMOTE));
5232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (MACH_REMOTE == vg_task_port) {
5234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme self-suspend
5235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(0);
5236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // suspend other - no problem
5238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(task_suspend);
5241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(task_suspend)
5244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(task_resume)
5249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("task_resume(%s)", name_for_port(MACH_REMOTE));
5251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (MACH_REMOTE == vg_task_port) {
5253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme self-resume
5254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(0);
5255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // resume other - no problem
5257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(task_resume);
5260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(task_resume)
5263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(vm_allocate)
5268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t address;
5274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_size_t size;
5275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int flags;
5276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("vm_allocate (%s, at %#llx, size %lld, flags %#x)",
5282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (ULong)req->address, (ULong)req->size, req->flags);
5284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_allocate.size) = req->size;
5286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_allocate.flags) = req->flags;
5287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(vm_allocate);
5289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(vm_allocate)
5292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t address;
5299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
5306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
5307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        PRINT("allocated at %#llx", (ULong)reply->address);
5308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // requesting 0 bytes returns address 0 with no error
5309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (MACH_ARG(vm_allocate.size)) {
5310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(notify_core_and_tool_of_mmap)(
5311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  reply->address, MACH_ARG(vm_allocate.size),
5312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  VKI_PROT_READ|VKI_PROT_WRITE, VKI_MAP_ANON, -1, 0);
5313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
5314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
5315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRINT("allocated at %#llx in remote task %s",
5316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (ULong)reply->address,
5317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               name_for_port(MACH_REMOTE));
5318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
5321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(vm_deallocate)
5326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t address;
5332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_size_t size;
5333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("vm_deallocate(%s, at %#llx, size %lld)",
5339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (ULong)req->address, (ULong)req->size);
5341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_deallocate.address) = req->address;
5343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_deallocate.size) = req->size;
5344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(vm_deallocate);
5346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Must block to prevent race (other thread allocates and
5348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // notifies after we deallocate but before we notify)
5349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags &= ~SfMayBlock;
5350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(vm_deallocate)
5353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
5366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
5367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (MACH_ARG(vm_deallocate.size)) {
5368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr start = VG_PGROUNDDN(MACH_ARG(vm_deallocate.address));
5369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr end = VG_PGROUNDUP(MACH_ARG(vm_deallocate.address) +
5370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    MACH_ARG(vm_deallocate.size));
5371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // Must have cleared SfMayBlock in PRE to prevent race
5372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(notify_core_and_tool_of_munmap)(start, end - start);
5373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
5374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
5377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(vm_protect)
5382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t address;
5388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_size_t size;
5389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      boolean_t set_maximum;
5390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_prot_t new_protection;
5391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("vm_protect(%s, at %#llx, size %lld, set_max %d, prot %d)",
5397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (ULong)req->address, (ULong)req->size,
5399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->set_maximum, req->new_protection);
5400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_protect.address) = req->address;
5402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_protect.size) = req->size;
5403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_protect.set_maximum) = req->set_maximum;
5404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_protect.new_protection) = req->new_protection;
5405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(vm_protect);
5407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(vm_protect)
5410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
5423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
5424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Addr start = VG_PGROUNDDN(MACH_ARG(vm_protect.address));
5425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Addr end = VG_PGROUNDUP(MACH_ARG(vm_protect.address) +
5426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 MACH_ARG(vm_protect.size));
5427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         UInt prot = MACH_ARG(vm_protect.new_protection);
5428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (MACH_ARG(vm_protect.set_maximum)) {
5429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             // GrP fixme mprotect max
5430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             VG_(printf)("UNKNOWN vm_protect set maximum");
5431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            //VG_(mprotect_max_range)(start, end-start, prot);
5432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
5433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(notify_core_and_tool_of_mprotect)(start, end-start, prot);
5434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            VG_(di_notify_vm_protect)(start, end-start, prot);
5435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
5436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
5439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(vm_inherit)
5444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t address;
5450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_size_t size;
5451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_inherit_t new_inheritance;
5452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("vm_inherit(%s, at %#llx, size %lld, value %d)",
5458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (ULong)req->address, (ULong)req->size,
5460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->new_inheritance);
5461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(vm_inherit);
5463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(vm_inherit)
5466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
5479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
5480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme do something?
5481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
5484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(vm_read)
5489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t address;
5495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_size_t size;
5496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("vm_read(from %s at %#llx size %llu)",
5502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (ULong)req->address, (ULong)req->size);
5504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_read.addr) = req->address;
5506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_read.size) = req->size;
5507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(vm_read);
5509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(vm_read)
5512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
5517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
5518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_ool_descriptor_t data;
5519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
5520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t dataCnt;
5522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Reply *reply = (Reply *)ARG1;
5526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (MACH_REMOTE == vg_task_port) {
5528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // vm_read from self
5529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme copy initialized state
5530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_vm_read)
5536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t address;
5542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_size_t size;
5543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_vm_read(from %s at 0x%llx size %llu)",
5549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE), req->address, req->size);
5550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_read.addr) = req->address;
5552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_read.size) = req->size;
5553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_vm_read);
5555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_vm_read)
5558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
5563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
5564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_ool_descriptor_t data;
5565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
5566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t dataCnt;
5568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Reply *reply = (Reply *)ARG1;
5572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (MACH_REMOTE == vg_task_port) {
5574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // vm_read from self
5575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme copy initialized state
5576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(vm_read_overwrite)
5581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t address;
5587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_size_t size;
5588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t data;
5589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("vm_read_overwrite(from %s at %#llx size %llu to %#llx)",
5595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (ULong)req->address, (ULong)req->size, (ULong)req->data);
5597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_read_overwrite.addr) = req->address;
5599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_read_overwrite.size) = req->size;
5600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_read_overwrite.data) = req->data;
5601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("vm_read_overwrite(data)", req->data, req->size);
5603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(vm_read_overwrite);
5605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(vm_read_overwrite)
5608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_size_t outsize;
5615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (reply->RetCode) {
5621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRINT("mig return %d", reply->RetCode);
5622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("read %llu bytes", (unsigned long long)reply->outsize);
5624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
5625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // vm_read_overwrite from self
5626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme copy initialized state
5627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(MACH_ARG(vm_read_overwrite.data), reply->outsize);
5628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
5629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // vm_read_overwrite from remote
5630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE(MACH_ARG(vm_read_overwrite.data), reply->outsize);
5631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(vm_copy)
5637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t source_address;
5643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_size_t size;
5644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t dest_address;
5645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("vm_copy(%s, %#llx, %lld, %#llx)",
5651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (ULong)req->source_address,
5653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (ULong)req->size, (ULong)req->dest_address);
5654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_copy.src) = req->source_address;
5656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_copy.dst) = req->dest_address;
5657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_copy.size) = req->size;
5658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(vm_copy);
5660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(vm_copy)
5663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
5676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
5677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme set dst's initialization equal to src's
5678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // and wipe any symbols or translations in dst
5679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
5682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(vm_map)
5687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
5692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
5693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t object;
5694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
5695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t address;
5697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_size_t size;
5698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t mask;
5699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int flags;
5700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_offset_t offset;
5701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      boolean_t copy;
5702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_prot_t cur_protection;
5703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_prot_t max_protection;
5704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_inherit_t inheritance;
5705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme check these
5711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("vm_map(in %s, at %#llx, size %lld, from %s ...)",
5712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (ULong)req->address, (ULong)req->size,
5714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->object.name));
5715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_map.size) = req->size;
5717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_map.copy) = req->copy;
5718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_map.protection) = (req->cur_protection & req->max_protection);
5719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(vm_map);
5721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(vm_map)
5724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t address;
5731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
5738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme check src and dest tasks
5739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     PRINT("mapped at %#llx", (ULong)reply->address);
5740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme max prot
5741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(notify_core_and_tool_of_mmap)(
5742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            reply->address, VG_PGROUNDUP(MACH_ARG(vm_map.size)),
5743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            MACH_ARG(vm_map.protection), VKI_MAP_SHARED, -1, 0);
5744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme VKI_MAP_PRIVATE if !copy?
5745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
5747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(vm_remap)
5752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
5757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
5758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t src_task;
5759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
5760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t target_address;
5762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_size_t size;
5763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t mask;
5764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      boolean_t anywhere;
5765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t src_address;
5766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      boolean_t copy;
5767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_inherit_t inheritance;
5768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme check src and dest tasks
5774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (VG_(clo_trace_syscalls)) {
5776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_port_name_t source_task = req->src_task.name;
5777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (source_task == mach_task_self()) {
5778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRINT("vm_remap(mach_task_self(), "
5779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               "to %#llx size %lld, from mach_task_self() at %#llx, ...)",
5780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (ULong)req->target_address,
5781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (ULong)req->size, (ULong)req->src_address);
5782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
5783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRINT("vm_remap(mach_task_self(), "
5784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               "to %#llx size %lld, from task %u at %#llx, ...)",
5785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (ULong)req->target_address, (ULong)req->size,
5786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               source_task, (ULong)req->src_address);
5787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // arg1 is task
5791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // vt->syscall_arg2 = req->target_address;
5792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(vm_remap.size) = req->size;
5793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // vt->syscall_arg4 = req->copy;
5794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(vm_remap);
5796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(vm_remap)
5799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t target_address;
5806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_prot_t cur_protection;
5807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_prot_t max_protection;
5808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
5815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme check src and dest tasks
5816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt prot = reply->cur_protection & reply->max_protection;
5817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme max prot
5818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mapped at %#llx", (ULong)reply->target_address);
5819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(notify_core_and_tool_of_mmap)(
5820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            reply->target_address, VG_PGROUNDUP(MACH_ARG(vm_remap.size)),
5821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            prot, VKI_MAP_SHARED, -1, 0);
5822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme VKI_MAP_FIXED if !copy?
5823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme copy initialized bits from source to dest if source_task is also mach_task_self
5824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
5826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_make_memory_entry_64)
5831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
5836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
5837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t parent_entry;
5838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
5839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      memory_object_size_t size;
5841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      memory_object_offset_t offset;
5842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_prot_t permission;
5843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_make_memory_entry_64(%s, %llu, %llu, %d, ..., %u)",
5849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->size, req->offset, req->permission, req->parent_entry.type);
5851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_make_memory_entry_64);
5853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_make_memory_entry_64)
5856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
5861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t object;
5862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      memory_object_size_t size;
5864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (reply->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) {
5870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assign_port_name(reply->object.name, "memory-%p");
5871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("%s", name_for_port(reply->object.name));
5872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(vm_purgable_control)
5877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_address_t address;
5883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_purgable_t control;
5884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int state;
5885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("vm_purgable_control(%s, %#llx, %d, %d)",
5891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (ULong)req->address, req->control, req->state);
5893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme verify address?
5895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(vm_purgable_control);
5897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(vm_purgable_control)
5900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int state;
5907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
5913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
5915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_vm_purgable_control)
5920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t address;
5926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_purgable_t control;
5927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int state;
5928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_vm_purgable_control(%s, 0x%llx, %d, %d)",
5934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (unsigned long long)req->address, req->control, req->state);
5936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme verify address?
5938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_vm_purgable_control);
5940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_vm_purgable_control)
5943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int state;
5950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
5956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
5957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
5958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_vm_allocate)
5963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t address;
5969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_size_t size;
5970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int flags;
5971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
5972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
5975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_vm_allocate (%s, at 0x%llx, size %lld, flags 0x%x)",
5977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
5978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->address, req->size, req->flags);
5979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_allocate.size) = req->size;
5981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_allocate.flags) = req->flags;
5982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_vm_allocate);
5984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_vm_allocate)
5987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
5989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
5990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
5991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
5992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
5993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t address;
5994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
5995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
5996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
5997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
5999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
6001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
6002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRINT("allocated at 0x%llx", reply->address);
6003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // requesting 0 bytes returns address 0 with no error
6004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (MACH_ARG(mach_vm_allocate.size)) {
6005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(notify_core_and_tool_of_mmap)(
6006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  reply->address, MACH_ARG(mach_vm_allocate.size),
6007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  VKI_PROT_READ|VKI_PROT_WRITE, VKI_MAP_ANON, -1, 0);
6008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
6009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
6010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         PRINT("allocated at 0x%llx in remote task %s", reply->address,
6011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               name_for_port(MACH_REMOTE));
6012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
6014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
6015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_vm_deallocate)
6020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t address;
6026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_size_t size;
6027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
6028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
6031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_vm_deallocate(%s, at 0x%llx, size %lld)",
6033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
6034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->address, req->size);
6035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_deallocate.address) = req->address;
6037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_deallocate.size) = req->size;
6038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_vm_deallocate);
6040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Must block to prevent race (other thread allocates and
6042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // notifies after we deallocate but before we notify)
6043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags &= ~SfMayBlock;
6044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_vm_deallocate)
6047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
6053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
6054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
6055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
6058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
6060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
6061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (MACH_ARG(mach_vm_deallocate.size)) {
6062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr start = VG_PGROUNDDN(MACH_ARG(mach_vm_deallocate.address));
6063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr end = VG_PGROUNDUP(MACH_ARG(mach_vm_deallocate.address) +
6064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    MACH_ARG(mach_vm_deallocate.size));
6065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // Must have cleared SfMayBlock in PRE to prevent race
6066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(notify_core_and_tool_of_munmap)(start, end - start);
6067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
6068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
6070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
6071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_vm_protect)
6076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t address;
6082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_size_t size;
6083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      boolean_t set_maximum;
6084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_prot_t new_protection;
6085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
6086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
6089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_vm_protect(%s, at 0x%llx, size %lld, set_max %d, prot %d)",
6091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE), req->address, req->size,
6092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->set_maximum, req->new_protection);
6093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_protect.address) = req->address;
6095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_protect.size) = req->size;
6096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_protect.set_maximum) = req->set_maximum;
6097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_protect.new_protection) = req->new_protection;
6098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_vm_protect);
6100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_vm_protect)
6103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
6109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
6110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
6111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
6114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
6116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
6117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Addr start = VG_PGROUNDDN(MACH_ARG(mach_vm_protect.address));
6118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Addr end = VG_PGROUNDUP(MACH_ARG(mach_vm_protect.address) +
6119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 MACH_ARG(mach_vm_protect.size));
6120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         UInt prot = MACH_ARG(mach_vm_protect.new_protection);
6121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (MACH_ARG(mach_vm_protect.set_maximum)) {
6122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // DDD: #warning GrP fixme mprotect max
6123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            //VG_(mprotect_max_range)(start, end-start, prot);
6124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
6125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ML_(notify_core_and_tool_of_mprotect)(start, end-start, prot);
6126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
6127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
6129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
6130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_vm_inherit)
6135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t address;
6141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_size_t size;
6142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_inherit_t new_inheritance;
6143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
6144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
6147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_vm_inherit(to %s, at 0x%llx, size %llu, value %u)",
6149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
6150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->address, req->size, req->new_inheritance);
6151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_vm_inherit);
6153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_vm_inherit)
6156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
6162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
6163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
6164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
6167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
6169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // no V-visible side effects
6170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme except maybe fork/exec
6171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
6172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
6173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_vm_copy)
6178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t source_address;
6184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_size_t size;
6185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t dest_address;
6186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
6187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
6190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_vm_copy(%s, 0x%llx, %llu, 0x%llx)",
6192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
6193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->source_address, req->size, req->dest_address);
6194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // arg1 is task
6196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // vt->syscall_arg2 = req->source_address;
6197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // vt->syscall_arg3 = req->size;
6198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // vt->syscall_arg4 = req->dest_address;
6199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_vm_copy);
6201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_vm_copy)
6204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
6210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
6211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
6212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
6215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
6217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (MACH_REMOTE == vg_task_port) {
6218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme set dest's initialization equal to src's
6219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // BUT vm_copy allocates no memory
6220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
6222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
6223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_vm_map)
6228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
6233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
6234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t object;
6235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
6236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t address;
6238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_size_t size;
6239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t mask;
6240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int flags;
6241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      memory_object_offset_t offset;
6242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      boolean_t copy;
6243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_prot_t cur_protection;
6244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_prot_t max_protection;
6245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vm_inherit_t inheritance;
6246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
6247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
6250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme check these
6252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_vm_map(in %s, at 0x%llx, size %llu, from %s ...)",
6253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
6254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->address, req->size,
6255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->object.name));
6256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_map.size) = req->size;
6258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_map.copy) = req->copy;
6259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(mach_vm_map.protection) =
6260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (req->cur_protection & req->max_protection);
6261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_vm_map);
6263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_vm_map)
6266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
6272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t address;
6273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
6274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
6275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
6278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
6280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme check src and dest tasks
6281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mapped at 0x%llx", reply->address);
6282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme max prot
6283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ML_(notify_core_and_tool_of_mmap)(
6284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            reply->address, VG_PGROUNDUP(MACH_ARG(mach_vm_map.size)),
6285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            MACH_ARG(mach_vm_map.protection), VKI_MAP_SHARED, -1, 0);
6286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme VKI_MAP_PRIVATE if !copy?
6287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
6288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
6289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_vm_region_recurse)
6294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t address;
6300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      natural_t nesting_depth;
6301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t infoCnt;
6302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
6303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
6306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_vm_region_recurse(in %s, at 0x%llx, depth %u, count %u)",
6308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(MACH_REMOTE),
6309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->address, req->nesting_depth, req->infoCnt);
6310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_vm_region_recurse);
6312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_vm_region_recurse)
6315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
6321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_address_t address;
6322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_vm_size_t size;
6323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      natural_t nesting_depth;
6324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t infoCnt;
6325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int info[19];
6326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
6327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
6330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
6332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRINT("got region at 0x%llx, size %llu, depth %u, count %u",
6333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             reply->address, reply->size,
6334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             reply->nesting_depth, reply->infoCnt);
6335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // GrP fixme mark info contents beyond infoCnt as bogus
6336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
6337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
6338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
6343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg: messages to thread
6344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
6345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(thread_terminate)
6349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(thread_terminate)
6354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
6356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Bool self_terminate = (mh->msgh_request_port == MACH_THREAD);
6357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("thread_terminate(%s)", name_for_port(mh->msgh_request_port));
6359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(thread_terminate);
6361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (self_terminate) {
6363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Terminating this thread.
6364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Copied from sys_exit.
6365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ThreadState *tst = VG_(get_ThreadState)(tid);
6366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->exitreason = VgSrc_ExitThread;
6367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->os_state.exitcode = 0;  // GrP fixme anything better?
6368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // What we would like to do is:
6369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //   SET_STATUS_Success(0);
6370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // but that doesn't work, because this is a MACH-class syscall,
6371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // and SET_STATUS_Success creates a UNIX-class syscall result.
6372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Hence we have to laboriously construct the full SysRes "by hand"
6373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // and use that to set the syscall return status.
6374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
6375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(mk_SysRes_x86_darwin)(
6376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            VG_DARWIN_SYSCALL_CLASS_MACH,
6377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            False/*success*/, 0, 0
6378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         )
6379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );
6380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *flags &= ~SfMayBlock;  // clear flag set by PRE(mach_msg)
6381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
6382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Terminating some other thread.
6383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Do keep the scheduler lock while terminating any other thread.
6384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Otherwise we might halt the other thread while it holds the lock,
6385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // which would deadlock the process.
6386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme good enough?
6387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme need to clean up other thread's valgrind data?
6388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(thread_create)
6393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(thread_create)
6398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("thread_create(mach_task_self(), ...)");
6400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(thread_create);
6402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme
6404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(core_panic)("thread_create() unimplemented");
6405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(thread_create_running)
6409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      thread_state_flavor_t flavor;
6415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t new_stateCnt;
6416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      natural_t new_state[144];
6417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
6418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req;
6421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   thread_state_t regs;
6422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState *new_thread;
6423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("thread_create_running(mach_task_self(), ...)");
6425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // The new thread will immediately begin execution,
6427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // so we need to hijack the register state here.
6428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   req = (Request *)ARG1;
6430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   regs = (thread_state_t)req->new_state;
6431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Build virtual thread.
6433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   new_thread = build_thread(regs, req->flavor, req->new_stateCnt);
6434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Edit the thread state to send to the real kernel.
6436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   hijack_thread_state(regs, req->flavor, req->new_stateCnt, new_thread);
6437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(thread_create_running);
6439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(thread_create_running)
6443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
6448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
6449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t child_act;
6450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
6451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
6452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
6455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assign_port_name(reply->child_act.name, "thread-%p");
6457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("%s", name_for_port(reply->child_act.name));
6458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(bsdthread_create)
6462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState *tst;
6464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("bsdthread_create( %#lx, %#lx, %#lx, %#lx, %#lx )",
6466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, ARG3, ARG4, ARG5);
6467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ5(pthread_t,"bsdthread_create",
6468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *,"func", void *,"func_arg", void *,"stack",
6469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 pthread_t,"thread", unsigned int,"flags");
6470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // The kernel will call V's pthread_hijack() to launch the thread.
6472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Here we allocate the thread state and pass it to pthread_hijack()
6473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // via the func_arg parameter.
6474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst = VG_(get_ThreadState)(VG_(alloc_ThreadState)());
6476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   allocstack(tst->tid);
6477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst->os_state.func_arg = (Addr)ARG2;
6479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARG2 = (Word)tst;
6480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Create a semaphore that pthread_hijack will signal once it starts
6482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // POST(bsdthread_create) needs to wait for the new memory map to appear
6483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   semaphore_create(mach_task_self(), &tst->os_state.child_go,
6484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    SYNC_POLICY_FIFO, 0);
6485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   semaphore_create(mach_task_self(), &tst->os_state.child_done,
6486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    SYNC_POLICY_FIFO, 0);
6487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(bsdthread_create)
6490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Tell new thread's pthread_hijack to proceed, and wait for it to finish.
6492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // We hold V's lock on the child's behalf.
6493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // If we return before letting pthread_hijack do its thing, V thinks
6494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // the new pthread struct is still unmapped when we return to libc,
6495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // causing false errors.
6496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState *tst = (ThreadState *)ARG2;
6498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   semaphore_signal(tst->os_state.child_go);
6499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   semaphore_wait(tst->os_state.child_done);
6500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   semaphore_destroy(mach_task_self(), tst->os_state.child_go);
6501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   semaphore_destroy(mach_task_self(), tst->os_state.child_done);
6502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme semaphore destroy needed when thread creation fails
6504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme probably other cleanup too
6505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme spinlocks might be good enough?
6506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // DDD: I'm not at all sure this is the right spot for this.  It probably
6508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // should be in pthread_hijack instead, just before the call to
6509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // start_thread_NORETURN(), call_on_new_stack_0_1(), but we don't have the
6510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // parent tid value there...
6511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vg_assert(VG_(owns_BigLock_LL)(tid));
6512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_TRACK ( pre_thread_ll_create, tid, tst->tid );
6513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(bsdthread_terminate)
6517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ThreadState *tst;
6519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("bsdthread_terminate( %#lx, %lx, %s, %s )",
6521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ARG1, ARG2, name_for_port(ARG3), name_for_port(ARG4));
6522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(int,"bsdthread_terminate",
6523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 void *,"freeaddr", size_t,"freesize",
6524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 mach_port_t,"kport", mach_port_t,"joinsem");
6525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Free memory and signal semaphore.
6527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme errors?
6528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG4) semaphore_signal((semaphore_t)ARG4);
6529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG1  &&  ARG2) {
6530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       ML_(notify_core_and_tool_of_munmap)(ARG1, ARG2);
6531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#      if DARWIN_VERS == DARWIN_10_8
6532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       /* JRS 2012 Aug 02: ugly hack: vm_deallocate disappeared from
6533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          the mig output.  Work around it for the time being. */
6534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       VG_(do_syscall2)(__NR_munmap, ARG1, ARG2);
6535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#      else
6536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       vm_deallocate(mach_task_self(), (vm_address_t)ARG1, (vm_size_t)ARG2);
6537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#      endif
6538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Tell V to terminate the thread.
6541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Copied from sys_exit.
6542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst = VG_(get_ThreadState)(tid);
6543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst->exitreason = VgSrc_ExitThread;
6544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tst->os_state.exitcode = 0;  // GrP fixme anything better?
6545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
6546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(thread_suspend)
6550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(thread_suspend)
6554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
6556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Bool self_suspend = (mh->msgh_request_port == MACH_THREAD);
6557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("thread_suspend(%s)", name_for_port(mh->msgh_request_port));
6559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(thread_suspend);
6561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (self_suspend) {
6563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // Don't keep the scheduler lock while self-suspending.
6564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // Otherwise we might halt while still holding the lock,
6565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // which would deadlock the process.
6566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       *flags |= SfMayBlock;
6567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
6568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // Do keep the scheduler lock while suspending any other thread.
6569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // Otherwise we might halt the other thread while it holds the lock,
6570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       // which would deadlock the process.
6571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(thread_get_state)
6576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
6582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t old_stateCnt;
6583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      natural_t old_state[144];
6584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
6585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
6586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
6589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // mach_port_t thread = MACH_ARG(thread_get_state.thread);
6590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   thread_state_flavor_t flavor = MACH_ARG(thread_get_state.flavor);
6591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!reply->RetCode) {
6593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      thread_state_from_vex((thread_state_t)reply->old_state,
6594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             flavor, reply->old_stateCnt,
6595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             &VG_(get_ThreadState)(tid)->arch.vex);
6596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
6597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("mig return %d", reply->RetCode);
6598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(thread_get_state)
6602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      thread_state_flavor_t flavor;
6608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_type_number_t old_stateCnt;
6609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
6610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
6613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Bool self = (req->Head.msgh_request_port == MACH_THREAD);
6614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme   if (self) {
6616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("thread_get_state(%s, %d)",
6617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(req->Head.msgh_request_port), req->flavor);
6618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       /*} else {
6619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRINT("thread_get_state(0x%x, %d)",
6620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             req->Head.msgh_request_port, req->flavor);
6621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             }*/
6622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Hack the thread state after making the real call.
6624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(thread_get_state.thread) = req->Head.msgh_request_port;
6625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(thread_get_state.flavor) = req->flavor;
6626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(thread_get_state);
6628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(thread_policy)
6632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
6634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Bool self = (mh->msgh_request_port == MACH_THREAD);
6635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme   if (self) {
6637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("thread_policy(%s, ...)", name_for_port(mh->msgh_request_port));
6638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /*} else {
6639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("thread_policy(thread 0x%x, ...)", mh->msgh_request_port);
6640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }*/
6641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(thread_policy);
6643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(thread_policy)
6646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(thread_policy_set)
6651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
6653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("thread_policy_set(%s, ...)", name_for_port(mh->msgh_request_port));
6655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(thread_policy_set);
6657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(thread_policy_set)
6660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(thread_info)
6665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
6667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("thread_info(%s, ...)", name_for_port(mh->msgh_request_port));
6669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme does any thread info need to be hijacked?
6670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(thread_info);
6672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(thread_info)
6675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme mark unused parts of thread_info_out as uninitialized?
6677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
6682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg: messages to bootstrap port
6683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
6684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(bootstrap_register)
6687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      kern_return_t RetCode;
6693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
6694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
6695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
6698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (reply->RetCode) PRINT("mig return %d", reply->RetCode);
6700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(bootstrap_register)
6703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
6708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
6709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t service_port;
6710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
6711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      name_t service_name;
6713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
6714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
6717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("bootstrap_register(port 0x%x, \"%s\")",
6719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         req->service_port.name, req->service_name);
6720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assign_port_name(req->service_port.name, req->service_name);
6722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(bootstrap_register);
6724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(bootstrap_look_up)
6728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* start of the kernel processed data */
6733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_body_t msgh_body;
6734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_port_descriptor_t service_port;
6735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* end of the kernel processed data */
6736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_trailer_t trailer;
6737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Reply;
6738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Reply *reply = (Reply *)ARG1;
6741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((reply->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX)  &&
6743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       reply->service_port.name)
6744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       assign_port_name(reply->service_port.name,
6746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        MACH_ARG(bootstrap_look_up.service_name));
6747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRINT("%s", name_for_port(reply->service_port.name));
6748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
6749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       PRINT("not found");
6750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(arena_free)(VG_AR_CORE, MACH_ARG(bootstrap_look_up.service_name));
6752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(bootstrap_look_up)
6755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack(4)
6757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
6758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mach_msg_header_t Head;
6759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NDR_record_t NDR;
6760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      name_t service_name;
6761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Request;
6762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma pack()
6763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Request *req = (Request *)ARG1;
6765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("bootstrap_look_up(\"%s\")", req->service_name);
6767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACH_ARG(bootstrap_look_up.service_name) =
6769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(arena_strdup)(VG_AR_CORE, "syswrap-darwin.bootstrap-name",
6770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        req->service_name);
6771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(bootstrap_look_up);
6773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
6777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg: receiver-specific handlers
6778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
6779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_msg_receive)
6782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
6784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme don't know of anything interesting here currently
6786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // import_complex_message handles everything
6787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // PRINT("UNHANDLED reply %d", mh->msgh_id);
6788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Assume the call may have mapped or unmapped memory
6790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(sync_mappings)("after", "mach_msg_receive", 0);
6791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_msg_receive)
6794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
6796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_msg_receive(port %s)", name_for_port(mh->msgh_reply_port));
6798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = POST_FN(mach_msg_receive);
6800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // no message sent, only listening for a reply
6802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // assume message may block
6803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
6804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_msg_bootstrap)
6808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // message to bootstrap port
6810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
6812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (mh->msgh_id) {
6814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 403:
6815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(bootstrap_register);
6816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 404:
6818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(bootstrap_look_up);
6819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
6822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("UNHANDLED bootstrap message [id %d, to %s, reply 0x%x]\n",
6823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            mh->msgh_id, name_for_port(mh->msgh_request_port),
6824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            mh->msgh_reply_port);
6825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_msg_host)
6831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // message to host self - check for host-level kernel calls
6833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
6835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (mh->msgh_id) {
6837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 200:
6838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(host_info);
6839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 202:
6841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(host_page_size);
6842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 205:
6844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(host_get_io_master);
6845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 206:
6847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(host_get_clock_service);
6848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 217:
6850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(host_request_notification);
6851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
6854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // unknown message to host self
6855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("UNKNOWN host message [id %d, to %s, reply 0x%x]\n",
6856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  mh->msgh_id, name_for_port(mh->msgh_request_port),
6857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  mh->msgh_reply_port);
6858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// JRS 2011-Aug-25: these magic numbers (3201 etc) come from
6863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// /usr/include/mach/mach_port.h et al (grep in /usr/include
6864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// for them)
6865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_msg_task)
6866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // message to a task port
6868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
6870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (mh->msgh_id) {
6872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3201:
6873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_type);
6874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3204:
6876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_allocate);
6877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3205:
6879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_destroy);
6880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3206:
6882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_deallocate);
6883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3207:
6885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_get_refs);
6886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3208:
6888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_mod_refs);
6889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3211:
6891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_get_set_status);
6892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3212:
6894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_move_member);
6895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3213:
6897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_request_notification);
6898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3214:
6900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_insert_right);
6901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3215:
6903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_extract_right);
6904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3217:
6906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_get_attributes);
6907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3218:
6909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_set_attributes);
6910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3226:
6912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_insert_member);
6913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3227:
6915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_port_extract_member);
6916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 3229:
6919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      CALL_PRE(mach_port_set_context);
6920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
6921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3402:
6923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(task_threads);
6924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3404:
6926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_ports_lookup);
6927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3407:
6930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(task_suspend);
6931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3408:
6933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(task_resume);
6934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3409:
6937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(task_get_special_port);
6938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3411:
6940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(thread_create);
6941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3412:
6943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(thread_create_running);
6944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 3414:
6947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      CALL_PRE(task_get_exception_ports);
6948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
6949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3418:
6951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(semaphore_create);
6952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3419:
6954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(semaphore_destroy);
6955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3801:
6958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(vm_allocate);
6959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3802:
6961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(vm_deallocate);
6962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3803:
6964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(vm_protect);
6965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3804:
6967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(vm_inherit);
6968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3805:
6970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(vm_read);
6971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3808:
6973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(vm_copy);
6974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3809:
6976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(vm_read_overwrite);
6977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3812:
6979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(vm_map);
6980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3814:
6982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(vm_remap);
6983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3825:
6985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_make_memory_entry_64);
6986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3830:
6988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(vm_purgable_control);
6989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 4800:
6992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_vm_allocate);
6993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 4801:
6995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_vm_deallocate);
6996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
6997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 4802:
6998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_vm_protect);
6999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 4803:
7001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_vm_inherit);
7002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 4804:
7004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_vm_read);
7005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 4807:
7007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_vm_copy);
7008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 4811:
7010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_vm_map);
7011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 4815:
7013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_vm_region_recurse);
7014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 4817:
7016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_make_memory_entry_64);
7017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 4818:
7019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_vm_purgable_control);
7020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
7023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // unknown message to task self
7024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("UNKNOWN task message [id %d, to %s, reply 0x%x]\n",
7025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  mh->msgh_id, name_for_port(mh->msgh_remote_port),
7026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  mh->msgh_reply_port);
7027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_msg_thread)
7033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // message to local thread - check for thread-level kernel calls
7035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
7037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (mh->msgh_id) {
7039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3600:
7040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(thread_terminate);
7041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3603:
7043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(thread_get_state);
7044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3605:
7046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(thread_suspend);
7047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3612:
7049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(thread_info);
7050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3616:
7052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(thread_policy);
7053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 3617:
7055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(thread_policy_set);
7056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
7058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // unknown message to a thread
7059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(printf)("UNKNOWN thread message [id %d, to %s, reply 0x%x]\n",
7060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  mh->msgh_id, name_for_port(mh->msgh_request_port),
7061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  mh->msgh_reply_port);
7062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int is_thread_port(mach_port_t port)
7068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (port == 0) return False;
7070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return VG_(lwpid_to_vgtid)(port) != VG_INVALID_THREADID;
7072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int is_task_port(mach_port_t port)
7076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (port == 0) return False;
7078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (port == vg_task_port) return True;
7080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return (0 == VG_(strncmp)("task-", name_for_port(port), 5));
7082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
7086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg: base handlers
7087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
7088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_msg)
7090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
7092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_option_t option = (mach_msg_option_t)ARG2;
7093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // mach_msg_size_t send_size = (mach_msg_size_t)ARG3;
7094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_size_t rcv_size = (mach_msg_size_t)ARG4;
7095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // mach_port_t rcv_name = (mach_port_t)ARG5;
7096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   size_t complex_header_size = 0;
7097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ7(long, "mach_msg",
7099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 mach_msg_header_t*,"msg", mach_msg_option_t,"option",
7100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 mach_msg_size_t,"send_size", mach_msg_size_t,"rcv_size",
7101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 mach_port_t,"rcv_name", mach_msg_timeout_t,"timeout",
7102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 mach_port_t,"notify");
7103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Assume default POST handler until specified otherwise
7105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AFTER = NULL;
7106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Assume call may block unless specified otherwise
7108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
7109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (option & MACH_SEND_MSG) {
7111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Validate outgoing message header
7112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("mach_msg(msg.msgh_bits)",
7113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   (Addr)&mh->msgh_bits, sizeof(mh->msgh_bits));
7114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // msgh_size not required, use parameter instead
7115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("mach_msg(msg.msgh_remote_port)",
7116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   (Addr)&mh->msgh_remote_port, sizeof(mh->msgh_remote_port));
7117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("mach_msg(msg.msgh_local_port)",
7118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   (Addr)&mh->msgh_local_port, sizeof(mh->msgh_local_port));
7119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // msgh_reserved not required
7120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("mach_msg(msg.msgh_id)",
7121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   (Addr)&mh->msgh_id, sizeof(mh->msgh_id));
7122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (mh->msgh_bits & MACH_MSGH_BITS_COMPLEX) {
7124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Validate typed message data and handle memory map changes.
7125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         complex_header_size = export_complex_message(tid, mh);
7126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme handle sender-specified message trailer
7129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // (but is this only for too-secure processes?)
7130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vg_assert(! (mh->msgh_bits & MACH_SEND_TRAILER));
7131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      MACH_REMOTE = mh->msgh_remote_port;
7133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      MACH_MSGH_ID = mh->msgh_id;
7134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (option & MACH_RCV_MSG) {
7137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Pre-validate receive buffer
7138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("mach_msg(receive buffer)", (Addr)mh, rcv_size);
7139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Call a PRE handler. The PRE handler may set an AFTER handler.
7142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!(option & MACH_SEND_MSG)) {
7144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // no message sent, receive only
7145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_msg_receive);
7146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else if (mh->msgh_request_port == vg_host_port) {
7149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // message sent to mach_host_self()
7150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_msg_host);
7151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else if (is_task_port(mh->msgh_request_port)) {
7154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // message sent to a task
7155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_msg_task);
7156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else if (mh->msgh_request_port == vg_bootstrap_port) {
7159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // message sent to bootstrap port
7160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_msg_bootstrap);
7161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else if (is_thread_port(mh->msgh_request_port)) {
7164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // message sent to one of this process's threads
7165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CALL_PRE(mach_msg_thread);
7166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else {
7169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // arbitrary message to arbitrary port
7170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRINT("UNHANDLED mach_msg [id %d, to %s, reply 0x%x]",
7171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            mh->msgh_id, name_for_port(mh->msgh_request_port),
7172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            mh->msgh_reply_port);
7173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      AFTER = POST_FN(mach_msg_unhandled);
7175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Assume the entire message body may be read.
7177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // GrP fixme generates false positives for unknown protocols
7178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /*
7179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_READ("mach_msg(payload)",
7180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   (Addr)((char*)mh + sizeof(mach_msg_header_t) + complex_header_size),
7181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   send_size - sizeof(mach_msg_header_t) - complex_header_size);
7182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      */
7183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_msg)
7188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_header_t *mh = (mach_msg_header_t *)ARG1;
7190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_msg_option_t option = (mach_msg_option_t)ARG2;
7191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (option & MACH_RCV_MSG) {
7193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (RES != 0) {
7194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // error during send or receive
7195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme need to clean up port rights?
7196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
7197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         mach_msg_trailer_t *mt =
7198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             (mach_msg_trailer_t *)((Addr)mh + round_msg(mh->msgh_size));
7199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Assume the entire received message and trailer is initialized
7201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // GrP fixme would being more specific catch any bugs?
7202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         POST_MEM_WRITE((Addr)mh,
7203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        round_msg(mh->msgh_size) + mt->msgh_trailer_size);
7204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (mh->msgh_bits & MACH_MSGH_BITS_COMPLEX) {
7206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             // Update memory map for out-of-line message data
7207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             import_complex_message(tid, mh);
7208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
7209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Call handler chosen by PRE(mach_msg)
7213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (AFTER) {
7214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*AFTER)(tid, arrghs, status);
7215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_msg_unhandled)
7220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(sync_mappings)("after", "mach_msg_receive (unhandled)", 0);
7222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
7226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   other Mach traps
7227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
7228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_reply_port)
7230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_reply_port()");
7232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_reply_port)
7235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   record_named_port(tid, RES, MACH_PORT_RIGHT_RECEIVE, "reply-%p");
7237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("reply port %s", name_for_port(RES));
7238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_thread_self)
7242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_thread_self()");
7244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_thread_self)
7247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   record_named_port(tid, RES, MACH_PORT_RIGHT_SEND, "thread-%p");
7249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("thread %#lx", RES);
7250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_host_self)
7254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_host_self()");
7256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_host_self)
7259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_host_port = RES;
7261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   record_named_port(tid, RES, MACH_PORT_RIGHT_SEND, "mach_host_self()");
7262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("host %#lx", RES);
7263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_task_self)
7267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_task_self()");
7269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_task_self)
7272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_task_port = RES;
7274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   record_named_port(tid, RES, MACH_PORT_RIGHT_SEND, "mach_task_self()");
7275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("task %#lx", RES);
7276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(syscall_thread_switch)
7280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("syscall_thread_switch(%s, %ld, %ld)",
7282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      name_for_port(ARG1), ARG2, ARG3);
7283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "syscall_thread_switch",
7284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 mach_port_t,"thread", int,"option", natural_t,"timeout");
7285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
7287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semaphore_signal)
7291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("semaphore_signal(%s)", name_for_port(ARG1));
7293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "semaphore_signal", semaphore_t,"semaphore");
7294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semaphore_signal_all)
7298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("semaphore_signal_all(%s)", name_for_port(ARG1));
7300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "semaphore_signal_all", semaphore_t,"semaphore");
7301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semaphore_signal_thread)
7305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("semaphore_signal_thread(%s, %s)",
7307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(ARG1), name_for_port(ARG2));
7308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "semaphore_signal_thread",
7309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 semaphore_t,"semaphore", mach_port_t,"thread");
7310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semaphore_wait)
7314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("semaphore_wait(%s)", name_for_port(ARG1));
7316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "semaphore_signal", semaphore_t,"semaphore");
7317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
7319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semaphore_wait_signal)
7323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("semaphore_wait_signal(%s, %s)",
7325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(ARG1), name_for_port(ARG2));
7326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "semaphore_wait_signal",
7327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 semaphore_t,"wait_semaphore",
7328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 semaphore_t,"signal_semaphore");
7329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
7331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semaphore_timedwait)
7335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("semaphore_timedwait(%s, %g seconds)",
7337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(ARG1), ARG2+ARG3/1000000000.0);
7338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "semaphore_wait_signal",
7339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 semaphore_t,"semaphore",
7340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"wait_time_hi",
7341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"wait_time_lo");
7342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
7344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(semaphore_timedwait_signal)
7348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("semaphore_wait_signal(wait %s, signal %s, %g seconds)",
7350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(ARG1), name_for_port(ARG2), ARG3+ARG4/1000000000.0);
7351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ4(long, "semaphore_wait_signal",
7352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 semaphore_t,"wait_semaphore",
7353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 semaphore_t,"signal_semaphore",
7354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"wait_time_hi",
7355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"wait_time_lo");
7356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
7358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(__semwait_signal)
7362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* 10.5 args: int cond_sem, int mutex_sem,
7364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int timeout, int relative,
7365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 time_t tv_sec, time_t tv_nsec */
7366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("__semwait_signal(wait %s, signal %s, %ld, %ld, %lds:%ldns)",
7367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(ARG1), name_for_port(ARG2), ARG3, ARG4, ARG5, ARG6);
7368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ6(long, "__semwait_signal",
7369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"cond_sem", int,"mutex_sem",
7370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"timeout", int,"relative",
7371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_time_t,"tv_sec", int,"tv_nsec");
7372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
7374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// GrP provided this alternative version for 10.6, but NjN
7376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// reckons the 10.5 is is still correct for 10.6.  So, retaining
7377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Greg's version as a comment just in case we need it later.
7378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//PRE(__semwait_signal)
7379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//{
7380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   /* 10.5 args: int cond_sem, int mutex_sem,
7381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//                 int timeout, int relative,
7382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//                 const timespec *ts */
7383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PRINT("__semwait_signal(wait %s, signal %s, %ld, %ld, %#lx)",
7384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//         name_for_port(ARG1), name_for_port(ARG2), ARG3, ARG4, ARG5);
7385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   PRE_REG_READ5(int, "__semwait_signal",
7386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//                 int,cond_sem, int,mutex_sem,
7387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//                 int,timeout, int,relative,
7388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//                 const struct vki_timespec *,ts);
7389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
7390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   if (ARG5) PRE_MEM_READ ("__semwait_signal(ts)",
7391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//                           ARG5, sizeof(struct vki_timespec));
7392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
7393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   *flags |= SfMayBlock;
7394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//}
7395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(__thread_selfid)
7398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("__thread_selfid ()");
7400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(vki_uint64_t, "__thread_selfid");
7401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(task_for_pid)
7404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("task_for_pid(%s, %ld, %#lx)", name_for_port(ARG1), ARG2, ARG3);
7406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "task_for_pid",
7407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 mach_port_t,"target",
7408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 vki_pid_t, "pid", mach_port_t *,"task");
7409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("task_for_pid(task)", ARG3, sizeof(mach_port_t));
7410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(task_for_pid)
7413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mach_port_t task;
7415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG3, sizeof(mach_port_t));
7417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   task = *(mach_port_t *)ARG3;
7419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   record_named_port(tid, task, MACH_PORT_RIGHT_SEND, "task-%p");
7420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("task 0x%x", task);
7421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(pid_for_task)
7425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("pid_for_task(%s, %#lx)", name_for_port(ARG1), ARG2);
7427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "task_for_pid", mach_port_t,"task", vki_pid_t *,"pid");
7428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("task_for_pid(pid)", ARG2, sizeof(vki_pid_t));
7429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(pid_for_task)
7432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vki_pid_t pid;
7434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG2, sizeof(vki_pid_t));
7436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   pid = *(vki_pid_t *)ARG2;
7438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("pid %u", pid);
7439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_timebase_info)
7443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_timebase_info(%#lx)", ARG1);
7445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "mach_timebase_info", void *,"info");
7446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_MEM_WRITE("mach_timebase_info(info)", ARG1, sizeof(struct vki_mach_timebase_info));
7447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mach_timebase_info)
7450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   POST_MEM_WRITE(ARG1, sizeof(struct vki_mach_timebase_info));
7452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mach_wait_until)
7456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 8
7458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_wait_until(%lu)", ARG1);
7459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "mach_wait_until",
7460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long long,"deadline");
7461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
7462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mach_wait_until(%llu)", LOHI64(ARG1, ARG2));
7463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "mach_wait_until",
7464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"deadline_hi", int,"deadline_lo");
7465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
7467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mk_timer_create)
7471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mk_timer_create()");
7473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "mk_timer_create");
7474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mk_timer_create)
7477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   record_named_port(tid, RES, MACH_PORT_RIGHT_SEND, "mk_timer-%p");
7479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mk_timer_destroy)
7483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mk_timer_destroy(%s)", name_for_port(ARG1));
7485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "mk_timer_destroy", mach_port_t,"name");
7486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Must block to prevent race (other thread allocates and
7488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // notifies after we deallocate but before we notify)
7489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags &= ~SfMayBlock;
7490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mk_timer_destroy)
7493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Must have cleared SfMayBlock in PRE to prevent race
7495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   record_port_destroy(ARG1);
7496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mk_timer_arm)
7500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 8
7502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mk_timer_arm(%s, %lu)", name_for_port(ARG1), ARG2);
7503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "mk_timer_arm", mach_port_t,"name",
7504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 unsigned long,"expire_time");
7505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
7506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mk_timer_arm(%s, %llu)", name_for_port(ARG1), LOHI64(ARG2, ARG3));
7507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ3(long, "mk_timer_arm", mach_port_t,"name",
7508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 int,"expire_time_hi", int,"expire_time_lo");
7509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(mk_timer_cancel)
7514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("mk_timer_cancel(%s, %#lx)", name_for_port(ARG1), ARG2);
7516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ2(long, "mk_timer_cancel",
7517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 mach_port_t,"name", Addr,"result_time");
7518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2) {
7519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PRE_MEM_WRITE("mk_timer_cancel(result_time)", ARG2,sizeof(vki_uint64_t));
7520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(mk_timer_cancel)
7524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2) {
7526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      POST_MEM_WRITE(ARG2, sizeof(vki_uint64_t));
7527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(iokit_user_client_trap)
7532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("iokit_user_client_trap(%s, %ld, %lx, %lx, %lx, %lx, %lx, %lx)",
7534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         name_for_port(ARG1), ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8);
7535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ8(kern_return_t, "iokit_user_client_trap",
7536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 mach_port_t,connect, unsigned int,index,
7537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 uintptr_t,p1, uintptr_t,p2, uintptr_t,p3,
7538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 uintptr_t,p4, uintptr_t,p5, uintptr_t,p6);
7539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // can't do anything else with this in general
7541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // might be able to use connect+index to choose something sometimes
7542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPOST(iokit_user_client_trap)
7545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ML_(sync_mappings)("after", "iokit_user_client_trap", ARG2);
7547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(swtch)
7551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("swtch ( )");
7553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ0(long, "swtch");
7554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
7556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(swtch_pri)
7560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("swtch_pri ( %ld )", ARG1);
7562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(long, "swtch_pri", int,"pri");
7563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfMayBlock;
7565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(FAKE_SIGRETURN)
7569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
7571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      an explanation of what follows. */
7572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* This handles the fake signal-return system call created by
7573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      sigframe-x86-darwin.c. */
7574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* See also comments just below on PRE(sigreturn). */
7575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("FAKE_SIGRETURN ( )");
7577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
7579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
7580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
7581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Remove the signal frame from this thread's (guest) stack,
7583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      in the process restoring the pre-signal guest state. */
7584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(sigframe_destroy)(tid, True);
7585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Tell the driver not to update the guest state with the "result",
7587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      and set a bogus result to keep it happy. */
7588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfNoWriteResult;
7589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Success(0);
7590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Check to see if any signals arose as a result of this. */
7592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *flags |= SfPollAfter;
7593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(sigreturn)
7597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* This is the "real" sigreturn.  But because we construct all the
7599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      signal frames ourselves (of course, in m_sigframe), this cannot
7600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      happen as a result of normal signal delivery.  I think it
7601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      happens only when doing siglongjmp, in which case Darwin's Libc
7602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      appears to use it for two different purposes: to mess with the
7603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      per-thread sigaltstack flags (as per arg 2), or to restore the
7604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      thread's state from a ucontext* (as per arg 1). */
7605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("sigreturn ( uctx=%#lx, infostyle=%#lx )", ARG1, ARG2);
7607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_valid_tid)(tid));
7609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(tid >= 1 && tid < VG_N_THREADS);
7610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vg_assert(VG_(is_running_thread)(tid));
7611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == VKI_UC_SET_ALT_STACK) {
7613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* This is confusing .. the darwin kernel sources imply there is
7614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         a per-thread on-altstack/not-on-altstack flag, which is set
7615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         by this flag.  Just ignore it and claim success for the time
7616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         being. */
7617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(debugLog)(0, "syswrap-darwin",
7618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       "WARNING: Ignoring sigreturn( ..., "
7619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       "UC_SET_ALT_STACK );\n");
7620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Success(0);
7621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (ARG2 == VKI_UC_RESET_ALT_STACK) {
7624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Ditto */
7625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(debugLog)(0, "syswrap-darwin",
7626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       "WARNING: Ignoring sigreturn( ..., "
7627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       "UC_RESET_ALT_STACK );\n");
7628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_Success(0);
7629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
7630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Otherwise claim this isn't supported.  (Could be
7633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      catastrophic).
7634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      What do we have to do if we do need to support it?
7636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      1. Change the second argument of VG_(sigframe_destroy) from
7638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "Bool isRT" to "UInt sysno", so we can pass the syscall
7639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         number, so it can distinguish this case from the
7640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __NR_DARWIN_FAKE_SIGRETURN case.
7641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      2. In VG_(sigframe_destroy), look at sysno to distinguish the
7643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         cases.  For __NR_DARWIN_FAKE_SIGRETURN, behave as at present.
7644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         For this case, restore the thread's CPU state (or at least
7645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         the integer regs) from the ucontext in ARG1 (and do all the
7646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         other "signal-returns" stuff too).
7647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      3. For (2), how do we know where the ucontext is?  One way is to
7649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         temporarily copy ARG1 into this thread's guest_EBX (or any
7650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         other int reg), and have VG_(sigframe_destroy) read
7651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         guest_EBX.  Why is it ok to trash guest_EBX (or any other int
7652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         reg)?  Because VG_(sigframe_destroy) is just about to
7653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         overwrite all the regs anyway -- since the primary purpose of
7654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         calling it is to restore the register state from the ucontext
7655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         pointed to by ARG1.
7656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Hey, it's uggerly.  But at least it's documented.
7658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
7659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* But in the meantime ... */
7660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(0, "syswrap-darwin",
7661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "WARNING: Ignoring sigreturn( uctx=..., 0 );\n");
7662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(0, "syswrap-darwin",
7663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "WARNING: Thread/program/Valgrind "
7664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "will likely segfault now.\n");
7665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(debugLog)(0, "syswrap-darwin",
7666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "WARNING: Please file a bug report at "
7667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    "http://www.valgrind.org.\n");
7668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SET_STATUS_Failure( VKI_ENOSYS );
7669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
7673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   machine-dependent traps
7674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
7675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGA_x86)
7677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic VexGuestX86SegDescr* alloc_zeroed_x86_LDT ( void )
7678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int nbytes = VEX_GUEST_X86_LDT_NENT * sizeof(VexGuestX86SegDescr);
7680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return VG_(arena_calloc)(VG_AR_CORE, "syswrap-darwin.ldt", nbytes, 1);
7681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPRE(thread_fast_set_cthread_self)
7685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRINT("thread_fast_set_cthread_self ( %#lx )", ARG1);
7687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PRE_REG_READ1(void, "thread_fast_set_cthread_self", struct pthread_t *, self);
7688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGA_x86)
7690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Point the USER_CTHREAD ldt entry (slot 6, reg 0x37) at this pthread
7691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
7692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexGuestX86SegDescr *ldt;
7693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ThreadState *tst = VG_(get_ThreadState)(tid);
7694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ldt = (VexGuestX86SegDescr *)tst->arch.vex.guest_LDT;
7695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!ldt) {
7696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ldt = alloc_zeroed_x86_LDT();
7697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         tst->arch.vex.guest_LDT = (HWord)ldt;
7698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_(memset)(&ldt[6], 0, sizeof(ldt[6]));
7700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ldt[6].LdtEnt.Bits.LimitLow = 1;
7701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ldt[6].LdtEnt.Bits.LimitHi = 0;
7702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ldt[6].LdtEnt.Bits.BaseLow = ARG1 & 0xffff;
7703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ldt[6].LdtEnt.Bits.BaseMid = (ARG1 >> 16) & 0xff;
7704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ldt[6].LdtEnt.Bits.BaseHi = (ARG1 >> 24) & 0xff;
7705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ldt[6].LdtEnt.Bits.Pres = 1; // ACC_P
7706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ldt[6].LdtEnt.Bits.Dpl = 3; // ACC_PL_U
7707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ldt[6].LdtEnt.Bits.Type = 0x12; // ACC_DATA_W
7708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ldt[6].LdtEnt.Bits.Granularity = 1;  // SZ_G
7709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ldt[6].LdtEnt.Bits.Default_Big = 1;  // SZ_32
7710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->os_state.pthread = ARG1;
7712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->arch.vex.guest_GS = 0x37;
7713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // What we would like to do is:
7715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //   SET_STATUS_Success(0x37);
7716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // but that doesn't work, because this is a MDEP-class syscall,
7717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // and SET_STATUS_Success creates a UNIX-class syscall result.
7718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Hence we have to laboriously construct the full SysRes "by hand"
7719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // and use that to set the syscall return status.
7720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
7721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(mk_SysRes_x86_darwin)(
7722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            VG_DARWIN_SYSNO_CLASS(__NR_thread_fast_set_cthread_self),
7723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            False, 0, 0x37
7724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         )
7725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );
7726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGA_amd64)
7729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme bigger hack than x86
7730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
7731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ThreadState *tst = VG_(get_ThreadState)(tid);
7732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->os_state.pthread = ARG1;
7733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tst->arch.vex.guest_GS_0x60 = ARG1;
7734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // SET_STATUS_Success(0x60);
7735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // see comments on x86 case just above
7736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_STATUS_from_SysRes(
7737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VG_(mk_SysRes_amd64_darwin)(
7738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            VG_DARWIN_SYSNO_CLASS(__NR_thread_fast_set_cthread_self),
7739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            False, 0, 0x60
7740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         )
7741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );
7742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
7745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#error unknown architecture
7746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ---------------------------------------------------------------------
7751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Added for OSX 10.7 (Lion)
7752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ------------------------------------------------------------------ */
7753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(getaudit_addr)
7755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("getaudit_addr(%#lx, %lu)", ARG1, ARG2);
7757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_REG_READ1(void*, "auditinfo_addr", int, "length");
7758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRE_MEM_WRITE("getaudit_addr(auditinfo_addr)", ARG1, ARG2);
7759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(getaudit_addr)
7761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   POST_MEM_WRITE(ARG1, ARG2);
7763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(psynch_mutexwait)
7766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("psynch_mutexwait(BOGUS)");
7768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfMayBlock;
7769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(psynch_mutexwait)
7771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(psynch_mutexdrop)
7775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("psynch_mutexdrop(BOGUS)");
7777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfMayBlock;
7778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(psynch_mutexdrop)
7780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(psynch_cvbroad)
7784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("psynch_cvbroad(BOGUS)");
7786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(psynch_cvbroad)
7788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(psynch_cvsignal)
7792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("psynch_cvsignal(BOGUS)");
7794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(psynch_cvsignal)
7796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(psynch_cvwait)
7800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("psynch_cvwait(BOGUS)");
7802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfMayBlock;
7803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(psynch_cvwait)
7805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(psynch_rw_rdlock)
7809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("psynch_rw_rdlock(BOGUS)");
7811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfMayBlock;
7812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(psynch_rw_rdlock)
7814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(psynch_rw_wrlock)
7818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("psynch_rw_wrlock(BOGUS)");
7820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfMayBlock;
7821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(psynch_rw_wrlock)
7823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(psynch_rw_unlock)
7827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("psynch_rw_unlock(BOGUS)");
7829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(psynch_rw_unlock)
7831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPRE(psynch_cvclrprepost)
7835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   PRINT("psynch_cvclrprepost(BOGUS)");
7837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *flags |= SfMayBlock;
7838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPOST(psynch_cvclrprepost)
7840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* ---------------------------------------------------------------------
7845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Added for OSX 10.8 (Mountain Lion)
7846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ------------------------------------------------------------------ */
7847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if DARWIN_VERS == DARWIN_10_8
7849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7850663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(mach__10)
7851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
7852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("mach__10(ARGUMENTS_UNKNOWN)");
7853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
7854663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPOST(mach__10)
7855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
7856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ML_(sync_mappings)("after", "mach__10", 0);
7857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
7858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7859663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(mach__12)
7860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
7861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("mach__12(ARGUMENTS_UNKNOWN)");
7862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
7863663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPOST(mach__12)
7864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
7865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ML_(sync_mappings)("after", "mach__12", 0);
7866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
7867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7868663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(mach__14)
7869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
7870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("mach__14(ARGUMENTS_UNKNOWN)");
7871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
7872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7873663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(mach__16)
7874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
7875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("mach__16(ARGUMENTS_UNKNOWN)");
7876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
7877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7878663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(mach__18)
7879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
7880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("mach__18(ARGUMENTS_UNKNOWN)");
7881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
7882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7883663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(mach__19)
7884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
7885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("mach__19(ARGUMENTS_UNKNOWN)");
7886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
7887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7888663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(mach__20)
7889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
7890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("mach__20(ARGUMENTS_UNKNOWN)");
7891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
7892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7893663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPRE(mach__21)
7894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
7895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PRINT("mach__21(ARGUMENTS_UNKNOWN)");
7896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
7897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif /* DARWIN_VERS == DARWIN_10_8 */
7899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ---------------------------------------------------------------------
7902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   syscall tables
7903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ------------------------------------------------------------------ */
7904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Add a Darwin-specific, arch-independent wrapper to a syscall table. */
7906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MACX_(sysno, name)    WRAPPER_ENTRY_X_(darwin, VG_DARWIN_SYSNO_INDEX(sysno), name)
7907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MACXY(sysno, name)    WRAPPER_ENTRY_XY(darwin, VG_DARWIN_SYSNO_INDEX(sysno), name)
7908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define _____(sysno) GENX_(sysno, sys_ni_syscall)  /* UNIX style only */
7909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
7911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     _____ : unsupported by the kernel (sys_ni_syscall) (UNIX-style only)
7912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             unfortunately misused for Mach too, causing assertion failures
7913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // _____ : unimplemented in valgrind
7914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     GEN   : handlers are in syswrap-generic.c
7915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     MAC   : handlers are in this file
7916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        X_ : PRE handler only
7917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        XY : PRE and POST handlers
7918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
7919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownconst SyscallTableEntry ML_(syscall_table)[] = {
7920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_syscall),   // 0
7921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_exit,        exit),
7922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fork,        sys_fork),
7923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_read,        sys_read),
7924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_write,       sys_write),
7925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_open,        sys_open),
7926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_close,       sys_close),
7927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_wait4,       sys_wait4),
7928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(8)),     // old creat
7929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_link,        sys_link),
7930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_unlink,      sys_unlink),
7931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(11)),    // old execv
7932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chdir,       sys_chdir),
7933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchdir,      sys_fchdir),
7934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mknod,       sys_mknod),
7935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chmod,       sys_chmod),
7936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chown,       sys_chown),
7937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(17)),    // old break
7938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getfsstat,   getfsstat),
7939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(19)),    // old lseek
7940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpid,      sys_getpid),     // 20
7941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(21)),    // old mount
7942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(22)),    // old umount
7943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setuid,      sys_setuid),
7944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getuid,      sys_getuid),
7945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_geteuid,     sys_geteuid),
7946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_ptrace,      ptrace),
7947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_recvmsg,     recvmsg),
7948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sendmsg,     sendmsg),
7949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_recvfrom,    recvfrom),
7950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_accept,      accept),
7951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getpeername, getpeername),
7952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getsockname, getsockname),
7953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_access,      sys_access),
7954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_chflags,     chflags),
7955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_fchflags,    fchflags),
7956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_sync,        sys_sync),
7957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_kill,        sys_kill),
7958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(38)),    // old stat
7959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getppid,     sys_getppid),
7960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(40)),    // old lstat
7961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup,         sys_dup),
7962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_pipe,        pipe),
7963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getegid,     sys_getegid),
7964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_profil),
7965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(45)),    // old ktrace
7966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_sigaction,   sigaction),
7967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getgid,      sys_getgid),
7968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_sigprocmask, sigprocmask),
7969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getlogin,    getlogin),
7970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setlogin),
7971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_acct),
7972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_sigpending,  sigpending),
7973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_sigaltstack, sys_sigaltstack),
7974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_ioctl,       ioctl),
7975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_reboot),
7976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_revoke),
7977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_symlink,     sys_symlink),   // 57
7978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_readlink,    sys_readlink),
7979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_execve,      sys_execve),
7980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_umask,       sys_umask),     // 60
7981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_chroot,      sys_chroot),
7982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(62)),    // old fstat
7983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(63)),    // used internally, reserved
7984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(64)),    // old getpagesize
7985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_msync,       sys_msync),
7986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_vfork,       sys_fork),              // (We treat vfork as fork.)
7987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(67)),    // old vread
7988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(68)),    // old vwrite
7989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(69)),    // old sbrk
7990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(70)),    // old sstk
7991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(71)),    // old mmap
7992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(72)),    // old vadvise
7993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_munmap,      sys_munmap),
7994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_mprotect,    sys_mprotect),
7995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_madvise,     sys_madvise),
7996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(76)),    // old vhangup
7997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(77)),    // old vlimit
7998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_mincore,     sys_mincore),
7999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getgroups,   sys_getgroups),
8000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setgroups),   // 80
8001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpgrp,     sys_getpgrp),
8002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpgid,     sys_setpgid),
8003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_setitimer,   sys_setitimer),
8004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(84)),    // old wait
8005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_swapon),
8006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getitimer,   sys_getitimer),
8007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(87)),    // old gethostname
8008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(88)),    // old sethostname
8009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getdtablesize, getdtablesize),
8010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_dup2,        sys_dup2),
8011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(91)),    // old getdopt
8012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_fcntl,       fcntl),
8013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_select,      sys_select),
8014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(94)),    // old setdopt
8015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fsync,       sys_fsync),
8016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setpriority, sys_setpriority),
8017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_socket,      socket),
8018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_connect,     connect),
8019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(99)),    // old accept
8020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_getpriority, sys_getpriority),   // 100
8021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(101)),   // old send
8022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(102)),   // old recv
8023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(103)),   // old sigreturn
8024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_bind,        bind),
8025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_setsockopt,  setsockopt),
8026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_listen,      listen),
8027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(107)),   // old vtimes
8028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(108)),   // old sigvec
8029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(109)),   // old sigblock
8030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(110)),   // old sigsetmask
8031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sigsuspend,  sigsuspend),            // old sigsuspend
8032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(112)),   // old sigstack
8033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(113)),   // old recvmsg
8034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(114)),   // old sendmsg
8035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(115)),   // old vtrace
8036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_gettimeofday, sys_gettimeofday),
8037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getrusage,   sys_getrusage),
8038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getsockopt,  getsockopt),
8039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(119)),   // old resuba
8040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_readv,       sys_readv),        // 120
8041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_writev,      sys_writev),
8042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_settimeofday),
8043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchown,      sys_fchown),
8044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fchmod,      sys_fchmod),
8045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(125)),   // old recvfrom
8046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setreuid),
8047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setregid),
8048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rename,      sys_rename),
8049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(129)),   // old truncate
8050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(130)),   // old ftruncate
8051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_flock,       sys_flock),
8052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_mkfifo),
8053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sendto,      sendto),
8054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_shutdown,    shutdown),
8055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_socketpair,  socketpair),
8056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mkdir,       sys_mkdir),
8057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_rmdir,       sys_rmdir),
8058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_utimes,      sys_utimes),
8059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_futimes,     futimes),
8060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_adjtime),     // 140
8061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(141)),   // old getpeername
8062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_gethostuuid, gethostuuid),
8063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(143)),   // old sethostid
8064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(144)),   // old getrlimit
8065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(145)),   // old setrlimit
8066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(146)),   // old killpg
8067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setsid,      sys_setsid),
8068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(148)),   // old setquota
8069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(149)),   // old qquota
8070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(150)),   // old getsockname
8071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_getpgid),
8072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setprivexec),
8073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_pread,       sys_pread64),
8074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pwrite,      sys_pwrite64),
8075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_nfssvc),
8076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(156)),   // old getdirentries
8077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_statfs,      sys_statfs),
8078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstatfs,     sys_fstatfs),
8079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_unmount),
8080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(160)),   // old async_daemon
8081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_getfh),
8082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(162)),   // old getdomainname
8083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(163)),   // old setdomainname
8084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(164)),   // ???
8085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_quotactl),
8086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(166)),   // old exportfs
8087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_mount,       mount),
8088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(168)),   // old ustat
8089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_csops,       csops),                 // code-signing ops
8090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(170)),   // old table
8091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(171)),   // old wait3
8092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(172)),   // old rpause
8093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_waitid),
8094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(174)),   // old getdents
8095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(175)),   // old gc_control
8096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_add_profil),
8097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(177)),   // ???
8098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(178)),   // ???
8099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(179)),   // ???
8100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_kdebug_trace, kdebug_trace),     // 180
8101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setgid,      sys_setgid),
8102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_setegid,     setegid),
8103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_seteuid,     seteuid),
8104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sigreturn,   sigreturn),
8105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_chud),
8106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(186)),   // ???
8107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
8108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_fdatasync),
8109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
8110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(187)),   // ???
8111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_stat,        sys_newstat),
8113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_fstat,       sys_newfstat),
8114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_lstat,       sys_newlstat),
8115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_pathconf,    pathconf),
8116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_fpathconf,   fpathconf),
8117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(193)),   // ???
8118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_getrlimit,   sys_getrlimit),
8119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_setrlimit,   sys_setrlimit),
8120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getdirentries, getdirentries),
8121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_mmap,        mmap),
8122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(198)),   // __syscall
8123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_lseek,       lseek),
8124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_truncate,    sys_truncate64),   // 200
8125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_ftruncate,   sys_ftruncate64),
8126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR___sysctl,    __sysctl),
8127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_mlock,       sys_mlock),
8128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_munlock,     sys_munlock),
8129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_undelete),
8130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ATsocket),
8131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ATgetmsg),
8132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ATputmsg),
8133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ATPsndreq),
8134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ATPsndrsp),
8135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ATPgetreq),
8136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ATPgetrsp),
8137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(213)),   // Reserved for AppleTalk
8138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
8139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(214)),   // old kqueue_from_portset_np
8140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(215)),   // old kqueue_portset_np
8141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
8142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_kqueue_from_portset_np),
8143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_kqueue_portset_np),
8144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_mkcomplex),
8146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_statv),
8147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_lstatv),
8148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_fstatv),
8149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getattrlist, getattrlist),   // 220
8150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_setattrlist, setattrlist),
8151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getdirentriesattr, getdirentriesattr),
8152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_exchangedata,      exchangedata),
8153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(224)),   // checkuseraccess
8154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_searchfs),
8155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_delete,      sys_unlink),
8156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_copyfile),
8157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
8158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_fgetattrlist),
8159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_fsetattrlist),
8160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
8161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(228)),   // ??
8162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(229)),   // ??
8163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_poll,        sys_poll),
8165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_watchevent,  watchevent),
8166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_waitevent,   waitevent),
8167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_modwatch,    modwatch),
8168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getxattr,    getxattr),
8169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_fgetxattr,   fgetxattr),
8170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_setxattr,    setxattr),
8171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_fsetxattr,   fsetxattr),
8172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_removexattr, removexattr),
8173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_fremovexattr, fremovexattr),
8174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_listxattr,   listxattr),    // 240
8175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_flistxattr,  flistxattr),
8176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_fsctl,       fsctl),
8177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_initgroups,  initgroups),
8178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_posix_spawn, posix_spawn),
8179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
8180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_ffsctl),
8181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
8182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(245)),   // ???
8183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(246)),   // ???
8185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_nfsclnt),
8186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_fhopen),
8187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(249)),   // ???
8188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_minherit),
8189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_semsys),
8190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_msgsys),
8191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_shmsys),
8192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_semctl,      semctl),
8193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_semget,      semget),
8194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_semop,       semop),
8195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(257)),   // ???
8196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_msgctl),
8197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_msgget),
8198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_msgsnd),   // 260
8199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_msgrcv),
8200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_shmat,       shmat),
8201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_shmctl,      shmctl),
8202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_shmdt,       shmdt),
8203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_shmget,      shmget),
8204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_shm_open,    shm_open),
8205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   MACXY(__NR_shm_unlink,  shm_unlink),
8206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sem_open,    sem_open),
8207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sem_close,   sem_close),
8208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sem_unlink,  sem_unlink),
8209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sem_wait,    sem_wait),
8210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sem_trywait, sem_trywait),
8211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sem_post,    sem_post),
8212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_sem_getvalue),
8213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_sem_init,    sem_init),
8214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sem_destroy, sem_destroy),
8215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_open_extended,  open_extended),    // 277
8216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_umask_extended),
8217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_stat_extended,  stat_extended),
8218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_lstat_extended, lstat_extended),   // 280
8219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_fstat_extended, fstat_extended),
8220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_chmod_extended, chmod_extended),
8221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_fchmod_extended,fchmod_extended),
8222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_access_extended,access_extended),
8223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_settid,         settid),
8224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_gettid),
8225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setsgroups),
8226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_getsgroups),
8227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setwgroups),
8228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_getwgroups),
8229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_mkfifo_extended),
8230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_mkdir_extended),
8231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_identitysvc),
8232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_shared_region_check_np),
8233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_shared_region_map_np),
8234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
8235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_vm_pressure_monitor),
8236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
8237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(296)),   // old load_shared_file
8238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(297)),   // old reset_shared_file
8240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(298)),   // old new_system_shared_regions
8241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(299)),   // old shared_region_map_file_np
8242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(300)),   // old shared_region_make_private_np
8243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MACXY(__NR_psynch_mutexwait, psynch_mutexwait), // 301
8244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MACXY(__NR_psynch_mutexdrop, psynch_mutexdrop), // 302
8245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MACXY(__NR_psynch_cvbroad,   psynch_cvbroad),   // 303
8246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MACXY(__NR_psynch_cvsignal,  psynch_cvsignal),  // 304
8247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MACXY(__NR_psynch_cvwait,    psynch_cvwait),    // 305
8248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MACXY(__NR_psynch_rw_rdlock, psynch_rw_rdlock), // 306
8249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MACXY(__NR_psynch_rw_wrlock, psynch_rw_wrlock), // 307
8250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MACXY(__NR_psynch_rw_unlock, psynch_rw_unlock), // 308
8251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(309)),   // ???
8252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_getsid),
8253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_settid_with_pid),
8254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MACXY(__NR_psynch_cvclrprepost, psynch_cvclrprepost), // 312
8255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_aio_fsync),
8256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_aio_return,     aio_return),
8257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_aio_suspend,    aio_suspend),
8258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_aio_cancel),
8259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_aio_error,      aio_error),
8260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_aio_read,       aio_read),
8261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_aio_write,      aio_write),
8262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_lio_listio),   // 320
8263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(321)),   // ???
8264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_iopolicysys),
8265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(323)),   // ???
8266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_mlockall),
8267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_munlockall),
8268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(326)),   // ???
8269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_issetugid,               issetugid),
8270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR___pthread_kill,          __pthread_kill),
8271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR___pthread_sigmask,       __pthread_sigmask),
8272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___sigwait),
8273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR___disable_threadsignal,  __disable_threadsignal),
8274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR___pthread_markcancel,    __pthread_markcancel),
8275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR___pthread_canceled,      __pthread_canceled),
8276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR___semwait_signal,        __semwait_signal),
8277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(335)),   // old utrace
8278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
8279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_proc_info,               proc_info),  // 336
8280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_sendfile,    sendfile),
8282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_stat64,      stat64),
8283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_fstat64,     fstat64),
8284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_lstat64,     lstat64),    // 340
8285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_stat64_extended,  stat64_extended),
8286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_lstat64_extended, lstat64_extended),
8287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_fstat64_extended, fstat64_extended),
8288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getdirentries64, getdirentries64),
8289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_statfs64,    statfs64),
8290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_fstatfs64,   fstatfs64),
8291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_getfsstat64, getfsstat64),
8292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___pthread_chdir),
8293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___pthread_fchdir),
8294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_audit),
8295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_auditon,     auditon),
8296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(352)),   // ???
8297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_getauid),
8298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setauid),
8299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_getaudit),
8300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setaudit),
8301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if DARWIN_VERS >= DARWIN_10_7
8302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MACXY(__NR_getaudit_addr, getaudit_addr),
8303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
8304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setaudit_addr),
8305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_auditctl),
8306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_bsdthread_create,     bsdthread_create),   // 360
8307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_bsdthread_terminate,  bsdthread_terminate),
8308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_kqueue,      kqueue),
8309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_kevent,      kevent),
8310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_lchown,      sys_lchown),
8311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_stack_snapshot),
8312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_bsdthread_register, bsdthread_register),
8313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_workq_open,  workq_open),
8314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_workq_ops,   workq_ops),
8315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
8316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_kevent64),
8317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
8318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(369)),   // ???
8319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(370)),   // ???
8321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(371)),   // ???
8322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
8323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR___thread_selfid, __thread_selfid),
8324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
8325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(372)),   // ???
8326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(373)),   // ???
8328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(374)),   // ???
8329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(375)),   // ???
8330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(376)),   // ???
8331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(377)),   // ???
8332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(378)),   // ???
8333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(379)),   // ???
8334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_execve),   // 380
8335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR___mac_syscall, __mac_syscall),
8336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_get_file),
8337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_set_file),
8338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_get_link),
8339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_set_link),
8340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_get_proc),
8341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_set_proc),
8342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_get_fd),
8343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_set_fd),
8344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_get_pid),
8345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_get_lcid),
8346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_get_lctx),
8347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_set_lctx),
8348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_setlcid),
8349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_getlcid),
8350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GrP fixme need any special nocancel handling?
8351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_read_nocancel,     sys_read),
8352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_write_nocancel,    sys_write),
8353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_open_nocancel,     sys_open),
8354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_close_nocancel,    sys_close),
8355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_wait4_nocancel,    sys_wait4),   // 400
8356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_recvmsg_nocancel,  recvmsg),
8357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sendmsg_nocancel,  sendmsg),
8358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_recvfrom_nocancel, recvfrom),
8359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_accept_nocancel,   accept),
8360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_msync_nocancel,    sys_msync),
8361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_fcntl_nocancel,    fcntl),
8362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_select_nocancel,   sys_select),
8363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_fsync_nocancel,    sys_fsync),
8364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_connect_nocancel,  connect),
8365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_sigsuspend_nocancel),
8366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_readv_nocancel,    sys_readv),
8367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_writev_nocancel,   sys_writev),
8368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sendto_nocancel,   sendto),
8369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_pread_nocancel,    sys_pread64),
8370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENX_(__NR_pwrite_nocancel,   sys_pwrite64),
8371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_waitid_nocancel),
8372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GENXY(__NR_poll_nocancel,     sys_poll),
8373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_msgsnd_nocancel),
8374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_msgrcv_nocancel),
8375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_sem_wait_nocancel, sem_wait), // 420
8376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_aio_suspend_nocancel),
8377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___sigwait_nocancel),
8378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR___semwait_signal_nocancel, __semwait_signal),
8379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_mount),
8380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_get_mount),
8381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR___mac_getfsstat),
8382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if DARWIN_VERS >= DARWIN_10_6
8383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_fsgetpath, fsgetpath),
8384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_audit_session_self, audit_session_self),
8385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_audit_session_join),
8386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_MAXSYSCALL)
8389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_DARWIN_FAKE_SIGRETURN, FAKE_SIGRETURN)
8390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
8391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Mach traps use negative syscall numbers.
8394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Use ML_(mach_trap_table)[-mach_trap_number] .
8395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownconst SyscallTableEntry ML_(mach_trap_table)[] = {
8397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(0)),
8398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(1)),
8399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(2)),
8400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(3)),
8401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(4)),
8402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(5)),
8403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(6)),
8404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(7)),
8405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(8)),
8406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(9)),
8407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  if DARWIN_VERS == DARWIN_10_8
8409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   MACXY(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(10), mach__10),
8410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  else
8411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(10)),
8412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  endif
8413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(11)),
8415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  if DARWIN_VERS == DARWIN_10_8
8417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   MACXY(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(12), mach__12),
8418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  else
8419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(12)),
8420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  endif
8421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(13)),
8423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  if DARWIN_VERS == DARWIN_10_8
8425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(14), mach__14),
8426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  else
8427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(14)),
8428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  endif
8429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(15)),
8431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  if DARWIN_VERS == DARWIN_10_8
8433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(16), mach__16),
8434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  else
8435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(16)),
8436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  endif
8437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(17)),
8439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  if DARWIN_VERS == DARWIN_10_8
8441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(18), mach__18),
8442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(19), mach__19),
8443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(20), mach__20),
8444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(21), mach__21),
8445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  else
8446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(18)),
8447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(19)),
8448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(20)),
8449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(21)),
8450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#  endif
8451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(22)),
8453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(23)),
8454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(24)),
8455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(25)),
8456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_mach_reply_port, mach_reply_port),
8457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_thread_self_trap, mach_thread_self),
8458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_task_self_trap, mach_task_self),
8459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_host_self_trap, mach_host_self),
8460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(30)),
8461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_mach_msg_trap, mach_msg),
8462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_mach_msg_overwrite_trap),
8463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_semaphore_signal_trap, semaphore_signal),
8464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_semaphore_signal_all_trap, semaphore_signal_all),
8465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_semaphore_signal_thread_trap, semaphore_signal_thread),
8466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_semaphore_wait_trap, semaphore_wait),
8467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_semaphore_wait_signal_trap, semaphore_wait_signal),
8468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_semaphore_timedwait_trap, semaphore_timedwait),
8469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_semaphore_timedwait_signal_trap, semaphore_timedwait_signal),
8470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(40)),    // -40
8471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGA_x86)
8472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_init_process),
8473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(42)),
8474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_map_fd),
8475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
8476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(41)),
8477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(42)),
8478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(43)),
8479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_task_name_for_pid),
8481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_task_for_pid, task_for_pid),
8482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_pid_for_task, pid_for_task),
8483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(47)),
8484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGA_x86)
8485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_macx_swapon),
8486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_macx_swapoff),
8487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(50)),
8488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_macx_triggers),
8489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_macx_backing_store_suspend),
8490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_macx_backing_store_recovery),
8491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
8492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(48)),
8493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(49)),
8494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(50)),
8495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(51)),
8496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(52)),
8497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(53)),
8498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(54)),
8500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(55)),
8501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(56)),
8502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(57)),
8503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(58)),
8504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_swtch_pri, swtch_pri),
8505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_swtch, swtch),   // -60
8506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_syscall_thread_switch, syscall_thread_switch),
8507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// _____(__NR_clock_sleep_trap),
8508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(63)),
8509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(64)),
8510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(65)),
8511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(66)),
8512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(67)),
8513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(68)),
8514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(69)),
8515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(70)),
8516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(71)),
8517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(72)),
8518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(73)),
8519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(74)),
8520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(75)),
8521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(76)),
8522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(77)),
8523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(78)),
8524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(79)),
8525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(80)),   // -80
8526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(81)),
8527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(82)),
8528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(83)),
8529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(84)),
8530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(85)),
8531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(86)),
8532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(87)),
8533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(88)),
8534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_mach_timebase_info, mach_timebase_info),
8535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_mach_wait_until, mach_wait_until),
8536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_mk_timer_create, mk_timer_create),
8537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_mk_timer_destroy, mk_timer_destroy),
8538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_mk_timer_arm, mk_timer_arm),
8539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_mk_timer_cancel, mk_timer_cancel),
8540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(95)),
8541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(96)),
8542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(97)),
8543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(98)),
8544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(99)),
8545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACXY(__NR_iokit_user_client_trap, iokit_user_client_trap), // -100
8546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
8547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Machine-dependent traps have wacky syscall numbers, and use the Mach trap
8550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// calling convention instead of the syscall convention.
8551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Use ML_(mdep_trap_table)[syscallno - ML_(mdep_trap_base)] .
8552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGA_x86)
8554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownconst SyscallTableEntry ML_(mdep_trap_table)[] = {
8555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_thread_fast_set_cthread_self, thread_fast_set_cthread_self),
8556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
8557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGA_amd64)
8558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownconst SyscallTableEntry ML_(mdep_trap_table)[] = {
8559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MACX_(__NR_thread_fast_set_cthread_self, thread_fast_set_cthread_self),
8560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
8561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
8562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#error unknown architecture
8563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
8564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownconst UInt ML_(syscall_table_size) =
8566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            sizeof(ML_(syscall_table)) / sizeof(ML_(syscall_table)[0]);
8567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownconst UInt ML_(mach_trap_table_size) =
8569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            sizeof(ML_(mach_trap_table)) / sizeof(ML_(mach_trap_table)[0]);
8570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownconst UInt ML_(mdep_trap_table_size) =
8572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            sizeof(ML_(mdep_trap_table)) / sizeof(ML_(mdep_trap_table)[0]);
8573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGO_darwin)
8575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
8577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                                          ---*/
8578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
8579