Command line help - demangling isn't just for C++
[valgrind.git] / coregrind / m_syswrap / syswrap-freebsd.c
blobea0ca2bfe5f12435a54f3abdac40ecbe879f31ac
1 /*--------------------------------------------------------------------*/
2 /*--- FreeBSD-specific syscalls, etc. syswrap-freebsd.c ---*/
3 /*--------------------------------------------------------------------*/
5 /*
6 This file is part of Valgrind, a dynamic binary instrumentation
7 framework.
9 Copyright (C) 2000-2008 Nicholas Nethercote
10 njn@valgrind.org
11 Copyright (C) 2018-2021 Paul Floyd
12 pjfloyd@wanadoo.fr
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version.
19 This program is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, see <http://www.gnu.org/licenses/>.
27 The GNU General Public License is contained in the file COPYING.
30 #if defined(VGO_freebsd)
32 #include "pub_core_basics.h"
33 #include "pub_core_vki.h"
34 #include "pub_core_vkiscnums.h"
35 #include "pub_core_threadstate.h"
36 #include "pub_core_aspacemgr.h"
37 #include "pub_core_debuginfo.h" // VG_(di_notify_*)
38 #include "pub_core_transtab.h" // VG_(discard_translations)
39 #include "pub_core_xarray.h"
40 #include "pub_core_clientstate.h"
41 #include "pub_core_debuglog.h"
42 #include "pub_core_libcbase.h"
43 #include "pub_core_libcassert.h"
44 #include "pub_core_libcfile.h"
45 #include "pub_core_libcprint.h"
46 #include "pub_core_libcproc.h"
47 #include "pub_core_libcsignal.h"
48 #include "pub_core_machine.h"
49 #include "pub_core_mallocfree.h"
50 #include "pub_core_tooliface.h"
51 #include "pub_core_options.h"
52 #include "pub_core_scheduler.h"
53 #include "pub_core_signals.h"
54 #include "pub_core_stacks.h"
55 #include "pub_core_syscall.h"
56 #include "pub_core_syswrap.h"
57 #include "pub_core_inner.h"
58 #include "pub_core_pathscan.h"
59 #include "pub_core_oset.h"
60 #if defined(ENABLE_INNER_CLIENT_REQUEST)
61 #include "pub_core_clreq.h"
62 #endif
64 #include "priv_types_n_macros.h"
65 #include "priv_syswrap-generic.h"
66 #include "priv_syswrap-main.h"
67 #include "priv_syswrap-freebsd.h"
69 static Bool capabiltyMode = False;
71 Bool VG_(get_capability_mode)(void)
73 return capabiltyMode;
77 // Run a thread from beginning to end and return the thread's
78 // scheduler-return-code.
79 static VgSchedReturnCode thread_wrapper(Word /*ThreadId*/ tidW)
81 VgSchedReturnCode ret;
82 ThreadId tid = (ThreadId)tidW;
83 Int lwpid = VG_(gettid)();
84 ThreadState* tst = VG_(get_ThreadState)(tid);
86 VG_(debugLog)(1, "syswrap-freebsd",
87 "thread_wrapper(tid=%u,lwpid=%d): entry\n",
88 tid, lwpid);
90 vg_assert(tst->status == VgTs_Init);
92 /* make sure we get the CPU lock before doing anything significant */
93 VG_(acquire_BigLock)(tid, "thread_wrapper(starting new thread)");
95 if (0) {
96 VG_(printf)("thread tid %u started: stack = %p\n",
97 tid, (void*)&tid);
100 /* Make sure error reporting is enabled in the new thread. */
101 tst->err_disablement_level = 0;
103 VG_TRACK(pre_thread_first_insn, tid);
105 tst->os_state.lwpid = lwpid;
106 /* Set the threadgroup for real. This overwrites the provisional value set
107 in do_clone(). See comments in do_clone for background, also #226116. */
108 tst->os_state.threadgroup = VG_(getpid)();
110 /* Thread created with all signals blocked; scheduler will set the
111 appropriate mask */
113 ret = VG_(scheduler)(tid);
115 vg_assert(VG_(is_exiting)(tid));
117 vg_assert(tst->status == VgTs_Runnable);
118 vg_assert(VG_(is_running_thread)(tid));
120 VG_(debugLog)(1, "syswrap-freebsd",
121 "thread_wrapper(tid=%u,lwpid=%d): exit, schedreturncode %s\n",
122 tid, lwpid, VG_(name_of_VgSchedReturnCode)(ret));
124 /* Return to caller, still holding the lock. */
125 return ret;
129 /* ---------------------------------------------------------------------
130 clone-related stuff
131 ------------------------------------------------------------------ */
133 /* Run a thread all the way to the end, then do appropriate exit actions
134 * (this is the last-one-out-turn-off-the-lights bit).
136 * This is marked as __attribute__((noreturn)). That has the effect of
137 * making clang++ no longer emit the function prologue and epilogue
138 * to save the base pointer.
140 * As far as I can tell clang -O2 does not include -fomit-frame-pointer
141 * However, since from here on the saved base pointer values are
142 * junk tools like FreeBSD pstack that only rely on base pointer
143 * walking will not work. FreeBSD bstack does work, based on GDB and
144 * reading debuginfo.
146 * If you really need a working base pointer modify Makefile.all.am
147 * and add -fno-omit-frame-pointer to AM_CFLAGS_BASE.
149 __attribute__((noreturn))
150 static void run_a_thread_NORETURN ( Word tidW )
152 ThreadId tid = (ThreadId)tidW;
153 VgSchedReturnCode src;
154 Int c;
155 ThreadState* tst;
156 #ifdef ENABLE_INNER_CLIENT_REQUEST
157 Int registered_vgstack_id;
158 #endif
160 VG_(debugLog)(1, "syswrap-freebsd",
161 "run_a_thread_NORETURN(tid=%u): pre-thread_wrapper\n",
162 tid);
164 tst = VG_(get_ThreadState)(tid);
165 vg_assert(tst);
167 /* An thread has two stacks:
168 * the simulated stack (used by the synthetic cpu. Guest process
169 is using this stack).
170 * the valgrind stack (used by the real cpu. Valgrind code is running
171 on this stack).
172 When Valgrind runs as an inner, it must signals that its (real) stack
173 is the stack to use by the outer to e.g. do stacktraces.
175 INNER_REQUEST
176 (registered_vgstack_id
177 = VALGRIND_STACK_REGISTER (tst->os_state.valgrind_stack_base,
178 tst->os_state.valgrind_stack_init_SP));
180 /* Run the thread all the way through. */
181 src = thread_wrapper(tid);
183 VG_(debugLog)(1, "syswrap-freebsd",
184 "run_a_thread_NORETURN(tid=%u): post-thread_wrapper\n",
185 tid);
187 c = VG_(count_living_threads)();
188 vg_assert(c >= 1); /* stay sane */
190 /* Deregister thread's stack. */
191 if (tst->os_state.stk_id != NULL_STK_ID) {
192 VG_(deregister_stack)(tst->os_state.stk_id);
195 // Tell the tool this thread is exiting
196 VG_TRACK( pre_thread_ll_exit, tid );
198 /* If the thread is exiting with errors disabled, complain loudly;
199 doing so is bad (does the user know this has happened?) Also,
200 in all cases, be paranoid and clear the flag anyway so that the
201 thread slot is safe in this respect if later reallocated. This
202 should be unnecessary since the flag should be cleared when the
203 slot is reallocated, in thread_wrapper(). */
204 if (tst->err_disablement_level > 0) {
205 VG_(umsg)(
206 "WARNING: exiting thread has error reporting disabled.\n"
207 "WARNING: possibly as a result of some mistake in the use\n"
208 "WARNING: of the VALGRIND_DISABLE_ERROR_REPORTING macros.\n"
210 VG_(debugLog)(
211 1, "syswrap-freebsd",
212 "run_a_thread_NORETURN(tid=%u): "
213 "WARNING: exiting thread has err_disablement_level = %u\n",
214 tid, tst->err_disablement_level
217 tst->err_disablement_level = 0;
219 if (c == 1) {
221 VG_(debugLog)(1, "syswrap-freebsd",
222 "run_a_thread_NORETURN(tid=%u): "
223 "last one standing\n",
224 tid);
226 /* We are the last one standing. Keep hold of the lock and
227 carry on to show final tool results, then exit the entire system.
228 Use the continuation pointer set at startup in m_main. */
229 ( * VG_(address_of_m_main_shutdown_actions_NORETURN) ) (tid, src);
230 } else {
232 VG_(debugLog)(1, "syswrap-freebsd",
233 "run_a_thread_NORETURN(tid=%u): "
234 "not last one standing\n",
235 tid);
237 /* OK, thread is dead, but others still exist. Just exit. */
239 /* This releases the run lock */
240 VG_(exit_thread)(tid);
241 vg_assert(tst->status == VgTs_Zombie);
242 vg_assert(sizeof(tst->status) == 4);
243 vg_assert(sizeof(tst->os_state.exitcode) == sizeof(Word));
245 INNER_REQUEST (VALGRIND_STACK_DEREGISTER (registered_vgstack_id));
247 /* We have to use this sequence to terminate the thread to
248 prevent a subtle race. If VG_(exit_thread)() had left the
249 ThreadState as Empty, then it could have been reallocated,
250 reusing the stack while we're doing these last cleanups.
251 Instead, VG_(exit_thread) leaves it as Zombie to prevent
252 reallocation. We need to make sure we don't touch the stack
253 between marking it Empty and exiting. Hence the
254 assembler. */
255 #if defined(VGP_x86_freebsd) /* FreeBSD has args on the stack */
256 __asm__ volatile (
257 "movl %1, %0\n" /* set tst->status = VgTs_Empty */
258 "movl %2, %%eax\n" /* set %eax = __NR_thr_exit */
259 "movl %3, %%ebx\n" /* set %ebx = tst->os_state.exitcode */
260 "pushl %%ebx\n" /* arg on stack */
261 "pushl %%ebx\n" /* fake return address */
262 "int $0x80\n" /* thr_exit(tst->os_state.exitcode) */
263 "popl %%ebx\n" /* fake return address */
264 "popl %%ebx\n" /* arg off stack */
265 : "=m" (tst->status)
266 : "n" (VgTs_Empty), "n" (__NR_thr_exit), "m" (tst->os_state.exitcode)
267 : "eax", "ebx"
269 #elif defined(VGP_amd64_freebsd)
270 __asm__ volatile (
271 "movl %1, %0\n" /* set tst->status = VgTs_Empty */
272 "movq %2, %%rax\n" /* set %rax = __NR_thr_exit */
273 "movq %3, %%rdi\n" /* set %rdi = tst->os_state.exitcode */
274 "pushq %%rdi\n" /* fake return address */
275 "syscall\n" /* thr_exit(tst->os_state.exitcode) */
276 "popq %%rdi\n" /* fake return address */
277 : "=m" (tst->status)
278 : "n" (VgTs_Empty), "n" (__NR_thr_exit), "m" (tst->os_state.exitcode)
279 : "rax", "rdi"
281 #elif defined(VGP_arm64_freebsd)
282 __asm__ volatile (
283 "str %w1, %0\n" /* set tst->status = VgTs_Empty (32-bit store) */
284 "mov x8, %2\n" /* set %x8 = __NR_thr_exit */
285 "ldr x0, %3\n" /* set %x0 = tst->os_state.exitcode */
286 "svc 0x00000000\n" /* exit(tst->os_state.exitcode) */
287 : "=m" (tst->status)
288 : "r" (VgTs_Empty), "n" (__NR_thr_exit), "m" (tst->os_state.exitcode)
289 : "x0", "x8"
291 #else
292 # error Unknown platform
293 #endif
295 VG_(core_panic)("Thread exit failed?\n");
298 /*NOTREACHED*/
299 vg_assert(0);
302 Word ML_(start_thread_NORETURN) ( void* arg )
304 ThreadState* tst = (ThreadState*)arg;
305 ThreadId tid = tst->tid;
307 run_a_thread_NORETURN ( (Word)tid );
308 /*NOTREACHED*/
309 vg_assert(0);
312 /* Allocate a stack for this thread, if it doesn't already have one.
313 They're allocated lazily, and never freed. Returns the initial stack
314 pointer value to use, or 0 if allocation failed. */
315 Addr ML_(allocstack)(ThreadId tid)
317 ThreadState* tst = VG_(get_ThreadState)(tid);
318 VgStack* stack;
319 Addr initial_SP;
321 /* Either the stack_base and stack_init_SP are both zero (in which
322 case a stack hasn't been allocated) or they are both non-zero,
323 in which case it has. */
325 if (tst->os_state.valgrind_stack_base == 0) {
326 vg_assert(tst->os_state.valgrind_stack_init_SP == 0);
329 if (tst->os_state.valgrind_stack_base != 0) {
330 vg_assert(tst->os_state.valgrind_stack_init_SP != 0);
333 /* If no stack is present, allocate one. */
335 if (tst->os_state.valgrind_stack_base == 0) {
336 stack = VG_(am_alloc_VgStack)( &initial_SP );
337 if (stack) {
338 tst->os_state.valgrind_stack_base = (Addr)stack;
339 tst->os_state.valgrind_stack_init_SP = initial_SP;
343 if (0) {
344 VG_(printf)( "stack for tid %u at %p; init_SP=%p\n",
345 tid,
346 (void*)tst->os_state.valgrind_stack_base,
347 (void*)tst->os_state.valgrind_stack_init_SP );
350 return tst->os_state.valgrind_stack_init_SP;
353 /* Allocate a stack for the main thread, and run it all the way to the
354 end. Although we already have a working VgStack
355 (VG_(interim_stack)) it's better to allocate a new one, so that
356 overflow detection works uniformly for all threads.
358 __attribute__((noreturn))
359 void VG_(main_thread_wrapper_NORETURN)(ThreadId tid)
361 Addr sp;
362 VG_(debugLog)(1, "syswrap-freebsd",
363 "entering VG_(main_thread_wrapper_NORETURN)\n");
365 sp = ML_(allocstack)(tid);
366 #if defined(ENABLE_INNER_CLIENT_REQUEST)
368 // we must register the main thread stack before the call
369 // to ML_(call_on_new_stack_0_1), otherwise the outer valgrind
370 // reports 'write error' on the non registered stack.
371 ThreadState* tst = VG_(get_ThreadState)(tid);
372 INNER_REQUEST
373 ((void)
374 VALGRIND_STACK_REGISTER (tst->os_state.valgrind_stack_base,
375 tst->os_state.valgrind_stack_init_SP));
377 #endif
379 /* If we can't even allocate the first thread's stack, we're hosed.
380 Give up. */
381 vg_assert2(sp != 0, "%s", "Cannot allocate main thread's stack.");
383 /* shouldn't be any other threads around yet */
384 vg_assert( VG_(count_living_threads)() == 1 );
386 ML_(call_on_new_stack_0_1)(
387 sp, /* stack */
388 0, /* bogus return address */
389 run_a_thread_NORETURN, /* fn to call */
390 (Word)tid /* arg to give it */
393 /*NOTREACHED*/
394 vg_assert(0);
398 /* Do a fork() */
399 SysRes ML_(do_fork) ( ThreadId tid )
401 vki_sigset_t fork_saved_mask;
402 vki_sigset_t mask;
403 SysRes res;
405 /* Block all signals during fork, so that we can fix things up in
406 the child without being interrupted. */
407 VG_(sigfillset)(&mask);
408 VG_(sigprocmask)(VKI_SIG_SETMASK, &mask, &fork_saved_mask);
410 VG_(do_atfork_pre)(tid);
412 res = VG_(do_syscall0)( __NR_fork );
414 if (!sr_isError(res)) {
415 if (sr_Res(res) == 0) {
416 /* child */
417 VG_(do_atfork_child)(tid);
419 /* restore signal mask */
420 VG_(sigprocmask)(VKI_SIG_SETMASK, &fork_saved_mask, NULL);
422 } else {
423 /* parent */
424 VG_(do_atfork_parent)(tid);
426 if (VG_(clo_trace_syscalls)) {
427 VG_(printf)(" clone(fork): process %d created child %lu\n",
428 VG_(getpid)(), sr_Res(res));
431 /* restore signal mask */
432 VG_(sigprocmask)(VKI_SIG_SETMASK, &fork_saved_mask, NULL);
436 return res;
439 static Addr ML_(make_safe_mask) ( const HChar* malloc_message, Addr mask_pointer )
441 vki_sigset_t* new_mask;
442 const vki_sigset_t* old_mask = (vki_sigset_t *)mask_pointer;
444 if (!ML_(safe_to_deref)(old_mask, sizeof(vki_sigset_t))) {
445 new_mask = (vki_sigset_t*)1; /* Something recognisable to POST() hook. */
446 } else {
447 new_mask = VG_(malloc)(malloc_message, sizeof(vki_sigset_t));
448 *new_mask = *old_mask;
449 VG_(sanitize_client_sigmask)(new_mask);
452 return (Addr)new_mask;
455 static void ML_(free_safe_mask) ( Addr mask_pointer )
457 if (mask_pointer != 0 && mask_pointer != 1) {
458 VG_(free)((vki_sigset_t *) mask_pointer);
463 /* ---------------------------------------------------------------------
464 PRE/POST wrappers for arch-generic, FreeBSD-specific syscalls
465 ------------------------------------------------------------------ */
467 // Nb: See the comment above the generic PRE/POST wrappers in
468 // m_syswrap/syswrap-generic.c for notes about how they work.
470 #define PRE(name) DEFN_PRE_TEMPLATE(freebsd, name)
471 #define POST(name) DEFN_POST_TEMPLATE(freebsd, name)
473 /* On FreeBSD, if any thread calls exit(2), then they are all shut down, pretty
474 * much like linux's exit_group().
476 // SYS_exit 1
477 // void exit(int status);
478 PRE(sys_exit)
480 ThreadId t;
482 PRINT("exit( %" FMT_REGWORD "u )", ARG1);
483 PRE_REG_READ1(void, "exit", int, status);
485 /* Mark all threads (including this one) to exit. */
486 for (t = 1; t < VG_N_THREADS; t++) {
487 if ( /* not alive */ VG_(threads)[t].status == VgTs_Empty ) {
488 continue;
491 //VG_(threads)[t].exitreason = VgSrc_ExitThread;
492 VG_(threads)[t].os_state.exitcode = ARG1;
494 // if (t != tid)
495 // VG_(get_thread_out_of_syscall)(t); /* unblock it, if blocked */
498 VG_(nuke_all_threads_except)( tid, VgSrc_ExitProcess );
499 VG_(reap_threads)(tid);
500 VG_(threads)[tid].exitreason = VgSrc_ExitThread;
502 /* We have to claim the syscall already succeeded. */
503 SET_STATUS_Success(0);
506 // SYS_fork 2
507 // pid_t fork(void);
508 PRE(sys_fork)
510 PRINT("%s", "sys_fork ()");
511 PRE_REG_READ0(pid_t, "fork");
513 SET_STATUS_from_SysRes( ML_(do_fork)(tid) );
514 if (SUCCESS) {
515 /* Thread creation was successful; let the child have the chance
516 to run */
517 *flags |= SfYieldAfter;
521 // SYS_read 3
522 // generic
524 // SYS_write 4
525 // generic
527 // SYS_open 5
528 // generic
530 // SYS_close 6
531 // generic
533 // SYS_wait4 7
534 // generic
536 // SYS_link 9
537 // generic
539 // SYS_unlink 10
540 // generic
542 // SYS_chdir 12
544 // SYS_fchdir 13
545 // generic
547 // SYS_freebsd11_mknod 14
548 // generic
550 // SYS_chmod 15
551 // generic
553 // SYS_chown 16
554 // generic
556 // SYS_break 17
557 // generic
559 // SYS_getpid 20
560 // generic
562 // SYS_mount 21
563 // int mount(const char *type, const char *dir, int flags, void *data);
564 PRE(sys_mount)
566 // Nb: depending on 'flags', the 'type' and 'data' args may be ignored.
567 // We are conservative and check everything, except the memory pointed to
568 // by 'data'.
569 *flags |= SfMayBlock;
570 PRINT( "sys_mount( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )",ARG1,ARG2,ARG3,ARG4);
571 PRE_REG_READ4(int, "mount",
572 const char *, type, char *, dir, int, flags,
573 void *, data);
574 PRE_MEM_RASCIIZ( "mount(type)", ARG1);
575 PRE_MEM_RASCIIZ( "mount(path)", ARG2);
578 // SYS_unmount 22
579 // int unmount(const char *dir, int flags);
580 PRE(sys_unmount)
582 PRINT("sys_umount( %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1, ARG2);
583 PRE_REG_READ2(int, "unmount", const char *, dir, int, flags);
584 PRE_MEM_RASCIIZ( "unmount(path)", ARG1);
587 // SYS_setuid 23
588 // generic
590 // SYS_getuid 24
591 // generic
593 // SYS_geteuid 25
594 // generic
596 // SYS_ptrace 26
597 // int ptrace(int request, pid_t pid, caddr_t addr, int data);
598 PRE(sys_ptrace)
600 struct vki_ptrace_io_desc *io_desc;
601 PRINT("sys_ptrace ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, 0x%" FMT_REGWORD "x, %" FMT_REGWORD "u)", ARG1, ARG2, ARG3, ARG4);
603 PRE_REG_READ4(int, "ptrace", int, request, pid_t, pid, caddr_t, addr, int, data);
605 switch (ARG1) {
606 case VKI_PTRACE_TRACEME:
607 case VKI_PTRACE_READ_I:
608 case VKI_PTRACE_READ_D:
609 case VKI_PTRACE_WRITE_I:
610 case VKI_PTRACE_WRITE_D:
611 break;
613 case VKI_PTRACE_IO:
614 PRE_MEM_READ("ptrace", ARG3, sizeof(struct vki_ptrace_io_desc));
615 io_desc = (struct vki_ptrace_io_desc *)ARG3;
616 switch (io_desc->piod_op) {
617 case VKI_PIOD_READ_D:
618 case VKI_PIOD_READ_I:
619 PRE_MEM_WRITE( "ptrace", (UWord)io_desc->piod_addr, io_desc->piod_len);
620 break;
621 case VKI_PIOD_WRITE_D:
622 case VKI_PIOD_WRITE_I:
623 PRE_MEM_READ( "ptrace", (UWord)io_desc->piod_addr, io_desc->piod_len);
624 break;
626 break;
628 case VKI_PTRACE_CONTINUE:
629 case VKI_PTRACE_STEP:
630 case VKI_PTRACE_KILL:
631 case VKI_PTRACE_ATTACH:
632 case VKI_PTRACE_DETACH:
633 break;
635 case VKI_PTRACE_GETREGS:
636 PRE_MEM_WRITE("ptrace", ARG3, sizeof(struct vki_user_regs_struct));
637 break;
639 case VKI_PTRACE_SETREGS:
640 PRE_MEM_READ("ptrace", ARG3, sizeof(struct vki_user_regs_struct));
641 break;
643 case VKI_PTRACE_GETFPREGS:
644 PRE_MEM_WRITE("ptrace", ARG3, sizeof(struct vki_fpreg));
645 break;
647 case VKI_PTRACE_SETFPREGS:
648 PRE_MEM_READ("ptrace", ARG3, sizeof(struct vki_fpreg));
649 break;
651 case VKI_PTRACE_GETDBREGS:
652 PRE_MEM_WRITE("ptrace", ARG3, sizeof(struct vki_dbreg));
653 break;
655 case VKI_PTRACE_SETDBREGS:
656 PRE_MEM_READ("ptrace", ARG3, sizeof(struct vki_dbreg));
657 break;
659 case VKI_PTRACE_LWPINFO:
660 PRE_MEM_WRITE("ptrace", ARG3, sizeof(struct vki_ptrace_lwpinfo));
661 break;
663 case VKI_PTRACE_GETNUMLWPS:
664 break;
666 case VKI_PTRACE_GETLWPLIST:
667 PRE_MEM_WRITE( "ptrace", ARG3, sizeof(vki_lwpid_t) * ARG4);
668 break;
670 case VKI_PTRACE_SETSTEP:
671 case VKI_PTRACE_CLEARSTEP:
672 case VKI_PTRACE_SUSPEND:
673 case VKI_PTRACE_RESUME:
674 case VKI_PTRACE_TO_SCE:
675 case VKI_PTRACE_TO_SCX:
676 case VKI_PTRACE_SYSCALL:
677 case VKI_PTRACE_VM_TIMESTAMP:
678 break;
679 case VKI_PTRACE_VM_ENTRY:
680 PRE_MEM_WRITE( "ptrace", ARG3, sizeof(struct vki_ptrace_vm_entry));
681 break;
685 POST(sys_ptrace)
687 struct vki_ptrace_io_desc *io_desc;
689 switch (ARG1) {
690 case VKI_PTRACE_TRACEME:
691 case VKI_PTRACE_READ_I:
692 case VKI_PTRACE_READ_D:
693 case VKI_PTRACE_WRITE_I:
694 case VKI_PTRACE_WRITE_D:
695 break;
697 case VKI_PTRACE_IO:
698 io_desc = (struct vki_ptrace_io_desc *)ARG3;
699 switch (io_desc->piod_op) {
700 case VKI_PIOD_READ_D:
701 case VKI_PIOD_READ_I:
702 if ((Word)RES != -1) {
703 POST_MEM_WRITE((UWord)io_desc->piod_addr, io_desc->piod_len);
705 break;
706 case VKI_PIOD_WRITE_D:
707 case VKI_PIOD_WRITE_I:
708 break;
710 break;
712 case VKI_PTRACE_CONTINUE:
713 case VKI_PTRACE_STEP:
714 case VKI_PTRACE_KILL:
715 case VKI_PTRACE_ATTACH:
716 case VKI_PTRACE_DETACH:
717 break;
719 case VKI_PTRACE_GETREGS:
720 if ((Word)RES != -1) {
721 POST_MEM_WRITE(ARG3, sizeof(struct vki_user_regs_struct));
723 break;
725 case VKI_PTRACE_SETREGS:
726 break;
728 case VKI_PTRACE_GETFPREGS:
729 if ((Word)RES != -1) {
730 POST_MEM_WRITE(ARG3, sizeof(struct vki_fpreg));
732 break;
734 case VKI_PTRACE_SETFPREGS:
735 break;
737 case VKI_PTRACE_GETDBREGS:
738 if ((Word)RES != -1) {
739 POST_MEM_WRITE(ARG3, sizeof(struct vki_dbreg));
741 break;
743 case VKI_PTRACE_SETDBREGS:
744 break;
746 case VKI_PTRACE_LWPINFO:
747 if ((Word)RES != -1) {
748 POST_MEM_WRITE(ARG3, sizeof(struct vki_ptrace_lwpinfo));
750 break;
752 case VKI_PTRACE_GETNUMLWPS:
753 break;
755 case VKI_PTRACE_GETLWPLIST:
756 if ((Word)RES != -1) {
757 POST_MEM_WRITE(ARG3, sizeof(vki_lwpid_t) * RES);
759 break;
761 case VKI_PTRACE_SETSTEP:
762 case VKI_PTRACE_CLEARSTEP:
763 case VKI_PTRACE_SUSPEND:
764 case VKI_PTRACE_RESUME:
765 case VKI_PTRACE_TO_SCE:
766 case VKI_PTRACE_TO_SCX:
767 case VKI_PTRACE_SYSCALL:
768 case VKI_PTRACE_VM_TIMESTAMP:
769 break;
771 case VKI_PTRACE_VM_ENTRY:
772 if ((Word)RES != -1) {
773 POST_MEM_WRITE(ARG3, sizeof(struct vki_ptrace_vm_entry));
775 break;
779 // SYS_recvmsg 27
780 // ssize_t recvmsg(int s, struct msghdr *msg, int flags);
781 PRE(sys_recvmsg)
783 *flags |= SfMayBlock;
784 PRINT("sys_recvmsg ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "d )",SARG1,ARG2,SARG3);
785 PRE_REG_READ3(vki_ssize_t, "recvmsg", int, s, struct msghdr *, msg, int, flags);
786 ML_(generic_PRE_sys_recvmsg)(tid, "recvmsg", (struct vki_msghdr *)ARG2);
789 POST(sys_recvmsg)
792 ML_(generic_POST_sys_recvmsg)(tid, "recvmsg", (struct vki_msghdr *)ARG2, RES);
795 // SYS_sendmsg 28
796 // ssize_t sendmsg(int s, const struct msghdr *msg, int flags);
797 PRE(sys_sendmsg)
799 *flags |= SfMayBlock;
800 PRINT("sys_sendmsg ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
801 PRE_REG_READ3(ssize_t, "sendmsg",
802 int, s, const struct msghdr *, msg, int, flags);
803 ML_(generic_PRE_sys_sendmsg)(tid, "sendmsg", (struct vki_msghdr *)ARG2);
806 // SYS_recvfrom 29
807 // ssize_t recvfrom(int s, void *buf, size_t len, int flags,
808 // struct sockaddr * restrict from, socklen_t * restrict fromlen);
809 PRE(sys_recvfrom)
811 *flags |= SfMayBlock;
812 PRINT("sys_recvfrom ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",SARG1,ARG2,ARG3,SARG4,ARG5,ARG6);
813 PRE_REG_READ6(ssize_t, "recvfrom",
814 int, s, void *, buf, size_t, len, int, flags,
815 struct sockaddr *, from, int *, fromlen);
816 ML_(generic_PRE_sys_recvfrom)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
819 POST(sys_recvfrom)
821 vg_assert(SUCCESS);
822 ML_(generic_POST_sys_recvfrom)(tid, VG_(mk_SysRes_Success)(RES),
823 ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
826 // SYS_accept 30
827 // int accept(int s, struct sockaddr * restrict addr,
828 // socklen_t * restrict addrlen);
829 PRE(sys_accept)
831 *flags |= SfMayBlock;
832 PRINT("sys_accept ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
833 PRE_REG_READ3(int, "accept",
834 int, s, struct sockaddr *, addr, int, *addrlen);
835 ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3);
838 POST(sys_accept)
840 SysRes r;
841 vg_assert(SUCCESS);
842 r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES),
843 ARG1,ARG2,ARG3);
844 SET_STATUS_from_SysRes(r);
847 // SYS_getpeername 31
848 // int getpeername(int s, struct sockaddr * restrict name,
849 // socklen_t * restrict namelen);
850 PRE(sys_getpeername)
852 PRINT("sys_getpeername ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",ARG1,ARG2,ARG3);
853 PRE_REG_READ3(int, "getpeername",
854 int, s, struct sockaddr *, name, socklen_t *, namelen);
855 ML_(generic_PRE_sys_getpeername)(tid, ARG1,ARG2,ARG3);
858 POST(sys_getpeername)
860 vg_assert(SUCCESS);
861 ML_(generic_POST_sys_getpeername)(tid, VG_(mk_SysRes_Success)(RES),
862 ARG1,ARG2,ARG3);
865 // SYS_getsockname 32
866 // int getsockname(int s, struct sockaddr * restrict name,
867 // socklen_t * restrict namelen);
868 PRE(sys_getsockname)
870 PRINT("sys_getsockname ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",SARG1,ARG2,ARG3);
871 PRE_REG_READ3(long, "getsockname",
872 int, s, struct sockaddr *, name, int *, namelen);
873 ML_(generic_PRE_sys_getsockname)(tid, ARG1,ARG2,ARG3);
876 POST(sys_getsockname)
878 vg_assert(SUCCESS);
879 ML_(generic_POST_sys_getsockname)(tid, VG_(mk_SysRes_Success)(RES),
880 ARG1,ARG2,ARG3);
883 // SYS_access 33
884 // generic
886 // SYS_chflags 34
887 // int chflags(const char *path, unsigned long flags)
888 PRE(sys_chflags)
890 PRINT("sys_chflags ( %#" FMT_REGWORD "x(%s), 0x%" FMT_REGWORD "x )", ARG1,(char *)ARG1,ARG2);
891 PRE_REG_READ2(int, "chflags",
892 const char *, path, unsigned long, flags);
893 PRE_MEM_RASCIIZ( "chflags(path)", ARG1 );
896 // SYS_fchflags 35
897 // int fchflags(int fd, unsigned long flags);
898 PRE(sys_fchflags)
900 PRINT("sys_fchflags ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1,ARG2);
901 PRE_REG_READ2(int, "fchflags", int, fd, unsigned long, flags);
904 // SYS_sync 36
905 // generic
907 // SYS_kill 37
908 // generic
910 // SYS_getppid 39
911 // generic
913 // SYS_dup 41
914 // generic
916 // Pipe on freebsd doesn't have args, and uses dual returns!
917 // SYS_freebsd10_pipe 42
918 // int pipe(void);
919 PRE(sys_pipe)
921 PRINT("%s", "sys_pipe ()");
924 POST(sys_pipe)
926 if (!ML_(fd_allowed)(RES, "pipe", tid, True) ||
927 !ML_(fd_allowed)(RESHI, "pipe", tid, True)) {
928 VG_(close)(RES);
929 VG_(close)(RESHI);
930 SET_STATUS_Failure( VKI_EMFILE );
931 } else {
932 if (VG_(clo_track_fds)) {
933 ML_(record_fd_open_nameless)(tid, RES);
934 ML_(record_fd_open_nameless)(tid, RESHI);
939 // SYS_getegid 43
940 // generic
942 // SYS_profil 44
943 // generic
945 // SYS_ktrace 45
946 // generic
948 // SYS_getgid 47
949 // generic
951 // SYS_getlogin 49
952 // syscall.master refers to namelen and namebuf for the argument names
953 // man getlogin has just getlogin(void) but also
954 // int getlogin_r(char *name, int len);
955 // so let's go with those names
956 PRE(sys_getlogin)
958 PRINT("sys_getlogin ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",ARG1,ARG2);
959 PRE_REG_READ2(int, "getlogin", char *, buf, u_int, len);
960 PRE_MEM_WRITE( "getlogin(name)", ARG1, ARG2 );
963 POST(sys_getlogin)
965 POST_MEM_WRITE(ARG1, ARG2 );
968 // SYS_setlogin 50
969 // int setlogin(const char *name);
970 PRE(sys_setlogin)
972 PRINT("sys_setlogin ( %#" FMT_REGWORD "x )",ARG1);
973 PRE_REG_READ1(long, "setlogin", char *, buf);
974 PRE_MEM_RASCIIZ( "setlogin(buf)", ARG1 );
977 // SYS_acct 51
978 // generic
980 // SYS_sigaltstack 53
981 // generic
983 // SYS_ioctl 54
984 // int ioctl(int fd, unsigned long request, ...);
985 PRE(sys_ioctl)
987 *flags |= SfMayBlock;
988 PRINT("sys_ioctl ( %" FMT_REGWORD "u, 0x%" FMT_REGWORD "x, %#" FMT_REGWORD "x )",ARG1,ARG2,ARG3);
989 PRE_REG_READ3(int, "ioctl",
990 int, fd, unsigned long, request, unsigned long, arg);
992 switch (ARG2 /* request */) {
993 /* Handle specific ioctls which pass structures which may have pointers to other
994 buffers */
995 case VKI_BIOCSETF:
996 // #define BIOCSETF _IOW('B', 103, struct bpf_program)
997 // "usbconfig" to get a list of devices then
998 // test with "usbdump -i usbus0" (as root)
999 if (ARG3 && ML_(safe_to_deref)((const void*)ARG3, sizeof(struct vki_bpf_program))) {
1000 struct vki_bpf_program* fp = (struct vki_bpf_program*)ARG3;
1001 PRE_FIELD_READ("ioctl(BIOCSETF).bf_len", fp->bf_len);
1002 PRE_FIELD_READ("ioctl(BIOCSETF).bf_insns", fp->bf_insns);
1003 PRE_MEM_READ("ioctl(BIOCSETF).bf_insns",
1004 (Addr)(fp->bf_insns), fp->bf_len*sizeof(struct vki_bpf_insn));
1006 break;
1007 case VKI_CAMIOCOMMAND:
1008 // #define CAMIOCOMMAND _IOWR(CAM_VERSION, 2, union ccb)
1009 if (ARG3 && ML_(safe_to_deref)((const void*)ARG3, sizeof(union vki_ccb))) {
1010 // test with "camcontrol devlist" (as root)
1011 // (many errors at present)
1012 union vki_ccb* ccb = (union vki_ccb*)ARG3;
1013 if (ccb->ccb_h.func_code == VKI_XPT_DEV_MATCH) {
1014 PRE_FIELD_READ("ioctl(CAMIOCOMMAND).cdm.match_buf_len", ccb->cdm.match_buf_len);
1015 PRE_FIELD_READ("ioctl(CAMIOCOMMAND).cdm.matches", ccb->cdm.matches);
1016 PRE_MEM_WRITE("ioctl(CAMIOCOMMAND:XPT_DEV_MATCH).num_matches",
1017 (Addr)(&ccb->cdm.num_matches), sizeof(ccb->cdm.num_matches));
1018 PRE_MEM_WRITE("ioctl(CAMIOCOMMAND:XPT_DEV_MATCH).matches",
1019 (Addr)(ccb->cdm.matches), ccb->cdm.match_buf_len);
1020 } else if (ccb->ccb_h.func_code == VKI_XPT_SCSI_IO) {
1021 struct vki_ccb_scsiio* scsiio = (struct vki_ccb_scsiio*)ccb;
1022 if (scsiio->dxfer_len) {
1023 if ((scsiio->ccb_h.flags & VKI_CAM_DIR_MASK) == VKI_CAM_DIR_IN) {
1024 PRE_MEM_WRITE("ioctl(CAMIOCOMMAND:XPT_SCSI_IO).data_ptr",
1025 (Addr)(scsiio->data_ptr), scsiio->dxfer_len);
1026 } else if ((scsiio->ccb_h.flags & VKI_CAM_DIR_MASK) == VKI_CAM_DIR_OUT) {
1027 PRE_MEM_READ("ioctl(CAMIOCOMMAND:XPT_SCSI_IO).data_ptr",
1028 (Addr)(scsiio->data_ptr), scsiio->dxfer_len);
1031 } else if (ccb->ccb_h.func_code == VKI_XPT_GDEV_TYPE ||
1032 ccb->ccb_h.func_code == VKI_XPT_PATH_INQ ||
1033 ccb->ccb_h.func_code == VKI_XPT_GET_TRAN_SETTINGS) {
1034 // do nothing
1035 } else {
1036 VG_(message)(Vg_UserMsg,
1037 "Warning: unhandled ioctl CAMIOCOMMAND function 0x%x\n",
1038 ccb->ccb_h.func_code);
1041 break;
1042 case VKI_FIODGNAME:
1043 // #define FIODGNAME _IOW('f', 120, struct fiodgname_arg) /* get dev. name */
1044 // has a regression test
1045 if (ARG3 && ML_(safe_to_deref)((const void*)ARG3, sizeof(struct vki_fiodgname_arg))) {
1046 struct vki_fiodgname_arg* data = (struct vki_fiodgname_arg*)(Addr)ARG3;
1047 PRE_FIELD_READ("ioctl(FIODGNAME).len", data->len);
1048 PRE_FIELD_READ("ioctl(FIODGNAME).buf", data->buf);
1049 PRE_MEM_WRITE("ioctl(FIODGNAME).buf", (Addr)data->buf, data->len);
1051 break;
1052 case VKI_SIOCGIFCONF:
1053 // #define SIOCGIFCONF _IOWR('i', 36, struct ifconf) /* get ifnet list */
1054 // test with "traceroute www.siemens.com" (as root)
1055 if (ARG3 && ML_(safe_to_deref)((const void*)ARG3, sizeof(struct vki_ifconf))) {
1056 struct vki_ifconf* ifc = (struct vki_ifconf*)ARG3;
1057 PRE_FIELD_READ("ioctl(SIOCGIFCONF).ifc_len", ifc->ifc_len);
1058 PRE_FIELD_READ("ioctl(SIOCGIFCONF).ifcu_req", ifc->ifc_ifcu.ifcu_req);
1059 PRE_MEM_WRITE("ioctl(SIOCGIFCONF).buf", (Addr)ifc->ifc_ifcu.ifcu_req, ifc->ifc_len);
1061 break;
1062 case VKI_SIOCGIFMEDIA:
1063 // #define SIOCGIFMEDIA _IOWR('i', 56, struct ifmediareq) /* get net media */
1064 // test with "ifconfig -m"
1065 if (ARG3 && ML_(safe_to_deref)((const void*)ARG3, sizeof(struct vki_ifmediareq))) {
1066 struct vki_ifmediareq* imr = (struct vki_ifmediareq*)ARG3;
1067 if (imr->ifm_ulist) {
1068 PRE_MEM_WRITE("ioctl(SIOCGIFMEDIA).ifm_ulist",
1069 (Addr)(imr->ifm_ulist), imr->ifm_count * sizeof(int));
1072 break;
1073 case VKI_SIOCGIFSTATUS:
1074 // #define SIOCGIFSTATUS _IOWR('i', 59, struct ifstat) /* get IF status */
1075 // test with "ifconfig -a"
1076 if (ARG3 && ML_(safe_to_deref)((const void*)ARG3, sizeof(struct vki_ifstat))) {
1077 struct vki_ifstat* data = (struct vki_ifstat*)(Addr)ARG3;
1078 PRE_MEM_RASCIIZ("ioctl(SIOCGIFSTATUS).ifs_name", (Addr)data->ifs_name);
1079 PRE_MEM_WRITE("ioctl(SIOCGIFSTATUS).ascii", (Addr)data->ascii, sizeof(data->ascii));
1081 break;
1082 case VKI_PCIOCGETCONF:
1083 // #define PCIOCGETCONF _IOWR('p', 5, struct pci_conf_io)
1084 // test with "pciconf -l"
1085 if (ARG3 && ML_(safe_to_deref)((const void*)ARG3, sizeof(struct vki_pci_conf_io))) {
1086 struct vki_pci_conf_io* pci = (struct vki_pci_conf_io*)ARG3;
1087 PRE_MEM_READ("ioctl(PCIOCGETCONF).patterns",
1088 (Addr)(pci->patterns), pci->pat_buf_len);
1089 PRE_MEM_WRITE("ioctl(PCIOCGETCONF).matches",
1090 (Addr)(pci->matches), pci->match_buf_len);
1092 break;
1093 default:
1094 ML_(PRE_unknown_ioctl)(tid, ARG2, ARG3);
1095 break;
1099 POST(sys_ioctl)
1101 switch (ARG2/* request */) {
1102 /* Handle specific ioctls which pass structures which may have pointers to other
1103 buffers */
1104 case VKI_CAMIOCOMMAND:
1105 if (ARG3) {
1106 union vki_ccb* ccb = (union vki_ccb*)ARG3;
1107 if (ccb->ccb_h.func_code == VKI_XPT_DEV_MATCH) {
1108 POST_MEM_WRITE((Addr)(&ccb->cdm.num_matches), sizeof(ccb->cdm.num_matches));
1109 POST_MEM_WRITE((Addr)(ccb->cdm.matches), ccb->cdm.num_matches*sizeof(struct vki_dev_match_result));
1110 } else if (ccb->ccb_h.func_code == VKI_XPT_SCSI_IO) {
1111 struct vki_ccb_scsiio* scsiio = (struct vki_ccb_scsiio*)ccb;
1112 if (scsiio->dxfer_len) {
1113 if ((scsiio->ccb_h.flags & VKI_CAM_DIR_MASK) == VKI_CAM_DIR_IN) {
1114 POST_MEM_WRITE((Addr)(scsiio->data_ptr), scsiio->dxfer_len);
1119 break;
1120 case VKI_FIODGNAME:
1121 if (ARG3) {
1122 struct vki_fiodgname_arg* data = (struct vki_fiodgname_arg*)(Addr)ARG3;
1123 POST_MEM_WRITE((Addr)data->buf, data->len);
1125 break;
1126 case VKI_SIOCGIFCONF:
1127 // #define SIOCGIFCONF _IOWR('i', 36, struct ifconf) /* get ifnet list */
1128 if (ARG3) {
1129 struct vki_ifconf* ifc = (struct vki_ifconf*)ARG3;
1130 POST_MEM_WRITE((Addr)ifc->ifc_ifcu.ifcu_req, ifc->ifc_len);
1132 break;
1133 case VKI_SIOCGIFMEDIA:
1134 if (ARG3) {
1135 struct vki_ifmediareq* imr = (struct vki_ifmediareq*)ARG3;
1136 if (imr->ifm_ulist) {
1137 POST_MEM_WRITE((Addr)(imr->ifm_ulist), imr->ifm_count * sizeof(int));
1140 break;
1141 case VKI_SIOCGIFSTATUS:
1142 // #define SIOCGIFSTATUS _IOWR('i', 59, struct ifstat) /* get IF status */
1143 if (ARG3) {
1144 struct vki_ifstat* data = (struct vki_ifstat*)(Addr)ARG3;
1145 POST_MEM_WRITE((Addr)data->ascii, sizeof(data->ascii));
1147 break;
1148 case VKI_PCIOCGETCONF:
1149 if (ARG3) {
1150 struct vki_pci_conf_io* pci = (struct vki_pci_conf_io*)ARG3;
1151 POST_MEM_WRITE((Addr)(pci->matches), pci->num_matches * sizeof(struct vki_pci_conf));
1153 break;
1156 default:
1157 ML_(POST_unknown_ioctl)(tid, RES, ARG2, ARG3);
1158 break;
1162 // SYS_reboot 55
1163 // int reboot(int howto);
1164 PRE(sys_reboot)
1166 PRINT("sys_reboot ( %" FMT_REGWORD "d )", SARG1);
1167 PRE_REG_READ1(int, "reboot", int, howto);
1170 // SYS_revoke 56
1171 // int revoke(const char *path);
1172 PRE(sys_revoke)
1174 PRINT("sys_revoke ( %#" FMT_REGWORD "x(%s) )", ARG1, (char*)ARG1);
1175 PRE_REG_READ1(long, "revoke", const char *, path);
1176 PRE_MEM_RASCIIZ( "revoke(path)", ARG1);
1179 // SYS_symlink 57
1180 // generic
1182 static void do_readlink(const HChar* path, HChar *buf, SizeT bufsize, SyscallStatus* status, Bool* curproc_file)
1184 HChar name[30];
1185 VG_(sprintf)(name, "/proc/%d/file", VG_(getpid)());
1186 if (ML_(safe_to_deref)(path, 1)
1187 && (VG_(strcmp)(path, name) == 0
1188 || VG_(strcmp)(path, "/proc/curproc/file") == 0)) {
1189 vg_assert(VG_(resolved_exename));
1190 Int len = VG_(snprintf)(buf, bufsize, "%s", VG_(resolved_exename));
1191 SET_STATUS_Success(len);
1192 *curproc_file = True;
1196 // SYS_readlink 58
1197 // ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsiz);
1198 PRE(sys_readlink)
1200 FUSE_COMPATIBLE_MAY_BLOCK();
1201 Word saved = SYSNO;
1202 Bool curproc_file = False;
1204 PRINT("sys_readlink ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x, %llu )",
1205 ARG1, (char*)(Addr)ARG1, ARG2, (ULong)ARG3);
1206 PRE_REG_READ3(long, "readlink",
1207 const char *, path, char *, buf, int, bufsiz);
1208 PRE_MEM_RASCIIZ( "readlink(path)", ARG1 );
1209 PRE_MEM_WRITE( "readlink(buf)", ARG2,ARG3 );
1211 if (VG_(have_slash_proc) == True)
1214 * Handle the case where readlink is looking at /proc/curproc/file or
1215 * /proc/<pid>/file
1217 do_readlink((const HChar *)ARG1, (HChar *)ARG2, (SizeT)ARG3, status, &curproc_file);
1220 if (!curproc_file) {
1221 /* Normal case */
1222 SET_STATUS_from_SysRes( VG_(do_syscall3)(saved, ARG1, ARG2, ARG3));
1224 if (SUCCESS && RES > 0) {
1225 POST_MEM_WRITE( ARG2, RES );
1229 // SYS_execve 59
1230 // generic
1232 // SYS_umask 60
1233 // generic
1235 // SYS_chroot 61
1236 // generic
1238 // SYS_msync 65
1239 // generic
1241 // SYS_vfork 66
1242 // pid_t vfork(void);
1243 PRE(sys_vfork)
1245 PRINT("%s", "sys_vfork ()");
1246 PRE_REG_READ0(pid_t, "vfork");
1248 /* Pretend vfork == fork. Not true, but will have to do. */
1249 SET_STATUS_from_SysRes( ML_(do_fork)(tid) );
1250 if (SUCCESS) {
1251 /* Thread creation was successful; let the child have the chance
1252 to run */
1253 *flags |= SfYieldAfter;
1257 // SYS_sbrk 69
1258 // int sbrk(int incr);
1259 PRE(sys_sbrk)
1261 PRINT("sys_sbrk ( %#" FMT_REGWORD "x )",ARG1);
1262 PRE_REG_READ1(int, "sbrk", int, incr);
1264 // removed in FreeBSD 15
1265 // prior to that it just returned EOPNOTSUPP
1266 // with a comment "Not yet implemented"
1268 // libc sbrk doesn't call this, it calls __sys_break
1269 // which maps to sys_brk
1272 // SYS_freebsd11_vadvise 72
1273 // @todo maybe
1275 // SYS_munmap 73
1276 // generic
1278 // SYS_mprotect 74
1279 // generic
1281 // SYS_madvise 75
1282 // generic
1284 // SYS_mincore 78
1285 // generic
1287 // SYS_getgroups 79
1288 // generic
1290 // SYS_setgroups 80
1291 // generic
1293 // SYS_getpgrp 81
1294 // generic
1296 // SYS_setpgid 82
1297 // generic
1299 // SYS_setitimer 83
1300 // generic
1302 // SYS_swapon 85
1303 // int swapon(const char *special);
1304 PRE(sys_swapon)
1306 PRINT("sys_swapon ( %#" FMT_REGWORD "x(%s) )", ARG1,(char*)ARG1);
1307 PRE_REG_READ1(int, "swapon", const char*, special );
1308 PRE_MEM_RASCIIZ( "swapon(special)", ARG1 );
1311 // SYS_getitimer 86
1312 // generic
1314 // SYS_getdtablesize 89
1315 // int getdtablesize(void);
1316 PRE(sys_getdtablesize)
1318 PRINT("%s", "sys_getdtablesize ( )");
1319 PRE_REG_READ0(long, "getdtablesize");
1322 // SYS_dup2 90
1323 // generic
1325 // SYS_fcntl 92
1326 // int fcntl(int fd, int cmd, ...);
1327 PRE(sys_fcntl)
1329 switch (ARG2) {
1330 // These ones ignore ARG3.
1331 case VKI_F_GETFD:
1332 case VKI_F_GETFL:
1333 case VKI_F_GETOWN:
1334 case VKI_F_GET_SEALS:
1335 case VKI_F_ISUNIONSTACK:
1336 PRINT("sys_fcntl ( %" FMT_REGWORD "d, %" FMT_REGWORD "d )", SARG1,SARG2);
1337 PRE_REG_READ2(int, "fcntl", int, fd, int, cmd);
1338 break;
1340 // These ones use ARG3 as "arg".
1341 case VKI_F_DUPFD:
1342 case VKI_F_DUPFD_CLOEXEC:
1343 case VKI_F_SETFD:
1344 case VKI_F_SETFL:
1345 case VKI_F_SETOWN:
1346 case VKI_F_READAHEAD:
1347 case VKI_F_RDAHEAD:
1348 case VKI_F_ADD_SEALS:
1349 PRINT("sys_fcntl[ARG3=='arg'] ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %" FMT_REGWORD "d )", SARG1,SARG2,SARG3);
1350 PRE_REG_READ3(int, "fcntl",
1351 int, fd, int, cmd, int, arg);
1352 break;
1354 // These ones use ARG3 as "lock" - obsolete.
1355 case VKI_F_OSETLKW:
1356 *flags |= SfMayBlock;
1357 /* FALLTHROUGH */
1358 case VKI_F_OGETLK:
1359 case VKI_F_OSETLK:
1360 PRINT("sys_fcntl[ARG3=='lock'] ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2,ARG3);
1361 PRE_REG_READ3(int, "fcntl",
1362 int, fd, int, cmd,
1363 struct oflock *, lock);
1364 break;
1366 // This one uses ARG3 as "oldd" and ARG4 as "newd".
1367 case VKI_F_DUP2FD:
1368 case VKI_F_DUP2FD_CLOEXEC:
1369 PRINT("sys_fcntl[ARG3=='oldd', ARG4=='newd'] ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )",
1370 ARG1,ARG2,ARG3,ARG4);
1371 PRE_REG_READ4(int, "fcntl",
1372 int, fd, int, cmd,
1373 unsigned long, oldd, unsigned long, newd);
1374 break;
1376 // These ones use ARG3 as "lock".
1377 case VKI_F_SETLKW:
1378 *flags |= SfMayBlock;
1379 /* FALLTHROUGH */
1380 case VKI_F_GETLK:
1381 case VKI_F_SETLK:
1382 case VKI_F_SETLK_REMOTE:
1383 PRINT("sys_fcntl[ARG3=='lock'] ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2,ARG3);
1384 PRE_REG_READ3(int, "fcntl",
1385 int, fd, int, cmd,
1386 struct flock *, lock);
1387 break;
1388 case VKI_F_KINFO:
1389 PRINT("sys_fcntl[ARG3=='kinfo_file'] ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2,ARG3);
1390 PRE_REG_READ3(int, "fcntl",
1391 int, fd, int, cmd,
1392 struct vki_kinfo_file *, kinfo);
1393 if (ARG3) {
1394 struct vki_kinfo_file* p_kinfo_file = (struct vki_kinfo_file*)ARG3;
1395 PRE_MEM_WRITE("fcntl(ARG3=='kinfo_file)", ARG3, p_kinfo_file->vki_kf_structsize);
1397 break;
1399 default:
1400 PRINT("sys_fcntl[UNKNOWN] ( %lu, %lu, %lu )", ARG1,ARG2,ARG3);
1401 I_die_here;
1405 POST(sys_fcntl)
1407 vg_assert(SUCCESS);
1408 if (ARG2 == VKI_F_DUPFD) {
1409 if (!ML_(fd_allowed)(RES, "fcntl(DUPFD)", tid, True)) {
1410 VG_(close)(RES);
1411 SET_STATUS_Failure( VKI_EMFILE );
1412 } else {
1413 if (VG_(clo_track_fds)) {
1414 ML_(record_fd_open_named)(tid, RES);
1417 } else if (ARG2 == VKI_F_DUPFD_CLOEXEC) {
1418 if (!ML_(fd_allowed)(RES, "fcntl(DUPFD_CLOEXEC)", tid, True)) {
1419 VG_(close)(RES);
1420 SET_STATUS_Failure( VKI_EMFILE );
1421 } else {
1422 if (VG_(clo_track_fds)) {
1423 ML_(record_fd_open_named)(tid, RES);
1429 // SYS_select 93
1430 // generic
1432 // SYS_fsync 95
1433 // generic
1435 // SYS_setpriority 9
1436 // generic
1438 // SYS_socket 97
1439 // int socket(int domain, int type, int protocol);
1440 PRE(sys_socket)
1442 PRINT("sys_socket ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %" FMT_REGWORD "d )",SARG1,SARG2,SARG3);
1443 PRE_REG_READ3(int, "socket", int, domain, int, type, int, protocol);
1446 POST(sys_socket)
1448 SysRes r;
1449 vg_assert(SUCCESS);
1450 r = ML_(generic_POST_sys_socket)(tid, VG_(mk_SysRes_Success)(RES));
1451 SET_STATUS_from_SysRes(r);
1454 // SYS_connect 98
1455 // int connect(int s, const struct sockaddr *name, socklen_t namelen);
1456 PRE(sys_connect)
1458 *flags |= SfMayBlock;
1459 PRINT("sys_connect ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
1460 PRE_REG_READ3(int, "connect",
1461 int, s, const struct sockaddr *, name, int, namelen);
1462 ML_(generic_PRE_sys_connect)(tid, ARG1,ARG2,ARG3);
1465 // SYS_getpriority 100
1466 // generic
1468 // SYS_bind 104
1469 // int bind(int s, const struct sockaddr *addr, socklen_t addrlen);
1470 PRE(sys_bind)
1472 PRINT("sys_bind ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
1473 PRE_REG_READ3(int, "bind",
1474 int, s, struct sockaddr *, addr, int, addrlen);
1475 ML_(generic_PRE_sys_bind)(tid, ARG1,ARG2,ARG3);
1478 // SYS_setsockopt 105
1479 // int setsockopt(int s, int level, int optname, const void *optval,
1480 // socklen_t optlen);
1481 PRE(sys_setsockopt)
1483 PRINT("sys_setsockopt ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",SARG1,SARG2,SARG3,ARG4,ARG5);
1484 PRE_REG_READ5(int, "setsockopt",
1485 int, s, int, level, int, optname,
1486 const void *, optval, vki_socklen_t, optlen);
1487 ML_(generic_PRE_sys_setsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
1490 // SYS_listen 106
1491 // int listen(int s, int backlog);
1492 PRE(sys_listen)
1494 PRINT("sys_listen ( %" FMT_REGWORD "d, %" FMT_REGWORD "d )",SARG1,SARG2);
1495 PRE_REG_READ2(int, "listen", int, s, int, backlog);
1498 //SYS_gettimeofday 116
1499 // generic
1501 // SYS_getrusage 117
1502 // generic
1504 // SYS_getsockopt 118
1505 // int getsockopt(int s, int level, int optname, void * restrict optval,
1506 // socklen_t * restrict optlen);
1507 PRE(sys_getsockopt)
1509 Addr optval_p = ARG4;
1510 Addr optlen_p = ARG5;
1511 PRINT("sys_getsockopt ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",ARG1,ARG2,ARG3,ARG4,ARG5);
1512 PRE_REG_READ5(int, "getsockopt",
1513 int, s, int, level, int, optname,
1514 void *, optval, int, *optlen);
1515 if (optval_p != (Addr)NULL) {
1516 ML_(buf_and_len_pre_check) ( tid, optval_p, optlen_p,
1517 "getsockopt(optval)",
1518 "getsockopt(optlen)" );
1522 POST(sys_getsockopt)
1524 Addr optval_p = ARG4;
1525 Addr optlen_p = ARG5;
1526 vg_assert(SUCCESS);
1527 if (optval_p != (Addr)NULL) {
1528 ML_(buf_and_len_post_check) ( tid, VG_(mk_SysRes_Success)(RES),
1529 optval_p, optlen_p,
1530 "getsockopt(optlen_out)" );
1534 // SYS_readv 120
1535 // generic
1537 // SYS_writev 121
1538 // generic
1540 // SYS_settimeofday 122
1541 // generic
1543 // SYS_fchown 123
1544 // generic
1546 // SYS_fchmod 124
1547 // generic
1549 // SYS_setreuid 126
1550 // generic
1552 // SYS_setregid 127
1553 // generic
1555 // SYS_rename 128
1556 // generic
1558 // SYS_flock 131
1559 // generic
1561 // SYS_mkfifo 132
1562 // int mkfifo(const char *path, mode_t mode);
1563 PRE(sys_mkfifo)
1565 PRINT("sys_mkfifo ( %#" FMT_REGWORD "x(%s), 0x%" FMT_REGWORD "x, 0x%" FMT_REGWORD "x )", ARG1, (char *)ARG1, ARG2, ARG3 );
1566 PRE_REG_READ2(int, "mkfifo", const char *, path, int, mode);
1567 PRE_MEM_RASCIIZ( "mkfifo(path)", ARG1 );
1570 // SYS_sendto 133
1571 // ssize_t sendto(int s, const void *msg, size_t len, int flags,
1572 // const struct sockaddr *to, socklen_t tolen);
1573 PRE(sys_sendto)
1575 *flags |= SfMayBlock;
1576 PRINT("sys_sendto ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
1577 PRE_REG_READ6(ssize_t, "sendto",
1578 int, s, const void *, msg, int, len,
1579 int, flags,
1580 const struct sockaddr *, to, socklen_t, tolen);
1581 ML_(generic_PRE_sys_sendto)(tid, ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
1584 // SYS_shutdown 134
1585 // int shutdown(int s, int how);
1586 PRE(sys_shutdown)
1588 *flags |= SfMayBlock;
1589 PRINT("sys_shutdown ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )",ARG1,ARG2);
1590 PRE_REG_READ2(int, "shutdown", int, s, int, how);
1593 // SYS_socketpair 135
1594 // int socketpair(int domain, int type, int protocol, int *sv);
1595 PRE(sys_socketpair)
1597 PRINT("sys_socketpair ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )",ARG1,ARG2,ARG3,ARG4);
1598 PRE_REG_READ4(int, "socketpair",
1599 int, domain, int, type, int, protocol, int *, sv);
1600 ML_(generic_PRE_sys_socketpair)(tid, ARG1,ARG2,ARG3,ARG4);
1603 POST(sys_socketpair)
1605 vg_assert(SUCCESS);
1606 ML_(generic_POST_sys_socketpair)(tid, VG_(mk_SysRes_Success)(RES),
1607 ARG1,ARG2,ARG3,ARG4);
1610 // SYS_mkdir 136
1611 // generic
1613 // SYS_rmdir 137
1614 // generic
1616 // SYS_utimes 138
1617 // generic
1619 // SYS_adjtime 140
1620 // int adjtime(const struct timeval *delta, struct timeval *olddelta);
1621 PRE(sys_adjtime)
1623 PRINT("sys_adjtime ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",ARG1,ARG2);
1624 PRE_REG_READ2(int, "adjtime",
1625 const struct vki_timeval *, delta, struct vki_timeval *, olddelta);
1626 PRE_MEM_READ("adjtime(delta)", ARG1, sizeof(struct vki_timeval));
1627 if (ARG2) {
1628 PRE_MEM_WRITE("adjtime(olddelta)", ARG1, sizeof(struct vki_timeval));
1632 POST(sys_adjtime)
1634 if (ARG2) {
1635 POST_MEM_WRITE(ARG1, sizeof(struct vki_timeval));
1639 // SYS_setsid 147
1640 // generic
1642 // SYS_quotactl 148
1643 /* int quotactl(const char *path, int cmd, int id, void *addr); */
1644 PRE(sys_quotactl)
1646 PRINT("sys_quotactl ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2,ARG3, ARG4);
1647 switch (ARG2) {
1648 case VKI_Q_QUOTAON:
1649 case VKI_Q_SETQUOTA:
1650 case VKI_Q_SETUSE:
1652 case VKI_Q_GETQUOTASIZE:
1653 PRE_REG_READ4(int, "quotactl",
1654 const char *, path, int, cmd, int, id,
1655 void *, addr);
1656 PRE_MEM_RASCIIZ( "quotactl(path)", ARG1 );
1657 break;
1658 case VKI_Q_GETQUOTA:
1659 if (VG_(tdict).track_pre_reg_read) {
1661 PRRSN;
1662 PRA1("quotactl",const char*,path);
1663 PRA2("quotactl",int,cmd);
1664 PRA4("quotactl",void*,addr);
1666 break;
1667 case VKI_Q_QUOTAOFF:
1668 case VKI_Q_SYNC:
1669 PRE_REG_READ2(int, "quotactl",
1670 const char *, path, int, cmd);
1671 break;
1672 default:
1673 break;
1677 // SYS_nlm_syscall 154
1678 // syscall.master says ; 154 is initialised by the NLM code, if present.
1679 // @todo
1681 // SYS_nfssvc 155
1682 // int nfssvc(int flags, void *argstructp);
1683 // lengthy manpage, at least 3 types of struct that argstructp can point to
1684 // @todo
1686 // SYS_lgetfh 160
1687 // int lgetfh(const char *path, fhandle_t *fhp);
1688 PRE(sys_lgetfh)
1690 PRINT("sys_lgetfh ( %#" FMT_REGWORD "x, %" FMT_REGWORD "x ", ARG1, ARG2);
1691 PRE_REG_READ2(int, "lgetfh", const char*, path, vki_fhandle_t*, fhp);
1692 PRE_MEM_RASCIIZ( "lgetfh(path)", ARG1 );
1693 PRE_MEM_WRITE("lgetfh(fhp)", ARG2, sizeof(vki_fhandle_t));
1696 POST(sys_lgetfh)
1698 POST_MEM_WRITE(ARG2, sizeof(vki_fhandle_t));
1701 // SYS_getfh 161
1702 // int getfh(const char *path, fhandle_t *fhp);
1703 PRE(sys_getfh)
1705 PRINT("sys_getfh ( %#" FMT_REGWORD "x, %" FMT_REGWORD "x ", ARG1, ARG2);
1706 PRE_REG_READ2(int, "getfh", const char*, path, vki_fhandle_t*, fhp);
1707 PRE_MEM_RASCIIZ( "getfh(path)", ARG1 );
1708 PRE_MEM_WRITE("getfh(fhp)", ARG2, sizeof(vki_fhandle_t));
1711 POST(sys_getfh)
1713 POST_MEM_WRITE(ARG2, sizeof(vki_fhandle_t));
1716 // freebsd4 getdomainname 162
1717 // removed
1719 // freebsd4 setdomainname 163
1720 // removed
1722 // freebsd4 uname 164
1723 // removed
1725 // SYS_sysarch 165
1726 // x86/amd64
1728 // SYS_rtprio 166
1729 PRE(sys_rtprio)
1731 PRINT( "sys_rtprio ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1, ARG2, ARG3 );
1732 PRE_REG_READ3(int, "rtprio",
1733 int, function, pid_t, pid, struct rtprio *, rtp);
1734 if (ARG1 == VKI_RTP_SET) {
1735 PRE_MEM_READ( "rtprio(rtp#set)", ARG3, sizeof(struct vki_rtprio));
1736 } else if (ARG1 == VKI_RTP_LOOKUP) {
1737 PRE_MEM_WRITE( "rtprio(rtp#lookup)", ARG3, sizeof(struct vki_rtprio));
1738 } else {
1739 /* PHK ?? */
1743 POST(sys_rtprio)
1745 if (ARG1 == VKI_RTP_LOOKUP && RES == 0) {
1746 POST_MEM_WRITE( ARG3, sizeof(struct vki_rtprio));
1750 // freebsd6_pread 173 FreeBSD 10 and earlier
1751 // x86/amd64
1753 // freebsd6_pwrite 174 FreeBSD 10 and earlier
1754 // x86/amd64
1756 // SYS_setfib 175
1757 // int setfib(int fib);
1758 PRE(sys_setfib)
1760 PRINT("sys_setfib ( %" FMT_REGWORD "d )", SARG1);
1761 PRE_REG_READ1(int, "setfib", int, fib);
1764 // SYS_ntp_adjtime 176
1765 // int ntp_adjtime(struct timex *);
1766 // @todo
1768 // SYS_setgid 181
1769 // generic
1771 // SYS_setegid 182
1772 // int setegid(gid_t egid);
1773 PRE(sys_setegid)
1775 PRINT("sys_setegid ( %" FMT_REGWORD "u )", ARG1);
1776 PRE_REG_READ1(int, "setegid", vki_gid_t, gid);
1779 // SYS_seteuid 183
1780 // int seteuid(uid_t euid);
1781 PRE(sys_seteuid)
1783 PRINT("sys_seteuid ( %" FMT_REGWORD "u )", ARG1);
1784 PRE_REG_READ1(long, "seteuid", vki_uid_t, uid);
1787 // SYS_freebsd11_stat 188
1788 // int stat(char *path, struct freebsd11_stat *sb);
1789 PRE(sys_freebsd11_stat)
1791 PRINT("sys_freebsd11_stat ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x )",ARG1,(char *)ARG1,ARG2);
1792 PRE_REG_READ2(int, "stat", char *, path, struct freebsd11_stat *, sb);
1793 PRE_MEM_RASCIIZ( "stat(path)", ARG1 );
1794 PRE_MEM_WRITE( "stat(sb)", ARG2, sizeof(struct vki_freebsd11_stat) );
1797 POST(sys_freebsd11_stat)
1799 POST_MEM_WRITE( ARG2, sizeof(struct vki_freebsd11_stat) );
1802 // SYS_freebsd11_fstat 189
1803 // int fstat(int fd, struct stat *sb);
1804 PRE(sys_freebsd11_fstat)
1806 PRINT("sys_freebsd11_fstat ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )",SARG1,ARG2);
1807 PRE_REG_READ2(int, "fstat", int, fd, struct stat *, sb);
1808 PRE_MEM_WRITE( "fstat(sb)", ARG2, sizeof(struct vki_freebsd11_stat) );
1811 POST(sys_freebsd11_fstat)
1813 POST_MEM_WRITE( ARG2, sizeof(struct vki_freebsd11_stat) );
1816 // SYS_freebsd11_lstat 190
1817 // int lstat(const char * restrict path, struct stat * restrict sb);
1818 PRE(sys_freebsd11_lstat)
1820 PRINT("sys_freebsd11_lstat ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x )",ARG1,(char *)ARG1,ARG2);
1821 PRE_REG_READ2(sb, "lstat", const char *, path, struct freebsd11_stat *, sb);
1822 PRE_MEM_RASCIIZ( "lstat(path)", ARG1 );
1823 PRE_MEM_WRITE( "lstat(sb)", ARG2, sizeof(struct vki_freebsd11_stat) );
1826 POST(sys_freebsd11_lstat)
1828 vg_assert(SUCCESS);
1829 if (RES == 0) {
1830 POST_MEM_WRITE( ARG2, sizeof(struct vki_freebsd11_stat) );
1834 // SYS_pathconf 191
1835 // long pathconf(const char *path, int name);
1836 PRE(sys_pathconf)
1838 PRINT("sys_pathconf ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )",ARG1,(char *)ARG1,ARG2);
1839 PRE_REG_READ2(long, "pathconf", char *, path, int, name);
1840 PRE_MEM_RASCIIZ( "pathconf(path)", ARG1 );
1843 // SYS_fpathconf 192
1844 // long fpathconf(int fd, int name);
1845 PRE(sys_fpathconf)
1847 PRINT("sys_fpathconf ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )",ARG1,ARG2);
1848 PRE_REG_READ2(long, "fpathconf", int, fd, int, name);
1851 // SYS_getrlimit 194
1852 // generic
1854 // SYS_setrlimit 195
1855 // generic
1858 // SYS_freebsd11_getdirentries 196
1859 // int getdirentries(int fd, char *buf, int nbytes, long *basep);
1860 PRE(sys_freebsd11_getdirentries)
1862 *flags |= SfMayBlock;
1863 PRINT("sys_freebsd11_getdirentries ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,ARG2,ARG3);
1864 PRE_REG_READ4(int, "getdirentries",
1865 int, fd, char *, buf,
1866 int, nbytes,
1867 long *, basep);
1868 PRE_MEM_WRITE( "getdirentries(buf)", ARG2, ARG3 );
1869 if (ARG4) {
1870 PRE_MEM_WRITE( "getdirentries(basep)", ARG4, sizeof(long) );
1874 POST(sys_freebsd11_getdirentries)
1876 vg_assert(SUCCESS);
1877 if (RES > 0) {
1878 POST_MEM_WRITE( ARG2, RES );
1879 if ( ARG4 != 0 ) {
1880 POST_MEM_WRITE( ARG4, sizeof (long));
1885 // SYS_freebsd6_mmap 197
1886 // amd64 / x86
1889 // SYS___syscall 198
1890 // special handling
1892 // freebsd6_lseek 199 FreeBSD 10 and earlier
1893 // x86/amd64
1895 // freebsd6_truncate 200 FreeBSD 10 and earlier
1896 // x86/amd64
1898 // freebsd6_ftruncate 201 FreeBSD 10 and earlier
1899 // x86/amd64
1901 static Bool sysctl_kern_ps_strings(SizeT* out, SizeT* outlen)
1903 Word tmp = -1;
1904 const struct auxv *cauxv;
1906 for (cauxv = (struct auxv*)VG_(client_auxv); cauxv->a_type != VKI_AT_NULL; cauxv++) {
1907 if (cauxv->a_type == VKI_AT_PS_STRINGS) {
1908 tmp = (Word)cauxv->u.a_ptr;
1910 *out = tmp;
1911 *outlen = sizeof(size_t);
1912 return True;
1915 return False;
1918 static void sysctl_kern_usrstack(SizeT* out, SizeT* outlen)
1920 *out = VG_(get_usrstack)();
1921 *outlen = sizeof(ULong);
1924 static Bool sysctl_kern_proc_pathname(HChar *out, SizeT *len)
1926 const HChar *exe_name = VG_(resolved_exename);
1928 if (!len) {
1929 return False;
1932 if (!out) {
1933 HChar tmp[VKI_PATH_MAX];
1934 if (!VG_(realpath)(exe_name, tmp)) {
1935 return False;
1937 *len = VG_(strlen)(tmp)+1;
1938 return True;
1941 if (!VG_(realpath)(exe_name, out)) {
1942 return False;
1945 *len = VG_(strlen)(out)+1;
1946 return True;
1949 // SYS___sysctl 202
1950 /* int __sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen); */
1951 /* ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 */
1952 PRE(sys___sysctl)
1954 PRINT("sys_sysctl ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,SARG2,ARG3,ARG4,ARG5,ARG6 );
1956 int* name = (int*)ARG1;
1957 if (ML_(safe_to_deref)(name, sizeof(int))) {
1958 PRINT("\nmib[0]: ");
1959 if (SARG2 >= 1) {
1960 switch (name[0]) {
1961 case 0: // CTL_UNSPEC
1962 PRINT("unspec");
1963 break;
1964 case 1: // CTL_KERN
1965 PRINT("kern");
1966 break;
1967 case 2: // CTL_VM
1968 PRINT("vm");
1969 break;
1970 case 3: // CTL_VFS
1971 PRINT("vfs");
1972 break;
1973 case 4: // CTL_NET
1974 PRINT("net");
1975 break;
1976 case 5: // CTL_DEBUG
1977 PRINT("debug");
1978 break;
1979 case 6: // CTL_HW
1980 PRINT("hw");
1981 break;
1982 case 7: // CTL_MACHDEP
1983 PRINT("machdep");
1984 break;
1985 case 8: // CTL _USER
1986 PRINT("user");
1987 break;
1988 case 9: //CTL_P1003_1B
1989 PRINT("p1003_b1b");
1990 break;
1991 default:
1992 PRINT("unrecognized (%d)", ((int*)ARG1)[0]);
1993 break;
1996 if (SARG2 >= 2 && ML_(safe_to_deref)(name, 2*sizeof(int))) {
1997 PRINT(" mib[1]: %d\n", name[1]);
2002 * Special handling cases
2004 * 1. kern.usrstack
2005 * This sysctl returns the address of the bottom of the user stack
2006 * (that is the highest user stack address, since the stack grows
2007 * downwards). Without any special handling this would return the
2008 * address of the host userstack. We have created a stack for the
2009 * guest (in aspacemgr) and that is the one that we want the guest
2010 * to see. Aspacemgr is setup in m_main.c with the addresses and sizes
2011 * saved to file static variables in that file, so we call
2012 * VG_(get_usrstack)() to retrieve them from there.
2014 if (SARG2 == 2 && ML_(safe_to_deref)(name, 2*sizeof(int))) {
2015 if (name[0] == 1 && name[1] == 33) {
2016 // kern.usrstack
2017 sysctl_kern_usrstack((SizeT*)ARG3, (SizeT*)ARG4);
2018 SET_STATUS_Success(0);
2023 * 2. kern.ps_strings
2025 if (SARG2 == 2 && ML_(safe_to_deref)(name, 2*sizeof(int))) {
2026 if (name[0] == 1 && name[1] == 32) {
2027 if (sysctl_kern_ps_strings((SizeT*)ARG3, (SizeT*)ARG4)) {
2028 SET_STATUS_Success(0);
2034 * 3. kern.proc.pathname
2036 if (SARG2 == 4 && ML_(safe_to_deref)(name, 4*sizeof(int))) {
2037 if (name[0] == 1 && name[1] == 14 && name[2] == 12) {
2038 vki_pid_t pid = (vki_pid_t)name[3];
2039 if (pid == -1 || pid == VG_(getpid)()) {
2040 sysctl_kern_proc_pathname((HChar *)ARG3, (SizeT *)ARG4);
2041 SET_STATUS_Success(0);
2046 PRE_REG_READ6(int, "__sysctl", int *, name, vki_u_int32_t, namelen, void *, oldp,
2047 vki_size_t *, oldlenp, void *, newp, vki_size_t, newlen);
2049 // read number of ints specified in ARG2 from mem pointed to by ARG1
2050 PRE_MEM_READ("sysctl(name)", (Addr)ARG1, ARG2 * sizeof(int));
2052 // if 'newp' is not NULL can read namelen bytes from that address
2053 if (ARG5 != (UWord)NULL) {
2054 PRE_MEM_READ("sysctl(newp)", (Addr)ARG5, ARG6);
2057 // there are two scenarios for oldlenp/oldp
2058 // 1. oldval is NULL and oldlenp is non-NULL
2059 // this is a query of oldlenp so oldlenp will be written
2060 // 2. Both are non-NULL
2061 // this is a query of oldp, oldlenp will be read and oldp will
2062 // be written
2064 // More thoughts on this
2065 // if say oldp is a string buffer
2066 // oldlenp will point to the length of the buffer
2068 // but on return does oldlenp also get updated?
2070 // is oldlenp is not NULL, can write
2071 if (ARG4 != (UWord)NULL) {
2072 if (ARG3 != (UWord)NULL) {
2073 // case 2 above
2074 PRE_MEM_READ("sysctl(oldlenp)", (Addr)ARG4, sizeof(vki_size_t));
2075 PRE_MEM_WRITE("sysctl(oldlenp)", (Addr)ARG4, sizeof(vki_size_t));
2076 if (ML_(safe_to_deref)((void*)(Addr)ARG4, sizeof(vki_size_t))) {
2077 PRE_MEM_WRITE("sysctl(oldp)", (Addr)ARG3, *(vki_size_t *)ARG4);
2078 } else {
2079 VG_(dmsg)("Warning: Bad oldlenp address %p in sysctl\n",
2080 (void *)(Addr)ARG4);
2081 SET_STATUS_Failure ( VKI_EFAULT );
2083 } else {
2084 // case 1 above
2085 PRE_MEM_WRITE("sysctl(oldlenp)", (Addr)ARG4, sizeof(vki_size_t));
2090 POST(sys___sysctl)
2092 if (ARG4 != (UWord)NULL) {
2093 if (ARG3 != (UWord)NULL) {
2094 POST_MEM_WRITE((Addr)ARG4, sizeof(vki_size_t));
2095 POST_MEM_WRITE((Addr)ARG3, *(vki_size_t *)ARG4);
2096 } else {
2097 POST_MEM_WRITE((Addr)ARG4, sizeof(vki_size_t));
2102 // SYS_mlock 203
2103 // generic
2105 // SYS_munlock 204
2106 // generic
2108 // SYS_undelete 205
2109 // int undelete(const char *path);
2110 PRE(sys_undelete)
2112 *flags |= SfMayBlock;
2113 PRINT("sys_undelete ( %#" FMT_REGWORD "x(%s) )", ARG1,(char *)ARG1);
2114 PRE_REG_READ1(int, "undelete", const char *, path);
2115 PRE_MEM_RASCIIZ( "undelete(path)", ARG1 );
2118 // SYS_futimes 206
2119 // int futimes(int fd, const struct timeval *times);
2120 PRE(sys_futimes)
2122 PRINT("sys_lutimes ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2);
2123 PRE_REG_READ2(long, "futimes", int, fd, struct timeval *, times);
2124 if (ARG2 != 0) {
2125 PRE_MEM_READ( "futimes(times)", ARG2, sizeof(struct vki_timeval) );
2129 // SYS_getpgid 207
2130 // generic
2132 // SYS_poll 209
2133 // generic
2135 // SYS_freebsd7___semctl 220
2136 // int semctl(int semid, int semnum, int cmd, ...);
2137 #if !defined(VGP_arm64_freebsd)
2138 PRE(sys_freebsd7___semctl)
2140 union vki_semun* semun;
2141 switch (ARG3) {
2142 case VKI_IPC_STAT:
2143 case VKI_SEM_STAT:
2144 case VKI_IPC_SET:
2145 case VKI_GETALL:
2146 case VKI_SETALL:
2147 PRINT("sys_freebsd7___semctl ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )",ARG1,ARG2,ARG3,ARG4);
2148 PRE_REG_READ4(int, "semctl",
2149 int, semid, int, semnum, int, cmd, union vki_semun *, arg);
2150 PRE_MEM_READ("sys_freebsd7___semctl(arg)", ARG4, sizeof(union vki_semun));
2151 semun = (union vki_semun*)ARG4;
2152 if (ML_(safe_to_deref)(semun, sizeof(*semun))) {
2153 ARG4 = (RegWord)semun;
2154 ML_(generic_PRE_sys_semctl)(tid, ARG1,ARG2,ARG3,ARG4);
2156 break;
2157 default:
2158 PRINT("sys_freebsd7___semctl ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
2159 PRE_REG_READ3(long, "semctl",
2160 int, semid, int, semnum, int, cmd);
2161 break;
2165 POST(sys_freebsd7___semctl)
2167 union vki_semun* semun = (union vki_semun*)ARG4;
2168 if (ML_(safe_to_deref)(semun, sizeof(*semun))) {
2169 ARG4 = (RegWord)semun;
2170 ML_(generic_POST_sys_semctl)(tid, RES, ARG1,ARG2,ARG3,ARG4);
2173 #endif
2175 // SYS_semget 221
2176 // int semget(key_t key, int nsems, int flag);
2177 PRE(sys_semget)
2179 PRINT("sys_semget ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
2180 PRE_REG_READ3(int, "semget", vki_key_t, key, int, nsems, int, flag);
2183 // SYS_semop 222
2184 // int semop(int semid, struct sembuf *array, size_t nops);
2185 PRE(sys_semop)
2187 *flags |= SfMayBlock;
2188 PRINT("sys_semop ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
2189 PRE_REG_READ3(int, "semop",
2190 int, semid, struct sembuf *, array, unsigned, nops);
2191 ML_(generic_PRE_sys_semop)(tid, ARG1,ARG2,ARG3);
2194 // SYS_freebsd7_msgctl 224
2195 // int msgctl(int msqid, int cmd, struct msqid_ds_old *buf);
2196 #if !defined(VGP_arm64_freebsd)
2197 PRE(sys_freebsd7_msgctl)
2199 PRINT("sys_freebsd7_msgctl ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1,SARG2,ARG3 );
2201 PRE_REG_READ3(int, "msgctl", int, msqid, int, cmd, struct msqid_ds_old *, buf);
2203 switch (ARG2 /* cmd */) {
2204 case VKI_IPC_STAT:
2205 PRE_MEM_WRITE( "msgctl(IPC_STAT, buf)",
2206 ARG3, sizeof(struct vki_msqid_ds_old) );
2207 break;
2208 case VKI_IPC_SET:
2209 PRE_MEM_READ( "msgctl(IPC_SET, buf)",
2210 ARG3, sizeof(struct vki_msqid_ds_old) );
2211 break;
2215 POST(sys_freebsd7_msgctl)
2217 switch (ARG2 /* cmd */) {
2218 case VKI_IPC_STAT:
2219 POST_MEM_WRITE( ARG3, sizeof(struct vki_msqid_ds_old) );
2220 break;
2223 #endif
2225 // SYS_msgget 225
2226 // int msgget(key_t key, int msgflg);
2227 PRE(sys_msgget)
2229 PRINT("sys_msgget ( %" FMT_REGWORD"d, %" FMT_REGWORD"d )",SARG1,SARG2);
2230 PRE_REG_READ2(int, "msgget", key_t, key, int, msgflg);
2233 // SYS_msgsnd 226
2234 // int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);
2235 PRE(sys_msgsnd)
2237 PRINT("sys_msgsnd ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %" FMT_REGWORD "d )", SARG1,ARG2,SARG3,SARG4 );
2238 PRE_REG_READ4(int, "msgsnd", int, msqid, struct msgbuf *, msgp, size_t, msgsz, int, msgflg);
2239 struct vki_msgbuf *msgp = (struct vki_msgbuf *)ARG2;
2240 PRE_MEM_READ( "msgsnd(msgp->mtype)", (Addr)&msgp->mtype, sizeof(msgp->mtype) );
2241 PRE_MEM_READ( "msgsnd(msgp->mtext)", (Addr)&msgp->mtext, ARG3 );
2243 // SYS_msgrcv 227
2244 // ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);
2245 PRE(sys_msgrcv)
2247 *flags |= SfMayBlock;
2249 PRINT("sys_msgrcv ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "d, %" FMT_REGWORD "d )", SARG1,ARG2,ARG3,SARG4,SARG5 );
2250 PRE_REG_READ5(ssize_t, "msgrcv", int, msqid, struct msgbuf *, msgp, size_t, msgsz,
2251 long, msgtyp, int, msgflg);
2252 struct vki_msgbuf *msgp = (struct vki_msgbuf *)ARG2;
2253 PRE_MEM_WRITE( "msgrcv(msgp->mtype)", (Addr)&msgp->mtype, sizeof(msgp->mtype) );
2254 PRE_MEM_WRITE( "msgrcv(msgp->mtext)", (Addr)&msgp->mtext, ARG3 );
2257 POST(sys_msgrcv)
2259 struct vki_msgbuf *msgp = (struct vki_msgbuf *)ARG2;
2260 POST_MEM_WRITE( (Addr)&msgp->mtype, sizeof(msgp->mtype) );
2261 POST_MEM_WRITE( (Addr)&msgp->mtext, RES );
2264 // SYS_shmat 228
2265 // void * shmat(int shmid, const void *addr, int flag);
2266 PRE(sys_shmat)
2268 UWord arg2tmp;
2269 PRINT("sys_shmat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
2270 PRE_REG_READ3(void *, "shmat",
2271 int, shmid, const void *, addr, int, flag);
2272 arg2tmp = ML_(generic_PRE_sys_shmat)(tid, ARG1,ARG2,ARG3);
2273 if (arg2tmp == 0) {
2274 SET_STATUS_Failure( VKI_EINVAL );
2275 } else {
2276 ARG2 = arg2tmp;
2280 POST(sys_shmat)
2282 ML_(generic_POST_sys_shmat)(tid, RES,ARG1,ARG2,ARG3);
2285 // SYS_freebsd7_shmctl 229
2286 // int shmctl(int shmid, int cmd, struct shmid_ds *buf);
2287 #if !defined(VGP_arm64_freebsd)
2288 PRE(sys_freebsd7_shmctl)
2290 PRINT("sys_freebsd7_shmctl ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )",SARG1,SARG2,ARG3);
2291 PRE_REG_READ3(int, "shmctl",
2292 int, shmid, int, cmd, struct vki_shmid_ds_old *, buf);
2293 switch (ARG2 /* cmd */) {
2294 case VKI_IPC_STAT:
2295 PRE_MEM_WRITE( "shmctl7(IPC_STAT, buf)",
2296 ARG3, sizeof(struct vki_shmid_ds_old) );
2297 break;
2298 case VKI_IPC_SET:
2299 PRE_MEM_READ( "shmctl7(IPC_SET, buf)",
2300 ARG3, sizeof(struct vki_shmid_ds_old) );
2301 break;
2305 POST(sys_freebsd7_shmctl)
2307 if (ARG2 == VKI_IPC_STAT) {
2308 POST_MEM_WRITE( ARG3, sizeof(struct vki_shmid_ds_old) );
2311 #endif
2313 // SYS_shmdt 230
2314 // int shmdt(const void *addr);
2315 PRE(sys_shmdt)
2317 PRINT("sys_shmdt ( %#" FMT_REGWORD "x )",ARG1);
2318 PRE_REG_READ1(int, "shmdt", const void *, addr);
2319 if (!ML_(generic_PRE_sys_shmdt)(tid, ARG1)) {
2320 SET_STATUS_Failure( VKI_EINVAL );
2324 POST(sys_shmdt)
2326 ML_(generic_POST_sys_shmdt)(tid, RES,ARG1);
2329 // SYS_shmget 231
2330 // int shmget(key_t key, size_t size, int flag);
2331 PRE(sys_shmget)
2333 PRINT("sys_shmget ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
2334 PRE_REG_READ3(int, "shmget", vki_key_t, key, vki_size_t, size, int, flag);
2338 // SYS_clock_gettime 232
2339 // int clock_gettime(clockid_t clock_id, struct timespec *tp);
2340 PRE(sys_clock_gettime)
2342 PRINT("sys_clock_gettime( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2);
2343 PRE_REG_READ2(int, "clock_gettime",
2344 vki_clockid_t, clk_id, struct timespec *, tp);
2345 PRE_MEM_WRITE( "clock_gettime(tp)", ARG2, sizeof(struct vki_timespec) );
2348 POST(sys_clock_gettime)
2350 POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
2353 // SYS_clock_settime 233
2354 // int clock_settime(clockid_t clock_id, const struct timespec *tp);
2355 PRE(sys_clock_settime)
2357 PRINT("sys_clock_settime( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2);
2358 PRE_REG_READ2(int, "clock_settime",
2359 vki_clockid_t, clk_id, const struct timespec *, tp);
2360 PRE_MEM_READ( "clock_settime(tp)", ARG2, sizeof(struct vki_timespec) );
2363 // SYS_clock_getres 234
2364 // int clock_getres(clockid_t clock_id, struct timespec *tp);
2365 PRE(sys_clock_getres)
2367 PRINT("sys_clock_getres( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2);
2368 // Nb: we can't use "RES" as the param name because that's a macro
2369 // defined above!
2370 PRE_REG_READ2(int, "clock_getres",
2371 vki_clockid_t, clock_id, struct timespec *, tp);
2372 if (ARG2 != 0) {
2373 PRE_MEM_WRITE( "clock_getres(tp)", ARG2, sizeof(struct vki_timespec) );
2377 POST(sys_clock_getres)
2379 if (ARG2 != 0) {
2380 POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
2384 // SYS_ktimer_create 235
2385 // int timer_create(clockid_t clockid, struct sigevent *restrict evp,
2386 // timer_t *restrict timerid);
2387 PRE(sys_timer_create)
2389 PRINT("sys_timer_create( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", SARG1,ARG2,ARG3);
2390 PRE_REG_READ3(int, "timer_create",
2391 vki_clockid_t, clockid, struct sigevent *, evp,
2392 vki_timer_t *, timerid);
2393 if (ARG2 != 0) {
2394 PRE_MEM_READ( "timer_create(evp)", ARG2, sizeof(struct vki_sigevent) );
2396 PRE_MEM_WRITE( "timer_create(timerid)", ARG3, sizeof(vki_timer_t) );
2399 POST(sys_timer_create)
2401 POST_MEM_WRITE( ARG3, sizeof(vki_timer_t) );
2404 // SYS_ktimer_delete 236
2405 // int timer_delete(timer_t timerid);
2406 PRE(sys_timer_delete)
2408 PRINT("sys_timer_delete( %#" FMT_REGWORD "x )", ARG1);
2409 PRE_REG_READ1(long, "timer_delete", vki_timer_t, timerid);
2412 // SYS_ktimer_settime 237
2413 // int timer_settime(timer_t timerid, int flags,
2414 // const struct itimerspec *restrict value,
2415 // struct itimerspec *restrict ovalue);
2416 PRE(sys_timer_settime)
2418 PRINT("sys_timer_settime( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1,SARG2,ARG3,ARG4);
2419 PRE_REG_READ4(int, "timer_settime",
2420 vki_timer_t, timerid, int, flags,
2421 const struct itimerspec *, value,
2422 struct itimerspec *, ovalue);
2423 PRE_MEM_READ( "timer_settime(value)", ARG3,
2424 sizeof(struct vki_itimerspec) );
2425 if (ARG4 != 0) {
2426 PRE_MEM_WRITE( "timer_settime(ovalue)", ARG4,
2427 sizeof(struct vki_itimerspec) );
2431 POST(sys_timer_settime)
2433 if (ARG4 != 0) {
2434 POST_MEM_WRITE( ARG4, sizeof(struct vki_itimerspec) );
2438 // SYS_ktimer_gettime 238
2439 // int timer_gettime(timer_t timerid, struct itimerspec *value);
2440 PRE(sys_timer_gettime)
2442 PRINT("sys_timer_gettime( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1,ARG2);
2443 PRE_REG_READ2(long, "timer_gettime",
2444 vki_timer_t, timerid, struct itimerspec *, value);
2445 PRE_MEM_WRITE( "timer_gettime(value)", ARG2,
2446 sizeof(struct vki_itimerspec));
2449 POST(sys_timer_gettime)
2451 POST_MEM_WRITE( ARG2, sizeof(struct vki_itimerspec) );
2454 // SYS_ktimer_getoverrun 239
2455 // int timer_getoverrun(timer_t timerid);
2456 PRE(sys_timer_getoverrun)
2458 PRINT("sys_timer_getoverrun( %#" FMT_REGWORD "x )", ARG1);
2459 PRE_REG_READ1(int, "timer_getoverrun", vki_timer_t, timerid);
2462 // SYS_nanosleep 240
2463 // generic
2465 // SYS_ffclock_getcounter 241
2466 // int ffclock_getcounter(ffcounter *ffcount);
2467 // @todo
2469 // SYS_ffclock_setestimate 242
2470 // int ffclock_setestimate(struct ffclock_estimate *cest);
2471 // @todo
2473 // SYS_ffclock_getestimate 243
2474 // int ffclock_getestimate(struct ffclock_estimate *cest);
2475 // @todo
2477 // SYS_clock_nanosleep 244
2478 // int clock_nanosleep(clockid_t clock_id, int flags,
2479 // const struct timespec *rqtp, struct timespec *rmtp);
2480 PRE(sys_clock_nanosleep)
2482 *flags |= SfMayBlock|SfPostOnFail;
2483 PRINT("sys_clock_nanosleep ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
2484 SARG1, SARG2, ARG3, ARG4);
2485 PRE_REG_READ4(int, "clock_nanosleep", vki_clockid_t, clock_id, int, flags,
2486 const struct timespec *, rqtp, struct timespec *, rmtp);
2487 PRE_MEM_READ("clock_nanosleep(rqtp)", ARG3, sizeof(struct vki_timespec));
2488 if (ARG4 != 0) {
2489 PRE_MEM_WRITE( "clock_nanosleep(rmtp)", ARG4, sizeof(struct vki_timespec) );
2493 POST(sys_clock_nanosleep)
2495 if (ARG4 != 0 && FAILURE && ERR == VKI_EINTR) {
2496 POST_MEM_WRITE( ARG4, sizeof(struct vki_timespec) );
2500 // SYS_clock_getcpuclockid2 247
2501 // x86/amd64
2503 POST(sys_clock_getcpuclockid2)
2505 POST_MEM_WRITE(ARG3, sizeof(vki_clockid_t));
2509 // SYS_ntp_gettime 248
2510 // int ntp_gettime(struct ntptimeval *);
2511 // @todo
2513 // SYS_minherit 250
2514 // int minherit(void *addr, size_t len, int inherit);
2515 PRE(sys_minherit)
2517 PRINT("sys_minherit( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1,ARG2,ARG3);
2518 PRE_REG_READ3(int, "minherit",
2519 void *, addr, vki_size_t, len, int, inherit);
2520 if (ARG2 != 0) {
2521 PRE_MEM_WRITE( "minherit(addr)", ARG1,ARG2 );
2525 POST(sys_minherit)
2527 if (ARG2 != 0) {
2528 POST_MEM_WRITE( ARG1, ARG2 );
2532 // SYS_rfork 251
2533 // x86/amd64 not functional
2535 // SYS_issetugid 253
2536 // int issetugid(void);
2537 PRE(sys_issetugid)
2539 PRINT("%s", "sys_issetugid ()");
2540 PRE_REG_READ0(long, "issetugid");
2543 // SYS_lchown 254
2544 // generic
2546 // We must record the iocb for each aio_read() in a table so that when
2547 // aio_return() is called we can mark the memory written asynchronously by
2548 // aio_read() as having been written. We don't have to do this for
2549 // aio_write(). See bug 197227 for more details.
2550 static OSet* iocb_table = NULL;
2551 static Bool aio_init_done = False;
2553 static void aio_init(void)
2555 iocb_table = VG_(OSetWord_Create)(VG_(malloc), "syswrap.aio", VG_(free));
2556 aio_init_done = True;
2559 // and the same thing for vector reads
2560 static OSet* iocbv_table = NULL;
2561 static Bool aiov_init_done = False;
2563 static void aiov_init(void)
2565 iocbv_table = VG_(OSetWord_Create)(VG_(malloc), "syswrap.aiov", VG_(free));
2566 aiov_init_done = True;
2570 // SYS_aio_read 255
2571 // int aio_read(struct aiocb *iocb);
2572 PRE(sys_aio_read)
2574 PRINT("sys_aio_read ( %#" FMT_REGWORD "x )", ARG1);
2575 PRE_REG_READ1(int, "aio_read", struct vki_aiocb *, iocb);
2576 PRE_MEM_READ("aio_read(iocb)", ARG1, sizeof(struct vki_aiocb));
2577 if (ML_(safe_to_deref)((struct vki_aiocb *)ARG1, sizeof(struct vki_aiocb))) {
2578 struct vki_aiocb *iocb = (struct vki_aiocb *)ARG1;
2579 if (!ML_(fd_allowed)(iocb->aio_fildes, "aio_read", tid, False)) {
2580 SET_STATUS_Failure(VKI_EBADF);
2581 } else {
2582 PRE_MEM_WRITE("aio_read(aiocbp->aio_buf)",
2583 (Addr)iocb->aio_buf, iocb->aio_nbytes);
2584 // @todo PJF there is a difference between FreeBSD and
2585 // Darwin here. On Darwin, if aio_buf is NULL the syscall
2586 // will fail, on FreeBSD it doesn't fail.
2588 } else {
2589 SET_STATUS_Failure(VKI_EINVAL);
2593 POST(sys_aio_read)
2595 struct vki_aiocb* iocb = (struct vki_aiocb*)ARG1;
2597 if (iocb->aio_buf) {
2598 if (!aio_init_done) {
2599 aio_init();
2601 // see also POST(sys_aio_readv)
2602 if (!VG_(OSetWord_Contains)(iocb_table, (UWord)iocb)) {
2603 VG_(OSetWord_Insert)(iocb_table, (UWord)iocb);
2604 } else {
2605 // @todo PJF this warns without callstack
2606 VG_(dmsg)("Warning: Duplicate control block %p in aio_read\n",
2607 (void *)(Addr)ARG1);
2608 VG_(dmsg)("Warning: Ensure 'aio_return' is called when 'aio_read' has completed\n");
2613 // SYS_aio_write 256
2614 // int aio_write(struct aiocb *iocb);
2615 PRE(sys_aio_write)
2617 PRINT("sys_aio_write ( %#" FMT_REGWORD "x )", ARG1);
2618 PRE_REG_READ1(int, "aio_write", struct vki_aiocb *, iocb);
2619 PRE_MEM_READ("aio_write(iocb)", ARG1, sizeof(struct vki_aiocb));
2620 if (ML_(safe_to_deref)((struct vki_aiocb *)ARG1, sizeof(struct vki_aiocb))) {
2621 struct vki_aiocb *iocb = (struct vki_aiocb *)ARG1;
2622 if (!ML_(fd_allowed)(iocb->aio_fildes, "aio_write", tid, False)) {
2623 SET_STATUS_Failure( VKI_EBADF );
2624 } else {
2625 PRE_MEM_READ("aio_write(iocb->aio_buf)",
2626 (Addr)iocb->aio_buf, iocb->aio_nbytes);
2627 // @todo PJF there is a difference between FreeBSD and
2628 // Darwin here. On Darwin, if aio_buf is NULL the syscall
2629 // will fail, on FreeBSD it doesn't fail.
2631 } else {
2632 SET_STATUS_Failure(VKI_EINVAL);
2636 // SYS_lio_listio 257
2637 // int lio_listio(int mode, struct aiocb * const list[], int nent,
2638 // struct sigevent *sig);
2639 PRE(sys_lio_listio)
2641 PRINT("sys_lio_listio ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )",
2642 SARG1, ARG2, SARG3, ARG4);
2643 PRE_REG_READ4(int, "lio_listio", int, mode, struct aiocb * const *, list, int, nent,
2644 struct sigevent *,sig);
2645 PRE_MEM_READ("lio_listio(list)", ARG2, ARG3*sizeof(struct vki_aiocb *));
2646 // loop check elements
2647 if (ML_(safe_to_deref)((struct vki_aiocb **)ARG2, ARG3*sizeof(struct vki_aiocb *))) {
2648 struct vki_aiocb** list = (struct vki_aiocb **)ARG2;
2649 for (int i = 0; i < (int)ARG3; ++i) {
2650 if (list[i]) {
2651 PRE_MEM_READ("lio_listio(list[?])", (Addr)list[i], ARG3*sizeof(struct vki_aiocb));
2653 // @todo
2654 // figure out what gets read/written
2655 // when list[i]->aio_lio_opcode == VKI_LIO_READ and
2656 // when list[i]->aio_lio_opcode == VKI_LIO_WRITE
2657 //if (ML_(safe_to_deref)(list[i], ARG3*sizeof(struct vki_aiocb))) {
2662 if (ARG1 & VKI_LIO_WAIT) {
2663 *flags |= SfMayBlock;
2666 if (ARG4 && (ARG1 == VKI_LIO_NOWAIT)) {
2667 PRE_MEM_READ("lio_listio(sig)", ARG4, sizeof(struct vki_sigevent));
2671 // SYS_freebsd11_getdents 272
2672 // generic
2674 // SYS_lchmod 274
2675 // int lchmod(const char *path, mode_t mode);
2676 PRE(sys_lchmod)
2678 PRINT("sys_lchmod ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )", ARG1,(char *)ARG1,ARG2);
2679 PRE_REG_READ2(int, "lchmod", const char *, path, vki_mode_t, mode);
2680 PRE_MEM_RASCIIZ( "lchmod(path)", ARG1 );
2683 // SYS_lutimes 276
2684 // int lutimes(const char *path, const struct timeval *times);
2685 PRE(sys_lutimes)
2687 PRINT("sys_lutimes ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x )", ARG1,(char *)ARG1,ARG2);
2688 PRE_REG_READ2(int, "lutimes", char *, path, struct timeval *, times);
2689 PRE_MEM_RASCIIZ( "lutimes(path)", ARG1 );
2690 if (ARG2 != 0) {
2691 PRE_MEM_READ( "lutimes(times)", ARG2, sizeof(struct vki_timeval) );
2695 // SYS_freebsd11_nstat 278
2696 // @todo, maybe
2698 // SYS_freebsd11_nfstat 279
2699 // @todo, maybe
2701 // SYS_freebsd11_nlstat 280
2702 // @todo, maybe
2704 // SYS_preadv 289
2705 // amd64 / x86
2707 // SYS_pwritev 290
2708 // amd64 / x86
2710 // SYS_fhopen 298
2711 // int fhopen(const fhandle_t *fhp, int flags);
2712 PRE(sys_fhopen)
2714 PRINT("sys_open ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",ARG1,ARG2);
2715 PRE_REG_READ2(int, "fhopen",
2716 struct fhandle_t *, fhp, int, flags);
2717 PRE_MEM_READ( "fhopen(fhp)", ARG1, sizeof(struct vki_fhandle) );
2719 /* Otherwise handle normally */
2720 *flags |= SfMayBlock;
2723 POST(sys_fhopen)
2725 vg_assert(SUCCESS);
2726 if (!ML_(fd_allowed)(RES, "fhopen", tid, True)) {
2727 VG_(close)(RES);
2728 SET_STATUS_Failure( VKI_EMFILE );
2729 } else {
2730 if (VG_(clo_track_fds)) {
2731 ML_(record_fd_open_nameless)(tid, RES);
2736 // SYS_freebsd11_fhstat 299
2737 // int fhstat(const fhandle_t *fhp, struct stat *sb);
2738 PRE(sys_freebsd11_fhstat)
2740 PRINT("sys_freebsd11_fhstat ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",ARG1,ARG2);
2741 PRE_REG_READ2(int, "fhstat", struct fhandle *, fhp, struct freebd11_stat *, sb);
2742 PRE_MEM_READ( "fhstat(fhp)", ARG1, sizeof(struct vki_fhandle) );
2743 PRE_MEM_WRITE( "fhstat(sb)", ARG2, sizeof(struct vki_freebsd11_stat) );
2746 POST(sys_freebsd11_fhstat)
2748 POST_MEM_WRITE( ARG2, sizeof(struct vki_freebsd11_stat) );
2751 // SYS_modnext 300
2752 // int modnext(int modid);
2753 PRE(sys_modnext)
2755 PRINT("sys_modnext ( %" FMT_REGWORD "d )",SARG1);
2756 PRE_REG_READ1(int, "modnext", int, modid);
2759 // SYS_modstat 301
2760 // int modstat(int modid, struct module_stat *stat);
2761 PRE(sys_modstat)
2763 PRINT("sys_modstat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )",ARG1,ARG2);
2764 PRE_REG_READ2(int, "modstat", int, modid, struct module_stat *, buf);
2765 PRE_MEM_WRITE( "modstat(stat)", ARG2, sizeof(struct vki_module_stat) );
2768 POST(sys_modstat)
2770 POST_MEM_WRITE( ARG2, sizeof(struct vki_module_stat) );
2773 // SYS_modfnext 302
2774 // int modfnext(int modid);
2775 PRE(sys_modfnext)
2777 PRINT("sys_modfnext ( %" FMT_REGWORD "d )",SARG1);
2778 PRE_REG_READ1(int, "modfnext", int, modid);
2781 // SYS_modfind 303
2782 // int modfind(const char *modname);
2783 PRE(sys_modfind)
2785 PRINT("sys_modfind ( %#" FMT_REGWORD "x )",ARG1);
2786 PRE_REG_READ1(long, "modfind", char *, modname);
2787 PRE_MEM_RASCIIZ( "modfind(modname)", ARG1 );
2790 // SYS_kldload 304
2791 // int kldload(const char *file);
2792 PRE(sys_kldload)
2794 PRINT("sys_kldload ( %#" FMT_REGWORD "x(%s) )", ARG1, (char *)ARG1);
2795 PRE_REG_READ1(int, "kldload", const char *, "file");
2796 PRE_MEM_RASCIIZ( "kldload(file)", ARG1 );
2799 // SYS_kldunload 305
2800 // int kldunload(int fileid);
2801 PRE(sys_kldunload)
2803 PRINT("sys_kldunload ( %" FMT_REGWORD "u )", ARG1);
2804 PRE_REG_READ1(int, "kldunload", int, "fileid");
2807 // SYS_kldfind 306
2808 // int kldfind(const char *file);
2809 PRE(sys_kldfind)
2811 PRINT("sys_kldfind ( %#" FMT_REGWORD "x(%s) )", ARG1, (char *)ARG1);
2812 PRE_REG_READ1(int, "kldfind", const char *, file);
2813 PRE_MEM_RASCIIZ( "kldfind(file)", ARG1 );
2816 // SYS_kldnext 307
2817 // int kldnext(int fileid);
2818 PRE(sys_kldnext)
2820 PRINT("sys_kldnext ( %" FMT_REGWORD "u )", ARG1);
2821 PRE_REG_READ1(int, "kldnext", int, fileid);
2824 // SYS_kldstat 308
2825 // int kldstat(int fileid, struct kld_file_stat *stat);
2826 PRE(sys_kldstat)
2828 PRINT("sys_kldstat ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, ARG2);
2829 PRE_REG_READ2(int, "kldstat", int, fileid, struct kld_file_stat*, stat);
2830 PRE_MEM_WRITE("kldstat(stat)", ARG2, sizeof(struct vki_kld_file_stat));
2833 POST(sys_kldstat)
2835 POST_MEM_WRITE(ARG2, sizeof(struct vki_kld_file_stat));
2838 // SYS_kldfirstmod 309
2839 // int kldfirstmod(int fileid);
2840 PRE(sys_kldfirstmod)
2842 PRINT("sys_kldfirstmod ( %" FMT_REGWORD "u )", ARG1);
2843 PRE_REG_READ1(int, "kldfirstmod", int, fileid);
2846 // SYS_setresuid 311
2847 // int setresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
2848 PRE(sys_setresuid)
2850 PRINT("sys_setresuid ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3);
2851 PRE_REG_READ3(int, "setresuid",
2852 vki_uid_t, ruid, vki_uid_t, euid, vki_uid_t, suid);
2855 // SYS_setresgid 312
2856 // int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
2857 PRE(sys_setresgid)
2859 PRINT("sys_setresgid ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3);
2860 PRE_REG_READ3(int, "setresgid",
2861 vki_gid_t, rgid, vki_gid_t, egid, vki_gid_t, sgid);
2864 // SYS_aio_return 314
2865 // ssize_t aio_return(struct aiocb *iocb);
2866 PRE(sys_aio_return)
2868 PRINT("sys_aio_return ( %#" FMT_REGWORD "x )", ARG1);
2869 PRE_REG_READ1(ssize_t, "aio_return", struct aiocb *, iocb);
2870 PRE_MEM_READ("aio_return(iocb)", ARG1, sizeof(struct vki_aiocb));
2871 // read or write?
2872 if (ML_(safe_to_deref)((struct vki_aiocb *)ARG1, sizeof(struct vki_aiocb))) {
2873 SET_STATUS_from_SysRes(VG_(do_syscall1)(SYSNO, ARG1));
2874 /*if (SUCCESS)*/ {
2875 struct vki_aiocb* iocb = (struct vki_aiocb*)ARG1;
2876 if (!aio_init_done) {
2877 aio_init();
2879 if (!aiov_init_done) {
2880 aiov_init();
2883 // for the happy path aio_return is supposed to be called
2884 // after the io has completed (as determined by aio_error,
2885 // aio_suspend or a signal).
2887 // but what if the aio_read failed or hasn't completed?
2888 // we want to remove the read from the iocb(v)_table
2889 // in the case of aio_read failing
2890 // if the read hasn't completed that's a user error
2891 // I don't know if it's possible to recover in that case
2892 // the iocb will have been removed from the table
2893 // so if the user does recover and call aio_return
2894 // 'correctly' we won't do the POST_MEM_WRITE
2895 // I don't think that we can tell apart a failing
2896 // read from a premature aio_return
2898 // check if it was a plain read
2899 if (VG_(OSetWord_Remove)(iocb_table, (UWord)iocb) && SUCCESS) {
2900 POST_MEM_WRITE((Addr)iocb->aio_buf, iocb->aio_nbytes);
2902 if (VG_(OSetWord_Remove)(iocbv_table, (UWord)iocb) && SUCCESS) {
2903 SizeT vec_count = (SizeT)iocb->aio_nbytes;
2904 // assume that id the read succeded p_iovec is accessible
2905 volatile struct vki_iovec* p_iovec = (volatile struct vki_iovec*)iocb->aio_buf;
2906 for (SizeT i = 0U; i < vec_count; ++i) {
2907 POST_MEM_WRITE((Addr)p_iovec[i].iov_base, p_iovec[i].iov_len);
2911 } else {
2912 SET_STATUS_Failure(VKI_EINVAL);
2916 // SYS_aio_suspend 315
2917 // int aio_suspend(const struct aiocb *const iocbs[], int niocb,
2918 // const struct timespec *timeout);
2919 PRE(sys_aio_suspend)
2921 PRINT("sys_aio_suspend ( %#" FMT_REGWORD "x )", ARG1);
2922 PRE_REG_READ3(int, "aio_suspend", const struct aiocb * const *, iocbs, int, nbiocb, const struct timespec*, timeout);
2923 if (ARG2 > 0) {
2924 PRE_MEM_READ("aio_suspend(iocbs)", ARG1, ARG2*sizeof(struct vki_aiocb*));
2926 if (ARG3) {
2927 PRE_MEM_READ("aio_suspend(timeout)", ARG3, sizeof(struct vki_timespec));
2931 // SYS_aio_cancel 316
2932 // int aio_cancel(int fildes, struct aiocb *iocb);
2933 PRE(sys_aio_cancel)
2935 PRINT("sys_aio_cancel ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, ARG2);
2936 PRE_REG_READ2(int, "aio_cancel", int, fildes, struct iocb *, iocb);
2937 if (ARG2) {
2938 PRE_MEM_READ("aio_cancel(iocb)", ARG2, sizeof(struct vki_aiocb));
2940 if (!ML_(fd_allowed)(ARG1, "aio_cancel", tid, False)) {
2941 SET_STATUS_Failure(VKI_EBADF);
2942 } else {
2943 if (ARG2) {
2944 if (ML_(safe_to_deref)((struct vki_aiocb *)ARG2, sizeof(struct vki_aiocb))) {
2945 // struct vki_aiocb *iocb = (struct vki_aiocb *)ARG2;
2946 // @todo PJF cancel only requests associated with
2947 // fildes and iocb
2948 // Do I need to remove pending reads from iocb(v)_table
2949 // or should the user always call aio_return even after
2950 // aio_cancel?
2951 } else {
2952 SET_STATUS_Failure(VKI_EINVAL);
2954 } else {
2955 // @todo PJF cancel all requests associated with fildes, see above
2960 // SYS_aio_error 317
2961 // int aio_error(const struct aiocb *iocb);
2962 PRE(sys_aio_error)
2964 PRINT("sys_aio_error ( %#" FMT_REGWORD "x )", ARG1);
2965 PRE_REG_READ1(ssize_t, "aio_error", struct aiocb *, iocb);
2966 PRE_MEM_READ("aio_error(iocb)", ARG1, sizeof(struct vki_aiocb));
2967 if (ARG1) {
2968 if (!ML_(safe_to_deref)((struct vki_aiocb *)ARG1, sizeof(struct vki_aiocb))) {
2969 SET_STATUS_Failure(VKI_EINVAL);
2974 // SYS_yield 321
2975 int yield(void);
2976 PRE(sys_yield)
2978 *flags |= SfMayBlock;
2979 PRINT("%s", "yield()");
2980 PRE_REG_READ0(long, "yield");
2983 // SYS_mlockall 324
2984 // generic
2986 // SYS_munlockall 325
2987 // int munlockall(void);
2988 PRE(sys_munlockall)
2990 *flags |= SfMayBlock;
2991 PRINT("%s", "sys_munlockall ( )");
2992 PRE_REG_READ0(int, "munlockall");
2995 // SYS___getcwd 326
2996 // int __getcwd(char *buf, size_t buflen);
2997 PRE(sys___getcwd)
2999 PRINT("sys___getcwd ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,ARG2);
3000 PRE_REG_READ2(long, "__getcwd", char *, buf, unsigned int, buflen);
3001 PRE_MEM_WRITE( "__getcwd(buf)", ARG1, ARG2 );
3004 POST(sys___getcwd)
3006 vg_assert(SUCCESS);
3007 if (RES == 0) {
3008 // QQQ it is unclear if this is legal or not, but the
3009 // QQQ kernel just wrote it there...
3010 // QQQ Why oh why didn't phk return the length from __getcwd()?
3011 UInt len = VG_(strlen) ( (char *)ARG1 ) + 1;
3012 POST_MEM_WRITE( ARG1, len );
3016 //SYS_sched_setparam 327
3017 // int sched_setparam(pid_t pid, const struct sched_param *param);
3018 PRE(sys_sched_setparam)
3020 PRINT("sched_setparam ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, ARG2 );
3021 PRE_REG_READ2(int, "sched_setparam",
3022 vki_pid_t, pid, struct sched_param *, param);
3023 PRE_MEM_READ( "sched_setparam(param)", ARG2, sizeof(struct vki_sched_param) );
3026 POST(sys_sched_setparam)
3028 POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) );
3031 // SYS_sched_getparam 328
3032 // int sched_getparam(pid_t pid, struct sched_param *param);
3033 PRE(sys_sched_getparam)
3035 PRINT("sched_getparam ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, ARG2 );
3036 PRE_REG_READ2(int, "sched_getparam",
3037 vki_pid_t, pid, struct sched_param *, param);
3038 PRE_MEM_WRITE( "sched_getparam(param)", ARG2, sizeof(struct vki_sched_param) );
3041 POST(sys_sched_getparam)
3043 POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) );
3046 // SYS_sched_setscheduler 329
3047 // int sched_setscheduler(pid_t pid, int policy,
3048 // const struct sched_param *param);
3049 PRE(sys_sched_setscheduler)
3051 PRINT("sys_sched_setscheduler ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1,SARG2,ARG3);
3052 PRE_REG_READ3(int, "sched_setscheduler",
3053 vki_pid_t, pid, int, policy, struct sched_param *, param);
3054 if (ARG3 != 0) {
3055 PRE_MEM_READ("sched_setscheduler(param)",
3056 ARG3, sizeof(struct vki_sched_param));
3060 // SYS_sched_getscheduler 330
3061 // int sched_getscheduler(pid_t pid);
3062 PRE(sys_sched_getscheduler)
3064 PRINT("sys_sched_getscheduler ( %" FMT_REGWORD "d )", SARG1);
3065 PRE_REG_READ1(int, "sched_getscheduler", vki_pid_t, pid);
3068 // SYS_sched_yield 331
3069 // int sched_yield(void);
3070 PRE(sys_sched_yield)
3072 *flags |= SfMayBlock;
3073 PRINT("sched_yield()");
3074 PRE_REG_READ0(int, "sched_yield");
3077 // SYS_sched_get_priority_max 332
3078 // int sched_get_priority_max(int policy);
3079 PRE(sys_sched_get_priority_max)
3081 PRINT("sched_get_priority_max ( %" FMT_REGWORD "u )", ARG1);
3082 PRE_REG_READ1(long, "sched_get_priority_max", int, policy);
3085 // SYS_sched_get_priority_min 333
3086 // int sched_get_priority_min(int policy);
3087 PRE(sys_sched_get_priority_min)
3089 PRINT("sched_get_priority_min ( %" FMT_REGWORD "u )", ARG1);
3090 PRE_REG_READ1(long, "sched_get_priority_min", int, policy);
3093 // SYS_sched_rr_get_interval 334
3094 // int sched_rr_get_interval(pid_t pid, struct timespec *interval);
3095 PRE(sys_sched_rr_get_interval)
3097 PRINT("sys_sched_rr_get_interval ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, ARG2);
3098 PRE_REG_READ2(int, "sched_rr_get_interval", vki_pid_t, pid, struct vki_timespec *,interval);
3099 PRE_MEM_WRITE("sys_sched_rr_get_interval(interval)", ARG2, sizeof(struct vki_timespec));
3102 POST(sys_sched_rr_get_interval)
3104 POST_MEM_WRITE(ARG2, sizeof(struct vki_timespec));
3107 // SYS_utrace 335
3108 // int utrace(const void *addr, size_t len);
3109 PRE(sys_utrace)
3111 PRINT("sys_utrace ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1, ARG2);
3112 PRE_REG_READ2(int, "utrace", const void *, addr, vki_size_t, len);
3113 PRE_MEM_READ( "utrace(addr)", ARG1, ARG2 );
3116 // SYS_kldsym 337
3117 // int kldsym(int fileid, int cmd, void *data);
3118 PRE(sys_kldsym)
3120 PRINT("sys_kldsym ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2,ARG3 );
3121 PRE_REG_READ3(int, "kldsym", int, fileid, int, cmd, void*, data);
3122 PRE_MEM_READ( "kldsym(data)", ARG3, sizeof(struct vki_kld_sym_lookup) );
3123 struct vki_kld_sym_lookup *kslp = (struct vki_kld_sym_lookup *)ARG3;
3124 if (ML_(safe_to_deref)(kslp, sizeof(struct vki_kld_sym_lookup))) {
3125 PRE_MEM_RASCIIZ( "kldsym(data.symname)", (Addr)kslp->symname );
3129 POST(sys_kldsym)
3131 struct vki_kld_sym_lookup *kslp = (struct vki_kld_sym_lookup *)ARG3;
3132 POST_MEM_WRITE( (Addr)&kslp->symvalue, sizeof(kslp->symvalue) );
3133 POST_MEM_WRITE( (Addr)&kslp->symsize, sizeof(kslp->symsize) );
3136 // SYS_jail 338
3137 // int jail(struct jail *jail);
3138 PRE(sys_jail)
3140 PRINT("sys_jail ( %#" FMT_REGWORD "x )", ARG1);
3141 PRE_REG_READ1(int, "jail", struct jail *, jail);
3142 PRE_MEM_READ( "jail(jail)", ARG1, sizeof(struct vki_jail) );
3145 // SYS_nnpfs_syscall 338
3146 // @todo
3148 // SYS_sigprocmask 340
3149 // int sigprocmask(int how, const sigset_t * restrict set,
3150 // sigset_t * restrict oset);
3151 PRE(sys_sigprocmask)
3153 PRINT("sys_sigprocmask ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",ARG1,ARG2,ARG3);
3154 PRE_REG_READ3(int, "sigprocmask",
3155 int, how, vki_sigset_t *, set, vki_sigset_t *, oset);
3156 if (ARG2 != 0) {
3157 PRE_MEM_READ( "sigprocmask(set)", ARG2, sizeof(vki_sigset_t));
3159 if (ARG3 != 0) {
3160 PRE_MEM_WRITE( "sigprocmask(oset)", ARG3, sizeof(vki_sigset_t));
3163 if (ARG2 != 0 &&
3164 !ML_(safe_to_deref)((void *)(Addr)ARG2, sizeof(vki_sigset_t))) {
3165 VG_(dmsg)("Warning: Bad set handler address %p in sigprocmask\n",
3166 (void *)(Addr)ARG2);
3167 SET_STATUS_Failure ( VKI_EFAULT );
3168 } else if (ARG3 != 0 &&
3169 !ML_(safe_to_deref)((void *)(Addr)ARG3, sizeof(vki_sigset_t))) {
3170 VG_(dmsg)("Warning: Bad oldset address %p in sigprocmask\n",
3171 (void *)(Addr)ARG3);
3172 SET_STATUS_Failure ( VKI_EFAULT );
3173 } else {
3174 SET_STATUS_from_SysRes(VG_(do_sys_sigprocmask)(tid, ARG1 /*how*/,
3175 (vki_sigset_t*)(Addr)ARG2,
3176 (vki_sigset_t*)(Addr)ARG3));
3179 if (SUCCESS) {
3180 *flags |= SfPollAfter;
3184 POST(sys_sigprocmask)
3186 vg_assert(SUCCESS);
3187 if (RES == 0 && ARG3 != 0) {
3188 POST_MEM_WRITE( ARG3, sizeof(vki_sigset_t));
3192 // SYS_sigsuspend 341
3193 // int sigsuspend(const sigset_t *sigmask);
3194 PRE(sys_sigsuspend)
3196 *flags |= SfMayBlock;
3197 PRINT("sys_sigsuspend ( %#" FMT_REGWORD "x )", ARG1 );
3198 PRE_REG_READ1(int, "sigsuspend", const vki_sigset_t *, sigmask);
3199 PRE_MEM_READ( "sigsuspend(sigmask)", ARG1, sizeof(vki_sigset_t) );
3200 if (ARG1) {
3201 ARG1 = ML_(make_safe_mask)("syswrap.sigsuspend.1", (Addr)ARG1);
3205 POST(sys_sigsuspend)
3207 ML_(free_safe_mask) ( (Addr)ARG1 );
3210 // SYS_sigpending 343
3211 // int sigpending(sigset_t *set);
3212 PRE(sys_sigpending)
3214 PRINT( "sys_sigpending ( %#" FMT_REGWORD "x )", ARG1 );
3215 PRE_REG_READ1(int, "sigpending", vki_sigset_t *, set);
3216 PRE_MEM_WRITE( "sigpending(set)", ARG1, sizeof(vki_sigset_t));
3219 POST(sys_sigpending)
3221 POST_MEM_WRITE( ARG1, sizeof(vki_sigset_t) ) ;
3225 // SYS_sigtimedwait 345
3226 // int sigtimedwait(const sigset_t *restrict set, siginfo_t *restrict info,
3227 // const struct timespec *restrict timeout);
3228 PRE(sys_sigtimedwait)
3230 *flags |= SfMayBlock;
3231 PRINT("sys_sigtimedwait ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
3232 ARG1,ARG2,ARG3);
3233 PRE_REG_READ3(int, "sigtimedwait",
3234 const vki_sigset_t *, set, vki_siginfo_t *, info,
3235 const struct timespec *, timeout);
3236 if (ARG1 != 0) {
3237 PRE_MEM_READ( "sigtimedwait(set)", ARG1, sizeof(vki_sigset_t));
3239 if (ARG2 != 0) {
3240 PRE_MEM_WRITE( "sigtimedwait(info)", ARG2, sizeof(vki_siginfo_t) );
3242 if (ARG3 != 0) {
3243 PRE_MEM_READ( "sigtimedwait(timeout)",
3244 ARG3, sizeof(struct vki_timespec) );
3248 POST(sys_sigtimedwait)
3250 if (ARG2 != 0) {
3251 POST_MEM_WRITE( ARG2, sizeof(vki_siginfo_t) );
3255 // SYS_sigwaitinfo 346
3256 // int sigwaitinfo(const sigset_t * restrict set, siginfo_t * restrict info);
3257 PRE(sys_sigwaitinfo)
3259 *flags |= SfMayBlock;
3260 PRINT("sys_sigwaitinfo ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
3261 ARG1,ARG2);
3262 PRE_REG_READ2(int, "sigwaitinfo",
3263 const vki_sigset_t *, set, vki_siginfo_t *, info);
3264 if (ARG1 != 0) {
3265 PRE_MEM_READ( "sigwaitinfo(set)", ARG1, sizeof(vki_sigset_t));
3267 if (ARG2 != 0) {
3268 PRE_MEM_WRITE( "sigwaitinfo(info)", ARG2, sizeof(vki_siginfo_t) );
3272 POST(sys_sigwaitinfo)
3274 if (ARG2 != 0) {
3275 POST_MEM_WRITE( ARG2, sizeof(vki_siginfo_t) );
3279 // SYS___acl_get_file 347
3280 // int __acl_get_file(const char *path, acl_type_t type, struct acl *aclp);
3281 PRE(sys___acl_get_file)
3283 PRINT("sys___acl_get_file ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,(char *)ARG1,ARG2,ARG3);
3284 PRE_REG_READ3(int, "acl_get_file",
3285 const char *, path, int, type, struct vki_acl *, aclp);
3286 PRE_MEM_RASCIIZ("acl_get_file(path", ARG1);
3287 PRE_MEM_WRITE( "acl_get_file(aclp)", ARG3, sizeof(struct vki_acl) );
3290 POST(sys___acl_get_file)
3292 vg_assert(SUCCESS);
3293 if (RES == 0) {
3294 POST_MEM_WRITE( ARG3, sizeof(struct vki_acl) );
3298 // SYS___acl_set_file 348
3299 // int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp);
3300 PRE(sys___acl_set_file)
3302 PRINT("sys___acl_set_file ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,(char *)ARG1,ARG2,ARG3);
3303 PRE_REG_READ3(int, "acl_set_file",
3304 const char *, path, int, type, struct vki_acl *, aclp);
3305 PRE_MEM_RASCIIZ("acl_set_file(path", ARG1);
3306 PRE_MEM_READ("acl_set_file(aclp)", ARG3, sizeof(struct vki_acl) );
3309 // SYS___acl_get_fd 349
3310 // int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp);
3311 PRE(sys___acl_get_fd)
3313 PRINT("sys___acl_get_fd ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2,ARG3);
3314 PRE_REG_READ3(int, "acl_get_fd",
3315 int, fd, int, type, struct vki_acl *, aclp);
3316 PRE_MEM_WRITE( "acl_get_file(aclp)", ARG3, sizeof(struct vki_acl) );
3319 POST(sys___acl_get_fd)
3321 vg_assert(SUCCESS);
3322 if (RES == 0) {
3323 POST_MEM_WRITE( ARG3, sizeof(struct vki_acl) );
3327 // SYS___acl_set_fd 350
3328 // int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp);
3329 PRE(sys___acl_set_fd)
3331 PRINT("sys___acl_set_fd ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2,ARG3);
3332 PRE_REG_READ3(int, "acl_set_fd",
3333 int, filedes, int, type, struct vki_acl *, aclp);
3334 PRE_MEM_READ( "acl_get_file(aclp)", ARG3, sizeof(struct vki_acl) );
3337 // SYS___acl_delete_file 351
3338 // int __acl_delete_file(const char *path, acl_type_t type);
3339 PRE(sys___acl_delete_file)
3341 PRINT("sys___acl_delete_file ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )", ARG1,(char *)ARG1,ARG2);
3342 PRE_MEM_RASCIIZ("acl_set_file(path", ARG1);
3343 PRE_REG_READ2(int, "acl_delete_file",
3344 const char *, path, int, type);
3346 // SYS___acl_delete_fd 352
3347 // int __acl_delete_fd(int filedes, acl_type_t type);
3348 PRE(sys___acl_delete_fd)
3350 PRINT("sys___acl_delete_fd ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1,ARG2);
3351 PRE_REG_READ2(int, "acl_delete_fd",
3352 int, filedes, int, acltype);
3355 // SYS___acl_aclcheck_file 353
3356 // int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp);
3357 PRE(sys___acl_aclcheck_file)
3359 PRINT("sys___acl_aclcheck_file ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,(char *)ARG1,ARG2,ARG3);
3360 PRE_REG_READ3(int, "acl_aclcheck_file",
3361 const char *, path, int, type, struct vki_acl *, aclp);
3362 PRE_MEM_RASCIIZ("acl_set_file(path", ARG1);
3363 PRE_MEM_READ( "acl_aclcheck_file(aclp)", ARG3, sizeof(struct vki_acl) );
3366 // SYS___acl_aclcheck_fd 354
3367 // int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp);
3368 PRE(sys___acl_aclcheck_fd)
3370 PRINT("sys___acl_aclcheck_fd ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2,ARG3);
3371 PRE_REG_READ3(int, "acl_aclcheck_fd",
3372 int, fd, int, type, struct vki_acl *, aclp);
3373 PRE_MEM_READ( "acl_aclcheck_fd(aclp)", ARG3, sizeof(struct vki_acl) );
3376 // SYS_extattrctl 355
3377 // no manpage?
3378 // syscalls.master: int extattrctl(_In_z_ const char *path, int cmd, _In_z_opt_ const char *filename, int attrnamespace, _In_z_ const char *attrname);
3379 PRE(sys_extattrctl)
3381 PRINT("sys_extattrctl ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", ARG1,SARG2,ARG3,SARG4,ARG5);
3382 PRE_REG_READ5(ssize_t, "extattrctl",
3383 const char *, path, int, cmd, const char *, filename, int, attrnamespace, const char *, attrname);
3384 PRE_MEM_RASCIIZ("extattrctl(path)", ARG1);
3385 PRE_MEM_RASCIIZ("extattrctl(filename)", ARG3);
3386 PRE_MEM_RASCIIZ("extattrctl(attrname)", ARG5);
3389 // SYS_extattr_set_file 356
3390 // ssize_t extattr_set_file(const char *path, int attrnamespace,
3391 // const char *attrname, const void *data, size_t nbytes);
3392 PRE(sys_extattr_set_file)
3394 PRINT("sys_extattr_set_file ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,SARG2,ARG3,ARG4,ARG5);
3395 PRE_REG_READ5(ssize_t, "extattr_set_file",
3396 const char *, path, int, attrnamespace, const char *, attrname, const void *, data, size_t, nbytes);
3397 PRE_MEM_RASCIIZ("extattr_set_file(path)", ARG1);
3398 PRE_MEM_RASCIIZ("extattr_set_file(attrname)", ARG3);
3399 PRE_MEM_READ("extattr_set_file(data)", ARG4, ARG5);
3402 // SYS_extattr_get_file 357
3403 // ssize_t extattr_get_file(const char *path, int attrnamespace,
3404 // const char *attrname, void *data, size_t nbytes);
3405 PRE(sys_extattr_get_file)
3407 PRINT("sys_extattr_get_file ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,SARG2,ARG3,ARG4,ARG5);
3408 PRE_REG_READ5(ssize_t, "extattr_get_file",
3409 const char *, path, int, attrnamespace, const char *, attrname, void *, data, size_t, nbytes);
3410 PRE_MEM_RASCIIZ("extattr_get_file(path)", ARG1);
3411 PRE_MEM_RASCIIZ("extattr_get_file(attrname)", ARG3);
3412 if (ARG4) {
3413 PRE_MEM_WRITE("extattr_get_file(data)", ARG4, ARG5);
3417 POST(sys_extattr_get_file)
3419 if (ARG4) {
3420 POST_MEM_WRITE(ARG4, ARG5);
3424 // SYS_extattr_delete_file 358
3425 // int extattr_delete_file(const char *path, int attrnamespace,
3426 // const char *attrname);
3427 PRE(sys_extattr_delete_file)
3429 PRINT("sys_extattr_delete_file ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", ARG1,SARG2,ARG3);
3430 PRE_REG_READ3(ssize_t, "extattr_delete_file",
3431 const char *, path, int, attrnamespace, const char *, attrname);
3432 PRE_MEM_RASCIIZ("extattr_delete_file(path)", ARG1);
3433 PRE_MEM_RASCIIZ("extattr_delete_file(attrname)", ARG3);
3436 // SYS_aio_waitcomplete 359
3437 // ssize_t aio_waitcomplete(struct aiocb **iocbp, struct timespec *timeout);
3438 PRE(sys_aio_waitcomplete)
3440 *flags |= SfMayBlock;
3441 PRINT("sys_aio_waitcomplete ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1,ARG2);
3442 PRE_REG_READ2(ssize_t, "aio_waitcomplete", struct aiocb **, iocbp, struct timespec *, timeout);
3443 if (ARG2) {
3444 PRE_MEM_READ("aio_waitcomplete(timeout", ARG2, sizeof(struct vki_timespec));
3446 PRE_MEM_WRITE( "aio_waitcomplete(iocbp)", ARG1, sizeof(struct aiocb *));
3449 POST(sys_aio_waitcomplete)
3451 POST_MEM_WRITE(ARG1, sizeof(struct aiocb *));
3454 // SYS_getresuid 360
3455 // int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
3456 PRE(sys_getresuid)
3458 PRINT("sys_getresuid ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1,ARG2,ARG3);
3459 PRE_REG_READ3(long, "getresuid",
3460 vki_uid_t *, ruid, vki_uid_t *, euid, vki_uid_t *, suid);
3461 PRE_MEM_WRITE( "getresuid(ruid)", ARG1, sizeof(vki_uid_t) );
3462 PRE_MEM_WRITE( "getresuid(euid)", ARG2, sizeof(vki_uid_t) );
3463 PRE_MEM_WRITE( "getresuid(suid)", ARG3, sizeof(vki_uid_t) );
3466 POST(sys_getresuid)
3468 vg_assert(SUCCESS);
3469 if (RES == 0) {
3470 POST_MEM_WRITE( ARG1, sizeof(vki_uid_t) );
3471 POST_MEM_WRITE( ARG2, sizeof(vki_uid_t) );
3472 POST_MEM_WRITE( ARG3, sizeof(vki_uid_t) );
3476 // SYS_getresgid 361
3477 // int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);
3478 PRE(sys_getresgid)
3480 PRINT("sys_getresgid ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1,ARG2,ARG3);
3481 PRE_REG_READ3(long, "getresgid",
3482 vki_gid_t *, rgid, vki_gid_t *, egid, vki_gid_t *, sgid);
3483 PRE_MEM_WRITE( "getresgid(rgid)", ARG1, sizeof(vki_gid_t) );
3484 PRE_MEM_WRITE( "getresgid(egid)", ARG2, sizeof(vki_gid_t) );
3485 PRE_MEM_WRITE( "getresgid(sgid)", ARG3, sizeof(vki_gid_t) );
3488 POST(sys_getresgid)
3490 vg_assert(SUCCESS);
3491 if (RES == 0) {
3492 POST_MEM_WRITE( ARG1, sizeof(vki_gid_t) );
3493 POST_MEM_WRITE( ARG2, sizeof(vki_gid_t) );
3494 POST_MEM_WRITE( ARG3, sizeof(vki_gid_t) );
3498 // SYS_kqueue 362
3499 // int kqueue(void);
3500 PRE(sys_kqueue)
3502 PRINT("%s", "sys_kqueue(void)");
3503 PRE_REG_READ0(int, "kqueue");
3506 POST(sys_kqueue)
3508 if (!ML_(fd_allowed)(RES, "kqueue", tid, True)) {
3509 VG_(close)(RES);
3510 SET_STATUS_Failure( VKI_EMFILE );
3511 } else {
3512 if (VG_(clo_track_fds)) {
3513 ML_(record_fd_open_nameless)(tid, RES);
3518 // SYS_freebsd11_kevent 363
3519 // int kevent(int kq, const struct kevent *changelist, int nchanges,
3520 // struct kevent *eventlist, int nevents,
3521 // const struct timespec *timeout);
3522 PRE(sys_freebsd11_kevent)
3524 PRINT("sys_freebsd11_kevent ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )\n", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
3525 PRE_REG_READ6(int, "kevent",
3526 int, fd, const struct vki_kevent_freebsd11 *, changelist, int, nchanges,
3527 struct vki_kevent_freebsd11 *, eventlist, int, nevents,
3528 struct timespec *, timeout);
3529 if (ARG2 != 0 && ARG3 != 0) {
3530 PRE_MEM_READ( "kevent(changelist)", ARG2, sizeof(struct vki_kevent_freebsd11)*ARG3 );
3532 if (ARG4 != 0 && ARG5 != 0) {
3533 PRE_MEM_WRITE( "kevent(eventlist)", ARG4, sizeof(struct vki_kevent_freebsd11)*ARG5);
3535 if (ARG5 != 0) {
3536 *flags |= SfMayBlock;
3538 if (ARG6 != 0) {
3539 PRE_MEM_READ( "kevent(timeout)",
3540 ARG6, sizeof(struct vki_timespec));
3544 POST(sys_freebsd11_kevent)
3546 vg_assert(SUCCESS);
3547 if ((Word)RES != -1) {
3548 if (ARG4 != 0) {
3549 POST_MEM_WRITE( ARG4, sizeof(struct vki_kevent_freebsd11)*RES) ;
3554 // SYS_extattr_set_fd 371
3555 // ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname,
3556 // const void *data, size_t nbytes);
3557 PRE(sys_extattr_set_fd)
3559 PRINT("sys_extattr_set_fd ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", SARG1,SARG2,ARG3,ARG4,ARG5);
3560 PRE_REG_READ5(int, "extattr_set_fd", int, fd, int, attrnamespace, const char *,attrname, const void *,data, size_t, nbytes);
3561 PRE_MEM_RASCIIZ( "extattr_set_fd(attrname)", ARG3 );
3562 PRE_MEM_READ("extattr_set_fd(data)", ARG4, ARG5);
3565 // SYS_extattr_get_fd 372
3566 // ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname,
3567 // void *data, size_t nbytes);
3568 PRE(sys_extattr_get_fd)
3570 PRINT("sys_extattr_get_fd ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", SARG1,SARG2,ARG3,ARG4,ARG5);
3571 PRE_REG_READ5(int, "extattr_get_fd", int, fd, int, attrnamespace, const char *,attrname, const void *,data, size_t, nbytes);
3572 PRE_MEM_RASCIIZ( "extattr_get_fd(attrname)", ARG3 );
3573 PRE_MEM_WRITE("extattr_get_fd(data)", ARG4, ARG5);
3576 POST(sys_extattr_get_fd)
3578 POST_MEM_WRITE(ARG4, ARG5);
3581 // SYS_extattr_delete_fd 373
3582 // int extattr_delete_fd(int fd, int attrnamespace, const char *attrname);
3583 PRE(sys_extattr_delete_fd)
3585 PRINT("sys_extattr_delete_fd ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1,SARG2,ARG3);
3586 PRE_REG_READ3(int, "extattr_delete_fd", int, fd, int, attrnamespace, const char *,attrname);
3587 PRE_MEM_RASCIIZ( "extattr_delete_fd(attrname)", ARG3 );
3590 // SYS___setugid 374
3591 // no manpage?
3592 // syscalls.master: int __setugid(int flag);
3593 PRE(sys___setugid)
3595 PRINT("sys___setugid ( %" FMT_REGWORD "d )", SARG1);
3596 PRE_REG_READ1(int, "__setugid", int, flag);
3599 // SYS_eaccess 376
3600 // int eaccess(const char *path, int mode);
3601 PRE(sys_eaccess)
3603 PRINT("sys_eaccess ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )", ARG1,(char*)ARG1,ARG2);
3604 PRE_REG_READ2(int, "eaccess", const char *, path, int, mode);
3605 PRE_MEM_RASCIIZ( "eaccess(path)", ARG1 );
3608 // SYS_afs3_syscall 377
3609 // @todo
3611 // SYS_nmount 378
3612 // int nmount(struct iovec *iov, u_int niov, int flags);
3613 PRE(sys_nmount)
3615 PRINT("sys_nmount ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "d )", ARG1, ARG2, SARG3);
3616 PRE_REG_READ3(int, "nmount", struct iovec *, iov, u_int, niov, int, flags);
3617 PRE_MEM_READ( "nmount(pathname)", ARG1, ARG2*sizeof(struct vki_iovec) );
3620 // SYS___mac_get_proc 384
3621 // @todo
3623 // SYS___mac_set_proc 385
3624 // @todo
3626 // SYS___mac_get_fd 386
3627 // @todo
3629 // SYS___mac_get_file 387
3630 // @todo
3632 // SYS___mac_set_fd 388
3633 // @todo
3635 // SYS___mac_set_file 389
3636 // @todo
3638 // SYS_kenv 390
3639 // int kenv(int action, const char *name, char *value, int len);
3640 PRE(sys_kenv)
3642 PRINT("sys_kenv ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,ARG2,ARG3,ARG4);
3643 PRE_REG_READ4(int, "kenv",
3644 int, action, const char *, name, char *, value, int, len);
3645 switch (ARG1) {
3646 case VKI_KENV_GET:
3647 case VKI_KENV_SET:
3648 case VKI_KENV_UNSET:
3649 PRE_MEM_RASCIIZ("kenv(name)", ARG2);
3650 /* FALLTHROUGH */
3651 case VKI_KENV_DUMP:
3652 break;
3653 default:
3654 VG_(dmsg)("Warning: Bad action %" FMT_REGWORD "u in kenv\n", ARG1);
3658 POST(sys_kenv)
3660 if (SUCCESS) {
3661 switch (ARG1) {
3662 case VKI_KENV_GET:
3663 POST_MEM_WRITE(ARG3, ARG4);
3664 break;
3665 case VKI_KENV_DUMP:
3666 if (ARG3 != (Addr)NULL) {
3667 POST_MEM_WRITE(ARG3, ARG4);
3669 break;
3674 // SYS_lchflags 391
3675 // int lchflags(const char *path, unsigned long flags);
3676 PRE(sys_lchflags)
3678 PRINT("sys_lchflags ( %#" FMT_REGWORD "x(%s), 0x%" FMT_REGWORD "x )", ARG1,(char *)ARG1,ARG2);
3679 PRE_REG_READ2(int, "lchflags",
3680 const char *, path, unsigned long, flags);
3681 PRE_MEM_RASCIIZ( "lchflags(path)", ARG1 );
3684 // SYS_uuidgen 392
3685 // int uuidgen(struct uuid *store, int count);
3686 PRE(sys_uuidgen)
3688 PRINT("sys_uuidgen ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,ARG2);
3689 PRE_REG_READ2(int, "uuidgen",
3690 struct vki_uuid *, store, int, count);
3691 PRE_MEM_WRITE( "uuidgen(store)", ARG1, ARG2 * sizeof(struct vki_uuid));
3694 POST(sys_uuidgen)
3696 if (SUCCESS) {
3697 POST_MEM_WRITE( ARG1, ARG2 * sizeof(struct vki_uuid) );
3701 // SYS_sendfile 393
3702 // x86/amd64
3704 // SYS_mac_syscall 394
3705 // @todo
3707 // SYS_freebsd11_getfsstat 395
3708 // int getfsstat(struct freebsd11_statfs *buf, long bufsize, int mode);
3709 PRE(sys_freebsd11_getfsstat)
3711 PRINT("sys_freebsd11_getfsstat ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
3712 PRE_REG_READ3(int, "getfsstat", struct vki_freebsd11_statfs *, buf, long, bufsize, int, mode);
3713 PRE_MEM_WRITE( "getfsstat(buf)", ARG1, ARG2 );
3716 POST(sys_freebsd11_getfsstat)
3718 vg_assert(SUCCESS);
3719 if ((Word)RES != -1) {
3720 POST_MEM_WRITE( ARG1, RES * sizeof(struct vki_freebsd11_statfs) );
3724 // SYS_freebsd11_statfs 396
3725 // int statfs(const char *path, struct statfs *buf);
3726 PRE(sys_freebsd11_statfs)
3728 PRINT("sys_statfs ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x )",ARG1,(char *)ARG1,ARG2);
3729 PRE_REG_READ2(int, "statfs", const char *, path, struct statfs *, buf);
3730 PRE_MEM_RASCIIZ( "statfs(path)", ARG1 );
3731 PRE_MEM_WRITE( "statfs(buf)", ARG2, sizeof(struct vki_freebsd11_statfs) );
3734 POST(sys_freebsd11_statfs)
3736 POST_MEM_WRITE( ARG2, sizeof(struct vki_freebsd11_statfs) );
3739 // SYS_freebsd11_fstatfs 397
3740 // int fstatfs(int fd, struct statfs *buf);
3741 PRE(sys_freebsd11_fstatfs)
3743 PRINT("sys_fstatfs ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )",ARG1,ARG2);
3744 PRE_REG_READ2(int, "fstatfs",
3745 unsigned int, fd, struct statfs *, buf);
3746 PRE_MEM_WRITE( "fstatfs(buf)", ARG2, sizeof(struct vki_freebsd11_statfs) );
3749 POST(sys_freebsd11_fstatfs)
3751 POST_MEM_WRITE( ARG2, sizeof(struct vki_freebsd11_statfs) );
3754 // SYS_freebsd11_fhstatfs 398
3755 // int fhstatfs(const fhandle_t *fhp, struct statfs *buf);
3756 PRE(sys_freebsd11_fhstatfs)
3758 PRINT("sys_fhstatfs ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",ARG1,ARG2);
3759 PRE_REG_READ2(int, "fhstatfs",
3760 struct fhandle *, fhp, struct statfs *, buf);
3761 PRE_MEM_READ( "fhstatfs(fhp)", ARG1, sizeof(struct vki_fhandle) );
3762 PRE_MEM_WRITE( "fhstatfs(buf)", ARG2, sizeof(struct vki_freebsd11_statfs) );
3765 POST(sys_freebsd11_fhstatfs)
3767 POST_MEM_WRITE( ARG2, sizeof(struct vki_freebsd11_statfs) );
3770 // SYS_ksem_close 400
3771 // @todo
3773 // SYS_ksem_post 401
3774 // @todo
3776 // SYS_ksem_wait 402
3777 // @todo
3779 // SYS_ksem_trywait 403
3780 // @todo
3782 // SYS_ksem_init 404
3783 // @todo
3785 // SYS_ksem_open 405
3786 // @todo
3788 // SYS_ksem_unlink 406
3789 // @todo
3791 // SYS_ksem_getvalue 407
3792 // @todo
3794 // SYS_ksem_destroy 408
3795 // @todo
3797 // SYS___mac_get_pid 409
3798 // @todo
3800 // SYS___mac_get_link 410
3801 // @todo
3803 // SYS___mac_set_link 411
3804 // @todo
3806 // SYS_extattr_set_link 412
3807 // ssize_t extattr_set_link(const char *path, int attrnamespace,
3808 // const char *attrname, const void *data, size_t nbytes);
3809 PRE(sys_extattr_set_link)
3811 PRINT("sys_extattr_set_link ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,SARG2,ARG3,ARG4,ARG5);
3812 PRE_REG_READ5(ssize_t, "extattr_set_link",
3813 const char *, path, int, attrnamespace, const char *, attrname, const void *, data, size_t, nbytes);
3814 PRE_MEM_RASCIIZ("extattr_set_link(path)", ARG1);
3815 PRE_MEM_RASCIIZ("extattr_set_link(attrname)", ARG3);
3816 PRE_MEM_READ("extattr_set_link(data)", ARG4, ARG5);
3819 // SYS_extattr_get_link 413
3820 // ssize_t extattr_get_link(const char *path, int attrnamespace,
3821 // const char *attrname, void *data, size_t nbytes);
3822 PRE(sys_extattr_get_link)
3824 PRINT("sys_extattr_get_link ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,SARG2,ARG3,ARG4,ARG5);
3825 PRE_REG_READ5(ssize_t, "extattr_get_link",
3826 const char *, path, int, attrnamespace, const char *, attrname, void *, data, size_t, nbytes);
3827 PRE_MEM_RASCIIZ("extattr_get_link(path)", ARG1);
3828 PRE_MEM_RASCIIZ("extattr_get_link(attrname)", ARG3);
3829 if (ARG4) {
3830 PRE_MEM_WRITE("extattr_get_link(data)", ARG4, ARG5);
3834 POST(sys_extattr_get_link)
3836 if (ARG4) {
3837 POST_MEM_WRITE(ARG4, ARG5);
3841 // SYS_extattr_delete_link 414
3842 // int extattr_delete_link(const char *path, int attrnamespace,
3843 // const char *attrname);
3844 PRE(sys_extattr_delete_link)
3846 PRINT("sys_extattr_delete_link ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", ARG1,SARG2,ARG3);
3847 PRE_REG_READ3(ssize_t, "extattr_delete_link",
3848 const char *, path, int, attrnamespace, const char *, attrname);
3849 PRE_MEM_RASCIIZ("extattr_delete_link(path)", ARG1);
3850 PRE_MEM_RASCIIZ("extattr_delete_link(attrname)", ARG3);
3853 // SYS___mac_execve 415
3854 // @todo
3856 // SYS_sigaction 416
3857 //int sigaction(int sig, const struct sigaction * restrict act,
3858 // struct sigaction * restrict oact);
3859 PRE(sys_sigaction)
3861 vki_sigaction_toK_t new;
3862 vki_sigaction_toK_t *newp;
3863 vki_sigaction_fromK_t old;
3864 vki_sigaction_fromK_t *oldp;
3866 PRINT("sys_sigaction ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
3867 SARG1,ARG2,ARG3);
3868 PRE_REG_READ3(long, "sigaction",
3869 int, sign, const struct sigaction *, act,
3870 struct sigaction *, oact);
3872 newp = oldp = NULL;
3874 if (ARG2 != 0) {
3875 struct vki_sigaction *sa = (struct vki_sigaction *)ARG2;
3876 PRE_MEM_READ( "sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
3877 PRE_MEM_READ( "sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
3878 PRE_MEM_READ( "sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
3881 if (ARG3 != 0) {
3882 PRE_MEM_WRITE( "sigaction(oact)", ARG3, sizeof(struct vki_sigaction));
3883 oldp = &old;
3886 if (ARG2 != 0
3887 && ! ML_(safe_to_deref)((void *)(Addr)ARG2,
3888 sizeof(struct vki_sigaction))) {
3889 VG_(umsg)("Warning: bad act handler address %p in sigaction()\n",
3890 (void *)(Addr)ARG2);
3891 SET_STATUS_Failure ( VKI_EFAULT );
3892 } else if ((ARG3 != 0
3893 && ! ML_(safe_to_deref)((void *)(Addr)ARG3,
3894 sizeof(struct vki_sigaction)))) {
3895 VG_(umsg)("Warning: bad oact handler address %p in sigaction()\n",
3896 (void *)(Addr)ARG3);
3897 SET_STATUS_Failure ( VKI_EFAULT );
3898 } else {
3899 if (ARG2 != 0) {
3900 struct vki_sigaction *oldnew =
3901 (struct vki_sigaction *)(Addr)ARG2;
3903 new.ksa_handler = oldnew->ksa_handler;
3904 new.sa_flags = oldnew->sa_flags;
3905 new.sa_mask = oldnew->sa_mask;
3906 newp = &new;
3909 SET_STATUS_from_SysRes( VG_(do_sys_sigaction)(ARG1, newp, oldp) );
3911 if (ARG3 != 0 && SUCCESS && RES == 0) {
3912 struct vki_sigaction *oldold =
3913 (struct vki_sigaction *)(Addr)ARG3;
3915 oldold->ksa_handler = oldp->ksa_handler;
3916 oldold->sa_flags = oldp->sa_flags;
3917 oldold->sa_mask = oldp->sa_mask;
3922 POST(sys_sigaction)
3924 vg_assert(SUCCESS);
3925 if (RES == 0 && ARG3 != 0) {
3926 POST_MEM_WRITE( ARG3, sizeof(struct vki_sigaction));
3930 // SYS_sigreturn 417
3931 // x86/amd64
3933 // SYS_getcontext 421
3934 // SYS_setcontext 422
3935 // SYS_swapcontext 423
3936 // PRE in x86/amd64
3938 POST(sys_getcontext)
3940 POST_MEM_WRITE( ARG1, sizeof(struct vki_ucontext) );
3943 POST(sys_swapcontext)
3945 if (SUCCESS) {
3946 POST_MEM_WRITE( ARG1, sizeof(struct vki_ucontext) );
3950 // SYS_freebsd13_swapoff 424
3951 // int swapoff(const char *special);
3952 PRE(sys_freebsd13_swapoff)
3954 PRINT("sys_freebsd13_swapoff ( %#" FMT_REGWORD "x(%s) )", ARG1,(char *)ARG1);
3955 PRE_REG_READ1(int, "swapoff", const char *, special);
3956 PRE_MEM_RASCIIZ( "swapoff(special)", ARG1 );
3959 // SYS___acl_get_link 425
3960 // int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp);
3961 PRE(sys___acl_get_link)
3963 PRINT("sys___acl_get_link ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,(char *)ARG1,ARG2,ARG3);
3964 PRE_REG_READ3(int, "__acl_get_link",
3965 const char *, path, int, acltype, struct vki_acl *, aclp);
3966 PRE_MEM_RASCIIZ( "__acl_get_link(path)", ARG1 );
3967 PRE_MEM_WRITE( "__acl_get_link(aclp)", ARG3, sizeof(struct vki_acl) );
3970 POST(sys___acl_get_link)
3972 vg_assert(SUCCESS);
3973 if (RES == 0) {
3974 POST_MEM_WRITE( ARG3, sizeof(struct vki_acl) );
3978 // SYS___acl_set_link 426
3979 // int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp);
3980 PRE(sys___acl_set_link)
3982 PRINT("sys___acl_set_link ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,(char *)ARG1,ARG2,ARG3);
3983 PRE_REG_READ3(int, "__acl_set_link",
3984 const char *, path, int, acltype, struct vki_acl *, aclp);
3985 PRE_MEM_RASCIIZ( "__acl_set_link(path)", ARG1 );
3986 PRE_MEM_READ( "__acl_set_link(aclp)", ARG3, sizeof(struct vki_acl) );
3988 // SYS___acl_delete_link 427
3989 // int __acl_delete_link(const char *path, acl_type_t type);
3990 PRE(sys___acl_delete_link)
3992 PRINT("sys___acl_delete_link ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )", ARG1,(char *)ARG1,ARG2);
3993 PRE_MEM_RASCIIZ( "__acl_delete_link(path)", ARG1 );
3994 PRE_REG_READ2(int, "__acl_delete_link",
3995 const char *, path, int, acltype);
3998 // SYS___acl_aclcheck_link 428
3999 // int __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp);
4000 PRE(sys___acl_aclcheck_link)
4002 PRINT("sys___acl_aclcheck_link ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,(char *)ARG1,ARG2,ARG3);
4003 PRE_REG_READ3(long, "__acl_aclcheck_link",
4004 const char *, path, int, acltype, struct vki_acl *, aclp);
4005 PRE_MEM_RASCIIZ( "__acl_check_link(path)", ARG1 );
4006 PRE_MEM_READ( "__acl_aclcheck_link(aclp)", ARG3, sizeof(struct vki_acl) );
4009 // SYS_sigwait 429
4010 // int sigwait(const sigset_t * restrict set, int * restrict sig);
4011 PRE(sys_sigwait)
4013 PRINT("sys_sigwait ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
4014 ARG1,ARG2);
4015 PRE_REG_READ2(int, "sigwait",
4016 const vki_sigset_t *, set, int *, sig);
4017 if (ARG1 != 0) {
4018 PRE_MEM_READ( "sigwait(set)", ARG1, sizeof(vki_sigset_t));
4019 vki_sigset_t* set = (vki_sigset_t*)ARG1;
4020 if (ML_(safe_to_deref)(set, sizeof(vki_sigset_t))) {
4021 *flags |= SfMayBlock;
4024 if (ARG2 != 0) {
4025 PRE_MEM_WRITE( "sigwait(sig)", ARG2, sizeof(int));
4029 POST(sys_sigwait)
4031 if (RES == 0 && ARG2 != 0) {
4032 POST_MEM_WRITE( ARG2, sizeof(int));
4036 // SYS_thr_create 430
4037 // no manpage?
4038 // syscalls.master: int thr_create(_In_ ucontext_t *ctx, _Out_ long *id, int flags );
4039 PRE(sys_thr_create)
4041 PRINT( "sys_thr_create ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "d )", ARG1, ARG2, SARG3 );
4042 PRE_REG_READ3(int, "thr_create", /*ucontext_t*/void *, ctx, long *, id, int, flags );
4044 VG_(message)(Vg_UserMsg, "thr_create() not implemented");
4045 VG_(unimplemented)("Valgrind does not support thr_create().");
4047 SET_STATUS_Failure(VKI_ENOSYS);
4050 // SYS_thr_exit 431
4051 // void thr_exit(long *state);
4052 PRE(sys_thr_exit)
4054 ThreadState *tst;
4056 PRINT( "sys_thr_exit ( %#" FMT_REGWORD "x )", ARG1 );
4057 PRE_REG_READ1(void, "thr_exit", long *, state);
4059 if (ARG1) {
4060 PRE_MEM_WRITE( "thr_exit(state)", ARG1, sizeof(long) );
4063 tst = VG_(get_ThreadState)(tid);
4064 tst->exitreason = VgSrc_ExitThread;
4065 tst->os_state.exitcode = ARG1;
4066 SET_STATUS_Success(0);
4069 // SYS_thr_self 432
4070 // int thr_self(long *id);
4071 PRE(sys_thr_self)
4073 PRINT( "sys_thr_self ( %#" FMT_REGWORD "x )", ARG1 );
4074 PRE_REG_READ1(int, "thr_self", long *, id);
4075 PRE_MEM_WRITE( "thr_self()", ARG1, sizeof(long));
4078 POST(sys_thr_self)
4080 POST_MEM_WRITE( ARG1, sizeof(long));
4083 // SYS_thr_kill 433
4084 // int thr_kill(long id, int sig);
4085 PRE(sys_thr_kill)
4087 PRINT("sys_thr_kill ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1,ARG2);
4088 PRE_REG_READ2(long, "thr_kill", long, id, int, sig);
4089 if (!ML_(client_signal_OK)(ARG2)) {
4090 SET_STATUS_Failure( VKI_EINVAL );
4091 return;
4094 /* Check to see if this kill gave us a pending signal */
4095 *flags |= SfPollAfter;
4097 if (VG_(clo_trace_signals)) {
4098 VG_(message)(Vg_DebugMsg, "thr_kill: sending signal %lu to tid %lu\n",
4099 ARG2, ARG1);
4102 /* If we're sending SIGKILL, check to see if the target is one of
4103 our threads and handle it specially. */
4104 if (ARG2 == VKI_SIGKILL && ML_(do_sigkill)(ARG1, -1)) {
4105 SET_STATUS_Success(0);
4106 return;
4109 /* Ask to handle this syscall via the slow route, since that's the
4110 only one that sets tst->status to VgTs_WaitSys. If the result
4111 of doing the syscall is an immediate run of
4112 async_signalhandler() in m_signals, then we need the thread to
4113 be properly tidied away. I have the impression the previous
4114 version of this wrapper worked on x86/amd64 only because the
4115 kernel did not immediately deliver the async signal to this
4116 thread (on ppc it did, which broke the assertion re tst->status
4117 at the top of async_signalhandler()). */
4118 *flags |= SfMayBlock;
4121 POST(sys_thr_kill)
4123 if (VG_(clo_trace_signals)) {
4124 VG_(message)(Vg_DebugMsg, "thr_kill: sent signal %lu to tid %lu\n",
4125 ARG2, ARG1);
4129 // SYS_freebsd10__umtx_lock 434
4130 // removed
4132 // SYS_freebsd10__umtx_unlock 434
4133 // removed
4135 // SYS_jail_attach 436
4136 // int jail_attach(int jid);
4137 PRE(sys_jail_attach)
4139 PRINT("sys_jail_attach ( %" FMT_REGWORD "d )", SARG1);
4140 PRE_REG_READ1(int, "jail_attach", int, jid);
4143 // SYS_extattr_list_fd 437
4144 // ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes);
4145 PRE(sys_extattr_list_fd)
4147 PRINT("extattr_list_fd ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", SARG1, SARG2, ARG3, ARG4);
4148 PRE_REG_READ4(ssize_t, "extattr_list_fd", int, id, int, attrnamespace, void *,data, size_t, nbytes);
4149 PRE_MEM_WRITE("extattr_list_fd(data)", ARG3, ARG4);
4152 POST(sys_extattr_list_fd)
4154 POST_MEM_WRITE(ARG3, ARG4);
4157 // SYS_extattr_list_file 438
4158 // ssize_t extattr_list_file(const char *path, int attrnamespace, void *data,
4159 // size_t nbytes);
4160 PRE(sys_extattr_list_file)
4162 PRINT("extattr_list_file ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1, SARG2, ARG3, ARG4);
4163 PRE_REG_READ4(ssize_t, "extattr_list_file", const char *, path, int, attrnamespace, void *,data, size_t, nbytes);
4164 PRE_MEM_RASCIIZ("extattr_list_file(path)", ARG1);
4165 PRE_MEM_WRITE("extattr_list_file(data)", ARG3, ARG4);
4168 POST(sys_extattr_list_file)
4170 POST_MEM_WRITE(ARG3, ARG4);
4173 // SYS_extattr_list_link 439
4174 // ssize_t extattr_get_link(const char *path, int attrnamespace,
4175 // const char *attrname, void *data, size_t nbytes);
4176 PRE(sys_extattr_list_link)
4178 PRINT("extattr_list_link ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1, SARG2, ARG3, ARG4);
4179 PRE_REG_READ4(ssize_t, "extattr_list_link", const char *, path, int, attrnamespace, void *,data, size_t, nbytes);
4180 PRE_MEM_RASCIIZ("extattr_list_link(path)", ARG1);
4181 PRE_MEM_WRITE("extattr_list_link(data)", ARG3, ARG4);
4184 POST(sys_extattr_list_link)
4186 POST_MEM_WRITE(ARG3, ARG4);
4189 // SYS_ksem_timedwait 441
4190 // @todo
4192 // SYS_thr_suspend 442
4193 // int thr_suspend(struct timespec *timeout);
4194 PRE(sys_thr_suspend)
4196 PRINT("sys_thr_suspend ( %#" FMT_REGWORD "x )", ARG1);
4197 PRE_REG_READ1(int, "thr_suspend", struct timespec *, timeout);
4198 PRE_MEM_READ("thr_suspend(timeout)", ARG1, sizeof(struct vki_timespec));
4200 VG_(message)(Vg_UserMsg, "thr_supend() not implemented");
4201 VG_(unimplemented)("Valgrind does not support thr_suspend().");
4203 SET_STATUS_Failure(VKI_ENOSYS);
4206 // SYS_thr_wake 443
4207 // int thr_wake(long id);
4208 PRE(sys_thr_wake)
4210 PRINT("sys_thr_wake ( %" FMT_REGWORD "d )", SARG1);
4211 PRE_REG_READ1(long, "thr_wake", long, id);
4213 if (VG_(is_valid_tid)(ARG1)) {
4214 VG_(threads)[ARG1].status = VgTs_Runnable;
4215 } else {
4216 SET_STATUS_Failure( VKI_ESRCH );
4221 // SYS_kldunloadf 444
4222 // int kldunloadf(int fileid, int flags);
4223 PRE(sys_kldunloadf)
4225 PRINT("sys_kldunloadf ( %" FMT_REGWORD "d, %" FMT_REGWORD "d )", SARG1, SARG2);
4226 PRE_REG_READ2(int, "kldunloadf", int, fileid, int, flags);
4229 // SYS_audit 445
4230 // int audit(const char *record, u_int length);
4231 // @todo
4233 // SYS_auditon 446
4234 // int auditon(int cmd, void *data, u_int length);
4235 // @todo
4237 // SYS_getauid 447
4238 // int getauid(au_id_t *auid);
4239 // @todo
4241 // SYS_setauid 448
4242 // int setauid(au_id_t *auid);
4243 // @todo
4245 // SYS_getaudit 449
4246 // int getaudit(auditinfo_t *auditinfo);
4247 // @todo
4249 // SYS_setaudit 450
4250 // int setaudit(auditinfo_t *auditinfo);
4251 // @todo
4253 // SYS_getaudit_addr 451
4254 // int getaudit_addr(auditinfo_addr_t *auditinfo_addr, u_int length);
4255 // @todo
4257 // SYS_setaudit_addr 452
4258 // int setaudit_addr(auditinfo_addr_t *auditinfo_addr, u_int length);
4259 // @todo
4261 // SYS_auditctl 453
4262 // @todo
4264 // SYS__umtx_op 454
4265 // int _umtx_op(void *obj, int op, u_long val, void *uaddr, void *uaddr2);
4266 PRE(sys__umtx_op)
4268 /* 5 args are always passed through. The last two can vary, but
4269 they're always pointers. They may not be used though. */
4270 switch(ARG2) {
4271 case VKI_UMTX_OP_LOCK:
4272 // marked as COMPAT10
4273 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, LOCK, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4274 PRE_REG_READ5(long, "_umtx_op_lock",
4275 struct umtx *, obj, int, op, unsigned long, id,
4276 size_t, timeout_size, struct vki_timespec *, timeout);
4277 PRE_MEM_READ( "_umtx_op_lock(mtx)", ARG1, sizeof(struct vki_umtx) );
4278 if (ARG5) {
4279 PRE_MEM_READ( "_umtx_op_lock(timespec)", ARG5, ARG4 );
4281 PRE_MEM_WRITE( "_umtx_op_lock(mtx)", ARG1, sizeof(struct vki_umtx) );
4282 *flags |= SfMayBlock;
4283 break;
4284 case VKI_UMTX_OP_UNLOCK:
4285 // marked as COMPAT10
4286 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, UNLOCK, %" FMT_REGWORD "u)", ARG1, ARG3);
4287 PRE_REG_READ3(long, "_umtx_op_unlock",
4288 struct umtx *, obj, int, op, unsigned long, id);
4289 PRE_MEM_READ( "_umtx_op_unlock(mtx)", ARG1, sizeof(struct vki_umtx) );
4290 PRE_MEM_WRITE( "_umtx_op_unlock(mtx)", ARG1, sizeof(struct vki_umtx) );
4291 break;
4292 case VKI_UMTX_OP_WAIT:
4293 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, WAIT, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4294 PRE_REG_READ5(long, "_umtx_op_wait",
4295 long *, obj, int, op, unsigned long, val,
4296 size_t, timeout_size, struct vki_timespec *, timeout);
4297 if (ARG1) {
4298 PRE_MEM_READ( "_umtx_op_wait(val)", ARG1, sizeof(long) );
4299 if (*(long*)ARG1 == (long)ARG3) {
4300 *flags |= SfMayBlock;
4304 if (ARG5) {
4305 PRE_MEM_READ( "_umtx_op_wait(timeout)", ARG5, ARG4 );
4308 break;
4309 case VKI_UMTX_OP_WAKE:
4310 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, WAKE, %" FMT_REGWORD "u)", ARG1, ARG3);
4311 PRE_REG_READ3(long, "_umtx_op_wake",
4312 vki_uintptr_t *, obj, int, op, int, val);
4313 // PJF I don't think that the value of obj gets read, the address is being used as a key
4314 //PRE_MEM_READ("_umtx_op_wake(obj)", ARG1, sizeof(vki_uintptr_t));
4315 break;
4316 case VKI_UMTX_OP_MUTEX_TRYLOCK:
4317 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, MUTEX_TRYLOCK, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4318 PRE_REG_READ2(long, "_umtx_op_mutex_trylock", struct umutex *, obj, int, op);
4319 PRE_MEM_READ( "_umtx_op_mutex_trylock(mutex)", ARG1, sizeof(struct vki_umutex) );
4320 PRE_MEM_WRITE( "_umtx_op_mutex_trylock(mutex)", ARG1, sizeof(struct vki_umutex) );
4321 /* not too sure about the restart here
4322 * it's hard to test as if the mutex is locked this returns EBUSY
4323 * so there is only a small window where the syscall could be interrupted */
4324 *flags |= SfMayBlock | SfKernelRestart;
4325 break;
4326 case VKI_UMTX_OP_MUTEX_LOCK:
4327 // called by pthread_mutex_lock
4328 // when the atribute UMUTEX_PRIO_PROTECT or UMUTEX_PRIO_INHERIT is set
4329 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, MUTEX_LOCK, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4330 PRE_REG_READ5(long, "_umtx_op_mutex_lock",
4331 struct umutex *, obj, int, op, unsigned long, noid,
4332 size_t, timeout_size, struct vki_timespec *, timeout);
4333 PRE_MEM_READ( "_umtx_op_mutex_lock(mutex)", ARG1, sizeof(struct vki_umutex) );
4334 if (ARG5) {
4335 PRE_MEM_READ( "_umtx_op_mutex_lock(timespec)", ARG5, ARG4 );
4336 } else {
4337 *flags |= SfKernelRestart;
4339 PRE_MEM_WRITE( "_umtx_op_mutex_lock(mutex)", ARG1, sizeof(struct vki_umutex) );
4340 *flags |= SfMayBlock;
4341 break;
4342 case VKI_UMTX_OP_MUTEX_UNLOCK:
4343 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, MUTEX_UNLOCK)", ARG1);
4344 PRE_REG_READ2(long, "_umtx_op_mutex_unlock",
4345 struct umutex *, obj, int, op);
4346 PRE_MEM_READ( "_umtx_op_mutex_unlock(mutex)", ARG1, sizeof(struct vki_umutex) );
4347 PRE_MEM_WRITE( "_umtx_op_mutex_unlock(mutex)", ARG1, sizeof(struct vki_umutex) );
4348 break;
4349 case VKI_UMTX_OP_SET_CEILING:
4350 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, SET_CEILING, %" FMT_REGWORD "u, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4);
4351 PRE_REG_READ4(long, "_umtx_op_set_ceiling",
4352 struct umutex *, obj, int, op, unsigned int, ceiling,
4353 unsigned int *, old_ceiling);
4354 PRE_MEM_READ( "_umtx_op_set_ceiling(mutex)", ARG1, sizeof(struct vki_umutex) );
4355 PRE_MEM_WRITE( "_umtx_op_set_ceiling(mutex)", ARG1, sizeof(struct vki_umutex) );
4356 if (ARG4) {
4357 PRE_MEM_WRITE( "_umtx_op_set_ceiling(old_ceiling)", ARG4, sizeof(vki_uint32_t) );
4359 break;
4360 case VKI_UMTX_OP_CV_WAIT:
4361 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, CV_WAIT, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4362 PRE_REG_READ5(long, "_umtx_op_cv_wait",
4363 struct ucond *, obj, int, op, unsigned long, wflags,
4364 struct umutex *, umtx, struct vki_timespec *, timeout);
4365 PRE_MEM_READ( "_umtx_op_cv_wait(cond)", ARG1, sizeof(struct vki_ucond) );
4366 PRE_MEM_WRITE( "_umtx_op_cv_wait(cond)", ARG1, sizeof(struct vki_ucond) );
4367 PRE_MEM_READ( "_umtx_op_cv_wait(mutex)", ARG4, sizeof(struct vki_umutex) );
4368 PRE_MEM_WRITE( "_umtx_op_cv_wait(mutex)", ARG4, sizeof(struct vki_umutex) );
4369 if (ARG5) {
4370 PRE_MEM_READ( "_umtx_op_cv_wait(timespec)", ARG5, sizeof(struct vki_timespec) );
4372 *flags |= SfMayBlock;
4373 break;
4374 case VKI_UMTX_OP_CV_SIGNAL:
4375 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, CV_SIGNAL)", ARG1);
4376 PRE_REG_READ2(long, "_umtx_op_cv_signal",
4377 struct ucond *, obj, int, op);
4378 PRE_MEM_READ( "_umtx_op_cv_signal(cond)", ARG1, sizeof(struct vki_ucond) );
4379 PRE_MEM_WRITE( "_umtx_op_cv_signal(cond)", ARG1, sizeof(struct vki_ucond) );
4380 break;
4381 case VKI_UMTX_OP_CV_BROADCAST:
4382 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, CV_BROADCAST, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4383 PRE_REG_READ2(long, "_umtx_op_cv_broadcast",
4384 struct ucond *, obj, int, op);
4385 PRE_MEM_READ( "_umtx_op_cv_broadcast(cond)", ARG1, sizeof(struct vki_ucond) );
4386 PRE_MEM_WRITE( "_umtx_op_cv_broadcast(cond)", ARG1, sizeof(struct vki_ucond) );
4387 break;
4388 case VKI_UMTX_OP_WAIT_UINT:
4389 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, CV_WAIT_UINT, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4390 PRE_REG_READ5(long, "_umtx_op_wait_uint",
4391 int *, obj, int, op, unsigned long, id,
4392 size_t, timeout_wait, struct vki_timespec *, timeout);
4393 PRE_MEM_READ( "_umtx_op_wait(uint)", ARG1, sizeof(int) );
4394 if (ARG5) {
4395 PRE_MEM_READ( "_umtx_op_wait(timespec)", ARG5, ARG4 );
4397 *flags |= SfMayBlock;
4398 break;
4399 case VKI_UMTX_OP_RW_RDLOCK:
4400 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, RW_RDLOCK, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4401 PRE_REG_READ5(long, "_umtx_op_rw_rdlock",
4402 struct urwlock *, obj, int, op, unsigned long, noid,
4403 void *, zero, struct vki_timespec *, timeout);
4404 PRE_MEM_READ( "_umtx_op_rw_rdlock(rw)", ARG1, sizeof(struct vki_urwlock) );
4405 PRE_MEM_WRITE( "_umtx_op_rw_rdlock(rw)", ARG1, sizeof(struct vki_urwlock) );
4406 *flags |= SfMayBlock;
4407 break;
4408 case VKI_UMTX_OP_RW_WRLOCK:
4409 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, RW_WRLOCK, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4410 PRE_REG_READ5(long, "_umtx_op_rw_wrlock",
4411 struct urwlock *, obj, int, op, unsigned long, noid,
4412 void *, zero, struct vki_timespec *, timeout);
4413 PRE_MEM_READ( "_umtx_op_rw_wrlock(rw)", ARG1, sizeof(struct vki_urwlock) );
4414 PRE_MEM_WRITE( "_umtx_op_rw_wrlock(rw)", ARG1, sizeof(struct vki_urwlock) );
4415 *flags |= SfMayBlock;
4416 break;
4417 case VKI_UMTX_OP_RW_UNLOCK:
4418 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, RW_UNLOCK, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4419 PRE_REG_READ2(long, "_umtx_op_rw_unlock",
4420 struct urwlock *, obj, int, op);
4421 PRE_MEM_READ( "_umtx_op_rw_unlock(rw)", ARG1, sizeof(struct vki_urwlock) );
4422 PRE_MEM_WRITE( "_umtx_op_rw_unlock(rw)", ARG1, sizeof(struct vki_urwlock) );
4423 break;
4424 case VKI_UMTX_OP_WAIT_UINT_PRIVATE:
4425 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, CV_WAIT_UINT_PRIVATE, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4426 PRE_REG_READ5(long, "_umtx_op_wait_uint_private",
4427 int *, obj, int, op, unsigned long, id,
4428 size_t, timeout_size, struct vki_timespec *, timeout);
4429 PRE_MEM_READ( "_umtx_op_wait_private(uint)", ARG1, sizeof(int) );
4430 if (ARG5) {
4431 PRE_MEM_READ( "_umtx_op_wait_private(umtx_time)", ARG5, ARG4 );
4433 *flags |= SfMayBlock;
4434 break;
4435 case VKI_UMTX_OP_WAKE_PRIVATE:
4436 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, CV_WAKE_PRIVATE, %" FMT_REGWORD "u)", ARG1, ARG3);
4437 PRE_REG_READ3(long, "_umtx_op_wake_private",
4438 vki_uintptr_t *, obj, int, op, int, val);
4439 // PJF like OP_WAKE contents of obj not read
4440 //PRE_MEM_READ("_umtx_op_wake_private(obj)", ARG1, sizeof(vki_uintptr_t));
4441 break;
4442 case VKI_UMTX_OP_MUTEX_WAIT:
4443 // pthread_mutex_lock without prio flags
4444 // does not need to be restarted
4445 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, MUTEX_WAIT, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4446 PRE_REG_READ2(long, "_umtx_op_mutex_wait",
4447 struct umutex *, obj, int, op);
4448 PRE_MEM_READ( "_umtx_op_mutex_wait(mutex)", ARG1, sizeof(struct vki_umutex) );
4449 PRE_MEM_WRITE( "_umtx_op_mutex_wait(mutex)", ARG1, sizeof(struct vki_umutex) );
4450 *flags |= SfMayBlock;
4451 break;
4452 case VKI_UMTX_OP_MUTEX_WAKE:
4453 // marked as deprecated
4454 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, MUTEX_WAKE, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4455 PRE_REG_READ2(long, "_umtx_op_mutex_wake",
4456 struct umutex *, obj, int, op);
4457 PRE_MEM_READ( "_umtx_op_mutex_wake(mutex)", ARG1, sizeof(struct vki_umutex) );
4458 PRE_MEM_WRITE( "_umtx_op_mutex_wake(mutex)", ARG1, sizeof(struct vki_umutex) );
4459 break;
4460 case VKI_UMTX_OP_SEM_WAIT:
4461 // marked as deprecated
4462 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, SEM_WAIT, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4463 PRE_REG_READ5(long, "_umtx_op_sem_wait",
4464 struct usem *, obj, int, op, unsigned long, id,
4465 size_t, timeout_size, struct vki_timespec *, timeout);
4466 PRE_MEM_READ( "_umtx_op_sem_wait(usem)", ARG1, sizeof(struct vki_usem) );
4467 PRE_MEM_WRITE( "_umtx_op_sem_wait(usem)", ARG1, sizeof(struct vki_usem) );
4468 if (ARG5) {
4469 PRE_MEM_READ( "_umtx_op_sem_wait(umtx_time)", ARG5, ARG4 );
4471 *flags |= SfMayBlock;
4472 break;
4473 case VKI_UMTX_OP_SEM_WAKE:
4474 // marked as deprecated
4475 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, SEM_WAKE, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4476 PRE_REG_READ2(long, "_umtx_op_sem_wake",
4477 struct umutex *, obj, int, op);
4478 PRE_MEM_READ( "_umtx_op_sem_wake(mutex)", ARG1, sizeof(struct vki_usem) );
4479 PRE_MEM_WRITE( "_umtx_op_sem_wake(mutex)", ARG1, sizeof(struct vki_usem) );
4480 break;
4481 case VKI_UMTX_OP_NWAKE_PRIVATE:
4482 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, NWAKE_PRIVATE, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4483 PRE_REG_READ3(long, "_umtx_op_nwake_private",
4484 struct umutex *, obj, int, op, int, count);
4485 PRE_MEM_READ( "_umtx_op_nwake_private(mtxs)", ARG1, ARG3 * sizeof(void *) );
4486 PRE_MEM_WRITE( "_umtx_op_mutex_wake(mtxs)", ARG1, sizeof(struct vki_umutex) );
4487 break;
4488 case VKI_UMTX_OP_MUTEX_WAKE2:
4489 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, MUTEX_WAKE2, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4490 PRE_REG_READ3(long, "_umtx_op_mutex_wake2",
4491 struct umutex *, obj, int, op, unsigned long, flags);
4492 PRE_MEM_READ( "_umtx_op_mutex_wake(mutex)", ARG1, sizeof(struct vki_umutex) );
4493 PRE_MEM_WRITE( "_umtx_op_mutex_wake(mutex)", ARG1, sizeof(struct vki_umutex) );
4494 break;
4495 case VKI_UMTX_OP_SEM2_WAIT:
4496 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, SEM2_WAIT, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4497 PRE_REG_READ3(long, "_umtx_op_sem2_wake",
4498 struct _usem2 *, obj, int, op, unsigned long, flags);
4499 PRE_MEM_READ( "_umtx_op_sem2_wait(mutex)", ARG1, sizeof(struct vki_usem2) );
4500 PRE_MEM_WRITE( "_umtx_op_sem2_wait(mutex)", ARG1, sizeof(struct vki_usem2) );
4501 *flags |= SfMayBlock;
4502 break;
4503 case VKI_UMTX_OP_SEM2_WAKE:
4504 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, SEM2_WAKE, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4505 PRE_REG_READ3(long, "_umtx_op_sem2_wake",
4506 struct _usem2 *, obj, int, op, unsigned long, flags);
4507 PRE_MEM_READ( "_umtx_op_sem2_wait(mutex)", ARG1, sizeof(struct vki_usem2) );
4508 PRE_MEM_WRITE( "_umtx_op_sem2_wait(mutex)", ARG1, sizeof(struct vki_usem2) );
4509 break;
4510 case VKI_UMTX_OP_SHM:
4511 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, SHM, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4512 PRE_REG_READ4(long, "_umtx_op_shm",
4513 void *, obj, int, op, unsigned long, val, void*, uaddr);
4514 break;
4515 case VKI_UMTX_OP_ROBUST_LISTS:
4516 // strangely the obj pointer ARG1 isn't used, for instance lin libc
4517 // libthr/thread/thr_mutex.c: _umtx_op(NULL, UMTX_OP_ROBUST_LISTS, sizeof(rb), &rb, NULL);
4518 // val (ARG3) ought to be the same as sizeof(struct vki_umtx_robust_lists_params)
4519 // strangely the kernel returns EINVAL if size is larger than sizeof(struct vki_umtx_robust_lists_params)
4520 // (which seems relatively harmless)
4521 // but not if it is smaller (definitely dangerous, probably an overrun)
4522 if (ARG3 < sizeof(struct vki_umtx_robust_lists_params)) {
4523 VG_(umsg)("WARNING: _umtx_op_tobust_lists size is smaller than sizeof(struct umtx_robust_lists_params).\n");
4525 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, ROBUST_LISTS, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG3, ARG4, ARG5);
4526 PRE_REG_READ4(long, "_umtx_op_robust_lists",
4527 void*, obj, int, op, unsigned long, val, struct umtx_robust_lists*, uaddr);
4528 PRE_MEM_READ( "_umtx_op_robust_lists(robust_lists)", ARG4, ARG3 );
4529 break;
4530 case VKI_UMTX_OP_GET_MIN_TIMEOUT:
4531 PRINT( "sys__umtx_op ( GET_MIN_TIMEOUT, %#" FMT_REGWORD "x)", ARG4);
4532 // bit of a pain just reads args 2 and 4
4533 if (VG_(tdict).track_pre_reg_read) {
4534 PRRSN;
4535 PRA2("_umtx_op_get_min_timeout",int,op);
4536 PRA4("_umtx_op_get_min_timeout",long int*,timeout);
4538 PRE_MEM_WRITE( "_umtx_op_get_min_timout(uaddr)", ARG4, sizeof(long int) );
4539 break;
4540 case VKI_UMTX_OP_SET_MIN_TIMEOUT:
4541 PRINT( "sys__umtx_op ( SET_MIN_TIMEOUT, %" FMT_REGWORD "u)", ARG3);
4542 // bit of a pain just reads args 2 and 3
4543 if (VG_(tdict).track_pre_reg_read) {
4544 PRRSN;
4545 PRA2("_umtx_op_set_min_timeout",int,op);
4546 PRA3("_umtx_op_set_min_timeout",unsigned long,timeout);
4548 break;
4549 default:
4550 VG_(umsg)("WARNING: _umtx_op unsupported value.\n");
4551 PRINT( "sys__umtx_op ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u(UNKNOWN), %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1, ARG2, ARG3, ARG4, ARG5);
4552 break;
4556 POST(sys__umtx_op)
4558 switch(ARG2) {
4559 case VKI_UMTX_OP_LOCK:
4560 case VKI_UMTX_OP_UNLOCK:
4561 if (SUCCESS) {
4562 POST_MEM_WRITE( ARG1, sizeof(struct vki_umtx) );
4564 break;
4565 case VKI_UMTX_OP_WAIT:
4566 case VKI_UMTX_OP_WAKE:
4567 case VKI_UMTX_OP_WAIT_UINT:
4568 case VKI_UMTX_OP_WAIT_UINT_PRIVATE:
4569 case VKI_UMTX_OP_WAKE_PRIVATE:
4570 break;
4571 case VKI_UMTX_OP_MUTEX_TRYLOCK:
4572 case VKI_UMTX_OP_MUTEX_LOCK:
4573 case VKI_UMTX_OP_MUTEX_UNLOCK:
4574 case VKI_UMTX_OP_MUTEX_WAIT: /* Sets/clears contested bits */
4575 case VKI_UMTX_OP_MUTEX_WAKE: /* Sets/clears contested bits */
4576 if (SUCCESS) {
4577 POST_MEM_WRITE( ARG1, sizeof(vki_uintptr_t) );
4579 break;
4580 case VKI_UMTX_OP_SET_CEILING:
4581 if (SUCCESS) {
4582 POST_MEM_WRITE( ARG1, sizeof(struct vki_umutex) );
4583 if (ARG4) {
4584 POST_MEM_WRITE( ARG4, sizeof(vki_uint32_t) );
4587 break;
4588 case VKI_UMTX_OP_CV_WAIT:
4589 if (SUCCESS) {
4590 POST_MEM_WRITE( ARG1, sizeof(struct vki_ucond) );
4591 POST_MEM_WRITE( ARG4, sizeof(struct vki_umutex) );
4593 break;
4594 case VKI_UMTX_OP_CV_SIGNAL:
4595 case VKI_UMTX_OP_CV_BROADCAST:
4596 if (SUCCESS) {
4597 POST_MEM_WRITE( ARG1, sizeof(struct vki_ucond) );
4599 break;
4600 case VKI_UMTX_OP_RW_RDLOCK:
4601 case VKI_UMTX_OP_RW_WRLOCK:
4602 case VKI_UMTX_OP_RW_UNLOCK:
4603 if (SUCCESS) {
4604 POST_MEM_WRITE( ARG1, sizeof(struct vki_urwlock) );
4606 break;
4607 case VKI_UMTX_OP_SEM2_WAIT:
4608 case VKI_UMTX_OP_SEM2_WAKE:
4609 if (SUCCESS) {
4610 POST_MEM_WRITE( ARG1, sizeof(struct vki_usem2) );
4612 break;
4613 case VKI_UMTX_OP_SHM:
4614 if (SUCCESS && ARG3 == VKI_UMTX_SHM_CREAT) {
4615 if (VG_(clo_track_fds))
4616 ML_(record_fd_open_nameless) (tid, RES);
4618 break;
4619 case VKI_UMTX_OP_GET_MIN_TIMEOUT:
4620 POST_MEM_WRITE( ARG4, sizeof(long int) );
4621 break;
4622 default:
4623 break;
4627 // SYS_thr_new 455
4628 // x86/amd64
4630 // SYS_sigqueue 456
4631 // int sigqueue(pid_t pid, int signo, const union sigval value);
4632 PRE(sys_sigqueue)
4634 PRINT("sys_sigqueue ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )",
4635 SARG1,SARG2,ARG3);
4636 PRE_REG_READ3(int, "sigqueue", vki_pid_t, pid, int, signo, const union vki_sigval, value);
4639 // SYS_kmq_open 457
4640 // mqd_t mq_open(const char *name, int oflag, ...);
4641 // int kmq_open(_In_z_ const char *path, int flags, mode_t mode, _In_opt_ const struct mq_attr *attr);
4642 PRE(sys_kmq_open)
4644 if (ARG2 & VKI_O_CREAT) {
4645 PRINT("sys_kmq_open( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %hu, %#" FMT_REGWORD "x )",
4646 ARG1,(char *)ARG1,ARG2,(vki_mode_t)ARG3,ARG4);
4647 PRE_REG_READ4(long, "mq_open",
4648 const char *, name, int, oflag, vki_mode_t, mode,
4649 struct mq_attr *, attr);
4650 } else {
4651 PRINT("sys_kmq_open( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %hu)",
4652 ARG1,(char *)ARG1,ARG2,(vki_mode_t)ARG3);
4653 PRE_REG_READ3(long, "mq_open",
4654 const char *, name, int, oflag, vki_mode_t, mode);
4656 PRE_MEM_RASCIIZ( "mq_open(name)", ARG1 );
4657 if (ARG2 & VKI_O_CREAT) {
4658 PRE_MEM_READ("mq_open(attr)", ARG4, sizeof(struct vki_mq_attr));
4659 if (ML_(safe_to_deref)((struct vki_mq_attr *)ARG4, sizeof(struct vki_mq_attr))) {
4660 const struct vki_mq_attr *attr = (struct vki_mq_attr *)ARG4;
4661 PRE_MEM_READ("mq_open(attr->mq_maxmsg)",
4662 (Addr)&attr->mq_maxmsg, sizeof(attr->mq_maxmsg) );
4663 PRE_MEM_READ("mq_open(attr->mq_msgsize)",
4664 (Addr)&attr->mq_msgsize, sizeof(attr->mq_msgsize) );
4669 POST(sys_kmq_open)
4671 vg_assert(SUCCESS);
4672 if (!ML_(fd_allowed)(RES, "mq_open", tid, True)) {
4673 VG_(close)(RES);
4674 SET_STATUS_Failure( VKI_EMFILE );
4675 } else {
4676 if (VG_(clo_track_fds)) {
4677 ML_(record_fd_open_with_given_name)(tid, RES, (const HChar*)ARG1);
4682 // SYS_kmq_setattr 458
4683 // int mq_setattr(mqd_t mqdes, const struct mq_attr *restrict mqstat,
4684 // struct mq_attr *restrict omqstat);
4685 PRE(sys_kmq_setattr)
4687 PRINT("sys_kmq_getattr( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1,ARG2,ARG3 );
4688 PRE_REG_READ3(int, "mq_setattr",
4689 vki_mqd_t, mqdes, const struct mq_attr *, mqstat,
4690 struct mq_attr *, omqstat);
4691 if (!ML_(fd_allowed)(ARG1, "mq_getattr", tid, False)) {
4692 SET_STATUS_Failure( VKI_EBADF );
4693 } else {
4694 if (ML_(safe_to_deref)((struct vki_mq_attr *)ARG2, sizeof(struct vki_mq_attr))) {
4695 const struct vki_mq_attr *attr = (struct vki_mq_attr *)ARG2;
4696 PRE_MEM_READ( "mq_setattr(mqstat->mq_flags)",
4697 (Addr)&attr->mq_flags, sizeof(attr->mq_flags) );
4699 PRE_MEM_WRITE( "mq_setattr(omqstat)", ARG3,
4700 sizeof(struct vki_mq_attr) );
4704 // SYS_kmq_timedreceive 459
4705 // ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len,
4706 // unsigned *msg_prio, const struct timespec *abs_timeout);
4707 PRE(sys_kmq_timedreceive)
4709 *flags |= SfMayBlock;
4710 PRINT("sys_kmq_timedreceive( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %llu, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
4711 ARG1,ARG2,(ULong)ARG3,ARG4,ARG5);
4712 PRE_REG_READ5(ssize_t, "mq_timedreceive",
4713 vki_mqd_t, mqdes, char *, msg_ptr, vki_size_t, msg_len,
4714 unsigned int *, msg_prio,
4715 const struct timespec *, abs_timeout);
4716 if (!ML_(fd_allowed)(ARG1, "mq_timedreceive", tid, False)) {
4717 SET_STATUS_Failure( VKI_EBADF );
4718 } else {
4719 PRE_MEM_WRITE( "mq_timedreceive(msg_ptr)", ARG2, ARG3 );
4720 if (ARG4 != 0) {
4721 PRE_MEM_WRITE( "mq_timedreceive(msg_prio)",
4722 ARG4, sizeof(unsigned int) );
4724 if (ARG5 != 0) {
4725 PRE_MEM_READ( "mq_timedreceive(abs_timeout)",
4726 ARG5, sizeof(struct vki_timespec) );
4731 POST(sys_kmq_timedreceive)
4733 POST_MEM_WRITE( ARG2, ARG3 );
4734 if (ARG4 != 0) {
4735 POST_MEM_WRITE( ARG4, sizeof(unsigned int) );
4739 // SYS_kmq_timedsend 460
4740 // int mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len,
4741 // unsigned msg_prio, const struct timespec *abs_timeout);
4742 PRE(sys_kmq_timedsend)
4744 *flags |= SfMayBlock;
4745 PRINT("sys_kmq_timedsend ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %llu, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )",
4746 ARG1,ARG2,(ULong)ARG3,ARG4,ARG5);
4747 PRE_REG_READ5(int, "mq_timedsend",
4748 vki_mqd_t, mqdes, const char *, msg_ptr, vki_size_t, msg_len,
4749 unsigned int, msg_prio, const struct timespec *, abs_timeout);
4750 if (!ML_(fd_allowed)(ARG1, "mq_timedsend", tid, False)) {
4751 SET_STATUS_Failure( VKI_EBADF );
4752 } else {
4753 PRE_MEM_READ( "mq_timedsend(msg_ptr)", ARG2, ARG3 );
4754 if (ARG5 != 0) {
4755 PRE_MEM_READ( "mq_timedsend(abs_timeout)", ARG5,
4756 sizeof(struct vki_timespec) );
4761 // SYS_kmq_notify 461
4762 // int mq_notify(mqd_t mqdes, const struct sigevent *notification);
4763 PRE(sys_kmq_notify)
4765 PRINT("sys_kmq_notify( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1,ARG2 );
4766 PRE_REG_READ2(int, "mq_notify",
4767 vki_mqd_t, mqdes, const struct sigevent *, notification);
4768 if (!ML_(fd_allowed)(ARG1, "mq_notify", tid, False)) {
4769 SET_STATUS_Failure( VKI_EBADF );
4771 else if (ARG2 != 0) {
4772 PRE_MEM_READ( "mq_notify(notification)",
4773 ARG2, sizeof(struct vki_sigevent) );
4777 // SYS_kmq_unlink 462
4778 // int kmq_unlink(const char *path);
4779 PRE(sys_kmq_unlink)
4781 PRINT("sys_kmq_unlink ( %#" FMT_REGWORD "x(%s) )", ARG1,(char *)ARG1);
4782 PRE_REG_READ1(int, "mq_unlink", const char *, name);
4783 PRE_MEM_RASCIIZ( "mq_unlink(name)", ARG1 );
4786 // SYS_abort2 463
4787 // void abort2(const char *why, int nargs, void **args);
4788 PRE(sys_abort2)
4790 PRINT( "sys_abort2 ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", ARG1, SARG2, ARG3 );
4791 PRE_REG_READ3(void, "abort2", const char *, why, int, nargs, void **, args);
4792 // max length of 'why' is 128
4793 PRE_MEM_RASCIIZ( "abort2(why)", ARG2);
4794 // max val for nargs is 16
4795 PRE_MEM_READ("abort2(args", ARG3, ARG2*sizeof(void*));
4798 // SYS_thr_set_name 464
4799 // int thr_set_name(long id, const char *name);
4800 PRE(sys_thr_set_name)
4802 PRINT( "sys_thr_set_name ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1, ARG2 );
4803 PRE_REG_READ2(int, "thr_set_name", long, id, const char *, name);
4804 PRE_MEM_RASCIIZ( "thr_set_name(name)", ARG2);
4806 if (ML_(safe_to_deref)((void*)ARG2, 1)) {
4807 const HChar* new_name = (const HChar*) (Addr)ARG2;
4808 ThreadState* tst = VG_(get_ThreadState)(tid);
4809 SizeT new_len = VG_(strnlen)(new_name, VKI_MAXCOMLEN+1);
4810 tst->thread_name = VG_(realloc)("syswrap.thr_set_name", tst->thread_name, new_len + 1);
4811 VG_(strlcpy)(tst->thread_name, new_name, new_len + 1);
4815 // SYS_aio_fsync 465
4816 // int aio_fsync(int op, struct aiocb *iocb);
4817 PRE(sys_aio_fsync)
4819 PRINT("aio_fsync ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1,ARG2);
4820 PRE_REG_READ2(int, "aio_fsync", int, op, struct vki_aiocb *, iocb);
4821 PRE_MEM_READ( "aio_fsync(iocb)", ARG2, sizeof(struct vki_aiocb) );
4824 // SYS_rtprio_thread 466
4825 // int rtprio_thread(int function, lwpid_t lwpid, struct rtprio *rtp);
4826 PRE(sys_rtprio_thread)
4828 PRINT( "sys_rtprio_thread ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1, ARG2, ARG3 );
4829 PRE_REG_READ3(int, "rtprio_thread",
4830 int, function, __vki_lwpid_t, lwpid, struct vki_rtprio *, rtp);
4831 if (ARG1 == VKI_RTP_SET) {
4832 PRE_MEM_READ( "rtprio_thread(rtp#set)", ARG3, sizeof(struct vki_rtprio));
4833 } else if (ARG1 == VKI_RTP_LOOKUP) {
4834 PRE_MEM_WRITE( "rtprio_thread(rtp#lookup)", ARG3, sizeof(struct vki_rtprio));
4835 } else {
4836 /* PHK ?? */
4840 POST(sys_rtprio_thread)
4842 if (ARG1 == VKI_RTP_LOOKUP && RES == 0) {
4843 POST_MEM_WRITE( ARG3, sizeof(struct vki_rtprio));
4847 // SYS_sctp_peeloff 471
4848 // int sctp_peeloff(int s, sctp_assoc_t id);
4849 // @todo
4852 // SYS_sctp_generic_sendmsg 472
4853 // int sctp_generic_sendmsg(int s, void *msg, int msglen, struct sockaddr *to,
4854 // socklen_t len, struct sctp_sndrcvinfo *sinfo, int flags);
4856 // Not called directly from libc
4857 PRE(sys_sctp_generic_sendmsg)
4859 *flags |= SfMayBlock;
4860 PRINT("sys_sctp_generic_sendmsg ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "d )",SARG1,ARG2,SARG3,ARG4,SARG5,ARG6,SARG7);
4861 PRE_REG_READ7(ssize_t, "sctp_generic_sendmsg",
4862 int, s, void *, msg, int, msglen,
4863 struct sockaddr *, to, socklen_t, len,
4864 struct sctp_sndrcvinfo *, sinfo, int, flags);
4866 PRE_MEM_READ( "sctp_generic_sendmsg(msg)", ARG2, ARG3);
4868 ML_(pre_mem_read_sockaddr) (tid, "sctp_generic_sendmsg(to)", (struct vki_sockaddr *)ARG4, ARG5);
4870 if (ARG6 != (Addr)NULL) {
4871 PRE_MEM_READ( "sctp_generic_sendmsg(sinfo)", ARG6, sizeof(struct vki_sctp_sndrcvinfo));
4875 // SYS_sctp_generic_sendmsg_iov 473
4876 // int sctp_generic_sendmsg_iov(int s, struct iovec *iov, int iovlen,
4877 // struct sockaddr *to, struct sctp_sndrcvinfo *sinfo, int flags);
4878 // @todo
4880 // SYS_sctp_generic_recvmsg 474
4881 // int sctp_generic_recvmsg(int s, struct iovec *iov, int iovlen,
4882 // struct sockaddr *from, socklen_t *fromlen,
4883 // struct sctp_sndrcvinfo *sinfo, int *msgflags);
4885 // Not called directly from libc
4886 PRE(sys_sctp_generic_recvmsg)
4888 *flags |= SfMayBlock;
4889 PRINT("sys_sctp_generic_recvmsg ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",SARG1,ARG2,SARG3,ARG4,ARG5,ARG6,ARG7);
4890 PRE_REG_READ7(ssize_t, "sctp_generic_recvmsg",
4891 int, s, struct iovec *, iov, int, iovlen,
4892 struct sockaddr *, from, socklen_t *, fromlen,
4893 struct sctp_sndrcvinfo *, sinfo, int *, msgflags);
4895 // in the sctp_recvmsg libc wrapper this is always 1
4896 if ((Int)ARG3 > 0) {
4897 PRE_MEM_READ( "sctp_generic_recvmsg(iov)", ARG2, ARG3 * sizeof(struct vki_iovec) );
4899 if (ML_(safe_to_deref)((const void*)ARG2, ARG3 * sizeof(struct vki_iovec))) {
4900 struct vki_iovec* iovec = (struct vki_iovec*)ARG2;
4901 PRE_MEM_WRITE("sctp_generic_recvmsg(iov.iov_base)", (Addr)iovec->iov_base, iovec->iov_len);
4904 if (ARG4 != (Addr)NULL) {
4905 ML_(buf_and_len_pre_check) (tid, ARG4, ARG5,
4906 "sctp_generic_recvmsg(from)",
4907 "sctp_generic_recvmsg(fromlen_in)");
4910 if (ARG6 != (Addr)NULL) {
4911 PRE_MEM_WRITE("sctp_generic_recvmsg(sinfo)", ARG6, sizeof(struct vki_sctp_sndrcvinfo));
4914 if (ARG7 != (Addr)NULL) {
4915 PRE_MEM_WRITE("sctp_generic_recvmsg(msgflags)", ARG7, sizeof(int));
4919 POST(sys_sctp_generic_recvmsg)
4921 vg_assert(SUCCESS);
4922 struct vki_iovec* iovec = (struct vki_iovec*)ARG2;
4923 POST_MEM_WRITE((Addr)iovec->iov_base, iovec->iov_len);
4925 POST_MEM_WRITE( ARG2, ARG3*sizeof(struct vki_iovec) );
4927 if (ARG4 != (Addr)NULL) {
4928 ML_(buf_and_len_post_check) (tid, VG_(mk_SysRes_Success)(RES), ARG4, ARG5,
4929 "sctp_generic_recvmsg(fromlen_out)");
4932 if (ARG6 != (Addr)NULL) {
4933 POST_MEM_WRITE(ARG6, sizeof(struct vki_sctp_sndrcvinfo));
4936 if (ARG7 != (Addr)NULL) {
4937 POST_MEM_WRITE(ARG7, sizeof(int));
4941 // SYS_pread 475
4942 // x86/amd64
4944 // SYS_pwrite 476
4945 // x86/amd64
4947 // SYS_mmap 477
4948 // x86/amd64
4950 // SYS_lseek 478
4951 // x86/amd64
4953 //SYS_truncate 479
4954 // x86/amd64
4956 // SYS_ftruncate 480
4957 // x86/amd64
4959 // SYS_thr_kill2 481
4960 // int thr_kill2(pid_t pid, long id, int sig);
4961 PRE(sys_thr_kill2)
4963 PRINT("sys_thr_kill2 ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1,ARG2,ARG3);
4964 PRE_REG_READ3(int, "thr_kill2", pid_t, pid, long, tid, int, sig);
4965 if (!ML_(client_signal_OK)(ARG3)) {
4966 SET_STATUS_Failure( VKI_EINVAL );
4967 return;
4970 /* Check to see if this kill gave us a pending signal */
4971 *flags |= SfPollAfter;
4973 if (VG_(clo_trace_signals)) {
4974 VG_(message)(Vg_DebugMsg, "thr_kill2: sending signal %lu to pid %lu/%lu\n",
4975 ARG3, ARG1, ARG2);
4978 /* If we're sending SIGKILL, check to see if the target is one of
4979 our threads and handle it specially. */
4980 if (ARG3 == VKI_SIGKILL && ML_(do_sigkill)(ARG2, ARG1)) {
4981 SET_STATUS_Success(0);
4982 return;
4985 /* Ask to handle this syscall via the slow route, since that's the
4986 only one that sets tst->status to VgTs_WaitSys. If the result
4987 of doing the syscall is an immediate run of
4988 async_signalhandler() in m_signals, then we need the thread to
4989 be properly tidied away. I have the impression the previous
4990 version of this wrapper worked on x86/amd64 only because the
4991 kernel did not immediately deliver the async signal to this
4992 thread (on ppc it did, which broke the assertion re tst->status
4993 at the top of async_signalhandler()). */
4994 *flags |= SfMayBlock;
4997 POST(sys_thr_kill2)
4999 if (VG_(clo_trace_signals)) {
5000 VG_(message)(Vg_DebugMsg, "thr_kill2: sent signal %lu to pid %lu/%lu\n",
5001 ARG3, ARG1, ARG2);
5005 // SYS_shm_open 482
5006 // int shm_open(const char *path, int flags, mode_t mode);
5007 PRE(sys_shm_open)
5009 PRE_REG_READ3(int, "shm_open",
5010 const char *, path, int, flags, vki_mode_t, mode);
5011 if (ARG1 == VKI_SHM_ANON) {
5012 PRINT("sys_shm_open(%#" FMT_REGWORD "x(SHM_ANON), %" FMT_REGWORD "u, %hu)", ARG1, ARG2, (vki_mode_t)ARG3);
5013 } else {
5014 PRINT("sys_shm_open(%#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %hu)", ARG1, (HChar *)ARG1, ARG2, (vki_mode_t)ARG3);
5015 PRE_MEM_RASCIIZ( "shm_open(path)", ARG1 );
5017 *flags |= SfMayBlock;
5020 POST(sys_shm_open)
5022 vg_assert(SUCCESS);
5023 if (!ML_(fd_allowed)(RES, "shm_open", tid, True)) {
5024 VG_(close)(RES);
5025 SET_STATUS_Failure( VKI_EMFILE );
5026 } else {
5027 if (VG_(clo_track_fds)) {
5028 ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG1);
5033 // SYS_shm_unlink 483
5034 // int shm_unlink(const char *path);
5035 PRE(sys_shm_unlink)
5037 PRINT("sys_shm_unlink(%#" FMT_REGWORD "x(%s))", ARG1, (char *)ARG1);
5038 PRE_REG_READ1(int, "shm_unlink",
5039 const char *, path);
5041 PRE_MEM_RASCIIZ( "shm_unlink(path)", ARG1 );
5043 *flags |= SfMayBlock;
5046 // SYS_cpuset 484
5047 // int cpuset(cpusetid_t *setid);
5048 PRE(sys_cpuset)
5050 PRINT("sys_cpuset ( %#" FMT_REGWORD "x )", ARG1);
5051 PRE_REG_READ1(int, "cpuset", vki_cpusetid_t *, setid);
5052 PRE_MEM_WRITE("cpuset(setid)", ARG1, sizeof(vki_cpusetid_t));
5055 POST(sys_cpuset)
5057 POST_MEM_WRITE(ARG1, sizeof(vki_cpusetid_t));
5060 // SYS_cpuset_setid 485
5061 // amd64 / x86
5063 // SYS_cpuset_getid 486
5064 // amd64 / x86
5066 // SYS_cpuset_getaffinity 487
5067 // amd64 / x86
5069 // SYS_cpuset_setaffinity 488
5070 // amd64 / x86
5072 // SYS_faccessat 489
5073 // int faccessat(int fd, const char *path, int mode, int flag);
5074 PRE(sys_faccessat)
5076 PRINT("sys_faccessat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )", ARG1,ARG2,(char*)ARG2,ARG3);
5077 PRE_REG_READ3(int, "faccessat",
5078 int, fd, const char *, path, int, flag);
5079 PRE_MEM_RASCIIZ( "faccessat(path)", ARG2 );
5082 // SYS_fchmodat 490
5083 // int fchmodat(int fd, const char *path, mode_t mode, int flag);
5084 PRE(sys_fchmodat)
5086 PRINT("sys_fchmodat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )", ARG1,ARG2,(char*)ARG2,ARG3);
5087 PRE_REG_READ4(int, "fchmodat",
5088 int, fd, const char *, path, vki_mode_t, mode, int, flag);
5089 PRE_MEM_RASCIIZ( "fchmodat(path)", ARG2 );
5092 // SYS_fchownat 491
5093 // int fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag);
5094 PRE(sys_fchownat)
5096 PRINT("sys_fchownat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), 0x%" FMT_REGWORD "x, 0x%" FMT_REGWORD "x, %" FMT_REGWORD "d )",
5097 ARG1,ARG2,(char*)ARG2,ARG3,ARG4, SARG5);
5098 PRE_REG_READ5(int, "fchownat",
5099 int, fd, const char *, path,
5100 vki_uid_t, owner, vki_gid_t, group, int, flag);
5101 PRE_MEM_RASCIIZ( "fchownat(path)", ARG2 );
5104 // SYS_fexecve 492
5105 // int fexecve(int fd, char *const argv[], char *const envp[]);
5106 PRE(sys_fexecve)
5108 PRINT("sys_fexecve ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
5109 SARG1,ARG2,ARG3);
5110 PRE_REG_READ3(int, "fexecve",
5111 int, fd, char * const *, argv,
5112 char * const *, envp);
5114 if (!ML_(fd_allowed)(ARG1, "fexecve", tid, False)) {
5115 SET_STATUS_Failure(VKI_EBADF);
5116 return;
5119 const HChar *fname;
5121 if (VG_(resolve_filename)(ARG1, &fname) == False) {
5122 SET_STATUS_Failure(VKI_ENOENT);
5123 return;
5126 struct vg_stat stats;
5127 if (VG_(fstat)(ARG1, &stats) != 0) {
5128 SET_STATUS_Failure(VKI_EACCES);
5129 return;
5132 Int openFlags;
5134 if (VG_(resolve_filemode)(ARG1, &openFlags) == False) {
5135 SET_STATUS_Failure(VKI_ENOENT);
5136 return;
5140 * openFlags is in kernel FFLAGS format
5141 * (see /usr/include/sys/fcntl.h)
5142 * which alllows us to tell if RDONLY is set
5146 Bool isScript = False;
5148 SysRes res;
5149 res = VG_(open)(fname, VKI_O_RDONLY,
5150 VKI_S_IRUSR|VKI_S_IRGRP|VKI_S_IROTH);
5151 if (sr_isError(res)) {
5152 SET_STATUS_Failure(VKI_ENOENT);
5153 return;
5156 char buf[2];
5157 VG_(read)((Int)sr_Res(res), buf, 2);
5158 VG_(close)((Int)sr_Res(res));
5159 if (buf[0] == '#' && buf[1] == '!') {
5160 isScript = True;
5163 if (isScript) {
5164 if (!(openFlags & VKI_FREAD)) {
5165 SET_STATUS_Failure(VKI_EACCES);
5166 return;
5168 } else {
5169 if (!((openFlags & VKI_O_EXEC) ||
5170 (stats.mode & (VKI_S_IXUSR|VKI_S_IXGRP|VKI_S_IXOTH)))) {
5171 SET_STATUS_Failure(VKI_EACCES);
5172 return;
5176 Addr arg_2 = (Addr)ARG2;
5177 Addr arg_3 = (Addr)ARG3;
5179 handle_pre_sys_execve(tid, status, (Addr)fname, arg_2, arg_3, FEXECVE, False);
5182 // SYS_freebsd11_fstatat 493
5183 // int fstatat(int fd, const char *path, struct stat *sb, int flag);
5184 PRE(sys_freebsd11_fstatat)
5186 PRINT("sys_freebsd11_fstatat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x )", ARG1,ARG2,(char*)ARG2,ARG3);
5187 PRE_REG_READ4(int, "fstatat",
5188 int, fd, const char *, path, struct freebsd11_stat *, buf, int, flag);
5189 PRE_MEM_RASCIIZ( "fstatat(path)", ARG2 );
5190 PRE_MEM_WRITE( "fstatat(sb)", ARG3, sizeof(struct vki_freebsd11_stat) );
5193 POST(sys_freebsd11_fstatat)
5195 POST_MEM_WRITE( ARG3, sizeof(struct vki_freebsd11_stat) );
5198 // SYS_futimesat 494
5199 // int futimesat(int fd, const char *path, const struct timeval times[2]);
5200 PRE(sys_futimesat)
5202 PRINT("sys_futimesat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x )", ARG1,ARG2,(char*)ARG2,ARG3);
5203 PRE_REG_READ3(int, "futimesat",
5204 int, fd, const char *, path, struct timeval *, times);
5205 if (ARG2 != 0) {
5206 PRE_MEM_RASCIIZ( "futimesat(path)", ARG2 );
5208 if (ARG3 != 0) {
5209 PRE_MEM_READ( "futimesat(times)", ARG3, 2 * sizeof(struct vki_timeval) );
5213 // SYS_linkat 495
5214 // int linkat(int fd1, const char *name1, int fd2, const char *name2, int flag);
5215 PRE(sys_linkat)
5217 *flags |= SfMayBlock;
5218 PRINT("sys_linkat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )",ARG1,ARG2,(char*)ARG2,ARG3,ARG4,(char*)ARG4,ARG5);
5219 PRE_REG_READ5(int, "linkat",
5220 int, fd1, const char *, name1,
5221 int, fd2, const char *, name2,
5222 int, flag);
5223 PRE_MEM_RASCIIZ( "linkat(name1)", ARG2);
5224 PRE_MEM_RASCIIZ( "linkat(name2)", ARG4);
5227 // SYS_mkdirat 496
5228 // int mkdirat(int fd, const char *path, mode_t mode);
5229 PRE(sys_mkdirat)
5231 *flags |= SfMayBlock;
5232 PRINT("sys_mkdirat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )", ARG1,ARG2,(char*)ARG2,ARG3);
5233 PRE_REG_READ3(int, "mkdirat",
5234 int, fd, const char *, path, unsigned int, mode);
5235 PRE_MEM_RASCIIZ( "mkdirat(path)", ARG2 );
5238 // SYS_mkfifoat 497
5239 // int mkfifoat(int fd, const char *path, mode_t mode);
5240 PRE(sys_mkfifoat)
5242 PRINT("sys_mkfifoat ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x(%s), 0x%" FMT_REGWORD "x )",
5243 SARG1,ARG2,(HChar*)ARG2,ARG3 );
5244 PRE_REG_READ3(int, "mkfifoat",
5245 int, fd, const char *, path, vki_mode_t, mode);
5246 PRE_MEM_RASCIIZ( "mkfifoat(path)", ARG2 );
5249 // SYS_freebsd11_mknodat 498
5250 // int mknodat(int fd, const char *path, mode_t mode, dev_t dev);
5251 PRE(sys_freebsd11_mknodat)
5253 PRINT("sys_freebsd11_mknodat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), 0x%" FMT_REGWORD "x, 0x%" FMT_REGWORD "x )", ARG1,ARG2,(char*)ARG2,ARG3,ARG4 );
5254 PRE_REG_READ4(long, "mknodat",
5255 int, dfd, const char *, pathname, int, mode, unsigned, dev);
5256 PRE_MEM_RASCIIZ( "mknodat(pathname)", ARG2 );
5259 // SYS_openat 499
5260 // int openat(int fd, const char *path, int flags, ...);
5261 PRE(sys_openat)
5263 if (ARG3 & VKI_O_CREAT) {
5264 // 4-arg version
5265 PRINT("sys_openat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %" FMT_REGWORD "u )",ARG1,ARG2,(char*)ARG2,ARG3,ARG4);
5266 PRE_REG_READ4(int, "openat",
5267 int, fd, const char *, path, int, flags, vki_mode_t, mode);
5268 } else {
5269 // 3-arg version
5270 PRINT("sys_openat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )",ARG1,ARG2,(char*)ARG2,ARG3);
5271 PRE_REG_READ3(int, "openat",
5272 int, fd, const char *, path, int, flags);
5275 if (ARG1 != (unsigned)VKI_AT_FDCWD && !ML_(fd_allowed)(ARG1, "openat", tid, False)) {
5276 SET_STATUS_Failure( VKI_EBADF );
5277 } else {
5278 PRE_MEM_RASCIIZ( "openat(path)", ARG2 );
5281 /* Otherwise handle normally */
5282 *flags |= SfMayBlock;
5285 POST(sys_openat)
5287 vg_assert(SUCCESS);
5288 if (!ML_(fd_allowed)(RES, "openat", tid, True)) {
5289 VG_(close)(RES);
5290 SET_STATUS_Failure( VKI_EMFILE );
5291 } else {
5292 if (VG_(clo_track_fds)) {
5293 ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG2);
5298 // SYS_readlinkat 500
5299 // ssize_t readlinkat(int fd, const char *restrict path, char *restrict buf,
5300 // size_t bufsize);
5301 PRE(sys_readlinkat)
5303 Word saved = SYSNO;
5304 Bool curproc_file = False;
5306 PRINT("sys_readlinkat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x, %llu )", ARG1,ARG2,(char*)ARG2,ARG3,(ULong)ARG4);
5307 PRE_REG_READ4(ssize_t, "readlinkat",
5308 int, fd, const char *, path, char *, buf, int, bufsize);
5309 PRE_MEM_RASCIIZ( "readlinkat(path)", ARG2 );
5310 PRE_MEM_WRITE( "readlinkat(buf)", ARG3,ARG4 );
5312 if (VG_(have_slash_proc) == True && (Int)ARG1 == VKI_AT_FDCWD) {
5314 * Handle the case where readlinkat is looking at /proc/curproc/file or
5315 * /proc/<pid>/file.
5317 do_readlink((const HChar *)ARG2, (HChar *)ARG3, (SizeT)ARG4, status, &curproc_file);
5320 // @todo PJF there is still the case where fd refers to /proc or /proc/pid
5321 // or /proc/curproc and path is relative pid/file, curptoc/file or just file
5323 if (!curproc_file) {
5324 /* Normal case */
5325 SET_STATUS_from_SysRes( VG_(do_syscall4)(saved, ARG1, ARG2, ARG3, ARG4));
5327 if (SUCCESS && RES > 0) {
5328 POST_MEM_WRITE( ARG3, RES );
5332 POST(sys_readlinkat)
5334 POST_MEM_WRITE( ARG3, RES );
5337 // SYS_renameat 501
5338 // int renameat(int fromfd, const char *from, int tofd, const char *to);
5339 PRE(sys_renameat)
5341 PRINT("sys_renameat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s) )", ARG1,ARG2,(char*)ARG2,ARG3,ARG4,(char*)ARG4);
5342 PRE_REG_READ4(int, "renameat",
5343 int, fromfd, const char *, from,
5344 int, tofd, const char *, to);
5345 PRE_MEM_RASCIIZ( "renameat(oldpath)", ARG2 );
5346 PRE_MEM_RASCIIZ( "renameat(newpath)", ARG4 );
5349 // SYS_symlinkat 502
5350 // int symlinkat(const char *name1, int fd, const char *name2);
5351 PRE(sys_symlinkat)
5353 *flags |= SfMayBlock;
5354 PRINT("sys_symlinkat ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s) )",ARG1,(char*)ARG1,ARG2,ARG3,(char*)ARG3);
5355 PRE_REG_READ3(int, "symlinkat",
5356 const char *, name1, int, fd, const char *, name2);
5357 PRE_MEM_RASCIIZ( "symlinkat(name1)", ARG1 );
5358 PRE_MEM_RASCIIZ( "symlinkat(name2)", ARG3 );
5361 // SYS_unlinkat 503
5362 // int unlinkat(int fd, const char *path, int flag);
5363 PRE(sys_unlinkat)
5365 *flags |= SfMayBlock;
5366 PRINT("sys_unlinkat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u ",
5367 ARG1, ARG2, (char*)ARG2, ARG3);
5368 PRE_REG_READ3(int, "unlinkat", int, fd, const char *, path, int, flag);
5369 PRE_MEM_RASCIIZ( "unlinkat(path)", ARG2 );
5372 // SYS_posix_openpt 504
5373 // int posix_openpt(int oflag);
5374 PRE(sys_posix_openpt)
5376 PRINT("sys_posix_openpt ( %" FMT_REGWORD "d )", SARG1);
5377 PRE_REG_READ1(int, "posix_openpt", int, oflag);
5380 // SYS_gssd_syscall 505
5381 // @todo
5382 // see https://www.freebsd.org/cgi/man.cgi?format=html&query=gssapi(3)
5383 // syscalls.master says ; 505 is initialised by the kgssapi code, if present.
5385 // SYS_jail_get 506
5386 // int jail_get(struct iovec *iov, u_int niov, int flags);
5387 PRE(sys_jail_get)
5389 PRINT("sys_jail_get ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3);
5390 PRE_REG_READ3(int, "jail_get", struct vki_iovec *, iov, unsigned int,
5391 niov, int, flags);
5392 PRE_MEM_READ("jail_get(iov)", ARG1, ARG2 * sizeof(struct vki_iovec));
5395 // SYS_jail_set 507
5396 // int jail_set(struct iovec *iov, u_int niov, int flags);
5397 PRE(sys_jail_set)
5399 PRINT("sys_jail_set ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3);
5400 PRE_REG_READ3(int, "jail_set", struct vki_iovec *, iov, unsigned int,
5401 niov, int, flags);
5402 PRE_MEM_READ("jail_set(iovs)", ARG1, ARG2 * sizeof(struct vki_iovec));
5405 // SYS_jail_remove 508
5406 // int jail_remove(int jid);
5407 PRE(sys_jail_remove)
5409 PRINT("sys_jail_remove ( %" FMT_REGWORD "d )", SARG1);
5410 PRE_REG_READ1(int, "jail_remove", int, jid);
5413 // SYS_closefrom 509
5414 // void closefrom(int lowfd);
5415 PRE(sys_closefrom)
5417 PRINT("sys_closefrom ( %" FMT_REGWORD "dx )", SARG1);
5418 PRE_REG_READ1(int, "closefrom", int, lowfd);
5421 * Can't pass this on to the kernel otherwise it will close
5422 * all of the host files like the log
5425 for (int fd = ARG1; fd < VG_(fd_hard_limit); ++fd) {
5426 if ((fd != 2/*stderr*/ || VG_(debugLog_getLevel)() == 0)
5427 && fd != VG_(log_output_sink).fd
5428 && fd != VG_(xml_output_sink).fd)
5429 VG_(close)(fd);
5432 SET_STATUS_Success(0);
5435 POST(sys_closefrom)
5437 unsigned int fd;
5438 unsigned int last = VG_(fd_hard_limit);
5440 if (!VG_(clo_track_fds))
5441 return;
5443 for (fd = ARG1; fd <= last; fd++)
5444 if ((fd != 2/*stderr*/ || VG_(debugLog_getLevel)() == 0)
5445 && fd != VG_(log_output_sink).fd
5446 && fd != VG_(xml_output_sink).fd)
5447 ML_(record_fd_close)(tid, fd);
5450 // SYS___semctl 510
5451 // int semctl(int semid, int semnum, int cmd, ...);
5452 // int __semctl(int semid, int semnum, int cmd, _Inout_ union semun *arg);
5453 PRE(sys___semctl)
5455 union vki_semun* semun;
5457 switch (ARG3) {
5458 case VKI_IPC_STAT:
5459 case VKI_SEM_STAT:
5460 case VKI_IPC_SET:
5461 case VKI_GETALL:
5462 case VKI_SETALL:
5463 PRINT("sys___semctl ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )",ARG1,ARG2,ARG3,ARG4);
5464 PRE_REG_READ4(long, "semctl",
5465 int, semid, int, semnum, int, cmd, union vki_semun *, arg);
5466 PRE_MEM_READ("sys___sysctl(arg)", ARG4, sizeof(union vki_semun));
5467 semun = (union vki_semun*)ARG4;
5468 if (ML_(safe_to_deref)(semun, sizeof(*semun))) {
5469 ARG4 = (RegWord)semun;
5470 ML_(generic_PRE_sys_semctl)(tid, ARG1,ARG2,ARG3,ARG4);
5472 break;
5473 default:
5474 PRINT("sys_semctl ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
5475 PRE_REG_READ3(long, "semctl",
5476 int, semid, int, semnum, int, cmd);
5477 break;
5481 POST(sys___semctl)
5483 union vki_semun* semun = (union vki_semun*)ARG4;
5484 if (ML_(safe_to_deref)(semun, sizeof(*semun))) {
5485 ARG4 = (RegWord)semun;
5486 ML_(generic_POST_sys_semctl)(tid, RES, ARG1,ARG2,ARG3,ARG4);
5490 // SYS_msgctl 511
5491 // int msgctl(int msqid, int cmd, struct msqid_ds *buf);
5492 PRE(sys_msgctl)
5494 PRINT("sys_msgctl ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1,SARG2,ARG3 );
5496 PRE_REG_READ3(int, "msgctl", int, msqid, int, cmd, struct msqid_ds *, buf);
5498 switch (ARG2 /* cmd */) {
5499 case VKI_IPC_STAT:
5500 PRE_MEM_WRITE( "msgctl(IPC_STAT, buf)",
5501 ARG3, sizeof(struct vki_msqid_ds) );
5502 break;
5503 case VKI_IPC_SET:
5504 PRE_MEM_READ( "msgctl(IPC_SET, buf)",
5505 ARG3, sizeof(struct vki_msqid_ds) );
5506 break;
5510 POST(sys_msgctl)
5512 switch (ARG2 /* cmd */) {
5513 case VKI_IPC_STAT:
5514 POST_MEM_WRITE( ARG3, sizeof(struct vki_msqid_ds) );
5515 break;
5520 // SYS_shmctl 512
5521 // int shmctl(int shmid, int cmd, struct shmid_ds *buf);
5522 PRE(sys_shmctl)
5524 PRINT("sys_shmctl ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )",SARG1,SARG2,ARG3);
5525 PRE_REG_READ3(int, "shmctl",
5526 int, shmid, int, cmd, struct vki_shmid_ds *, buf);
5527 switch (ARG2 /* cmd */) {
5528 case VKI_IPC_STAT:
5529 PRE_MEM_WRITE( "shmctl(IPC_STAT, buf)",
5530 ARG3, sizeof(struct vki_shmid_ds) );
5531 break;
5532 case VKI_IPC_SET:
5533 PRE_MEM_READ( "shmctl(IPC_SET, buf)",
5534 ARG3, sizeof(struct vki_shmid_ds) );
5535 break;
5539 POST(sys_shmctl)
5541 if (ARG2 == VKI_IPC_STAT) {
5542 POST_MEM_WRITE( ARG3, sizeof(struct vki_shmid_ds) );
5546 // SYS_lpathconf 513
5547 // long lpathconf(const char *path, int name);
5548 PRE(sys_lpathconf)
5550 PRINT("sys_lpathconf ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d)", ARG1, SARG2);
5551 PRE_REG_READ2(long, "lpathconf", const char *, path, int, name);
5552 PRE_MEM_RASCIIZ("lpathconf(path)", ARG1);
5555 // SYS___cap_rights_get 515
5556 // note extra 1st argument for the internal function which is not present
5557 // in the public interface
5558 // int __cap_rights_get(int version, int fd, cap_rights_t *rights);
5559 PRE(sys_cap_rights_get)
5561 PRINT("sys_cap_rights_get ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, SARG2, ARG3);
5562 PRE_REG_READ3(long, "cap_rights_get", int, version, int, fd, vki_cap_rights_t*, rights);
5563 PRE_MEM_WRITE("cap_rights_get(rights)", ARG3, sizeof(vki_cap_rights_t));
5566 POST(sys_cap_rights_get)
5568 POST_MEM_WRITE(ARG2, sizeof(vki_cap_rights_t));
5571 // SYS_cap_enter 516
5572 // int cap_enter(void);
5573 PRE(sys_cap_enter)
5575 PRINT("%s", "sys_cap_enter ( )");
5576 PRE_REG_READ0(int, "cap_enter");
5577 static Bool warning_given = False;
5578 if (!warning_given) {
5579 warning_given = True;
5580 capabiltyMode = True;
5581 VG_(umsg)(
5582 "WARNING: Valgrind may not operate correctly in capability mode.\n"
5583 " Please consider disabling capability by using the RUNNING_ON_VALGRIND mechanism.\n"
5584 " See http://valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.clientreq\n");
5586 /* now complete loading debuginfo since it is not allowed after entering cap mode */
5587 VG_(load_all_debuginfo)();
5590 // SYS_cap_getmode 517
5591 // int cap_getmode(u_int *modep);
5592 PRE(sys_cap_getmode)
5594 PRINT("sys_cap_getmode ( %#" FMT_REGWORD "x )", ARG1);
5595 PRE_REG_READ1(int, "cap_getmode", u_int*, modep);
5596 PRE_MEM_WRITE("cap_getmode(modep)", ARG1, sizeof(u_int));
5599 POST(sys_cap_getmode)
5601 POST_MEM_WRITE(ARG1, sizeof(u_int));
5604 static vki_sigset_t pdfork_saved_mask;
5606 // SYS_pdfork 518
5607 // pid_t pdfork(int *fdp, int flags);
5608 PRE(sys_pdfork)
5610 Bool is_child;
5611 Int child_pid;
5612 vki_sigset_t mask;
5614 PRINT("sys_pdfork ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1, ARG2);
5615 PRE_REG_READ2(pid_t, "pdfork", int*, fdp, int, flags);
5617 /* Block all signals during fork, so that we can fix things up in
5618 the child without being interrupted. */
5619 VG_(sigfillset)(&mask);
5620 VG_(sigprocmask)(VKI_SIG_SETMASK, &mask, &pdfork_saved_mask);
5622 VG_(do_atfork_pre)(tid);
5624 SET_STATUS_from_SysRes( VG_(do_syscall2)(__NR_pdfork, ARG1, ARG2) );
5626 if (!SUCCESS) {
5627 return;
5630 // RES is 0 for child, non-0 (the child's PID) for parent.
5631 is_child = ( RES == 0 ? True : False );
5632 child_pid = ( is_child ? -1 : (Int)RES );
5634 if (is_child) {
5635 VG_(do_atfork_child)(tid);
5637 /* restore signal mask */
5638 VG_(sigprocmask)(VKI_SIG_SETMASK, &pdfork_saved_mask, NULL);
5639 } else {
5640 VG_(do_atfork_parent)(tid);
5642 PRINT(" fork: process %d created child %d\n", VG_(getpid)(), child_pid);
5644 /* restore signal mask */
5645 VG_(sigprocmask)(VKI_SIG_SETMASK, &pdfork_saved_mask, NULL);
5648 if (ARG1) {
5649 PRE_MEM_WRITE( "pdfork(fdp)", ARG1, sizeof(int) );
5653 POST(sys_pdfork)
5655 if (ARG1) {
5656 POST_MEM_WRITE( ARG1, sizeof(int) );
5660 // pdkill 519
5661 //int pdkill(int fd, int signum)
5662 PRE(sys_pdkill)
5664 PRINT("sys_pdkill ( %" FMT_REGWORD "u, %" FMT_REGWORD "d )", ARG1, SARG2);
5665 PRE_REG_READ2(int, "pdkill", int, fd, int, signum);
5667 if (!ML_(client_signal_OK)(ARG2)) {
5668 SET_STATUS_Failure( VKI_EINVAL );
5669 return;
5672 /* Ther was some code here to check if the kill is to this process
5674 * But it was totally wrong
5676 * It was calling ML_(do_sigkill)(Int pid, Int tgid)
5678 * With a file descriptor
5680 * Fortunately this will never match a real process otherwise
5681 * it might have accidentally killed us.
5683 * For a start we need the pid, obtained with pdgetpid
5684 * Next ML_(do_sigkill) doesn't map to FreeBSD. It takes a
5685 * pid (lwpid) and a tgid (threadgroup)
5687 * On FreeBSD lwpid is the tid and threadgroup is the pid
5688 * The kill functions operate on pids, not tids.
5690 * One last thing, I don't see how pdkill could do a self
5691 * kill 9. It neads an fd which implied pdfork whichimplies
5692 * that the fd/pid are for a child process
5695 SET_STATUS_from_SysRes(VG_(do_syscall2)(SYSNO, ARG1, ARG2));
5697 if (VG_(clo_trace_signals)) {
5698 VG_(message)(Vg_DebugMsg, "pdkill: sent signal %ld to fd %ld\n",
5699 SARG2, SARG1);
5702 /* This kill might have given us a pending signal. Ask for a check once
5703 the syscall is done. */
5704 *flags |= SfPollAfter;
5708 // SYS_pdgetpid 520
5709 // int pdgetpid(int fd, pid_t *pidp);
5710 PRE(sys_pdgetpid)
5712 PRINT("pdgetpid ( %" FMT_REGWORD "d, %#lx )", SARG1, ARG2);
5713 PRE_REG_READ2(int, "pdgetpid",
5714 int, fd, pid_t*, pidp);
5715 PRE_MEM_WRITE( "pdgetpid(pidp))", ARG2, sizeof(vki_pid_t) );
5718 POST(sys_pdgetpid)
5720 POST_MEM_WRITE( ARG2, sizeof(vki_pid_t) );
5723 // SYS_pselect 522
5725 // int pselect(int nfds, fd_set * restrict readfds, fd_set * restrict writefds,
5726 // fd_set * restrict exceptfds,
5727 // const struct timespec * restrict timeout,
5728 // const sigset_t * restrict newsigmask);
5729 PRE(sys_pselect)
5731 *flags |= SfMayBlock | SfPostOnFail;
5732 PRINT("sys_pselect ( %ld, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#"
5733 FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
5734 SARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
5735 PRE_REG_READ6(int, "pselect",
5736 int, nfds, vki_fd_set *, readfds, vki_fd_set *, writefds,
5737 vki_fd_set *, exceptfds, struct vki_timespec *, timeout,
5738 const sigset_t *, newsigmask);
5739 // XXX: this possibly understates how much memory is read.
5740 if (ARG2 != 0) {
5741 PRE_MEM_READ( "pselect(readfds)",
5742 ARG2, ARG1/8 /* __FD_SETSIZE/8 */ );
5744 if (ARG3 != 0) {
5745 PRE_MEM_READ( "pselect(writefds)",
5746 ARG3, ARG1/8 /* __FD_SETSIZE/8 */ );
5748 if (ARG4 != 0) {
5749 PRE_MEM_READ( "pselect(exceptfds)",
5750 ARG4, ARG1/8 /* __FD_SETSIZE/8 */ );
5752 if (ARG5 != 0) {
5753 PRE_MEM_READ( "pselect(timeout)", ARG5, sizeof(struct vki_timeval) );
5756 if (ARG6 != 0) {
5757 PRE_MEM_READ( "pselect(sig)", ARG6, sizeof(vki_sigset_t) );
5758 ARG6 = ML_(make_safe_mask)("syswrap.pselect.1", (Addr)ARG6);
5762 POST(sys_pselect)
5764 ML_(free_safe_mask) ( (Addr)ARG6 );
5767 // SYS_getloginclass 523
5768 // int getloginclass(char *name, size_t len);
5769 PRE(sys_getloginclass)
5771 PRINT("sys_getloginclass ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1, ARG2);
5772 PRE_REG_READ2(int, "getloginclass", char *, name, size_t, len);
5773 // The buffer should be at least MAXLOGNAME bytes in length.
5774 PRE_MEM_WRITE("getloginclass(name)", ARG1, ARG2);
5777 POST(sys_getloginclass)
5779 POST_MEM_WRITE(ARG1, ARG2);
5782 // SYS_setloginclass 524
5783 // int setloginclass(const char *name);
5784 PRE(sys_setloginclass)
5786 PRINT("sys_setloginclass ( %#" FMT_REGWORD "x(%s) )", ARG1, (HChar*)ARG1);
5787 PRE_REG_READ1(int, "setloginclass", const char *, name);
5788 PRE_MEM_RASCIIZ("rctl_setloginclass(name)", ARG1);
5791 // SYS_rctl_get_racct 525
5792 // int rctl_get_racct(const char *inbufp, size_t inbuflen, char *outbufp,
5793 // size_t outbuflen);
5794 PRE(sys_rctl_get_racct)
5796 PRINT("sys_rctl_get_racct ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %#" FMT_REGWORD "xd, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3, ARG4);
5797 PRE_REG_READ4(int, "rctl_get_racct", const char *, inbufp, size_t, inbuflen, char *, outbufp,
5798 size_t, outbuflen);
5799 PRE_MEM_READ("rctl_get_racct(inbufp)", ARG1, ARG2);
5800 PRE_MEM_WRITE("rctl_get_racct(outbufp)", ARG3, ARG4);
5803 POST(sys_rctl_get_racct)
5805 POST_MEM_WRITE(ARG3, ARG4);
5808 // SYS_rctl_get_rules 526
5809 // int rctl_get_rules(const char *inbufp, size_t inbuflen, char *outbufp,
5810 // size_t outbuflen);
5811 PRE(sys_rctl_get_rules)
5813 PRINT("sys_rctl_get_rules ( %#" FMT_REGWORD "xd, %" FMT_REGWORD "u, %#" FMT_REGWORD "xd, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3, ARG4);
5814 PRE_REG_READ4(int, "rctl_get_rules", const char *, inbufp, size_t, inbuflen, char *, outbufp,
5815 size_t, outbuflen);
5816 PRE_MEM_READ("rctl_get_rules(inbufp)", ARG1, ARG2);
5817 PRE_MEM_WRITE("rctl_get_rules(outbufp)", ARG3, ARG4);
5820 POST(sys_rctl_get_rules)
5822 POST_MEM_WRITE(ARG3, ARG4);
5825 // SYS_rctl_get_limits 527
5826 // int rctl_get_limits(const char *inbufp, size_t inbuflen, char *outbufp,
5827 // size_t outbuflen);
5828 PRE(sys_rctl_get_limits)
5830 PRINT("sys_rctl_get_limits ( %#" FMT_REGWORD "xd, %" FMT_REGWORD "u, %#" FMT_REGWORD "xd, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3, ARG4);
5831 PRE_REG_READ4(int, "rctl_get_limits", const char *, inbufp, size_t, inbuflen, char *, outbufp,
5832 size_t, outbuflen);
5833 PRE_MEM_READ("rctl_get_limits(inbufp)", ARG1, ARG2);
5834 PRE_MEM_WRITE("rctl_get_limits(outbufp)", ARG3, ARG4);
5837 POST(sys_rctl_get_limits)
5839 POST_MEM_WRITE(ARG3, ARG4);
5842 // SYS_rctl_add_rule 528
5843 // int rctl_add_rule(const char *inbufp, size_t inbuflen, char *outbufp,
5844 // size_t outbuflen);
5845 PRE(sys_rctl_add_rule)
5847 PRINT("sys_rctl_add_rule ( %#" FMT_REGWORD "xd, %" FMT_REGWORD "u, %#" FMT_REGWORD "xd, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3, ARG4);
5848 PRE_REG_READ2(int, "rctl_add_rule", const char *, inbufp, size_t, inbuflen);
5849 PRE_MEM_READ("rctl_add_rule(inbufp)", ARG1, ARG2);
5850 // man page says
5851 // The outbufp and outbuflen arguments are unused
5852 //PRE_MEM_WRITE("rctl_add_rule(outbufp)", ARG3, ARG4);
5855 POST(sys_rctl_add_rule)
5857 //POST_MEM_WRITE(ARG3, ARG4);
5860 // SYS_rctl_remove_rule 529
5861 // int rctl_remove_rule(const char *inbufp, size_t inbuflen, char *outbufp,
5862 // size_t outbuflen);
5863 PRE(sys_rctl_remove_rule)
5865 PRINT("sys_rctl_remove_rule ( %#" FMT_REGWORD "xd, %" FMT_REGWORD "u, %#" FMT_REGWORD "xd, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3, ARG4);
5866 PRE_REG_READ2(int, "rctl_remove_rule", const char *, inbufp, size_t, inbuflen);
5867 PRE_MEM_READ("rctl_remove_rule(inbufp)", ARG1, ARG2);
5868 // man page says
5869 // The outbufp and outbuflen arguments are unused
5870 //PRE_MEM_WRITE("rctl_remove_rule(outbufp)", ARG3, ARG4);
5873 POST(sys_rctl_remove_rule)
5875 //POST_MEM_WRITE(ARG3, ARG4);
5878 // SYS_posix_fallocate 530
5879 // x86/amd64
5881 // SYS_posix_fadvise 531
5882 // x86/amd64
5884 // SYS_wait6 532
5885 // amd64 / x86
5887 // SYS_cap_rights_limit 533
5888 //int cap_rights_limit(int fd, const cap_rights_t *rights);
5889 PRE(sys_cap_rights_limit)
5891 PRINT("sys_cap_rights_limit ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, ARG2);
5892 PRE_REG_READ2(int, "cap_rights_limit",
5893 int, fd, const cap_rights_t *, rights);
5894 PRE_MEM_READ( "cap_rights_limit(rights)", ARG2, sizeof(struct vki_cap_rights) );
5897 // SYS_cap_ioctls_limit 534
5898 // int cap_ioctls_limit(int fd, const unsigned long *cmds, size_t ncmds);
5899 PRE(sys_cap_ioctls_limit)
5901 PRINT("cap_ioctls_limit ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3);
5902 PRE_REG_READ3(int, "cap_ioctls_limit",
5903 int, fd, unsigned long*, rights, vki_size_t, ncmds);
5904 // "can be up to 256" taking that to not be inclusive
5905 if (ARG3 < 256 ) {
5906 PRE_MEM_READ( "cap_ioctls_limit(cmds))", ARG2, ARG3*sizeof(unsigned long) );
5908 // else fail?
5911 // SYS_cap_ioctls_get 535
5912 // int cap_ioctls_get(int fd, unsigned long *cmds, size_t maxcmds);
5913 PRE(sys_cap_ioctls_get)
5915 PRINT("sys_cap_ioctls_get ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", SARG1, ARG2, ARG3);
5916 PRE_REG_READ3(int, "cap_ioctls_get", int, fd, unsigned long *, cmds, size_t, maxcmds);
5917 if (ARG3 < 256) {
5918 PRE_MEM_WRITE("cap_ioctls_get(cmds)", ARG2, ARG3*sizeof(unsigned long));
5922 POST(sys_cap_ioctls_get)
5924 if (ARG3 < 256) {
5925 POST_MEM_WRITE(ARG2, ARG3*sizeof(unsigned long));
5930 // SYS_cap_fcntls_limit 536
5931 //int cap_fcntls_limit(int fd, uint32_t fcntlrights);
5932 PRE(sys_cap_fcntls_limit)
5934 PRINT("cap_fcntls_limit ( %" FMT_REGWORD "d, %" FMT_REGWORD "u )", SARG1, ARG2);
5935 PRE_REG_READ2(long, "cap_fcntls_limit",
5936 int, fd, vki_uint32_t, fcntlrights);
5939 // SYS_cap_fcntls_get 537
5940 // int cap_fcntls_get(int fd, uint32_t *fcntlrightsp);
5941 PRE(sys_cap_fcntls_get)
5943 PRINT("sys_cap_fcntls_get ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, ARG2);
5944 PRE_REG_READ2(int, "cap_fcntls_get", int, fd, uint32_t *, fcntlrightsp);
5945 PRE_MEM_WRITE("cap_fcntls_get(fcntlrightsp)", ARG2, sizeof(uint32_t));
5948 POST(sys_cap_fcntls_get)
5950 POST_MEM_WRITE(ARG2, sizeof(uint32_t));
5953 // SYS_bindat 538
5954 // int bindat(int fd, int s, const struct sockaddr *addr, socklen_t addrlen);
5955 PRE(sys_bindat)
5957 PRINT("sys_bindat ( %" FMT_REGWORD "d, %" FMT_REGWORD "dx, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",
5958 SARG1, SARG2, ARG3, ARG4);
5959 PRE_REG_READ4(int, "bindat", int, fd, int, s, const struct vki_sockaddr *, name, vki_socklen_t, namelen);
5960 PRE_MEM_READ("bindat(name)", ARG3, ARG4);
5963 // SYS_connectat 539
5964 // int connectat(int fd, int s, const struct sockaddr *name, socklen_t namelen);
5965 PRE(sys_connectat)
5967 PRINT("sys_connectat ( %" FMT_REGWORD "d, %" FMT_REGWORD "dx, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",
5968 SARG1, SARG2, ARG3, ARG4);
5969 PRE_REG_READ4(int, "connectat", int, fd, int, s, const struct vki_sockaddr *, name, vki_socklen_t, namelen);
5970 PRE_MEM_READ("connectat(name)", ARG3, ARG4);
5973 // SYS_chflagsat 540
5974 // int chflagsat(int fd, const char *path, unsigned long flags, int atflag);
5975 PRE(sys_chflagsat)
5977 PRINT("sys_chglagsat ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "d )",
5978 SARG1, ARG2, ARG3, SARG4);
5979 PRE_REG_READ4(int, "chflagsat", int, fd, const char *, path, unsigned long, flags, int, atflag);
5980 PRE_MEM_RASCIIZ("chflagsat(path)", ARG2);
5983 // SYS_accept4 541
5984 // int accept4(int s, struct sockaddr * restrict addr,
5985 // socklen_t * restrict addrlen, int flags);
5986 PRE(sys_accept4)
5988 *flags |= SfMayBlock;
5989 PRINT("sys_accept4 ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u)",ARG1,ARG2,ARG3,ARG4);
5990 PRE_REG_READ4(int, "accept4",
5991 int, s, struct sockaddr *, addr, int, *addrlen, int, flags);
5992 ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3);
5995 POST(sys_accept4)
5997 SysRes r;
5998 vg_assert(SUCCESS);
5999 r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES),
6000 ARG1,ARG2,ARG3);
6001 SET_STATUS_from_SysRes(r);
6004 // SYS_pipe2 542
6005 // int pipe2(int fildes[2], int flags);
6006 PRE(sys_pipe2)
6008 PRINT("sys_pipe2 ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1, ARG2);
6009 PRE_REG_READ2(int, "pipe2",
6010 int *, fildes, int, flags);
6011 PRE_MEM_WRITE("pipe2(fildes)", ARG1, 2 * sizeof(int));
6015 POST(sys_pipe2)
6017 int *fildes;
6019 if (RES != 0) {
6020 return;
6023 POST_MEM_WRITE(ARG1, 2 * sizeof(int));
6024 fildes = (int *)ARG1;
6026 if (!ML_(fd_allowed)(fildes[0], "pipe2", tid, True) ||
6027 !ML_(fd_allowed)(fildes[1], "pipe2", tid, True)) {
6028 VG_(close)(fildes[0]);
6029 VG_(close)(fildes[1]);
6030 SET_STATUS_Failure( VKI_EMFILE );
6031 } else if (VG_(clo_track_fds)) {
6032 ML_(record_fd_open_nameless)(tid, fildes[0]);
6033 ML_(record_fd_open_nameless)(tid, fildes[1]);
6037 // SYS_aio_mlock 543
6038 // int aio_mlock(struct aiocb *iocb);
6039 PRE(sys_aio_mlock)
6041 PRINT("sys_aio_mlock ( %#" FMT_REGWORD "x )", ARG1);
6042 PRE_REG_READ1(int, "aio_mlock", struct vki_aiocb *, iocb);
6043 PRE_MEM_READ("aio_mlock(iocb", ARG1, sizeof(struct vki_aiocb));
6044 // this locks memory into RAM, don't think that we need to do
6045 // anything extra
6048 // SYS_procctl 544
6049 // amd64 / x86 / arm64
6051 // SYS_ppoll 545
6052 // int ppoll(struct pollfd fds[], nfds_t nfds,
6053 // const struct timespec * restrict timeout,
6054 // const sigset_t * restrict newsigmask);
6055 PRE(sys_ppoll)
6057 PRINT("sys_ppoll ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %#" FMT_REGWORD
6058 "x, %#" FMT_REGWORD "x )",
6059 ARG1, ARG2, ARG3, ARG4);
6060 UInt i;
6061 struct vki_pollfd* fds = (struct vki_pollfd *)(Addr)ARG1;
6062 *flags |= SfMayBlock | SfPostOnFail;
6063 PRE_REG_READ4(long, "ppoll",
6064 struct vki_pollfd *, fds, unsigned int, nfds,
6065 struct vki_timespec *, timeout, vki_sigset_t *, newsigmask);
6067 for (i = 0; i < ARG2; i++) {
6068 PRE_MEM_READ( "ppoll(fds.fd)",
6069 (Addr)(&fds[i].fd), sizeof(fds[i].fd) );
6070 if (ML_(safe_to_deref)(&fds[i].fd, sizeof(fds[i].fd)) && fds[i].fd >= 0) {
6071 PRE_MEM_READ( "ppoll(fds.events)",
6072 (Addr)(&fds[i].events), sizeof(fds[i].events) );
6074 PRE_MEM_WRITE( "ppoll(fds.revents)",
6075 (Addr)(&fds[i].revents), sizeof(fds[i].revents) );
6078 if (ARG3) {
6079 PRE_MEM_READ( "ppoll(timeout)", ARG3,
6080 sizeof(struct vki_timespec) );
6082 if (ARG4) {
6083 PRE_MEM_READ( "ppoll(newsigmask)", ARG4, sizeof(vki_sigset_t));
6084 ARG4 = ML_(make_safe_mask)("syswrap.ppoll.1", (Addr)ARG4);
6088 POST(sys_ppoll)
6090 if (SUCCESS && ((Word)RES != -1)) {
6091 UInt i;
6092 struct vki_pollfd* ufds = (struct vki_pollfd *)(Addr)ARG1;
6093 for (i = 0; i < ARG2; i++) {
6094 POST_MEM_WRITE( (Addr)(&ufds[i].revents), sizeof(ufds[i].revents) );
6097 ML_(free_safe_mask) ( (Addr)ARG4 );
6100 // SYS_futimens 546
6101 // int futimens(int fd, const struct timespec times[2]);
6102 PRE(sys_futimens)
6104 PRINT("sys_futimens ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, ARG2);
6105 PRE_REG_READ2(int, "futimens", int, fd, const struct timespec *, times);
6106 PRE_MEM_READ("futimens(times)", ARG2, 2*sizeof(struct vki_timespec));
6109 // SYS_utimensat 547
6110 // int utimensat(int fd, const char *path, const struct timespec times[2],
6111 // int flag);
6112 PRE(sys_utimensat)
6114 PRINT("sys_utimensat ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "d )",
6115 SARG1, ARG2, ARG3, SARG4);
6116 PRE_REG_READ4(int, "utimensat", int, fd, const char *,path, const struct timespec *, times,
6117 int, flag);
6118 PRE_MEM_RASCIIZ("utimensat(path)", ARG2);
6119 PRE_MEM_READ("utimensat(times)", ARG3, 2*sizeof(struct vki_timespec));
6122 // SYS_fdatasync 550
6123 // int fdatasync(int fd);
6124 PRE(sys_fdatasync)
6126 PRINT("sys_fdatasync ( %" FMT_REGWORD "d )",SARG1);
6127 PRE_REG_READ1(int, "fdatasync", int, fd);
6130 // SYS_fstat 551
6131 // int fstat(int fd, struct stat *sb);
6132 PRE(sys_fstat)
6134 PRINT("sys_fstat ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )",SARG1,ARG2);
6135 PRE_REG_READ2(int, "fstat", int, fd, struct stat *, sb);
6136 PRE_MEM_WRITE( "fstat(sb)", ARG2, sizeof(struct vki_stat) );
6139 POST(sys_fstat)
6141 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) );
6144 // SYS_fstatat 552
6145 // int fstatat(int fd, const char *path, struct stat *sb, int flag);
6146 PRE(sys_fstatat)
6148 PRINT("sys_fstatat ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x, %" FMT_REGWORD "d )", SARG1,ARG2,(char*)ARG2,ARG3,SARG4);
6149 PRE_REG_READ4(int, "fstatat",
6150 int, fd, const char *, path, struct stat *, sb, int, flag);
6151 PRE_MEM_RASCIIZ( "fstatat(path)", ARG2 );
6152 PRE_MEM_WRITE( "fstatat(sb)", ARG3, sizeof(struct vki_stat) );
6155 POST(sys_fstatat)
6157 POST_MEM_WRITE( ARG3, sizeof(struct vki_stat) );
6159 // SYS_fhstat 553
6160 // int fhstat(const fhandle_t *fhp, struct stat *sb);
6161 PRE(sys_fhstat)
6163 PRINT("sys_fhstat ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",ARG1,ARG2);
6164 PRE_REG_READ2(long, "fhstat", const vki_fhandle_t *, fhp, struct stat *, sb);
6165 PRE_MEM_READ( "fhstat(fhp)", ARG1, sizeof(struct vki_fhandle) );
6166 PRE_MEM_WRITE( "fhstat(sb)", ARG2, sizeof(struct vki_stat) );
6169 POST(sys_fhstat)
6171 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) );
6174 // SYS_getdirentries 554
6175 // ssize_t getdirentries(int fd, char *buf, size_t nbytes, off_t *basep);
6176 PRE(sys_getdirentries)
6178 *flags |= SfMayBlock;
6179 PRINT("sys_getdirentries ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", SARG1,ARG2,ARG3,ARG4);
6180 PRE_REG_READ4(ssize_t, "getdirentries",
6181 int, fd, char *, buf,
6182 size_t, nbytes,
6183 off_t *, basep);
6184 PRE_MEM_WRITE( "getdirentries(buf)", ARG2, ARG3 );
6185 if (ARG4) {
6186 PRE_MEM_WRITE("getdirentries(basep)", ARG4, sizeof (vki_off_t));
6190 POST(sys_getdirentries)
6192 vg_assert(SUCCESS);
6193 if (RES > 0) {
6194 POST_MEM_WRITE( ARG2, RES );
6195 if ( ARG4 != 0 ) {
6196 POST_MEM_WRITE( ARG4, sizeof (vki_off_t));
6201 // SYS_statfs 555
6202 // int statfs(const char *path, struct statfs *buf);
6203 PRE(sys_statfs)
6205 PRINT("sys_statfs ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x )",ARG1,(char *)ARG1,ARG2);
6206 PRE_REG_READ2(int, "statfs", const char *, path, struct statfs *, buf);
6207 PRE_MEM_RASCIIZ( "statfs(path)", ARG1 );
6208 PRE_MEM_WRITE( "statfs(buf)", ARG2, sizeof(struct vki_statfs) );
6211 POST(sys_statfs)
6213 POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs) );
6216 // SYS_fstatfs 556
6217 // int fstatfs(int fd, struct statfs *buf);
6218 PRE(sys_fstatfs)
6220 PRINT("sys_fstatfs ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )",SARG1,ARG2);
6221 PRE_REG_READ2(int, "fstatfs",
6222 int, fd, struct vki_statfs *, buf);
6223 PRE_MEM_WRITE( "fstatfs(buf)", ARG2, sizeof(struct vki_statfs) );
6226 POST(sys_fstatfs)
6228 POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs) );
6231 // SYS_getfsstat 557
6232 // int getfsstat(struct statfs *buf, long bufsize, int mode);
6233 PRE(sys_getfsstat)
6235 PRINT("sys_getfsstat ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u )",ARG1,ARG2,ARG3);
6236 PRE_REG_READ3(long, "getfsstat", struct vki_statfs *, buf, long, len, int, flags);
6237 PRE_MEM_WRITE( "getfsstat(buf)", ARG1, ARG2 );
6240 POST(sys_getfsstat)
6242 vg_assert(SUCCESS);
6243 if ((Word)RES != -1) {
6244 POST_MEM_WRITE( ARG1, RES * sizeof(struct vki_statfs) );
6248 // SYS_fhstatfs 558
6249 // int fhstatfs(const fhandle_t *fhp, struct statfs *buf);
6250 PRE(sys_fhstatfs)
6252 PRINT("sys_fhstatfs ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",ARG1,ARG2);
6253 PRE_REG_READ2(long, "fhstatfs",
6254 struct fhandle *, fhp, struct statfs *, buf);
6255 PRE_MEM_READ( "fhstatfs(fhp)", ARG1, sizeof(struct vki_fhandle) );
6256 PRE_MEM_WRITE( "fhstatfs(buf)", ARG2, sizeof(struct vki_statfs) );
6259 POST(sys_fhstatfs)
6261 POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs) );
6264 // SYS_mknodat 559
6265 // x86 / amd64
6267 // SYS_kevent 560
6268 // int kevent(int kq, const struct kevent *changelist, int nchanges,
6269 // struct kevent *eventlist, int nevents,
6270 // const struct timespec *timeout);
6271 PRE(sys_kevent)
6273 PRINT("sys_kevent ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )\n", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
6274 PRE_REG_READ6(int, "kevent",
6275 int, kq, struct vki_kevent *, changelist, int, nchanges,
6276 struct vki_kevent *, eventlist, int, nevents,
6277 struct timespec *, timeout);
6278 if (ARG2 != 0 && ARG3 != 0) {
6279 PRE_MEM_READ( "kevent(changelist)", ARG2, sizeof(struct vki_kevent)*ARG3 );
6281 if (ARG4 != 0 && ARG5 != 0) {
6282 PRE_MEM_WRITE( "kevent(eventlist)", ARG4, sizeof(struct vki_kevent)*ARG5);
6284 if (ARG5 != 0) {
6285 *flags |= SfMayBlock;
6287 if (ARG6 != 0) {
6288 PRE_MEM_READ( "kevent(timeout)",
6289 ARG6, sizeof(struct vki_timespec));
6293 POST(sys_kevent)
6295 vg_assert(SUCCESS);
6296 if ((Word)RES != -1) {
6297 if (ARG4 != 0) {
6298 POST_MEM_WRITE( ARG4, sizeof(struct vki_kevent)*RES) ;
6303 // SYS_cpuset_getdomain 561
6304 // x86 / amd64
6306 // SYS_cpuset_setdomain 562
6307 // x86 / amd64
6309 // SYS_getrandom 563
6310 // ssize_t getrandom(void *buf, size_t buflen, unsigned int flags);
6311 PRE(sys_getrandom)
6313 PRINT("sys_getrandom ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3);
6314 PRE_REG_READ3(ssize_t, "getrandom",
6315 void *, buf, vki_size_t, buflen, unsigned int, flags);
6316 PRE_MEM_WRITE( "getrandom(buf)", ARG1, ARG2 );
6317 if ((ARG3 & VKI_GRND_NONBLOCK) == 0) {
6318 *flags |= SfMayBlock;
6322 POST(sys_getrandom)
6324 POST_MEM_WRITE( ARG1, ARG2 );
6327 // SYS_getfhat 564
6328 // int getfhat(int fd, const char *path, fhandle_t *fhp, int flag);
6329 PRE(sys_getfhat)
6331 PRINT("sys_getfhat ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "x, %" FMT_REGWORD "d ", SARG1, ARG2, ARG3, SARG4);
6332 PRE_REG_READ4(int, "getfhat", int, fd, const char*, path, vki_fhandle_t*, fhp, int, flag);
6333 PRE_MEM_RASCIIZ( "getfhat(path)", ARG2 );
6334 PRE_MEM_WRITE("getfhat(fhp)", ARG3, sizeof(vki_fhandle_t));
6337 POST(sys_getfhat)
6339 POST_MEM_WRITE(ARG3, sizeof(vki_fhandle_t));
6342 // SYS_fhlink 565
6343 // int fhlink(fhandle_t *fhp, const char *to);
6344 PRE(sys_fhlink)
6346 PRINT("sys_fhlink ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1, ARG2);
6347 PRE_REG_READ2(int, "fhlink", vki_fhandle_t *, fhp, const char *, to);
6348 PRE_MEM_READ( "fhlink(fhp)", ARG1, sizeof(vki_fhandle_t));
6349 PRE_MEM_RASCIIZ("fhlink(buf)", ARG2);
6352 // SYS_fhlinkat 566
6353 // int fhlinkat(fhandle_t *fhp, int tofd, const char *to);
6354 PRE(sys_fhlinkat)
6356 PRINT("sys_fhlinkat ( %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "xu ", ARG1, SARG2, ARG3);
6357 PRE_REG_READ3(int, "fhlinkat", vki_fhandle_t *, fhp, int, tofd, const char *, to);
6358 PRE_MEM_READ( "fhlinkat(fhp)", ARG1, sizeof(vki_fhandle_t));
6359 PRE_MEM_RASCIIZ("fhreadlink(to)", ARG3);
6362 // SYS_fhreadlink 567
6363 // int fhreadlink(fhandle_t *fhp, char *buf, size_t bufsize);
6364 PRE(sys_fhreadlink)
6366 PRINT("sys_fhreadlink ( %#" FMT_REGWORD "x, %" FMT_REGWORD "x, %" FMT_REGWORD "u ", ARG1, ARG2, ARG3);
6367 PRE_REG_READ3(int, "fhreadlink", vki_fhandle_t *, fhp, char *, buf, size_t, bufsize);
6368 PRE_MEM_READ( "fhreadlink(fhp)", ARG1, sizeof(vki_fhandle_t));
6369 PRE_MEM_WRITE("fhreadlink(buf)", ARG2, ARG3);
6372 POST(sys_fhreadlink)
6374 POST_MEM_WRITE(ARG2, ARG3);
6377 // SYS_unlinkat 568
6378 // int funlinkat(int dfd, const char *path, int fd, int flag);
6379 PRE(sys_funlinkat)
6381 *flags |= SfMayBlock;
6382 PRINT("sys_funlinkat ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %" FMT_REGWORD"u )",
6383 SARG1, ARG2, (char*)ARG2, ARG4, ARG5);
6384 PRE_REG_READ4(int, "funlinkat", int, dfd, const char *, path, int, fd, int, flag);
6385 PRE_MEM_RASCIIZ( "funlinkat(path)", ARG2 );
6388 // SYS_copy_file_range 569
6389 // ssize_t copy_file_range(int infd, off_t *inoffp, int outfd, off_t *outoffp,
6390 // size_t len, unsigned int flags);
6391 PRE(sys_copy_file_range)
6393 PRINT("sys_copy_file_range (%" FMT_REGWORD"d, %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "d, %" FMT_REGWORD "d)",
6394 SARG1, ARG2, SARG3, ARG4, (char*)ARG4, SARG5, SARG6);
6396 PRE_REG_READ6(vki_ssize_t, "copy_file_range",
6397 int, "infd",
6398 vki_off_t *, "inoffp",
6399 int, "outfd",
6400 vki_off_t *, "outoffp",
6401 vki_size_t, "len",
6402 unsigned int, "flags");
6404 /* File descriptors are "specially" tracked by valgrind.
6405 valgrind itself uses some, so make sure someone didn't
6406 put in one of our own... */
6407 if (!ML_(fd_allowed)(ARG1, "copy_file_range(infd)", tid, False) ||
6408 !ML_(fd_allowed)(ARG3, "copy_file_range(infd)", tid, False)) {
6409 SET_STATUS_Failure( VKI_EBADF );
6410 } else {
6411 /* Now see if the offsets are defined. PRE_MEM_READ will
6412 double check it can dereference them. */
6413 if (ARG2 != 0) {
6414 PRE_MEM_READ( "copy_file_range(inoffp)", ARG2, sizeof(vki_off_t));
6416 if (ARG4 != 0) {
6417 PRE_MEM_READ( "copy_file_range(outoffp)", ARG4, sizeof(vki_off_t));
6422 // SYS___sysctlbyname 570
6423 // int sysctlbyname(const char *name, void *oldp, size_t *oldlenp,
6424 // const void *newp, size_t newlen);
6425 // syscalls.master:
6426 // int __sysctlbyname(_In_reads_(namelen) const char *name, size_t namelen,
6427 // _Out_writes_bytes_opt_(*oldlenp) void *old,
6428 // _Inout_opt_ size_t *oldlenp, _In_reads_bytes_opt_(newlen) void *new,
6429 // size_t newlen );
6430 PRE(sys___sysctlbyname)
6432 // this is very much like SYS___sysctl, instead of having an OID with length
6433 // here threre is an ascii string with length
6434 // @todo PJF factor out the common functionality of the two
6435 PRINT("sys___sysctlbyname ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,(const char*)ARG1,ARG2,ARG3,ARG4,ARG5 );
6436 PRE_REG_READ6(int, "__sysctlbyname", const char *, name, vki_size_t, namelen,
6437 void *, oldp, vki_size_t *, oldlenp,
6438 void *, newp, vki_size_t, newlen);
6441 const char* name = (const char*)ARG1;
6442 if (ML_(safe_to_deref)(name, sizeof("kern.ps_strings")) &&
6443 VG_(strcmp)(name, "kern.ps_strings") == 0) {
6444 if (sysctl_kern_ps_strings((SizeT*)ARG3, (SizeT*)ARG4)) {
6445 SET_STATUS_Success(0);
6449 if (ML_(safe_to_deref)(name, sizeof("kern.usrstack")) &&
6450 VG_(strcmp)(name, "kern.usrstack") == 0) {
6451 sysctl_kern_usrstack((SizeT*)ARG3, (SizeT*)ARG4);
6452 SET_STATUS_Success(0);
6455 // kern.proc.pathname doesn't seem to be handled
6456 // makes sense as the pid is variable and using
6457 // a MIB is easier than generating a string
6459 // string length specified in ARG2 from mem pointed to by ARG1
6460 PRE_MEM_READ("__sysctlbyname(name)", (Addr)ARG1, ARG2);
6462 // if 'newp' is not NULL can read namelen bytes from that addess
6463 if (ARG5 != (UWord)NULL) {
6464 PRE_MEM_READ("__sysctlbyname(newp)", (Addr)ARG5, ARG6);
6467 // there are two scenarios for oldlenp/oldp
6468 // 1. oldval is NULL and oldlenp is non-NULL
6469 // this is a query of oldlenp so oldlenp will be written
6470 // 2. Both are non-NULL
6471 // this is a query of oldp, oldlenp will be read and oldp will
6472 // be written
6474 // is oldlenp is not NULL, can write
6475 if (ARG4 != (UWord)NULL) {
6476 if (ARG3 != (UWord)NULL) {
6477 // case 2 above
6478 PRE_MEM_READ("__sysctlbyname(oldlenp)", (Addr)ARG4, sizeof(vki_size_t));
6479 if (ML_(safe_to_deref)((void*)(Addr)ARG4, sizeof(vki_size_t))) {
6480 PRE_MEM_WRITE("__sysctlbyname(oldp)", (Addr)ARG3, *(vki_size_t *)ARG4);
6481 } else {
6482 VG_(dmsg)("Warning: Bad oldlenp address %p in sysctlbyname\n",
6483 (void *)(Addr)ARG4);
6484 SET_STATUS_Failure ( VKI_EFAULT );
6486 } else {
6487 // case 1 above
6488 PRE_MEM_WRITE("__sysctlbyname(oldlenp)", (Addr)ARG4, sizeof(vki_size_t));
6493 POST(sys___sysctlbyname)
6495 if (ARG4 != (UWord)NULL) {
6496 if (ARG3 != (UWord)NULL) {
6497 //POST_MEM_WRITE((Addr)ARG4, sizeof(vki_size_t));
6498 POST_MEM_WRITE((Addr)ARG3, *(vki_size_t *)ARG4);
6499 } else {
6500 POST_MEM_WRITE((Addr)ARG4, sizeof(vki_size_t));
6505 // SYS_shm_open2 571
6506 // from syscalls.master
6507 // int shm_open2(_In_z_ const char *path,
6508 // int flags,
6509 // mode_t mode,
6510 // int shmflags,
6511 // _In_z_ const char *name);
6512 PRE(sys_shm_open2)
6514 PRE_REG_READ5(int, "shm_open2",
6515 const char *, path, int, flags, vki_mode_t, mode, int, shmflags, const char*, name);
6516 if (ARG1 == VKI_SHM_ANON) {
6517 PRINT("sys_shm_open2(%#" FMT_REGWORD "x(SHM_ANON), %" FMT_REGWORD "u, %hu, %d, %#" FMT_REGWORD "x(%s))",
6518 ARG1, ARG2, (vki_mode_t)ARG3, (Int)ARG4, ARG5, (HChar*)ARG5);
6519 } else {
6520 PRINT("sys_shm_open2(%#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %hu, %d, %#" FMT_REGWORD "x(%s))",
6521 ARG1, (HChar *)ARG1, ARG2, (vki_mode_t)ARG3, (Int)ARG4, ARG5, (HChar*)ARG5);
6522 PRE_MEM_RASCIIZ( "shm_open2(path)", ARG1 );
6525 if (ARG5) {
6526 PRE_MEM_RASCIIZ( "shm_open2(name)", ARG5 );
6528 *flags |= SfMayBlock;
6531 POST(sys_shm_open2)
6533 vg_assert(SUCCESS);
6534 if (!ML_(fd_allowed)(RES, "shm_open2", tid, True)) {
6535 VG_(close)(RES);
6536 SET_STATUS_Failure( VKI_EMFILE );
6537 } else {
6538 if (VG_(clo_track_fds)) {
6539 ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG1);
6544 // SYS_sigfastblock 573
6545 // int sigfastblock(int cmd, void *ptr);
6546 PRE(sys_sigfastblock)
6548 PRINT("sys_sigfastblock ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, ARG2);
6549 PRE_REG_READ2(int, "sigfasblock", int, cmd, void*, ptr);
6552 // SYS___realpathat 574
6553 // from syscalls.master
6554 // int __realpathat(int fd,
6555 // _In_z_ const char *path,
6556 // _Out_writes_z_(size) char *buf,
6557 // size_t size,
6558 // int flags)
6559 PRE(sys___realpathat)
6561 PRINT("sys___realpathat ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x, %" FMT_REGWORD "u %" FMT_REGWORD "d )",
6562 SARG1,ARG2,(const char*)ARG2,ARG3,ARG4,SARG5 );
6563 PRE_REG_READ5(int, "__realpathat", int, fd, const char *, path,
6564 char *, buf, vki_size_t, size, int, flags);
6565 PRE_MEM_RASCIIZ("__realpathat(path)", (Addr)ARG2);
6566 PRE_MEM_WRITE("__realpathat(buf)", (Addr)ARG3, ARG4);
6569 POST(sys___realpathat)
6571 POST_MEM_WRITE((Addr)ARG3, ARG4);
6574 // SYS_sys_close_range 575
6575 // int close_range(u_int lowfd, u_int highfd, int flags);
6576 PRE(sys_close_range)
6578 SysRes res = VG_(mk_SysRes_Success)(0);
6579 unsigned int lowfd = ARG1;
6580 unsigned int fd_counter; // will count from lowfd to highfd
6581 unsigned int highfd = ARG2;
6583 /* on linux the may lock if futexes are used
6584 * there is a lock in the kernel but I assume it's just
6585 * a spinlock */
6586 PRINT("sys_close_range ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %"
6587 FMT_REGWORD "d )", ARG1, ARG2, SARG3);
6588 PRE_REG_READ3(int, "close_range",
6589 unsigned int, lowfd, unsigned int, highfd,
6590 int, flags);
6592 if (lowfd > highfd) {
6593 SET_STATUS_Failure( VKI_EINVAL );
6594 return;
6597 if (highfd >= VG_(fd_hard_limit))
6598 highfd = VG_(fd_hard_limit) - 1;
6600 if (lowfd > highfd) {
6601 SET_STATUS_Success ( 0 );
6602 return;
6605 fd_counter = lowfd;
6606 do {
6607 if (fd_counter > highfd
6608 || (fd_counter == 2U/*stderr*/ && VG_(debugLog_getLevel)() > 0)
6609 || fd_counter == VG_(log_output_sink).fd
6610 || fd_counter == VG_(xml_output_sink).fd) {
6611 /* Split the range if it contains a file descriptor we're not
6612 * supposed to close. */
6613 if (fd_counter - 1 >= lowfd) {
6614 res = VG_(do_syscall3)(__NR_close_range, (UWord)lowfd, (UWord)fd_counter - 1, ARG3 );
6616 lowfd = fd_counter + 1;
6618 } while (fd_counter++ <= highfd);
6620 /* If it failed along the way, it's presumably the flags being wrong. */
6621 SET_STATUS_from_SysRes (res);
6624 POST(sys_close_range)
6626 unsigned int fd;
6627 unsigned int last = ARG2;
6629 if (!VG_(clo_track_fds)
6630 || (ARG3 & VKI_CLOSE_RANGE_CLOEXEC) != 0)
6631 return;
6633 if (last >= VG_(fd_hard_limit))
6634 last = VG_(fd_hard_limit) - 1;
6636 /* If the close_range range is too wide, we don't want to loop
6637 through the whole range. */
6638 if (ARG2 == ~0U)
6639 ML_(record_fd_close_range)(tid, ARG1);
6640 else {
6641 for (fd = ARG1; fd <= last; fd++)
6642 if ((fd != 2/*stderr*/ || VG_(debugLog_getLevel)() == 0)
6643 && fd != VG_(log_output_sink).fd
6644 && fd != VG_(xml_output_sink).fd)
6645 ML_(record_fd_close)(tid, fd);
6649 // SYS___specialfd 577
6650 // syscalls.master
6651 // int __specialfd(int type,
6652 // _In_reads_bytes_(len) const void *req,
6653 // size_t len);
6654 PRE(sys___specialfd)
6656 PRINT("sys___specialfd ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )",
6657 SARG1,ARG2,(const char*)ARG2,ARG3 );
6658 PRE_REG_READ3(int, "__specialfd", int, type, const void *, req, vki_size_t, len);
6659 PRE_MEM_READ("__specialfd(req)", (Addr)ARG2, ARG3);
6662 // SYS_aio_writev 578
6663 // int aio_writev(struct aiocb *iocb);
6664 PRE(sys_aio_writev)
6666 PRINT("sys_aio_writev ( %#" FMT_REGWORD "x )", ARG1);
6667 PRE_REG_READ1(int, "aio_writev", struct vki_aiocb *, iocb);
6668 PRE_MEM_READ("aio_writev(iocb)", ARG1, sizeof(struct vki_aiocb));
6669 if (ML_(safe_to_deref)((struct vki_aiocb *)ARG1, sizeof(struct vki_aiocb))) {
6670 struct vki_aiocb *iocb = (struct vki_aiocb *)ARG1;
6671 if (!ML_(fd_allowed)(iocb->aio_fildes, "aio_writev", tid, False)) {
6672 SET_STATUS_Failure( VKI_EBADF );
6673 } else {
6674 // aio_writev() gathers the data from the iocb->aio_iovcnt buffers specified
6675 // by the members of the iocb->aio_iov array
6676 // FreeBSD headers #define define this to aio_iovcnt
6677 SizeT vec_count = (SizeT)iocb->aio_nbytes;
6678 #if defined(__clang__)
6679 #pragma clang diagnostic push
6680 // yes, I know it is volatile
6681 #pragma clang diagnostic ignored "-Wcast-qual"
6682 #endif
6683 struct vki_iovec* p_iovec = (struct vki_iovec*)iocb->aio_buf;
6684 #if defined(__clang__)
6685 #pragma clang diagnostic pop
6686 #endif
6687 PRE_MEM_READ("aio_writev(iocb->aio_iov)", (Addr)p_iovec, vec_count*sizeof(struct vki_iovec));
6688 // and this to aio_iov
6690 if (ML_(safe_to_deref)(p_iovec, vec_count*sizeof(struct vki_iovec))) {
6691 for (SizeT i = 0U; i < vec_count; ++i) {
6692 PRE_MEM_READ("aio_writev(iocb->iov[...])",
6693 (Addr)p_iovec[i].iov_base, p_iovec[i].iov_len);
6697 } else {
6698 SET_STATUS_Failure(VKI_EINVAL);
6702 // SYS_aio_readv 579
6703 // int aio_readv(struct aiocb *iocb);
6704 PRE(sys_aio_readv)
6706 PRINT("sys_aio_readv ( %#" FMT_REGWORD "x )", ARG1);
6707 PRE_REG_READ1(int, "aio_readv", struct vki_aiocb *, iocb);
6708 PRE_MEM_READ("aio_readv(iocb)", ARG1, sizeof(struct vki_aiocb));
6709 if (ML_(safe_to_deref)((struct vki_aiocb *)ARG1, sizeof(struct vki_aiocb))) {
6710 struct vki_aiocb *iocb = (struct vki_aiocb *)ARG1;
6711 if (!ML_(fd_allowed)(iocb->aio_fildes, "aio_readv", tid, False)) {
6712 SET_STATUS_Failure( VKI_EBADF );
6713 } else {
6714 SizeT vec_count = (SizeT)iocb->aio_nbytes;
6715 #if defined(__clang__)
6716 #pragma clang diagnostic push
6717 // yes, I know it is volatile
6718 #pragma clang diagnostic ignored "-Wcast-qual"
6719 #endif
6720 struct vki_iovec* p_iovec = (struct vki_iovec*)iocb->aio_buf;
6721 #if defined(__clang__)
6722 #pragma clang diagnostic pop
6723 #endif
6724 PRE_MEM_READ("aio_readv(iocb->aio_iov)", (Addr)p_iovec, vec_count*sizeof(struct vki_iovec));
6725 if (ML_(safe_to_deref)(p_iovec, vec_count*sizeof(struct vki_iovec))) {
6726 for (SizeT i = 0U; i < vec_count; ++i) {
6727 PRE_MEM_WRITE("aio_writev(iocb->aio_iov[...])",
6728 (Addr)p_iovec[i].iov_base, p_iovec[i].iov_len);
6732 } else {
6733 SET_STATUS_Failure(VKI_EINVAL);
6737 POST(sys_aio_readv)
6739 struct vki_aiocb* iocbv = (struct vki_aiocb*)ARG1;
6740 if (iocbv->aio_buf) {
6741 if (!aiov_init_done) {
6742 aiov_init();
6745 if (!VG_(OSetWord_Contains)(iocbv_table, (UWord)iocbv)) {
6746 VG_(OSetWord_Insert)(iocbv_table, (UWord)iocbv);
6747 } else {
6748 // @todo PJF this warns without callstack
6749 VG_(dmsg)("Warning: Duplicate control block %p in aio_readv\n",
6750 (void *)(Addr)ARG1);
6751 VG_(dmsg)("Warning: Ensure 'aio_return' is called when 'aio_readv' has completed\n");
6756 // SYS_fspacectl 580
6757 // int fspacectl(int fd, int cmd, const struct spacectl_range *rqsr, int flags,
6758 // struct spacectl_range *rmsr);
6759 PRE(sys_fspacectl)
6761 PRINT("fspacectl ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, SARG2, ARG3, SARG4, ARG5);
6762 PRE_REG_READ5(int, "fspacectl", int, fd, int, cmd, const struct spacectl_range *, rqsr, int, flags, struct spacectl_range *, rmsr);
6763 PRE_MEM_READ("fspacectl(rqsr)", (Addr)ARG3, sizeof(struct vki_spacectl_range));
6764 if (ARG5) {
6765 PRE_MEM_WRITE("fspacectl(rmsr)", (Addr)ARG5, sizeof(struct vki_spacectl_range));
6769 POST(sys_fspacectl)
6771 if (ARG5) {
6772 POST_MEM_WRITE((Addr)ARG5, sizeof(struct vki_spacectl_range));
6776 // SYS_swapoff 582
6777 // int swapoff(const char *special, u_int flags);
6778 PRE(sys_swapoff)
6780 PRINT("sys_swapoff(%#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u)", ARG1,(char *)ARG1, ARG2);
6781 PRE_REG_READ2(int, "swapoff", const char *, special, u_int, flags);
6782 PRE_MEM_RASCIIZ( "swapoff(special)", ARG1 );
6785 // SYS_kqueuex 583
6786 // int kqueuex(u_int flags);
6787 PRE(sys_kqueuex)
6789 PRINT("sys_kqueuex(%#" FMT_REGWORD "x)", ARG1);
6790 PRE_REG_READ1(int, "kqueuex", u_int, flags);
6793 POST(sys_kqueuex)
6795 if (!ML_(fd_allowed)(RES, "kqueuex", tid, True)) {
6796 VG_(close)(RES);
6797 SET_STATUS_Failure(VKI_EMFILE);
6798 } else {
6799 if (VG_(clo_track_fds)) {
6800 ML_(record_fd_open_nameless)(tid, RES);
6805 // SYS_membarrier 584
6806 // syscalls.master
6807 // int membarrier(int cmd, unsigned flags, int cpu_id);
6808 PRE(sys_membarrier)
6810 // cmd is signed int but the constants in the headers
6811 // are hex so print in hex
6812 PRINT("sys_membarrier(%#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "d)",
6813 ARG1, ARG2, SARG3);
6814 PRE_REG_READ3(int, "membarrier", int, cmd, unsigned, flags, int, cpu_id);
6817 // SYS_timerfd_create 585
6818 // int timerfd_create(int clockid, int flags);
6819 PRE(sys_timerfd_create)
6821 PRINT("sys_timerfd_create (%ld, %ld )", SARG1, SARG2);
6822 PRE_REG_READ2(int, "timerfd_create", int, clockid, int, flags);
6825 POST(sys_timerfd_create)
6827 if (!ML_(fd_allowed)(RES, "timerfd_create", tid, True)) {
6828 VG_(close)(RES);
6829 SET_STATUS_Failure( VKI_EMFILE );
6830 } else {
6831 if (VG_(clo_track_fds))
6832 ML_(record_fd_open_nameless) (tid, RES);
6836 // SYS_timerfd_gettime 586
6837 // int timerfd_gettime(int fd, struct itimerspec *curr_value);
6838 PRE(sys_timerfd_gettime)
6840 PRINT("sys_timerfd_gettime ( %ld, %#" FMT_REGWORD "x )", SARG1, ARG2);
6841 PRE_REG_READ2(int, "timerfd_gettime",
6842 int, fd,
6843 struct vki_itimerspec*, curr_value);
6844 if (!ML_(fd_allowed)(ARG1, "timerfd_gettime", tid, False))
6845 SET_STATUS_Failure(VKI_EBADF);
6846 else
6847 PRE_MEM_WRITE("timerfd_gettime(curr_value)",
6848 ARG2, sizeof(struct vki_itimerspec));
6851 POST(sys_timerfd_gettime)
6853 if (RES == 0)
6854 POST_MEM_WRITE(ARG2, sizeof(struct vki_itimerspec));
6857 // SYS_timerfd_gettime 587
6858 // int timerfd_settime(int fd, int flags, const struct itimerspec *new_value,
6859 // struct itimerspec *old_value);
6860 PRE(sys_timerfd_settime)
6862 PRINT("sys_timerfd_settime(%" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %#"
6863 FMT_REGWORD "x )", SARG1, SARG2, ARG3, ARG4);
6864 PRE_REG_READ4(int, "timerfd_settime",
6865 int, fd,
6866 int, flags,
6867 const struct vki_itimerspec*, new_value,
6868 struct vki_itimerspec*, old_value);
6869 if (!ML_(fd_allowed)(ARG1, "timerfd_settime", tid, False))
6870 SET_STATUS_Failure(VKI_EBADF);
6871 else
6873 PRE_MEM_READ("timerfd_settime(new_value)",
6874 ARG3, sizeof(struct vki_itimerspec));
6875 if (ARG4)
6877 PRE_MEM_WRITE("timerfd_settime(old_value)",
6878 ARG4, sizeof(struct vki_itimerspec));
6883 POST(sys_timerfd_settime)
6885 if (RES == 0 && ARG4 != 0) {
6886 POST_MEM_WRITE(ARG4, sizeof(struct vki_itimerspec));
6890 // SYS_kcmp 588
6891 // int kcmp(pid_t pid1, pid_t pid2, int type, uintptr_t idx1, uintptr_t idx2);
6892 PRE(sys_kcmp)
6894 PRINT("sys_kcmp(%ld, %ld, %ld, %" FMT_REGWORD "u, %" FMT_REGWORD "u)",
6895 SARG1, SARG2, SARG3, ARG4, ARG5);
6896 switch (ARG3) {
6897 case VKI_KCMP_FILES:
6898 case VKI_KCMP_VM:
6899 case VKI_KCMP_SIGHAND:
6900 /* Most of the comparison types don't look at |idx1| or |idx2|. */
6901 PRE_REG_READ3(int, "kcmp",
6902 vki_pid_t, pid1, vki_pid_t, pid2, int, type);
6903 break;
6904 case VKI_KCMP_FILE:
6905 case VKI_KCMP_FILEOBJ:
6906 default:
6907 PRE_REG_READ5(int, "kcmp",
6908 vki_pid_t, pid1, vki_pid_t, pid2, int, type,
6909 unsigned long, idx1, unsigned long, idx2);
6910 break;
6914 // SYS_getrlimitusage 589
6915 // from syscalls.master
6916 // int getrlimitusage(u_int which, int flags, _Out_ rlim_t *res);
6917 PRE(sys_getrlimitusage)
6919 PRINT("sys_getrlimitusage(%lu, %ld, %#" FMT_REGWORD "x )", ARG1, SARG2, ARG3);
6920 PRE_REG_READ3(int, "getrlimitusage", u_int, which, int, flags, vki_rlim_t*, res);
6922 PRE_MEM_WRITE("getrlimitusage(res)", ARG3, sizeof(vki_rlim_t));
6925 POST(sys_getrlimitusage)
6927 POST_MEM_WRITE(ARG3, sizeof(vki_rlim_t));
6929 // flags can be GETRLIMITUSAGE_EUID or not
6930 // not sure what that means?
6932 // we need to set the values for NOFILE DATA and STACK
6933 vki_rlim_t* res = (vki_rlim_t*)ARG3;
6934 switch (ARG1) {
6935 case VKI_RLIMIT_NOFILE:
6936 *res = ML_(get_fd_count)() + 3;
6937 break;
6938 case VKI_RLIMIT_DATA:
6940 * The OS initializes this the the size of the .data for the exe.
6941 * We read this in readelf.c.
6943 *res = VG_(data_size)() + VG_(brk_limit) - VG_(brk_base);
6944 break;
6945 case VKI_RLIMIT_STACK:
6947 * The main client stack is quite different when running under Valgrind.
6948 * See aspacemg-linux.c for details, but in short on 64bit systems
6949 * the main stack starts with 128k reserved and a 512M limit.
6950 * Valgrind just has one value, 16M by default (can be changed with
6951 * --main-stacksize). Maybe we should use something more like the OS
6952 * but it doesn't seem that important.
6954 *res = VG_(get_client_stack_max_size)();
6955 break;
6956 default:
6957 // do nothing
6958 break;
6962 #undef PRE
6963 #undef POST
6965 const SyscallTableEntry ML_(syscall_table)[] = {
6966 // syscall (handled specially) // 0
6967 BSDX_(__NR_exit, sys_exit), // 1
6968 BSDX_(__NR_fork, sys_fork), // 2
6969 GENXY(__NR_read, sys_read), // 3
6971 GENX_(__NR_write, sys_write), // 4
6972 GENXY(__NR_open, sys_open), // 5
6973 GENX_(__NR_close, sys_close), // 6
6974 GENXY(__NR_wait4, sys_wait4), // 7
6976 // 4.3 creat 8
6977 GENX_(__NR_link, sys_link), // 9
6978 GENX_(__NR_unlink, sys_unlink), // 10
6979 // obsol execv 11
6981 GENX_(__NR_chdir, sys_chdir), // 12
6982 GENX_(__NR_fchdir, sys_fchdir), // 13
6983 GENX_(__NR_freebsd11_mknod, sys_mknod), // 14
6984 GENX_(__NR_chmod, sys_chmod), // 15
6986 GENX_(__NR_chown, sys_chown), // 16
6987 #if defined(VGP_arm64_freebsd)
6988 BSDX_(__NR_break, sys_brk), // 17
6989 #else
6990 GENX_(__NR_break, sys_brk), // 17
6991 #endif
6992 // freebsd 4 getfsstat 18
6993 // 4.3 lseek 19
6995 GENX_(__NR_getpid, sys_getpid), // 20
6996 BSDX_(__NR_mount, sys_mount), // 21
6997 BSDX_(__NR_unmount, sys_unmount), // 22
6998 GENX_(__NR_setuid, sys_setuid), // 23
7000 GENX_(__NR_getuid, sys_getuid), // 24
7001 GENX_(__NR_geteuid, sys_geteuid), // 25
7002 BSDXY(__NR_ptrace, sys_ptrace), // 26
7003 BSDXY(__NR_recvmsg, sys_recvmsg), // 27
7005 BSDX_(__NR_sendmsg, sys_sendmsg), // 28
7006 BSDXY(__NR_recvfrom, sys_recvfrom), // 29
7007 BSDXY(__NR_accept, sys_accept), // 30
7008 BSDXY(__NR_getpeername, sys_getpeername), // 31
7010 BSDXY(__NR_getsockname, sys_getsockname), // 32
7011 GENX_(__NR_access, sys_access), // 33
7012 BSDX_(__NR_chflags, sys_chflags), // 34
7013 BSDX_(__NR_fchflags, sys_fchflags), // 35
7015 GENX_(__NR_sync, sys_sync), // 36
7016 GENX_(__NR_kill, sys_kill), // 37
7017 // 4.3 stat 38
7018 GENX_(__NR_getppid, sys_getppid), // 39
7020 // 4.3 lstat 40
7021 GENXY(__NR_dup, sys_dup), // 41
7023 #if defined(VGP_arm64_freebsd)
7024 GENX_(__NR_freebsd10_pipe, sys_ni_syscall), // 42
7025 #else
7026 BSDXY(__NR_freebsd10_pipe, sys_pipe), // 42
7027 #endif
7028 GENX_(__NR_getegid, sys_getegid), // 43
7030 GENX_(__NR_profil, sys_ni_syscall), // 44
7031 GENX_(__NR_ktrace, sys_ni_syscall), // 45
7032 // 4.3 sigaction 46
7033 GENX_(__NR_getgid, sys_getgid), // 47
7035 // 4.3 sigaction (int sigset) 48
7036 BSDXY(__NR_getlogin, sys_getlogin), // 49
7037 BSDX_(__NR_setlogin, sys_setlogin), // 50
7038 GENX_(__NR_acct, sys_acct), // 51
7040 // 4.3 sigpending 52
7041 GENXY(__NR_sigaltstack, sys_sigaltstack), // 53
7042 BSDXY(__NR_ioctl, sys_ioctl), // 54
7043 BSDX_(__NR_reboot, sys_reboot), // 55
7045 BSDX_(__NR_revoke, sys_revoke), // 56
7046 GENX_(__NR_symlink, sys_symlink), // 57
7047 BSDX_(__NR_readlink, sys_readlink), // 58
7048 GENX_(__NR_execve, sys_execve), // 59
7050 GENX_(__NR_umask, sys_umask), // 60
7051 GENX_(__NR_chroot, sys_chroot), // 61
7052 // 4.3 fstat 62
7053 // 4.3 getgerninfo 63
7055 // 4.3 getpagesize 64
7056 GENX_(__NR_msync, sys_msync), // 65
7057 BSDX_(__NR_vfork, sys_vfork), // 66
7058 // obsol vread 67
7060 // obsol vwrite 68
7061 BSDX_(__NR_sbrk, sys_sbrk), // 69
7062 // not implemented in OS sstk 70
7063 // 4.3 mmap 71
7065 // freebsd11 vadvise 72
7066 GENXY(__NR_munmap, sys_munmap), // 73
7067 GENXY(__NR_mprotect, sys_mprotect), // 74
7068 GENX_(__NR_madvise, sys_madvise), // 75
7070 // obsol vhangup 76
7071 // obsol vlimit 77
7072 GENXY(__NR_mincore, sys_mincore), // 78
7073 GENXY(__NR_getgroups, sys_getgroups), // 79
7075 GENX_(__NR_setgroups, sys_setgroups), // 80
7076 GENX_(__NR_getpgrp, sys_getpgrp), // 81
7077 GENX_(__NR_setpgid, sys_setpgid), // 82
7078 GENXY(__NR_setitimer, sys_setitimer), // 83
7080 // 4.3 wait 84
7081 BSDX_(__NR_swapon, sys_swapon), // 85
7082 GENXY(__NR_getitimer, sys_getitimer), // 86
7083 // 4.3 gethostname 87
7085 // 4.3 sethostname 88
7086 BSDX_(__NR_getdtablesize, sys_getdtablesize), // 89
7087 GENXY(__NR_dup2, sys_dup2), // 90
7089 BSDXY(__NR_fcntl, sys_fcntl), // 92
7090 GENX_(__NR_select, sys_select), // 93
7091 GENX_(__NR_fsync, sys_fsync), // 95
7093 GENX_(__NR_setpriority, sys_setpriority), // 96
7094 BSDXY(__NR_socket, sys_socket), // 97
7095 BSDX_(__NR_connect, sys_connect), // 98
7096 // 4.3 accept 99
7098 GENX_(__NR_getpriority, sys_getpriority), // 100
7099 // 4.3 send 101
7100 // 4.3 recv 102
7101 // 4.3 sigreturn 103
7103 BSDX_(__NR_bind, sys_bind), // 104
7104 BSDX_(__NR_setsockopt, sys_setsockopt), // 105
7105 BSDX_(__NR_listen, sys_listen), // 106
7106 // obsol vtimes 107
7108 // 4.3 sigvec 108
7109 // 4.3 sigblock 109
7110 // 4.3 sigsetmask 110
7111 // 4.3 sigsuspend 111
7113 // 4.3 sigstack 112
7114 // 4.3 recvmsg 113
7115 // 4.3 sendmsg 114
7116 // 4.3 vtrace 115
7118 GENXY(__NR_gettimeofday, sys_gettimeofday), // 116
7119 GENXY(__NR_getrusage, sys_getrusage), // 117
7120 BSDXY(__NR_getsockopt, sys_getsockopt), // 118
7122 GENXY(__NR_readv, sys_readv), // 120
7123 GENX_(__NR_writev, sys_writev), // 121
7124 GENX_(__NR_settimeofday, sys_settimeofday), // 122
7125 GENX_(__NR_fchown, sys_fchown), // 123
7127 GENX_(__NR_fchmod, sys_fchmod), // 124
7128 // 4.3 recvfrom 125
7129 GENX_(__NR_setreuid, sys_setreuid), // 126
7130 GENX_(__NR_setregid, sys_setregid), // 127
7132 GENX_(__NR_rename, sys_rename), // 128
7133 // 4.3 truncate 129
7134 // 4.3 ftruncate 130
7135 GENX_(__NR_flock, sys_flock), // 131
7137 BSDX_(__NR_mkfifo, sys_mkfifo), // 132
7138 BSDX_(__NR_sendto, sys_sendto), // 133
7139 BSDX_(__NR_shutdown, sys_shutdown), // 134
7140 BSDXY(__NR_socketpair, sys_socketpair), // 135
7142 GENX_(__NR_mkdir, sys_mkdir), // 136
7143 GENX_(__NR_rmdir, sys_rmdir), // 137
7144 GENX_(__NR_utimes, sys_utimes), // 138
7145 // 4.2 sigreturn 139
7147 BSDXY(__NR_adjtime, sys_adjtime), // 140
7148 // 4.3 getpeername 141
7149 // 4.3 gethostid 142
7150 // 4.3 sethostid 143
7152 // 4.3 getrlimit` 144
7153 // 4.3 setrlimit 145
7154 // 4.3 killpg 146
7155 GENX_(__NR_setsid, sys_setsid), // 147
7157 BSDX_(__NR_quotactl, sys_quotactl), // 148
7158 // 4.3 quota 149
7159 // 4.3 getsockname 150
7160 // bsd/os sem_lock 151
7162 // bsd/os sem_wakeup 152
7163 // bsd/os asyncdaemon 153
7165 // no idea what the following syscall does
7166 // unimp SYS_nlm_syscall 154
7168 // a somewhat complicated NFS API
7169 // takes a flag and a void* that can point to one of
7170 // three different types of struct depending on the flag
7171 // unimp SYS_nfssvc 155
7173 // 4.3 getdirentries 156
7174 // freebsd 4 statfs 157
7175 // freebsd 4 fstatfs 158
7177 BSDXY(__NR_lgetfh, sys_lgetfh), // 160
7178 BSDXY(__NR_getfh, sys_getfh), // 161
7179 //BSDXY(__NR_freebsd4_getdomainname, sys_freebsd4_getdomainname), // 162
7180 //BSDX_(__NR_freebsd4_setdomainname, sys_freebsd4_setdomainname), // 163
7181 //BSDXY(__NR_freebsd4_uname, sys_freebsd4_uname), // 164
7182 BSDXY(__NR_sysarch, sys_sysarch), // 165
7183 BSDXY(__NR_rtprio, sys_rtprio), // 166
7185 // the following 3 seem only to be defines in a header
7186 // semsys 169
7187 // msgsys 170
7188 // shmsys 171
7190 //BSDXY(__NR_freebsd6_pread, sys_freebsd6_pread), // 173
7191 //BSDX_(__NR_freebsd6_pwrite, sys_freebsd6_pwrite), // 174
7192 BSDX_(__NR_setfib, sys_setfib), // 175
7194 // @todo PJF this exists on Darwin and Solaris as well
7195 // and it isn't implememented on either
7196 // looking at the manpage there is a rather fearsome
7197 // timex struct with a mixture of ro and rw fields
7198 // BSDXY(__NR_ntp_adjtime, sys_ntp_adjtime), // 176
7200 // bsd/os sfork 177
7201 // bsd/os getdescriptor 178
7202 // bsd/os setdescriptor 179
7204 GENX_(__NR_setgid, sys_setgid), // 181
7205 BSDX_(__NR_setegid, sys_setegid), // 182
7206 BSDX_(__NR_seteuid, sys_seteuid), // 183
7208 // obs lfs_bmapv 184
7209 // obs lfs_markv 185
7210 // obs lfs_segclean 186
7211 // obs lfs_segwait 187
7213 // __FreeBSD_version 1200031
7214 BSDXY(__NR_freebsd11_stat, sys_freebsd11_stat), // 188
7215 BSDXY(__NR_freebsd11_fstat, sys_freebsd11_fstat), // 189
7216 BSDXY(__NR_freebsd11_lstat, sys_freebsd11_lstat), // 190
7218 BSDX_(__NR_pathconf, sys_pathconf), // 191
7219 BSDX_(__NR_fpathconf, sys_fpathconf), // 192
7220 GENXY(__NR_getrlimit, sys_getrlimit), // 194
7221 GENX_(__NR_setrlimit, sys_setrlimit), // 195
7222 // __FreeBSD_version 1200031
7223 BSDXY(__NR_freebsd11_getdirentries, sys_freebsd11_getdirentries), // 196
7225 //BSDX_(__NR_freebsd6_mmap, sys_freebsd6_mmap), // 197
7226 // __syscall (handled specially) // 198
7227 //BSDX_(__NR_freebsd6_lseek, sys_freebsd6_lseek), // 199
7228 //BSDX_(__NR_freebsd6_truncate, sys_freebsd6_truncate), // 200
7229 //BSDX_(__NR_freebsd6_ftruncate, sys_freebsd6_ftruncate), // 201
7230 BSDXY(__NR___sysctl, sys___sysctl), // 202
7231 GENX_(__NR_mlock, sys_mlock), // 203
7233 GENX_(__NR_munlock, sys_munlock), // 204
7234 BSDX_(__NR_undelete, sys_undelete), // 205
7235 BSDX_(__NR_futimes, sys_futimes), // 206
7236 GENX_(__NR_getpgid, sys_getpgid), // 207
7238 // netbsd newreboot 208
7239 GENXY(__NR_poll, sys_poll), // 209
7241 #if !defined(VGP_arm64_freebsd)
7242 BSDXY(__NR_freebsd7___semctl, sys_freebsd7___semctl), // 220
7243 #endif
7244 BSDX_(__NR_semget, sys_semget), // 221
7245 BSDX_(__NR_semop, sys_semop), // 222
7246 // obs semconfig 223
7248 #if !defined(VGP_arm64_freebsd)
7249 BSDXY(__NR_freebsd7_msgctl, sys_freebsd7_msgctl), // 224
7250 #endif
7251 BSDX_(__NR_msgget, sys_msgget), // 225
7252 BSDX_(__NR_msgsnd, sys_msgsnd), // 226
7253 BSDXY(__NR_msgrcv, sys_msgrcv), // 227
7255 BSDXY(__NR_shmat, sys_shmat), // 228
7256 #if !defined(VGP_arm64_freebsd)
7257 BSDXY(__NR_freebsd7_shmctl, sys_freebsd7_shmctl), // 229
7258 #endif
7259 BSDXY(__NR_shmdt, sys_shmdt), // 230
7260 BSDX_(__NR_shmget, sys_shmget), // 231
7262 BSDXY(__NR_clock_gettime, sys_clock_gettime), // 232
7263 BSDX_(__NR_clock_settime, sys_clock_settime), // 233
7264 BSDXY(__NR_clock_getres, sys_clock_getres), // 234
7265 BSDXY(__NR_ktimer_create, sys_timer_create), // 235
7266 BSDX_(__NR_ktimer_delete, sys_timer_delete), // 236
7267 BSDXY(__NR_ktimer_settime, sys_timer_settime), // 237
7268 BSDXY(__NR_ktimer_gettime, sys_timer_gettime), // 238
7269 BSDX_(__NR_ktimer_getoverrun, sys_timer_getoverrun), // 239
7271 GENXY(__NR_nanosleep, sys_nanosleep), // 240
7272 // unimpl SYS_ffclock_getcounter 241
7273 // unimpl SYS_ffclock_setestimate 242
7274 // unimpl SYS_ffclock_getestimate 243
7276 BSDXY(__NR_clock_nanosleep, sys_clock_nanosleep), // 244
7277 BSDXY(__NR_clock_getcpuclockid2, sys_clock_getcpuclockid2), // 247
7279 // unimpl SYS_ntp_gettime 248
7280 BSDXY(__NR_minherit, sys_minherit), // 250
7281 BSDX_(__NR_rfork, sys_rfork), // 251
7283 // openbsd_poll // 252
7284 BSDX_(__NR_issetugid, sys_issetugid), // 253
7285 GENX_(__NR_lchown, sys_lchown), // 254
7286 BSDXY(__NR_aio_read, sys_aio_read), // 255
7287 BSDX_(__NR_aio_write, sys_aio_write), // 256
7288 BSDX_(__NR_lio_listio, sys_lio_listio), // 257
7290 GENXY(__NR_freebsd11_getdents, sys_getdents), // 272
7291 BSDX_(__NR_lchmod, sys_lchmod), // 274
7292 // netbsd_lchown // 275
7294 BSDX_(__NR_lutimes, sys_lutimes), // 276
7295 // netbsd msync 277
7296 // unimpl SYS_freebsd11_nstat 278
7297 // unimpl SYS_freebsd11_nfstat 279
7299 // unimpl SYS_freebsd11_nlstat 280
7301 BSDXY(__NR_preadv, sys_preadv), // 289
7302 BSDX_(__NR_pwritev, sys_pwritev), // 290
7304 // freebsd 4 fhstatfs 297
7305 BSDXY(__NR_fhopen, sys_fhopen), // 298
7306 // __FreeBSD_version 1200031
7307 BSDXY(__NR_freebsd11_fhstat, sys_freebsd11_fhstat), // 299
7309 BSDX_(__NR_modnext, sys_modnext), // 300
7310 BSDXY(__NR_modstat, sys_modstat), // 301
7311 BSDX_(__NR_modfnext, sys_modfnext), // 302
7312 BSDX_(__NR_modfind, sys_modfind), // 303
7314 BSDX_(__NR_kldload, sys_kldload), // 304
7315 BSDX_(__NR_kldunload, sys_kldunload), // 305
7316 BSDX_(__NR_kldfind, sys_kldfind), // 306
7317 BSDX_(__NR_kldnext, sys_kldnext), // 307
7319 BSDXY(__NR_kldstat, sys_kldstat), // 308
7320 BSDX_(__NR_kldfirstmod, sys_kldfirstmod), // 309
7321 GENX_(__NR_getsid, sys_getsid), // 310
7322 BSDX_(__NR_setresuid, sys_setresuid), // 311
7324 BSDX_(__NR_setresgid, sys_setresgid), // 312
7325 // obsol signanosleep 313
7326 BSDX_(__NR_aio_return, sys_aio_return), // 314
7327 BSDX_(__NR_aio_suspend, sys_aio_suspend), // 315
7329 BSDX_(__NR_aio_cancel, sys_aio_cancel), // 316
7330 BSDX_(__NR_aio_error, sys_aio_error), // 317
7331 // freebsd 6 aio_read 318
7332 // freebsd 6 aio_write 319
7333 // freebsd 6 lio_listio 320
7334 BSDX_(__NR_yield, sys_yield), // 321
7335 // obs thr_sleep 322
7336 // obs thr_wakeup 323
7338 GENX_(__NR_mlockall, sys_mlockall), // 324
7339 BSDX_(__NR_munlockall, sys_munlockall), // 325
7340 BSDXY(__NR___getcwd, sys___getcwd), // 326
7341 BSDX_(__NR_sched_setparam, sys_sched_setparam), // 327
7342 BSDXY(__NR_sched_getparam, sys_sched_getparam), // 328
7343 BSDX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 329
7344 BSDX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 330
7345 BSDX_(__NR_sched_yield, sys_sched_yield), // 331
7347 BSDX_(__NR_sched_get_priority_max, sys_sched_get_priority_max), // 332
7348 BSDX_(__NR_sched_get_priority_min, sys_sched_get_priority_min), // 333
7349 BSDXY(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 334
7350 BSDX_(__NR_utrace, sys_utrace), // 335
7352 // freebsd 4 sendfile 336
7353 BSDXY(__NR_kldsym, sys_kldsym), // 337
7354 BSDX_(__NR_jail, sys_jail), // 338
7355 // unimpl SYS_nnpfs_syscall 339
7357 BSDXY(__NR_sigprocmask, sys_sigprocmask), // 340
7358 BSDXY(__NR_sigsuspend, sys_sigsuspend), // 341
7359 // freebsd 4 sigaction 342
7360 BSDXY(__NR_sigpending, sys_sigpending), // 343
7362 // freebsd 4 sigreturn 344
7363 BSDXY(__NR_sigtimedwait, sys_sigtimedwait), // 345
7364 BSDXY(__NR_sigwaitinfo, sys_sigwaitinfo), // 346
7365 BSDXY(__NR___acl_get_file, sys___acl_get_file), // 347
7367 BSDX_(__NR___acl_set_file, sys___acl_set_file), // 348
7368 BSDXY(__NR___acl_get_fd, sys___acl_get_fd), // 349
7369 BSDX_(__NR___acl_set_fd, sys___acl_set_fd), // 350
7370 BSDX_(__NR___acl_delete_file, sys___acl_delete_file), // 351
7372 BSDX_(__NR___acl_delete_fd, sys___acl_delete_fd), // 352
7373 BSDX_(__NR___acl_aclcheck_file, sys___acl_aclcheck_file), // 353
7374 BSDX_(__NR___acl_aclcheck_fd, sys___acl_aclcheck_fd), // 354
7375 BSDX_(__NR_extattrctl, sys_extattrctl), // 355
7376 BSDX_(__NR_extattr_set_file, sys_extattr_set_file), // 356
7377 BSDXY(__NR_extattr_get_file, sys_extattr_get_file), // 357
7378 BSDX_(__NR_extattr_delete_file, sys_extattr_delete_file), // 358
7379 BSDXY(__NR_aio_waitcomplete, sys_aio_waitcomplete), // 359
7381 BSDXY(__NR_getresuid, sys_getresuid), // 360
7382 BSDXY(__NR_getresgid, sys_getresgid), // 361
7383 BSDXY(__NR_kqueue, sys_kqueue), // 362
7384 // __FreeBSD_version 1200033
7385 BSDXY(__NR_freebsd11_kevent, sys_freebsd11_kevent), // 363
7386 // obs __cap_get_proc 364
7387 // obs __cap_set_proc 365
7388 // obs __cap_get_fd 366
7389 // obs __cap_get_file 367
7390 // obs __cap_set_fd 368
7391 // obs __cap_set_file 369
7393 BSDX_(__NR_extattr_set_fd, sys_extattr_set_fd), // 371
7394 BSDXY(__NR_extattr_get_fd, sys_extattr_get_fd), // 372
7395 BSDX_(__NR_extattr_delete_fd, sys_extattr_delete_fd), // 373
7396 BSDX_(__NR___setugid, sys___setugid), // 374
7397 // obs nfsclnt 375
7399 BSDX_(__NR_eaccess, sys_eaccess), // 376
7400 // unimpl afs3_syscall 377
7401 BSDX_(__NR_nmount, sys_nmount), // 378
7402 // obs kse_exit 379
7403 // obs kse_wakeup 380
7404 // obs kse_create 381
7405 // obs kse_thr_interrupt 382
7406 // obs kse_release 383
7408 // unimpl __mac_get_proc 384
7409 // unimpl __mac_set_proc 385
7410 // unimpl __mac_get_fd 386
7411 // unimpl __mac_get_file 387
7412 // unimpl __mac_set_fd 388
7413 // unimpl __mac_set_file 389
7414 BSDXY(__NR_kenv, sys_kenv), // 390
7415 BSDX_(__NR_lchflags, sys_lchflags), // 391
7417 BSDXY(__NR_uuidgen, sys_uuidgen), // 392
7418 BSDXY(__NR_sendfile, sys_sendfile), // 393
7419 // unimpl mac_syscall 394
7421 // __FreeBSD_version 1200031
7422 BSDXY(__NR_freebsd11_getfsstat, sys_freebsd11_getfsstat), // 395
7423 BSDXY(__NR_freebsd11_statfs, sys_statfs), // 396
7424 BSDXY(__NR_freebsd11_fstatfs, sys_fstatfs), // 397
7425 BSDXY(__NR_freebsd11_fhstatfs, sys_fhstatfs), // 398
7427 // unimpl ksem_close 400
7428 // unimpl ksem_post 401
7429 // unimpl ksem_wait 402
7430 // unimpl ksem_trywait 403
7432 // unimpl ksem_init 404
7433 // unimpl ksem_open 405
7434 // unimpl ksem_unlink 406
7435 // unimpl ksem_getvalue 407
7437 // unimpl ksem_destroy 408
7438 // unimpl __mac_get_pid 409
7439 // unimpl __mac_get_link 410
7440 // unimpl __mac_set_link 411
7442 BSDX_(__NR_extattr_set_link, sys_extattr_set_link), // 412
7443 BSDXY(__NR_extattr_get_link, sys_extattr_get_link), // 413
7444 BSDX_(__NR_extattr_delete_link, sys_extattr_delete_link), // 414
7445 // unimpl __mac_execve 415
7447 BSDXY(__NR_sigaction, sys_sigaction), // 416
7448 BSDX_(__NR_sigreturn, sys_sigreturn), // 417
7450 BSDXY(__NR_getcontext, sys_getcontext), // 421
7451 BSDX_(__NR_setcontext, sys_setcontext), // 422
7452 BSDXY(__NR_swapcontext, sys_swapcontext), // 423
7454 BSDX_(__NR_freebsd13_swapoff, sys_freebsd13_swapoff), // 424
7455 BSDXY(__NR___acl_get_link, sys___acl_get_link), // 425
7456 BSDX_(__NR___acl_set_link, sys___acl_set_link), // 426
7457 BSDX_(__NR___acl_delete_link, sys___acl_delete_link), // 427
7459 BSDX_(__NR___acl_aclcheck_link, sys___acl_aclcheck_link), // 428
7460 BSDXY(__NR_sigwait, sys_sigwait), // 429
7461 BSDX_(__NR_thr_create, sys_thr_create), // 430
7462 BSDX_(__NR_thr_exit, sys_thr_exit), // 431
7464 BSDXY(__NR_thr_self, sys_thr_self), // 432
7465 BSDXY(__NR_thr_kill, sys_thr_kill), // 433
7466 //BSDXY(__NR__umtx_lock, sys__umtx_lock), // 434
7467 //BSDXY(__NR__umtx_unlock, sys__umtx_unlock), // 435
7469 BSDX_(__NR_jail_attach, sys_jail_attach), // 436
7470 BSDXY(__NR_extattr_list_fd, sys_extattr_list_fd), // 437
7471 BSDXY(__NR_extattr_list_file, sys_extattr_list_file), // 438
7472 BSDXY(__NR_extattr_list_link, sys_extattr_list_link), // 439
7474 // obs kse_switchin 440
7475 // unimpl ksem_timedwait 441
7476 BSDX_(__NR_thr_suspend, sys_thr_suspend), // 442
7477 BSDX_(__NR_thr_wake, sys_thr_wake), // 443
7478 BSDX_(__NR_kldunloadf, sys_kldunloadf), // 444
7479 // unimpl audit 445
7480 // unimpl auditon 446
7481 // unimpl getauid 447
7483 // unimpl setauid 448
7484 // unimpl getaudit 449
7485 // unimpl setaudit 450
7486 // unimpl getaudit_addr 451
7487 // unimpl setaudit_addr 452
7488 // unimpl auditctl 453
7489 BSDXY(__NR__umtx_op, sys__umtx_op), // 454
7490 BSDX_(__NR_thr_new, sys_thr_new), // 455
7492 BSDX_(__NR_sigqueue, sys_sigqueue), // 456
7493 BSDXY(__NR_kmq_open, sys_kmq_open), // 457
7494 BSDX_(__NR_kmq_setattr, sys_kmq_setattr), // 458
7495 BSDXY(__NR_kmq_timedreceive, sys_kmq_timedreceive), // 459
7497 BSDX_(__NR_kmq_timedsend, sys_kmq_timedsend), // 460
7498 BSDX_(__NR_kmq_notify, sys_kmq_notify), // 461
7499 BSDX_(__NR_kmq_unlink, sys_kmq_unlink), // 462
7500 BSDX_(__NR_abort2, sys_abort2), // 463
7502 BSDX_(__NR_thr_set_name, sys_thr_set_name), // 464
7503 BSDX_(__NR_aio_fsync, sys_aio_fsync), // 465
7504 BSDXY(__NR_rtprio_thread, sys_rtprio_thread), // 466
7506 // unimpl sctp_peeloff 471
7507 BSDX_(__NR_sctp_generic_sendmsg, sys_sctp_generic_sendmsg), // 472
7508 // unimpl sctp_generic_sendmsg_iov 473
7509 BSDXY(__NR_sctp_generic_recvmsg, sys_sctp_generic_recvmsg), // 474
7510 BSDXY(__NR_pread, sys_pread), // 475
7512 BSDX_(__NR_pwrite, sys_pwrite), // 476
7513 BSDX_(__NR_mmap, sys_mmap), // 477
7514 BSDX_(__NR_lseek, sys_lseek), // 478
7515 BSDX_(__NR_truncate, sys_truncate), // 479
7516 BSDX_(__NR_ftruncate, sys_ftruncate), // 480
7517 BSDXY(__NR_thr_kill2, sys_thr_kill2), // 481
7518 BSDXY(__NR_shm_open, sys_shm_open), // 482
7519 BSDX_(__NR_shm_unlink, sys_shm_unlink), // 483
7521 BSDXY(__NR_cpuset, sys_cpuset), // 484
7522 BSDX_(__NR_cpuset_setid, sys_cpuset_setid), // 485
7523 BSDXY(__NR_cpuset_getid, sys_cpuset_getid), // 486
7525 BSDXY(__NR_cpuset_getaffinity, sys_cpuset_getaffinity), // 487
7526 BSDX_(__NR_cpuset_setaffinity, sys_cpuset_setaffinity), // 488
7527 BSDX_(__NR_faccessat, sys_faccessat), // 489
7528 BSDX_(__NR_fchmodat, sys_fchmodat), // 490
7529 BSDX_(__NR_fchownat, sys_fchownat), // 491
7531 BSDX_(__NR_fexecve, sys_fexecve), // 492
7532 // __FreeBSD_version 1200031
7533 BSDXY(__NR_freebsd11_fstatat, sys_freebsd11_fstatat), // 493
7534 BSDX_(__NR_futimesat, sys_futimesat), // 494
7535 BSDX_(__NR_linkat, sys_linkat), // 495
7537 BSDX_(__NR_mkdirat, sys_mkdirat), // 496
7538 BSDX_(__NR_mkfifoat, sys_mkfifoat), // 497
7540 // __FreeBSD_version 1200031
7541 BSDX_(__NR_freebsd11_mknodat, sys_freebsd11_mknodat), // 498
7543 BSDXY(__NR_openat, sys_openat), // 499
7545 BSDXY(__NR_readlinkat, sys_readlinkat), // 500
7546 BSDX_(__NR_renameat, sys_renameat), // 501
7547 BSDX_(__NR_symlinkat, sys_symlinkat), // 502
7548 BSDX_(__NR_unlinkat, sys_unlinkat), // 503
7550 BSDX_(__NR_posix_openpt, sys_posix_openpt), // 504
7551 // unimp gssd_syscall 505
7552 BSDX_(__NR_jail_get, sys_jail_get), // 506
7553 BSDX_(__NR_jail_set, sys_jail_set), // 507
7554 BSDX_(__NR_jail_remove, sys_jail_remove), // 508
7555 BSDXY(__NR_closefrom, sys_closefrom), // 509
7556 BSDXY(__NR___semctl, sys___semctl), // 510
7557 BSDXY(__NR_msgctl, sys_msgctl), // 511
7558 BSDXY(__NR_shmctl, sys_shmctl), // 512
7559 BSDX_(__NR_lpathconf, sys_lpathconf), // 513
7560 /* 514 is obsolete cap_new */
7561 BSDXY(__NR___cap_rights_get, sys_cap_rights_get), // 515
7562 BSDX_(__NR_cap_enter, sys_cap_enter), // 516
7563 BSDXY(__NR_cap_getmode, sys_cap_getmode), // 517
7564 BSDXY(__NR_pdfork, sys_pdfork), // 518
7565 BSDX_(__NR_pdkill, sys_pdkill), // 519
7566 BSDXY(__NR_pdgetpid, sys_pdgetpid), // 520
7567 BSDXY(__NR_pselect, sys_pselect), // 522
7568 BSDXY(__NR_getloginclass, sys_getloginclass), // 523
7569 BSDX_(__NR_setloginclass, sys_setloginclass), // 524
7570 BSDXY(__NR_rctl_get_racct, sys_rctl_get_racct), // 525
7571 BSDXY(__NR_rctl_get_rules, sys_rctl_get_rules), // 526
7572 BSDXY(__NR_rctl_get_limits, sys_rctl_get_limits), // 527
7573 BSDXY(__NR_rctl_add_rule, sys_rctl_add_rule), // 528
7574 BSDXY(__NR_rctl_remove_rule, sys_rctl_remove_rule), // 529
7575 BSDX_(__NR_posix_fallocate, sys_posix_fallocate), // 530
7576 BSDX_(__NR_posix_fadvise, sys_posix_fadvise), // 531
7577 BSDXY(__NR_wait6, sys_wait6), // 532
7578 BSDX_(__NR_cap_rights_limit, sys_cap_rights_limit), // 533
7579 BSDX_(__NR_cap_ioctls_limit, sys_cap_ioctls_limit), // 534
7580 BSDXY(__NR_cap_ioctls_get, sys_cap_ioctls_get), // 535
7581 BSDX_(__NR_cap_fcntls_limit, sys_cap_fcntls_limit), // 536
7582 BSDXY(__NR_cap_fcntls_get, sys_cap_fcntls_get), // 537
7583 BSDX_(__NR_bindat, sys_bindat), // 538
7584 BSDX_(__NR_connectat, sys_connectat), // 539
7585 BSDX_(__NR_chflagsat, sys_chflagsat), // 540
7586 BSDXY(__NR_accept4, sys_accept4), // 541
7587 BSDXY(__NR_pipe2, sys_pipe2), // 542
7588 BSDX_(__NR_aio_mlock, sys_aio_mlock), // 543
7589 BSDXY(__NR_procctl, sys_procctl), // 544
7591 // 544 is the highest syscall on FreeBSD 9
7593 BSDXY(__NR_ppoll, sys_ppoll), // 545
7594 BSDX_(__NR_futimens, sys_futimens), // 546
7595 BSDX_(__NR_utimensat, sys_utimensat), // 547
7597 // 547 is the highest syscall on FreeBSD 10
7599 /* 548 is obsolete numa_getaffinity */
7600 /* 549 is obsolete numa_setaffinity */
7601 BSDX_(__NR_fdatasync, sys_fdatasync), // 550
7603 // __FreeBSD_version 1200031
7604 BSDXY(__NR_fstat, sys_fstat), // 551
7605 BSDXY(__NR_fstatat, sys_fstatat), // 552
7606 BSDXY(__NR_fhstat, sys_fhstat), // 553
7607 BSDXY(__NR_getdirentries, sys_getdirentries), // 554
7608 BSDXY(__NR_statfs, sys_statfs), // 555
7609 BSDXY(__NR_fstatfs, sys_fstatfs), // 556
7610 BSDXY(__NR_getfsstat, sys_getfsstat), // 557
7611 BSDXY(__NR_fhstatfs, sys_fhstatfs), // 558
7612 BSDX_(__NR_mknodat, sys_mknodat), // 559
7614 // __FreeBSD_version 1200033
7615 BSDXY(__NR_kevent, sys_kevent), // 560
7617 BSDXY(__NR_cpuset_getdomain, sys_cpuset_getdomain), // 561
7618 BSDX_(__NR_cpuset_setdomain, sys_cpuset_setdomain), // 562
7619 BSDXY(__NR_getrandom, sys_getrandom), // 563
7621 // __FreeBSD_version 1200031
7622 BSDXY(__NR_getfhat, sys_getfhat), // 564
7623 BSDX_(__NR_fhlink, sys_fhlink), // 565
7624 BSDX_(__NR_fhlinkat, sys_fhlinkat), // 566
7625 BSDXY(__NR_fhreadlink, sys_fhreadlink), // 567
7627 BSDX_(__NR_funlinkat, sys_funlinkat), // 568
7628 BSDX_(__NR_copy_file_range, sys_copy_file_range), // 569
7629 // __FreeBSD_version 1201522 and 1300045
7630 BSDXY(__NR___sysctlbyname, sys___sysctlbyname), // 570
7632 BSDXY(__NR_shm_open2, sys_shm_open2), // 571
7633 // unimpl __NR_shm_rename 572
7634 BSDX_(__NR_sigfastblock, sys_sigfastblock), // 573
7635 BSDXY( __NR___realpathat, sys___realpathat), // 574
7636 BSDXY(__NR_close_range, sys_close_range), // 575
7638 // unimpl __NR_rpctls_syscall 576
7639 BSDX_(__NR___specialfd, sys___specialfd), // 577
7640 BSDX_(__NR_aio_writev, sys_aio_writev), // 578
7641 BSDXY(__NR_aio_readv, sys_aio_readv), // 579
7643 BSDXY(__NR_fspacectl, sys_fspacectl), // 580
7644 // unimpl __NR_sched_getcpu 581
7645 BSDX_(__NR_swapoff, sys_swapoff), // 582
7647 BSDXY(__NR_kqueuex, sys_kqueuex), // 583
7648 BSDX_(__NR_membarrier, sys_membarrier), // 584
7649 BSDXY(__NR_timerfd_create, sys_timerfd_create), // 585
7650 BSDXY(__NR_timerfd_settime, sys_timerfd_settime), // 586
7651 BSDXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 587
7652 BSDX_(__NR_kcmp, sys_kcmp), // 588
7653 BSDXY(__NR_getrlimitusage, sys_getrlimitusage), // 589
7655 BSDX_(__NR_fake_sigreturn, sys_fake_sigreturn), // 1000, fake sigreturn
7659 const SyscallTableEntry* ML_(get_freebsd_syscall_entry) ( UInt sysno )
7661 const UInt syscall_table_size
7662 = sizeof(ML_(syscall_table)) / sizeof(ML_(syscall_table)[0]);
7664 /* Is it in the contiguous initial section of the table? */
7665 if (sysno < syscall_table_size) {
7666 const SyscallTableEntry* sys = &ML_(syscall_table)[sysno];
7667 if (sys->before == NULL) {
7668 return NULL; /* no entry */
7670 return sys;
7673 /* Can't find a wrapper */
7674 return NULL;
7677 /*--------------------------------------------------------------------*/
7678 /*--- end ---*/
7679 /*--------------------------------------------------------------------*/
7681 #endif // defined(VGO_freebsd)