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