2 /*--------------------------------------------------------------------*/
3 /*--- Private syscalls header. priv_syswrap-generic.h ---*/
4 /*--------------------------------------------------------------------*/
7 This file is part of Valgrind, a dynamic binary instrumentation
10 Copyright (C) 2000-2017 Julian Seward
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, see <http://www.gnu.org/licenses/>.
26 The GNU General Public License is contained in the file COPYING.
29 #ifndef __PRIV_SYSWRAP_GENERIC_H
30 #define __PRIV_SYSWRAP_GENERIC_H
32 #include "pub_core_basics.h" // ThreadId
33 #include "pub_core_vki.h" // vki_msghdr
34 #include "priv_types_n_macros.h" // DECL_TEMPLATE
37 /* Guess the client stack from the segment in which sp is mapped.
38 Register the guessed stack using VG_(register_stack).
39 Setup tst client_stack_highest_byte and client_stack_szB.
40 If sp is not in a mapped segment, does nothing. */
41 extern void ML_(guess_and_register_stack
) (Addr sp
, ThreadState
* tst
);
43 // Return true if address range entirely contained within client
46 Bool
ML_(valid_client_addr
)(Addr start
, SizeT size
, ThreadId tid
,
47 const HChar
*syscallname
);
49 /* Handy small function to help stop wrappers from segfaulting when
50 presented with bogus client addresses. Is not used for generating
51 user-visible errors. */
52 extern Bool
ML_(safe_to_deref
) ( const void *start
, SizeT size
);
54 // Returns True if the signal is OK for the client to use.
55 extern Bool
ML_(client_signal_OK
)(Int sigNo
);
57 // Return true if we're allowed to use or create this fd.
59 Bool
ML_(fd_allowed
)(Int fd
, const HChar
*syscallname
, ThreadId tid
,
62 extern void ML_(record_fd_close
) (ThreadId tid
, Int fd
);
63 extern Int
ML_(get_fd_count
) (void);
64 extern void ML_(record_fd_close_range
) (ThreadId tid
, Int fd
);
65 extern void ML_(record_fd_open_named
) (ThreadId tid
, Int fd
);
66 extern void ML_(record_fd_open_nameless
) (ThreadId tid
, Int fd
);
67 extern void ML_(record_fd_open_with_given_name
)(ThreadId tid
, Int fd
,
68 const HChar
*pathname
);
70 // Return true if a given file descriptor is already recorded.
71 extern Bool
ML_(fd_recorded
)(Int fd
);
72 // Returns a pathname representing a recorded fd.
73 // Returned string must not be modified nor free'd.
74 extern const HChar
*ML_(find_fd_recorded_by_fd
)(Int fd
);
76 // Used when killing threads -- we must not kill a thread if it's the thread
77 // that would do Valgrind's final cleanup and output.
79 Bool
ML_(do_sigkill
)(Int pid
, Int tgid
);
81 /* When a client mmap or munmap has been successfully done, both the core
82 and the tool need to be notified of the new mapping. Hence this fn. */
84 ML_(notify_core_and_tool_of_mmap
) ( Addr a
, SizeT len
, UInt prot
,
85 UInt mm_flags
, Int fd
, Off64T offset
);
87 ML_(notify_core_and_tool_of_munmap
) ( Addr a
, SizeT len
);
89 ML_(notify_core_and_tool_of_mprotect
) ( Addr a
, SizeT len
, Int prot
);
92 ML_(pre_mem_read_sockaddr
) ( ThreadId tid
, const HChar
*description
,
93 struct vki_sockaddr
*sa
, UInt salen
);
95 ML_(buf_and_len_pre_check
) ( ThreadId tid
, Addr buf_p
, Addr buflen_p
,
96 const HChar
* buf_s
, const HChar
* buflen_s
);
98 ML_(buf_and_len_post_check
) ( ThreadId tid
, SysRes res
,
99 Addr buf_p
, Addr buflen_p
, const HChar
* s
);
101 /* PRE and POST for unknown ioctls based on ioctl request encoding */
103 void ML_(PRE_unknown_ioctl
)(ThreadId tid
, UWord request
, UWord arg
);
105 void ML_(POST_unknown_ioctl
)(ThreadId tid
, UInt res
, UWord request
, UWord arg
);
108 void ML_(pre_argv_envp
)(Addr a
, ThreadId tid
, const HChar
*s1
, const HChar
*s2
);
111 ML_(handle_auxv_open
)(SyscallStatus
*status
, const HChar
*filename
,
115 ML_(handle_self_exe_open
)(SyscallStatus
*status
, const HChar
*filename
,
118 /* Helper function for generic mprotect and linux pkey_mprotect. */
119 extern void handle_sys_mprotect (ThreadId tid
, SyscallStatus
*status
,
120 Addr
*addr
, SizeT
*len
, Int
*prot
);
121 /* Helper functions for preadv/preadv2. */
123 void handle_pre_sys_preadv(ThreadId tid
, SyscallStatus
* status
,
124 Int fd
, Addr vector
, Int count
,
127 void handle_post_sys_preadv(ThreadId tid
, SyscallStatus
* status
, Addr vector
, Int count
);
129 /* Helper function for pwritev/pwritev2. */
131 void handle_sys_pwritev(ThreadId tid
, SyscallStatus
* status
,
132 Int fd
, Addr vector
, Int count
,
142 void handle_pre_sys_execve(ThreadId tid
, SyscallStatus
*status
, Addr pathname
,
143 Addr arg_2
, Addr arg_3
, ExecveType execveType
,
146 DECL_TEMPLATE(generic
, sys_ni_syscall
); // * P -- unimplemented
147 DECL_TEMPLATE(generic
, sys_exit
);
148 DECL_TEMPLATE(generic
, sys_fork
);
149 DECL_TEMPLATE(generic
, sys_read
);
150 DECL_TEMPLATE(generic
, sys_write
);
151 DECL_TEMPLATE(generic
, sys_open
);
152 DECL_TEMPLATE(generic
, sys_close
);
153 DECL_TEMPLATE(generic
, sys_waitpid
);
154 DECL_TEMPLATE(generic
, sys_creat
);
155 DECL_TEMPLATE(generic
, sys_link
);
156 DECL_TEMPLATE(generic
, sys_unlink
);
157 DECL_TEMPLATE(generic
, sys_execve
); // (*??) P
158 DECL_TEMPLATE(generic
, sys_chdir
);
159 DECL_TEMPLATE(generic
, sys_time
);
160 DECL_TEMPLATE(generic
, sys_mknod
);
161 DECL_TEMPLATE(generic
, sys_chmod
);
162 DECL_TEMPLATE(generic
, sys_getpid
);
163 DECL_TEMPLATE(generic
, sys_alarm
);
164 DECL_TEMPLATE(generic
, sys_pause
);
165 DECL_TEMPLATE(generic
, sys_access
);
166 DECL_TEMPLATE(generic
, sys_kill
);
167 DECL_TEMPLATE(generic
, sys_rename
);
168 DECL_TEMPLATE(generic
, sys_mkdir
);
169 DECL_TEMPLATE(generic
, sys_rmdir
);
170 DECL_TEMPLATE(generic
, sys_dup
);
171 DECL_TEMPLATE(generic
, sys_times
);
172 DECL_TEMPLATE(generic
, sys_setpgid
);
173 DECL_TEMPLATE(generic
, sys_umask
);
174 DECL_TEMPLATE(generic
, sys_dup2
);
175 DECL_TEMPLATE(generic
, sys_getppid
);
176 DECL_TEMPLATE(generic
, sys_getpgrp
);
177 DECL_TEMPLATE(generic
, sys_setsid
);
178 DECL_TEMPLATE(generic
, sys_munmap
);
179 DECL_TEMPLATE(generic
, sys_truncate
);
180 DECL_TEMPLATE(generic
, sys_ftruncate
);
181 DECL_TEMPLATE(generic
, sys_fchmod
);
182 DECL_TEMPLATE(generic
, sys_msync
);
183 DECL_TEMPLATE(generic
, sys_readv
);
184 DECL_TEMPLATE(generic
, sys_writev
);
185 DECL_TEMPLATE(generic
, sys_getsid
);
186 DECL_TEMPLATE(generic
, sys_fdatasync
);
187 DECL_TEMPLATE(generic
, sys_mlock
);
188 DECL_TEMPLATE(generic
, sys_munlock
);
189 DECL_TEMPLATE(generic
, sys_mlockall
);
190 DECL_TEMPLATE(generic
, sys_nanosleep
);
191 DECL_TEMPLATE(generic
, sys_mremap
); // POSIX, but Linux arg order may be odd
192 DECL_TEMPLATE(generic
, sys_getuid
);
193 DECL_TEMPLATE(generic
, sys_getgid
);
194 DECL_TEMPLATE(generic
, sys_geteuid
);
195 DECL_TEMPLATE(generic
, sys_getegid
);
196 DECL_TEMPLATE(generic
, sys_getpgid
);
197 DECL_TEMPLATE(generic
, sys_fsync
);
198 DECL_TEMPLATE(generic
, sys_wait4
);
199 DECL_TEMPLATE(generic
, sys_mprotect
);
200 DECL_TEMPLATE(generic
, sys_getcwd
);
201 DECL_TEMPLATE(generic
, sys_symlink
);
202 DECL_TEMPLATE(generic
, sys_getgroups
);
203 DECL_TEMPLATE(generic
, sys_setgroups
); // SVr4, SVID, X/OPEN, 4.3BSD
204 DECL_TEMPLATE(generic
, sys_chown
);
205 DECL_TEMPLATE(generic
, sys_setuid
);
206 DECL_TEMPLATE(generic
, sys_gettimeofday
);
207 DECL_TEMPLATE(generic
, sys_madvise
);
208 DECL_TEMPLATE(generic
, sys_sethostname
);
210 // These ones aren't POSIX, but are in some standard and look reasonably
211 // generic, and are the same for all architectures under Linux.
212 DECL_TEMPLATE(generic
, sys_nice
); // SVr4, SVID EXT, AT&T, X/OPEN, BSD 4.3
213 DECL_TEMPLATE(generic
, sys_sync
); // SVr4, SVID, X/OPEN, BSD 4.3
214 DECL_TEMPLATE(generic
, sys_brk
); // 4.3BSD
215 DECL_TEMPLATE(generic
, sys_acct
); // SVR4, non-POSIX
216 DECL_TEMPLATE(generic
, sys_chroot
); // SVr4, SVID, 4.4BSD, X/OPEN
217 DECL_TEMPLATE(generic
, sys_readlink
); // X/OPEN, 4.4BSD
218 DECL_TEMPLATE(generic
, sys_fchdir
); // SVr4, SVID, POSIX, X/OPEN, 4.4BSD
219 DECL_TEMPLATE(generic
, sys_getdents
); // SVr4,SVID
220 DECL_TEMPLATE(generic
, sys_select
); // 4.4BSD
221 DECL_TEMPLATE(generic
, sys_flock
); // 4.4BSD
222 DECL_TEMPLATE(generic
, sys_poll
); // XPG4-UNIX
223 DECL_TEMPLATE(generic
, sys_getrusage
); // SVr4, 4.3BSD
224 DECL_TEMPLATE(generic
, sys_stime
); // SVr4, SVID, X/OPEN
225 DECL_TEMPLATE(generic
, sys_settimeofday
); // SVr4, 4.3BSD (non-POSIX)
226 DECL_TEMPLATE(generic
, sys_getpriority
); // SVr4, 4.4BSD
227 DECL_TEMPLATE(generic
, sys_setpriority
); // SVr4, 4.4BSD
228 DECL_TEMPLATE(generic
, sys_setitimer
); // SVr4, 4.4BSD
229 DECL_TEMPLATE(generic
, sys_getitimer
); // SVr4, 4.4BSD
230 DECL_TEMPLATE(generic
, sys_setreuid
); // 4.3BSD
231 DECL_TEMPLATE(generic
, sys_setregid
); // 4.3BSD
232 DECL_TEMPLATE(generic
, sys_fchown
); // SVr4,4.3BSD
233 DECL_TEMPLATE(generic
, sys_setgid
); // SVr4,SVID
234 DECL_TEMPLATE(generic
, sys_utimes
); // 4.3BSD
236 // May not be generic for every architecture under Linux.
237 DECL_TEMPLATE(generic
, sys_sigaction
); // (x86) P
239 // Funny names, not sure...
240 DECL_TEMPLATE(generic
, sys_newstat
); // * P
241 DECL_TEMPLATE(generic
, sys_newlstat
); // *
242 DECL_TEMPLATE(generic
, sys_newfstat
); // * P (SVr4,BSD4.3)
244 // For the remainder, not really sure yet
245 DECL_TEMPLATE(generic
, sys_ptrace
); // (x86?) (almost-P)
246 DECL_TEMPLATE(generic
, sys_setrlimit
); // SVr4, 4.3BSD
247 DECL_TEMPLATE(generic
, sys_old_getrlimit
); // SVr4, 4.3BSD L?
248 DECL_TEMPLATE(generic
, sys_statfs
); // * L?
249 DECL_TEMPLATE(generic
, sys_fstatfs
); // * L?
250 DECL_TEMPLATE(generic
, sys_iopl
); // (x86/amd64) L
251 DECL_TEMPLATE(generic
, sys_newuname
); // * P
252 DECL_TEMPLATE(generic
, sys_pread64
); // * (Unix98?)
253 DECL_TEMPLATE(generic
, sys_pwrite64
); // * (Unix98?)
254 DECL_TEMPLATE(generic
, sys_sigaltstack
); // (x86) (XPG4-UNIX)
255 DECL_TEMPLATE(generic
, sys_getpmsg
); // (?) (?)
256 DECL_TEMPLATE(generic
, sys_putpmsg
); // (?) (?)
257 DECL_TEMPLATE(generic
, sys_getrlimit
); // * (?)
258 DECL_TEMPLATE(generic
, sys_truncate64
); // %% (P?)
259 DECL_TEMPLATE(generic
, sys_ftruncate64
); // %% (P?)
260 DECL_TEMPLATE(generic
, sys_lchown
); // * (L?)
261 DECL_TEMPLATE(generic
, sys_mincore
); // * L?
262 DECL_TEMPLATE(generic
, sys_getdents64
); // * (SVr4,SVID?)
263 DECL_TEMPLATE(generic
, sys_statfs64
); // * (?)
264 DECL_TEMPLATE(generic
, sys_fstatfs64
); // * (?)
265 DECL_TEMPLATE(generic
, sys_mlock2
); // * L
268 /* ---------------------------------------------------------------------
269 Wrappers for sockets and ipc-ery. These are split into standalone
270 procedures because some platforms hides them inside multiplexors
271 (sys_socketcall and sys_ipc).
272 ------------------------------------------------------------------ */
278 extern void ML_(generic_PRE_sys_socketpair
) ( TId
, UW
, UW
, UW
, UW
);
279 extern SysRes
ML_(generic_POST_sys_socketpair
) ( TId
, SR
, UW
, UW
, UW
, UW
);
280 extern SysRes
ML_(generic_POST_sys_socket
) ( TId
, SR
);
281 extern void ML_(generic_PRE_sys_bind
) ( TId
, UW
, UW
, UW
);
282 extern void ML_(generic_PRE_sys_accept
) ( TId
, UW
, UW
, UW
);
283 extern SysRes
ML_(generic_POST_sys_accept
) ( TId
, SR
, UW
, UW
, UW
);
284 extern void ML_(generic_PRE_sys_sendto
) ( TId
, UW
, UW
, UW
, UW
, UW
, UW
);
285 extern void ML_(generic_PRE_sys_send
) ( TId
, UW
, UW
, UW
);
286 extern void ML_(generic_PRE_sys_recvfrom
) ( TId
, UW
, UW
, UW
, UW
, UW
, UW
);
287 extern void ML_(generic_POST_sys_recvfrom
) ( TId
, SR
, UW
, UW
, UW
, UW
, UW
, UW
);
288 extern void ML_(generic_PRE_sys_recv
) ( TId
, UW
, UW
, UW
);
289 extern void ML_(generic_POST_sys_recv
) ( TId
, UW
, UW
, UW
, UW
);
290 extern void ML_(generic_PRE_sys_connect
) ( TId
, UW
, UW
, UW
);
291 extern void ML_(generic_PRE_sys_setsockopt
) ( TId
, UW
, UW
, UW
, UW
, UW
);
292 extern void ML_(generic_PRE_sys_getsockname
) ( TId
, UW
, UW
, UW
);
293 extern void ML_(generic_POST_sys_getsockname
) ( TId
, SR
, UW
, UW
, UW
);
294 extern void ML_(generic_PRE_sys_getpeername
) ( TId
, UW
, UW
, UW
);
295 extern void ML_(generic_POST_sys_getpeername
) ( TId
, SR
, UW
, UW
, UW
);
296 extern void ML_(generic_PRE_sys_sendmsg
) ( TId
, const HChar
*,
297 struct vki_msghdr
* );
298 extern void ML_(generic_PRE_sys_recvmsg
) ( TId
, const HChar
*,
299 struct vki_msghdr
* );
300 extern void ML_(generic_POST_sys_recvmsg
) ( TId
, const HChar
*,
301 struct vki_msghdr
*, UInt
);
303 extern void ML_(generic_PRE_sys_semop
) ( TId
, UW
, UW
, UW
);
304 extern void ML_(generic_PRE_sys_semtimedop
) ( TId
, UW
, UW
, UW
, UW
);
305 extern void ML_(generic_PRE_sys_semctl
) ( TId
, UW
, UW
, UW
, UW
);
306 extern void ML_(generic_POST_sys_semctl
) ( TId
, UW
, UW
, UW
, UW
, UW
);
307 extern UWord
ML_(generic_PRE_sys_shmat
) ( TId
, UW
, UW
, UW
);
308 extern void ML_(generic_POST_sys_shmat
) ( TId
, UW
, UW
, UW
, UW
);
309 extern Bool
ML_(generic_PRE_sys_shmdt
) ( TId
, UW
);
310 extern void ML_(generic_POST_sys_shmdt
) ( TId
, UW
, UW
);
311 extern void ML_(generic_PRE_sys_shmctl
) ( TId
, UW
, UW
, UW
);
312 extern void ML_(generic_POST_sys_shmctl
) ( TId
, UW
, UW
, UW
, UW
);
314 extern SysRes
ML_(generic_PRE_sys_mmap
) ( TId
, UW
, UW
, UW
, UW
, UW
, Off64T
);
316 #define PRE_timeval_READ(zzname, zzarg) \
318 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \
319 PRE_FIELD_READ(zzname, zztv->tv_sec); \
320 PRE_FIELD_READ(zzname, zztv->tv_usec); \
322 #define PRE_timeval_WRITE(zzname, zzarg) \
324 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \
325 PRE_FIELD_WRITE(zzname, zztv->tv_sec); \
326 PRE_FIELD_WRITE(zzname, zztv->tv_usec); \
328 #define POST_timeval_WRITE(zzarg) \
330 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \
331 POST_FIELD_WRITE(zztv->tv_sec); \
332 POST_FIELD_WRITE(zztv->tv_usec); \
341 /////////////////////////////////////////////////////////////////
344 #endif // __PRIV_SYSWRAP_GENERIC_H
346 /*--------------------------------------------------------------------*/
348 /*--------------------------------------------------------------------*/