blob: 66c8c403053d5918207b1ca4254da3f5b7685248 [file] [log] [blame]
sewardja8d8e232005-06-07 20:04:56 +00001
2/*--------------------------------------------------------------------*/
njnc1b01812005-06-17 22:19:06 +00003/*--- Private syscalls header. priv_syswrap-generic.h ---*/
sewardja8d8e232005-06-07 20:04:56 +00004/*--------------------------------------------------------------------*/
5
6/*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
Elliott Hughesed398002017-06-21 14:41:24 -070010 Copyright (C) 2000-2017 Julian Seward
sewardja8d8e232005-06-07 20:04:56 +000011 jseward@acm.org
12
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.
17
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.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 02111-1307, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29*/
30
njnc1b01812005-06-17 22:19:06 +000031#ifndef __PRIV_SYSWRAP_GENERIC_H
32#define __PRIV_SYSWRAP_GENERIC_H
sewardja8d8e232005-06-07 20:04:56 +000033
florian535fb1b2013-09-15 13:54:34 +000034#include "pub_core_basics.h" // ThreadId
35#include "pub_core_vki.h" // vki_msghdr
36#include "priv_types_n_macros.h" // DECL_TEMPLATE
sewardja8d8e232005-06-07 20:04:56 +000037
38
philippe38a74d22014-08-29 22:53:19 +000039/* Guess the client stack from the segment in which sp is mapped.
40 Register the guessed stack using VG_(register_stack).
41 Setup tst client_stack_highest_byte and client_stack_szB.
42 If sp is not in a mapped segment, does nothing. */
43extern void ML_(guess_and_register_stack) (Addr sp, ThreadState* tst);
44
sewardja8d8e232005-06-07 20:04:56 +000045// Return true if address range entirely contained within client
46// address space.
47extern
sewardj7eb7c582005-06-23 01:02:53 +000048Bool ML_(valid_client_addr)(Addr start, SizeT size, ThreadId tid,
floriane543f302012-10-21 19:43:43 +000049 const HChar *syscallname);
sewardja8d8e232005-06-07 20:04:56 +000050
sewardj45f4e7c2005-09-27 19:20:21 +000051/* Handy small function to help stop wrappers from segfaulting when
52 presented with bogus client addresses. Is not used for generating
53 user-visible errors. */
sewardj8eb8bab2015-07-21 14:44:28 +000054extern Bool ML_(safe_to_deref) ( const void *start, SizeT size );
sewardj45f4e7c2005-09-27 19:20:21 +000055
njn419bbcb2005-06-21 03:52:49 +000056// Returns True if the signal is OK for the client to use.
sewardj7eb7c582005-06-23 01:02:53 +000057extern Bool ML_(client_signal_OK)(Int sigNo);
njn419bbcb2005-06-21 03:52:49 +000058
sewardja8d8e232005-06-07 20:04:56 +000059// Return true if we're allowed to use or create this fd.
60extern
floriane543f302012-10-21 19:43:43 +000061Bool ML_(fd_allowed)(Int fd, const HChar *syscallname, ThreadId tid,
62 Bool isNewFD);
sewardja8d8e232005-06-07 20:04:56 +000063
sewardj8eb8bab2015-07-21 14:44:28 +000064extern void ML_(record_fd_close) (Int fd);
njn096ccdd2009-02-22 23:00:30 +000065extern void ML_(record_fd_open_named) (ThreadId tid, Int fd);
njn4279a882005-08-26 03:43:28 +000066extern void ML_(record_fd_open_nameless) (ThreadId tid, Int fd);
67extern void ML_(record_fd_open_with_given_name)(ThreadId tid, Int fd,
florian3130eab2014-11-14 19:25:08 +000068 const HChar *pathname);
sewardja8d8e232005-06-07 20:04:56 +000069
sewardj8eb8bab2015-07-21 14:44:28 +000070// Return true if a given file descriptor is already recorded.
71extern Bool ML_(fd_recorded)(Int fd);
72// Returns a pathname representing a recorded fd.
73// Returned string must not be modified nor free'd.
74extern const HChar *ML_(find_fd_recorded_by_fd)(Int fd);
75
sewardja8d8e232005-06-07 20:04:56 +000076// 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.
78extern
sewardj7eb7c582005-06-23 01:02:53 +000079Bool ML_(do_sigkill)(Int pid, Int tgid);
sewardja8d8e232005-06-07 20:04:56 +000080
njndd372582009-05-10 22:42:19 +000081/* 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. */
83extern void
84ML_(notify_core_and_tool_of_mmap) ( Addr a, SizeT len, UInt prot,
85 UInt mm_flags, Int fd, Off64T offset );
86extern void
87ML_(notify_core_and_tool_of_munmap) ( Addr a, SizeT len );
88extern void
89ML_(notify_core_and_tool_of_mprotect) ( Addr a, SizeT len, Int prot );
sewardja8d8e232005-06-07 20:04:56 +000090
njnf37a81b2009-02-17 00:23:30 +000091extern void
92ML_(buf_and_len_pre_check) ( ThreadId tid, Addr buf_p, Addr buflen_p,
floriane543f302012-10-21 19:43:43 +000093 const HChar* buf_s, const HChar* buflen_s );
njnf37a81b2009-02-17 00:23:30 +000094extern void
95ML_(buf_and_len_post_check) ( ThreadId tid, SysRes res,
floriane543f302012-10-21 19:43:43 +000096 Addr buf_p, Addr buflen_p, const HChar* s );
njnf37a81b2009-02-17 00:23:30 +000097
njn1be9cf62009-05-22 00:15:06 +000098/* PRE and POST for unknown ioctls based on ioctl request encoding */
99extern
100void ML_(PRE_unknown_ioctl)(ThreadId tid, UWord request, UWord arg);
101extern
102void ML_(POST_unknown_ioctl)(ThreadId tid, UInt res, UWord request, UWord arg);
103
sewardj8eb8bab2015-07-21 14:44:28 +0000104extern
105void ML_(pre_argv_envp)(Addr a, ThreadId tid, const HChar *s1, const HChar *s2);
106
107extern Bool
108ML_(handle_auxv_open)(SyscallStatus *status, const HChar *filename,
109 int flags);
sewardja8d8e232005-06-07 20:04:56 +0000110
sewardjbc22cf72005-06-08 00:02:49 +0000111DECL_TEMPLATE(generic, sys_ni_syscall); // * P -- unimplemented
112DECL_TEMPLATE(generic, sys_exit);
113DECL_TEMPLATE(generic, sys_fork);
114DECL_TEMPLATE(generic, sys_read);
115DECL_TEMPLATE(generic, sys_write);
116DECL_TEMPLATE(generic, sys_open);
117DECL_TEMPLATE(generic, sys_close);
118DECL_TEMPLATE(generic, sys_waitpid);
119DECL_TEMPLATE(generic, sys_creat);
120DECL_TEMPLATE(generic, sys_link);
121DECL_TEMPLATE(generic, sys_unlink);
122DECL_TEMPLATE(generic, sys_execve); // (*??) P
123DECL_TEMPLATE(generic, sys_chdir);
124DECL_TEMPLATE(generic, sys_time);
125DECL_TEMPLATE(generic, sys_mknod);
126DECL_TEMPLATE(generic, sys_chmod);
sewardjbc22cf72005-06-08 00:02:49 +0000127DECL_TEMPLATE(generic, sys_getpid);
128DECL_TEMPLATE(generic, sys_alarm);
129DECL_TEMPLATE(generic, sys_pause);
sewardjbc22cf72005-06-08 00:02:49 +0000130DECL_TEMPLATE(generic, sys_access);
131DECL_TEMPLATE(generic, sys_kill);
132DECL_TEMPLATE(generic, sys_rename);
133DECL_TEMPLATE(generic, sys_mkdir);
134DECL_TEMPLATE(generic, sys_rmdir);
135DECL_TEMPLATE(generic, sys_dup);
136DECL_TEMPLATE(generic, sys_times);
sewardjbc22cf72005-06-08 00:02:49 +0000137DECL_TEMPLATE(generic, sys_setpgid);
138DECL_TEMPLATE(generic, sys_umask);
139DECL_TEMPLATE(generic, sys_dup2);
140DECL_TEMPLATE(generic, sys_getppid);
141DECL_TEMPLATE(generic, sys_getpgrp);
142DECL_TEMPLATE(generic, sys_setsid);
143DECL_TEMPLATE(generic, sys_munmap);
144DECL_TEMPLATE(generic, sys_truncate);
145DECL_TEMPLATE(generic, sys_ftruncate);
146DECL_TEMPLATE(generic, sys_fchmod);
147DECL_TEMPLATE(generic, sys_msync);
148DECL_TEMPLATE(generic, sys_readv);
149DECL_TEMPLATE(generic, sys_writev);
150DECL_TEMPLATE(generic, sys_getsid);
151DECL_TEMPLATE(generic, sys_fdatasync);
152DECL_TEMPLATE(generic, sys_mlock);
153DECL_TEMPLATE(generic, sys_munlock);
154DECL_TEMPLATE(generic, sys_mlockall);
sewardjbc22cf72005-06-08 00:02:49 +0000155DECL_TEMPLATE(generic, sys_nanosleep);
156DECL_TEMPLATE(generic, sys_mremap); // POSIX, but Linux arg order may be odd
157DECL_TEMPLATE(generic, sys_getuid);
158DECL_TEMPLATE(generic, sys_getgid);
159DECL_TEMPLATE(generic, sys_geteuid);
160DECL_TEMPLATE(generic, sys_getegid);
161DECL_TEMPLATE(generic, sys_getpgid);
162DECL_TEMPLATE(generic, sys_fsync);
163DECL_TEMPLATE(generic, sys_wait4);
164DECL_TEMPLATE(generic, sys_mprotect);
sewardjbc22cf72005-06-08 00:02:49 +0000165DECL_TEMPLATE(generic, sys_getcwd);
166DECL_TEMPLATE(generic, sys_symlink);
167DECL_TEMPLATE(generic, sys_getgroups);
168DECL_TEMPLATE(generic, sys_setgroups); // SVr4, SVID, X/OPEN, 4.3BSD
169DECL_TEMPLATE(generic, sys_chown);
170DECL_TEMPLATE(generic, sys_setuid);
171DECL_TEMPLATE(generic, sys_gettimeofday);
172DECL_TEMPLATE(generic, sys_madvise);
tomf93bbd92013-07-17 12:43:30 +0000173DECL_TEMPLATE(generic, sys_sethostname);
sewardja8d8e232005-06-07 20:04:56 +0000174
175// These ones aren't POSIX, but are in some standard and look reasonably
sewardjbc22cf72005-06-08 00:02:49 +0000176// generic, and are the same for all architectures under Linux.
177DECL_TEMPLATE(generic, sys_nice); // SVr4, SVID EXT, AT&T, X/OPEN, BSD 4.3
178DECL_TEMPLATE(generic, sys_sync); // SVr4, SVID, X/OPEN, BSD 4.3
179DECL_TEMPLATE(generic, sys_brk); // 4.3BSD
180DECL_TEMPLATE(generic, sys_acct); // SVR4, non-POSIX
181DECL_TEMPLATE(generic, sys_chroot); // SVr4, SVID, 4.4BSD, X/OPEN
182DECL_TEMPLATE(generic, sys_readlink); // X/OPEN, 4.4BSD
183DECL_TEMPLATE(generic, sys_fchdir); // SVr4, SVID, POSIX, X/OPEN, 4.4BSD
184DECL_TEMPLATE(generic, sys_getdents); // SVr4,SVID
185DECL_TEMPLATE(generic, sys_select); // 4.4BSD
186DECL_TEMPLATE(generic, sys_flock); // 4.4BSD
187DECL_TEMPLATE(generic, sys_poll); // XPG4-UNIX
188DECL_TEMPLATE(generic, sys_getrusage); // SVr4, 4.3BSD
189DECL_TEMPLATE(generic, sys_stime); // SVr4, SVID, X/OPEN
190DECL_TEMPLATE(generic, sys_settimeofday); // SVr4, 4.3BSD (non-POSIX)
191DECL_TEMPLATE(generic, sys_getpriority); // SVr4, 4.4BSD
192DECL_TEMPLATE(generic, sys_setpriority); // SVr4, 4.4BSD
193DECL_TEMPLATE(generic, sys_setitimer); // SVr4, 4.4BSD
194DECL_TEMPLATE(generic, sys_getitimer); // SVr4, 4.4BSD
195DECL_TEMPLATE(generic, sys_setreuid); // 4.3BSD
196DECL_TEMPLATE(generic, sys_setregid); // 4.3BSD
197DECL_TEMPLATE(generic, sys_fchown); // SVr4,4.3BSD
198DECL_TEMPLATE(generic, sys_setgid); // SVr4,SVID
199DECL_TEMPLATE(generic, sys_utimes); // 4.3BSD
sewardja8d8e232005-06-07 20:04:56 +0000200
sewardja8d8e232005-06-07 20:04:56 +0000201// May not be generic for every architecture under Linux.
sewardjbc22cf72005-06-08 00:02:49 +0000202DECL_TEMPLATE(generic, sys_sigaction); // (x86) P
sewardja8d8e232005-06-07 20:04:56 +0000203
204// Funny names, not sure...
sewardjbc22cf72005-06-08 00:02:49 +0000205DECL_TEMPLATE(generic, sys_newstat); // * P
206DECL_TEMPLATE(generic, sys_newlstat); // *
207DECL_TEMPLATE(generic, sys_newfstat); // * P (SVr4,BSD4.3)
sewardja8d8e232005-06-07 20:04:56 +0000208
209// For the remainder, not really sure yet
sewardjbc22cf72005-06-08 00:02:49 +0000210DECL_TEMPLATE(generic, sys_ptrace); // (x86?) (almost-P)
sewardjbc22cf72005-06-08 00:02:49 +0000211DECL_TEMPLATE(generic, sys_setrlimit); // SVr4, 4.3BSD
sewardjbc22cf72005-06-08 00:02:49 +0000212DECL_TEMPLATE(generic, sys_old_getrlimit); // SVr4, 4.3BSD L?
213DECL_TEMPLATE(generic, sys_statfs); // * L?
214DECL_TEMPLATE(generic, sys_fstatfs); // * L?
215DECL_TEMPLATE(generic, sys_iopl); // (x86/amd64) L
sewardjbc22cf72005-06-08 00:02:49 +0000216DECL_TEMPLATE(generic, sys_newuname); // * P
njn7b1edbd2009-05-19 06:50:37 +0000217DECL_TEMPLATE(generic, sys_pread64); // * (Unix98?)
218DECL_TEMPLATE(generic, sys_pwrite64); // * (Unix98?)
sewardjbc22cf72005-06-08 00:02:49 +0000219DECL_TEMPLATE(generic, sys_sigaltstack); // (x86) (XPG4-UNIX)
220DECL_TEMPLATE(generic, sys_getpmsg); // (?) (?)
221DECL_TEMPLATE(generic, sys_putpmsg); // (?) (?)
222DECL_TEMPLATE(generic, sys_getrlimit); // * (?)
sewardjbc22cf72005-06-08 00:02:49 +0000223DECL_TEMPLATE(generic, sys_truncate64); // %% (P?)
224DECL_TEMPLATE(generic, sys_ftruncate64); // %% (P?)
225DECL_TEMPLATE(generic, sys_lchown); // * (L?)
226DECL_TEMPLATE(generic, sys_mincore); // * L?
227DECL_TEMPLATE(generic, sys_getdents64); // * (SVr4,SVID?)
sewardjbc22cf72005-06-08 00:02:49 +0000228DECL_TEMPLATE(generic, sys_statfs64); // * (?)
229DECL_TEMPLATE(generic, sys_fstatfs64); // * (?)
sewardja8d8e232005-06-07 20:04:56 +0000230
231
232/* ---------------------------------------------------------------------
233 Wrappers for sockets and ipc-ery. These are split into standalone
philippef2a7bbe2012-11-04 20:40:33 +0000234 procedures because some platforms hides them inside multiplexors
sewardja8d8e232005-06-07 20:04:56 +0000235 (sys_socketcall and sys_ipc).
236 ------------------------------------------------------------------ */
237
238#define TId ThreadId
239#define UW UWord
240#define SR SysRes
241
sewardj7eb7c582005-06-23 01:02:53 +0000242extern void ML_(generic_PRE_sys_socketpair) ( TId, UW, UW, UW, UW );
243extern SysRes ML_(generic_POST_sys_socketpair) ( TId, SR, UW, UW, UW, UW );
244extern SysRes ML_(generic_POST_sys_socket) ( TId, SR );
245extern void ML_(generic_PRE_sys_bind) ( TId, UW, UW, UW );
246extern void ML_(generic_PRE_sys_accept) ( TId, UW, UW, UW );
247extern SysRes ML_(generic_POST_sys_accept) ( TId, SR, UW, UW, UW );
248extern void ML_(generic_PRE_sys_sendto) ( TId, UW, UW, UW, UW, UW, UW );
249extern void ML_(generic_PRE_sys_send) ( TId, UW, UW, UW );
250extern void ML_(generic_PRE_sys_recvfrom) ( TId, UW, UW, UW, UW, UW, UW );
251extern void ML_(generic_POST_sys_recvfrom) ( TId, SR, UW, UW, UW, UW, UW, UW );
252extern void ML_(generic_PRE_sys_recv) ( TId, UW, UW, UW );
253extern void ML_(generic_POST_sys_recv) ( TId, UW, UW, UW, UW );
254extern void ML_(generic_PRE_sys_connect) ( TId, UW, UW, UW );
255extern void ML_(generic_PRE_sys_setsockopt) ( TId, UW, UW, UW, UW, UW );
sewardj7eb7c582005-06-23 01:02:53 +0000256extern void ML_(generic_PRE_sys_getsockname) ( TId, UW, UW, UW );
257extern void ML_(generic_POST_sys_getsockname) ( TId, SR, UW, UW, UW );
258extern void ML_(generic_PRE_sys_getpeername) ( TId, UW, UW, UW );
259extern void ML_(generic_POST_sys_getpeername) ( TId, SR, UW, UW, UW );
floriane543f302012-10-21 19:43:43 +0000260extern void ML_(generic_PRE_sys_sendmsg) ( TId, const HChar *,
261 struct vki_msghdr * );
262extern void ML_(generic_PRE_sys_recvmsg) ( TId, const HChar *,
263 struct vki_msghdr * );
264extern void ML_(generic_POST_sys_recvmsg) ( TId, const HChar *,
265 struct vki_msghdr *, UInt );
sewardja8d8e232005-06-07 20:04:56 +0000266
sewardj7eb7c582005-06-23 01:02:53 +0000267extern void ML_(generic_PRE_sys_semop) ( TId, UW, UW, UW );
268extern void ML_(generic_PRE_sys_semtimedop) ( TId, UW, UW, UW, UW );
269extern void ML_(generic_PRE_sys_semctl) ( TId, UW, UW, UW, UW );
270extern void ML_(generic_POST_sys_semctl) ( TId, UW, UW, UW, UW, UW );
sewardj7eb7c582005-06-23 01:02:53 +0000271extern UWord ML_(generic_PRE_sys_shmat) ( TId, UW, UW, UW );
272extern void ML_(generic_POST_sys_shmat) ( TId, UW, UW, UW, UW );
273extern Bool ML_(generic_PRE_sys_shmdt) ( TId, UW );
274extern void ML_(generic_POST_sys_shmdt) ( TId, UW, UW );
275extern void ML_(generic_PRE_sys_shmctl) ( TId, UW, UW, UW );
276extern void ML_(generic_POST_sys_shmctl) ( TId, UW, UW, UW, UW );
sewardja8d8e232005-06-07 20:04:56 +0000277
sewardj274461d2005-10-02 17:01:41 +0000278extern SysRes ML_(generic_PRE_sys_mmap) ( TId, UW, UW, UW, UW, UW, Off64T );
tom9548a162005-09-30 08:07:53 +0000279
tom15bd0c82010-02-19 16:50:45 +0000280#define PRE_timeval_READ(zzname, zzarg) \
281 do { \
282 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \
283 PRE_FIELD_READ(zzname, zztv->tv_sec); \
284 PRE_FIELD_READ(zzname, zztv->tv_usec); \
njn72bbd8d2009-05-22 08:12:46 +0000285 } while (0)
tom15bd0c82010-02-19 16:50:45 +0000286#define PRE_timeval_WRITE(zzname, zzarg) \
287 do { \
288 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \
289 PRE_FIELD_WRITE(zzname, zztv->tv_sec); \
290 PRE_FIELD_WRITE(zzname, zztv->tv_usec); \
njn72bbd8d2009-05-22 08:12:46 +0000291 } while (0)
tom15bd0c82010-02-19 16:50:45 +0000292#define POST_timeval_WRITE(zzarg) \
293 do { \
294 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \
295 POST_FIELD_WRITE(zztv->tv_sec); \
296 POST_FIELD_WRITE(zztv->tv_usec); \
njn72bbd8d2009-05-22 08:12:46 +0000297 } while (0)
298
299
sewardja8d8e232005-06-07 20:04:56 +0000300#undef TId
301#undef UW
302#undef SR
303
304
305/////////////////////////////////////////////////////////////////
306
307
njnc1b01812005-06-17 22:19:06 +0000308#endif // __PRIV_SYSWRAP_GENERIC_H
sewardja8d8e232005-06-07 20:04:56 +0000309
310/*--------------------------------------------------------------------*/
311/*--- end ---*/
312/*--------------------------------------------------------------------*/