summaryrefslogtreecommitdiff
path: root/coregrind/m_syswrap/priv_syswrap-linux.h
diff options
context:
space:
mode:
Diffstat (limited to 'coregrind/m_syswrap/priv_syswrap-linux.h')
-rw-r--r--coregrind/m_syswrap/priv_syswrap-linux.h276
1 files changed, 276 insertions, 0 deletions
diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h
new file mode 100644
index 0000000..e2396a3
--- /dev/null
+++ b/coregrind/m_syswrap/priv_syswrap-linux.h
@@ -0,0 +1,276 @@
+
+/*--------------------------------------------------------------------*/
+/*--- Linux-specific syscalls stuff. priv_syswrap-linux.h ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+ This file is part of Valgrind, a dynamic binary instrumentation
+ framework.
+
+ Copyright (C) 2000-2009 Nicholas Nethercote
+ njn@valgrind.org
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307, USA.
+
+ The GNU General Public License is contained in the file COPYING.
+*/
+
+#ifndef __PRIV_SYSWRAP_LINUX_H
+#define __PRIV_SYSWRAP_LINUX_H
+
+/* requires #include "priv_types_n_macros.h" */
+
+// Clone-related functions
+extern Word ML_(start_thread_NORETURN) ( void* arg );
+extern Addr ML_(allocstack) ( ThreadId tid );
+extern void ML_(call_on_new_stack_0_1) ( Addr stack, Addr retaddr,
+ void (*f)(Word), Word arg1 );
+extern SysRes ML_(do_fork_clone) ( ThreadId tid, UInt flags,
+ Int* parent_tidptr, Int* child_tidptr );
+
+
+// Linux-specific (but non-arch-specific) syscalls
+
+DECL_TEMPLATE(linux, sys_mount);
+DECL_TEMPLATE(linux, sys_oldumount);
+DECL_TEMPLATE(linux, sys_umount);
+
+// POSIX, but various sub-cases differ between Linux and Darwin.
+DECL_TEMPLATE(linux, sys_fcntl);
+DECL_TEMPLATE(linux, sys_fcntl64);
+DECL_TEMPLATE(linux, sys_ioctl);
+
+DECL_TEMPLATE(linux, sys_setfsuid16);
+DECL_TEMPLATE(linux, sys_setfsuid);
+DECL_TEMPLATE(linux, sys_setfsgid16);
+DECL_TEMPLATE(linux, sys_setfsgid);
+DECL_TEMPLATE(linux, sys_setresuid16); // man page says "non-standard";
+DECL_TEMPLATE(linux, sys_setresuid); // man page says "non-standard"
+DECL_TEMPLATE(linux, sys_getresuid16);
+DECL_TEMPLATE(linux, sys_getresuid);
+DECL_TEMPLATE(linux, sys_setresgid16); // man page says "non-standard"
+DECL_TEMPLATE(linux, sys_setresgid); // man page says "non-standard"
+DECL_TEMPLATE(linux, sys_getresgid16);
+DECL_TEMPLATE(linux, sys_getresgid);
+
+DECL_TEMPLATE(linux, sys_exit_group);
+DECL_TEMPLATE(linux, sys_llseek);
+DECL_TEMPLATE(linux, sys_adjtimex);
+DECL_TEMPLATE(linux, sys_ioperm);
+DECL_TEMPLATE(linux, sys_syslog);
+DECL_TEMPLATE(linux, sys_vhangup);
+DECL_TEMPLATE(linux, sys_sysinfo);
+DECL_TEMPLATE(linux, sys_personality);
+DECL_TEMPLATE(linux, sys_sysctl);
+DECL_TEMPLATE(linux, sys_prctl);
+DECL_TEMPLATE(linux, sys_sendfile);
+DECL_TEMPLATE(linux, sys_sendfile64);
+DECL_TEMPLATE(linux, sys_futex);
+DECL_TEMPLATE(linux, sys_set_robust_list);
+DECL_TEMPLATE(linux, sys_get_robust_list);
+DECL_TEMPLATE(linux, sys_pselect6);
+DECL_TEMPLATE(linux, sys_ppoll);
+
+DECL_TEMPLATE(linux, sys_epoll_create);
+DECL_TEMPLATE(linux, sys_epoll_ctl);
+DECL_TEMPLATE(linux, sys_epoll_wait);
+DECL_TEMPLATE(linux, sys_epoll_pwait);
+DECL_TEMPLATE(linux, sys_eventfd);
+DECL_TEMPLATE(linux, sys_eventfd2);
+
+DECL_TEMPLATE(linux, sys_gettid);
+DECL_TEMPLATE(linux, sys_set_tid_address);
+DECL_TEMPLATE(linux, sys_tkill);
+DECL_TEMPLATE(linux, sys_tgkill);
+
+DECL_TEMPLATE(linux, sys_fadvise64);
+DECL_TEMPLATE(linux, sys_fadvise64_64);
+
+DECL_TEMPLATE(linux, sys_io_setup);
+DECL_TEMPLATE(linux, sys_io_destroy);
+DECL_TEMPLATE(linux, sys_io_getevents);
+DECL_TEMPLATE(linux, sys_io_submit);
+DECL_TEMPLATE(linux, sys_io_cancel);
+
+DECL_TEMPLATE(linux, sys_ioprio_set);
+DECL_TEMPLATE(linux, sys_ioprio_get);
+
+DECL_TEMPLATE(linux, sys_mbind);
+DECL_TEMPLATE(linux, sys_set_mempolicy);
+DECL_TEMPLATE(linux, sys_get_mempolicy);
+
+DECL_TEMPLATE(linux, sys_inotify_init);
+DECL_TEMPLATE(linux, sys_inotify_add_watch);
+DECL_TEMPLATE(linux, sys_inotify_rm_watch);
+
+DECL_TEMPLATE(linux, sys_mq_open);
+DECL_TEMPLATE(linux, sys_mq_unlink);
+DECL_TEMPLATE(linux, sys_mq_timedsend);
+DECL_TEMPLATE(linux, sys_mq_timedreceive);
+DECL_TEMPLATE(linux, sys_mq_notify);
+DECL_TEMPLATE(linux, sys_mq_getsetattr);
+
+DECL_TEMPLATE(linux, sys_clock_settime);
+DECL_TEMPLATE(linux, sys_clock_gettime);
+DECL_TEMPLATE(linux, sys_clock_getres);
+DECL_TEMPLATE(linux, sys_clock_nanosleep);
+
+DECL_TEMPLATE(linux, sys_timer_create); // Linux: varies across archs?
+DECL_TEMPLATE(linux, sys_timer_settime);
+DECL_TEMPLATE(linux, sys_timer_gettime);
+DECL_TEMPLATE(linux, sys_timer_getoverrun);
+DECL_TEMPLATE(linux, sys_timer_delete);
+DECL_TEMPLATE(linux, sys_timerfd_create);
+DECL_TEMPLATE(linux, sys_timerfd_gettime);
+DECL_TEMPLATE(linux, sys_timerfd_settime);
+
+DECL_TEMPLATE(linux, sys_signalfd);
+DECL_TEMPLATE(linux, sys_signalfd4);
+
+DECL_TEMPLATE(linux, sys_capget);
+DECL_TEMPLATE(linux, sys_capset);
+
+DECL_TEMPLATE(linux, sys_openat);
+DECL_TEMPLATE(linux, sys_mkdirat);
+DECL_TEMPLATE(linux, sys_mknodat);
+DECL_TEMPLATE(linux, sys_fchownat);
+DECL_TEMPLATE(linux, sys_futimesat);
+DECL_TEMPLATE(linux, sys_newfstatat);
+DECL_TEMPLATE(linux, sys_unlinkat);
+DECL_TEMPLATE(linux, sys_renameat);
+DECL_TEMPLATE(linux, sys_linkat);
+DECL_TEMPLATE(linux, sys_symlinkat);
+DECL_TEMPLATE(linux, sys_readlinkat);
+DECL_TEMPLATE(linux, sys_fchmodat);
+DECL_TEMPLATE(linux, sys_faccessat);
+DECL_TEMPLATE(linux, sys_utimensat);
+
+DECL_TEMPLATE(linux, sys_add_key);
+DECL_TEMPLATE(linux, sys_request_key);
+DECL_TEMPLATE(linux, sys_keyctl);
+
+// These ones have 32-bit generic equivalents, but the 16-bit versions (they
+// use 16-bit gid_t and uid_t types) seem to be Linux-specific.
+DECL_TEMPLATE(linux, sys_getuid16);
+DECL_TEMPLATE(linux, sys_setuid16);
+DECL_TEMPLATE(linux, sys_getgid16);
+DECL_TEMPLATE(linux, sys_setgid16);
+DECL_TEMPLATE(linux, sys_geteuid16);
+DECL_TEMPLATE(linux, sys_getegid16);
+DECL_TEMPLATE(linux, sys_setreuid16);
+DECL_TEMPLATE(linux, sys_setregid16);
+DECL_TEMPLATE(linux, sys_getgroups16);
+DECL_TEMPLATE(linux, sys_setgroups16);
+
+// Again, these 16-bit versions are Linux-specific, the 32-bit versions are
+// generic.
+DECL_TEMPLATE(linux, sys_chown16);
+DECL_TEMPLATE(linux, sys_fchown16);
+//DECL_TEMPLATE(linux, sys_lchown16); // not yet encountered
+
+// Are these POSIX? In Darwin they have an extra parameter 'position',
+// so put them here.
+DECL_TEMPLATE(linux, sys_setxattr);
+DECL_TEMPLATE(linux, sys_lsetxattr);
+DECL_TEMPLATE(linux, sys_fsetxattr);
+DECL_TEMPLATE(linux, sys_getxattr);
+DECL_TEMPLATE(linux, sys_lgetxattr);
+DECL_TEMPLATE(linux, sys_fgetxattr);
+DECL_TEMPLATE(linux, sys_listxattr);
+DECL_TEMPLATE(linux, sys_llistxattr);
+DECL_TEMPLATE(linux, sys_flistxattr);
+DECL_TEMPLATE(linux, sys_removexattr);
+DECL_TEMPLATE(linux, sys_lremovexattr);
+DECL_TEMPLATE(linux, sys_fremovexattr);
+
+// These are Posix, but not necessarily syscalls. Darwin only supports
+// sched_get_priority_{min,max} and sched_yield, but as libc functions, not
+// syscalls.
+DECL_TEMPLATE(linux, sys_sched_setparam);
+DECL_TEMPLATE(linux, sys_sched_getparam);
+DECL_TEMPLATE(linux, sys_sched_setscheduler);
+DECL_TEMPLATE(linux, sys_sched_getscheduler);
+DECL_TEMPLATE(linux, sys_sched_yield);
+DECL_TEMPLATE(linux, sys_sched_get_priority_max);
+DECL_TEMPLATE(linux, sys_sched_get_priority_min);
+//DECL_TEMPLATE(linux, sys_sched_rr_get_interval); // not yet encountered
+DECL_TEMPLATE(linux, sys_sched_setaffinity);
+DECL_TEMPLATE(linux, sys_sched_getaffinity);
+
+// These ones have different parameters and/or return values on Darwin.
+// Also, some archs on Linux do not match the generic wrapper for sys_pipe.
+DECL_TEMPLATE(linux, sys_munlockall);
+DECL_TEMPLATE(linux, sys_pipe);
+DECL_TEMPLATE(linux, sys_pipe2);
+DECL_TEMPLATE(linux, sys_quotactl);
+DECL_TEMPLATE(linux, sys_waitid);
+
+// Posix, but in Darwin utime is a libc function that calls syscall utimes.
+DECL_TEMPLATE(linux, sys_utime);
+
+// On Darwin, off_t is 64-bits even on 32-bit platforms.
+DECL_TEMPLATE(linux, sys_lseek);
+
+// Darwin (and probably other OSes) don't have the old_sigset_t type.
+DECL_TEMPLATE(linux, sys_sigpending);
+DECL_TEMPLATE(linux, sys_sigprocmask);
+
+// I think these are Linux-specific?
+DECL_TEMPLATE(linux, sys_rt_sigaction);
+DECL_TEMPLATE(linux, sys_rt_sigprocmask);
+DECL_TEMPLATE(linux, sys_rt_sigpending);
+DECL_TEMPLATE(linux, sys_rt_sigtimedwait);
+DECL_TEMPLATE(linux, sys_rt_sigqueueinfo);
+DECL_TEMPLATE(linux, sys_rt_sigsuspend);
+
+// Linux-specific?
+DECL_TEMPLATE(linux, sys_sync_file_range);
+DECL_TEMPLATE(linux, sys_stime); /* maybe generic? I'm not sure */
+
+// Linux specific (kernel modules)
+DECL_TEMPLATE(linux, sys_init_module);
+DECL_TEMPLATE(linux, sys_delete_module);
+
+// Linux-specific (oprofile-related)
+DECL_TEMPLATE(linux, sys_lookup_dcookie); // (*/32/64) L
+
+/* ---------------------------------------------------------------------
+ Wrappers for sockets and ipc-ery. These are split into standalone
+ procedures because x86-linux hides them inside multiplexors
+ (sys_socketcall and sys_ipc).
+ ------------------------------------------------------------------ */
+
+#define TId ThreadId
+#define UW UWord
+#define SR SysRes
+
+extern void ML_(linux_PRE_sys_msgsnd) ( TId, UW, UW, UW, UW );
+extern void ML_(linux_PRE_sys_msgrcv) ( TId, UW, UW, UW, UW, UW );
+extern void ML_(linux_POST_sys_msgrcv) ( TId, UW, UW, UW, UW, UW, UW );
+extern void ML_(linux_PRE_sys_msgctl) ( TId, UW, UW, UW );
+extern void ML_(linux_POST_sys_msgctl) ( TId, UW, UW, UW, UW );
+extern void ML_(linux_PRE_sys_getsockopt) ( TId, UW, UW, UW, UW, UW );
+extern void ML_(linux_POST_sys_getsockopt) ( TId, SR, UW, UW, UW, UW, UW );
+
+#undef TId
+#undef UW
+#undef SR
+
+#endif // __PRIV_SYSWRAP_LINUX_H
+
+/*--------------------------------------------------------------------*/
+/*--- end ---*/
+/*--------------------------------------------------------------------*/