drd: Add a consistency check
[valgrind.git] / coregrind / m_syswrap / priv_syswrap-generic.h
blobf014914b3d90d671c7134006ee6f93c7ccce8dc9
2 /*--------------------------------------------------------------------*/
3 /*--- Private syscalls header. priv_syswrap-generic.h ---*/
4 /*--------------------------------------------------------------------*/
6 /*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
10 Copyright (C) 2000-2013 Julian Seward
11 jseward@acm.org
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, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 02111-1307, USA.
28 The GNU General Public License is contained in the file COPYING.
31 #ifndef __PRIV_SYSWRAP_GENERIC_H
32 #define __PRIV_SYSWRAP_GENERIC_H
34 #include "pub_core_basics.h" // ThreadId
35 #include "pub_core_vki.h" // vki_msghdr
36 #include "priv_types_n_macros.h" // DECL_TEMPLATE
39 /* 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. */
43 extern void ML_(guess_and_register_stack) (Addr sp, ThreadState* tst);
45 // Return true if address range entirely contained within client
46 // address space.
47 extern
48 Bool ML_(valid_client_addr)(Addr start, SizeT size, ThreadId tid,
49 const HChar *syscallname);
51 /* 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. */
54 extern Bool ML_(safe_to_deref) ( void* start, SizeT size );
56 // Returns True if the signal is OK for the client to use.
57 extern Bool ML_(client_signal_OK)(Int sigNo);
59 // Return true if we're allowed to use or create this fd.
60 extern
61 Bool ML_(fd_allowed)(Int fd, const HChar *syscallname, ThreadId tid,
62 Bool isNewFD);
64 extern void ML_(record_fd_open_named) (ThreadId tid, Int fd);
65 extern void ML_(record_fd_open_nameless) (ThreadId tid, Int fd);
66 extern void ML_(record_fd_open_with_given_name)(ThreadId tid, Int fd,
67 const HChar *pathname);
69 // Used when killing threads -- we must not kill a thread if it's the thread
70 // that would do Valgrind's final cleanup and output.
71 extern
72 Bool ML_(do_sigkill)(Int pid, Int tgid);
74 /* When a client mmap or munmap has been successfully done, both the core
75 and the tool need to be notified of the new mapping. Hence this fn. */
76 extern void
77 ML_(notify_core_and_tool_of_mmap) ( Addr a, SizeT len, UInt prot,
78 UInt mm_flags, Int fd, Off64T offset );
79 extern void
80 ML_(notify_core_and_tool_of_munmap) ( Addr a, SizeT len );
81 extern void
82 ML_(notify_core_and_tool_of_mprotect) ( Addr a, SizeT len, Int prot );
84 extern void
85 ML_(buf_and_len_pre_check) ( ThreadId tid, Addr buf_p, Addr buflen_p,
86 const HChar* buf_s, const HChar* buflen_s );
87 extern void
88 ML_(buf_and_len_post_check) ( ThreadId tid, SysRes res,
89 Addr buf_p, Addr buflen_p, const HChar* s );
91 /* PRE and POST for unknown ioctls based on ioctl request encoding */
92 extern
93 void ML_(PRE_unknown_ioctl)(ThreadId tid, UWord request, UWord arg);
94 extern
95 void ML_(POST_unknown_ioctl)(ThreadId tid, UInt res, UWord request, UWord arg);
98 DECL_TEMPLATE(generic, sys_ni_syscall); // * P -- unimplemented
99 DECL_TEMPLATE(generic, sys_exit);
100 DECL_TEMPLATE(generic, sys_fork);
101 DECL_TEMPLATE(generic, sys_read);
102 DECL_TEMPLATE(generic, sys_write);
103 DECL_TEMPLATE(generic, sys_open);
104 DECL_TEMPLATE(generic, sys_close);
105 DECL_TEMPLATE(generic, sys_waitpid);
106 DECL_TEMPLATE(generic, sys_creat);
107 DECL_TEMPLATE(generic, sys_link);
108 DECL_TEMPLATE(generic, sys_unlink);
109 DECL_TEMPLATE(generic, sys_execve); // (*??) P
110 DECL_TEMPLATE(generic, sys_chdir);
111 DECL_TEMPLATE(generic, sys_time);
112 DECL_TEMPLATE(generic, sys_mknod);
113 DECL_TEMPLATE(generic, sys_chmod);
114 DECL_TEMPLATE(generic, sys_getpid);
115 DECL_TEMPLATE(generic, sys_alarm);
116 DECL_TEMPLATE(generic, sys_pause);
117 DECL_TEMPLATE(generic, sys_access);
118 DECL_TEMPLATE(generic, sys_kill);
119 DECL_TEMPLATE(generic, sys_rename);
120 DECL_TEMPLATE(generic, sys_mkdir);
121 DECL_TEMPLATE(generic, sys_rmdir);
122 DECL_TEMPLATE(generic, sys_dup);
123 DECL_TEMPLATE(generic, sys_times);
124 DECL_TEMPLATE(generic, sys_setpgid);
125 DECL_TEMPLATE(generic, sys_umask);
126 DECL_TEMPLATE(generic, sys_dup2);
127 DECL_TEMPLATE(generic, sys_getppid);
128 DECL_TEMPLATE(generic, sys_getpgrp);
129 DECL_TEMPLATE(generic, sys_setsid);
130 DECL_TEMPLATE(generic, sys_munmap);
131 DECL_TEMPLATE(generic, sys_truncate);
132 DECL_TEMPLATE(generic, sys_ftruncate);
133 DECL_TEMPLATE(generic, sys_fchmod);
134 DECL_TEMPLATE(generic, sys_msync);
135 DECL_TEMPLATE(generic, sys_readv);
136 DECL_TEMPLATE(generic, sys_writev);
137 DECL_TEMPLATE(generic, sys_getsid);
138 DECL_TEMPLATE(generic, sys_fdatasync);
139 DECL_TEMPLATE(generic, sys_mlock);
140 DECL_TEMPLATE(generic, sys_munlock);
141 DECL_TEMPLATE(generic, sys_mlockall);
142 DECL_TEMPLATE(generic, sys_nanosleep);
143 DECL_TEMPLATE(generic, sys_mremap); // POSIX, but Linux arg order may be odd
144 DECL_TEMPLATE(generic, sys_getuid);
145 DECL_TEMPLATE(generic, sys_getgid);
146 DECL_TEMPLATE(generic, sys_geteuid);
147 DECL_TEMPLATE(generic, sys_getegid);
148 DECL_TEMPLATE(generic, sys_getpgid);
149 DECL_TEMPLATE(generic, sys_fsync);
150 DECL_TEMPLATE(generic, sys_wait4);
151 DECL_TEMPLATE(generic, sys_mprotect);
152 DECL_TEMPLATE(generic, sys_getcwd);
153 DECL_TEMPLATE(generic, sys_symlink);
154 DECL_TEMPLATE(generic, sys_getgroups);
155 DECL_TEMPLATE(generic, sys_setgroups); // SVr4, SVID, X/OPEN, 4.3BSD
156 DECL_TEMPLATE(generic, sys_chown);
157 DECL_TEMPLATE(generic, sys_setuid);
158 DECL_TEMPLATE(generic, sys_gettimeofday);
159 DECL_TEMPLATE(generic, sys_madvise);
160 DECL_TEMPLATE(generic, sys_sethostname);
162 // These ones aren't POSIX, but are in some standard and look reasonably
163 // generic, and are the same for all architectures under Linux.
164 DECL_TEMPLATE(generic, sys_nice); // SVr4, SVID EXT, AT&T, X/OPEN, BSD 4.3
165 DECL_TEMPLATE(generic, sys_sync); // SVr4, SVID, X/OPEN, BSD 4.3
166 DECL_TEMPLATE(generic, sys_brk); // 4.3BSD
167 DECL_TEMPLATE(generic, sys_acct); // SVR4, non-POSIX
168 DECL_TEMPLATE(generic, sys_chroot); // SVr4, SVID, 4.4BSD, X/OPEN
169 DECL_TEMPLATE(generic, sys_readlink); // X/OPEN, 4.4BSD
170 DECL_TEMPLATE(generic, sys_fchdir); // SVr4, SVID, POSIX, X/OPEN, 4.4BSD
171 DECL_TEMPLATE(generic, sys_getdents); // SVr4,SVID
172 DECL_TEMPLATE(generic, sys_select); // 4.4BSD
173 DECL_TEMPLATE(generic, sys_flock); // 4.4BSD
174 DECL_TEMPLATE(generic, sys_poll); // XPG4-UNIX
175 DECL_TEMPLATE(generic, sys_getrusage); // SVr4, 4.3BSD
176 DECL_TEMPLATE(generic, sys_stime); // SVr4, SVID, X/OPEN
177 DECL_TEMPLATE(generic, sys_settimeofday); // SVr4, 4.3BSD (non-POSIX)
178 DECL_TEMPLATE(generic, sys_getpriority); // SVr4, 4.4BSD
179 DECL_TEMPLATE(generic, sys_setpriority); // SVr4, 4.4BSD
180 DECL_TEMPLATE(generic, sys_setitimer); // SVr4, 4.4BSD
181 DECL_TEMPLATE(generic, sys_getitimer); // SVr4, 4.4BSD
182 DECL_TEMPLATE(generic, sys_setreuid); // 4.3BSD
183 DECL_TEMPLATE(generic, sys_setregid); // 4.3BSD
184 DECL_TEMPLATE(generic, sys_fchown); // SVr4,4.3BSD
185 DECL_TEMPLATE(generic, sys_setgid); // SVr4,SVID
186 DECL_TEMPLATE(generic, sys_utimes); // 4.3BSD
188 // May not be generic for every architecture under Linux.
189 DECL_TEMPLATE(generic, sys_sigaction); // (x86) P
191 // Funny names, not sure...
192 DECL_TEMPLATE(generic, sys_newstat); // * P
193 DECL_TEMPLATE(generic, sys_newlstat); // *
194 DECL_TEMPLATE(generic, sys_newfstat); // * P (SVr4,BSD4.3)
196 // For the remainder, not really sure yet
197 DECL_TEMPLATE(generic, sys_ptrace); // (x86?) (almost-P)
198 DECL_TEMPLATE(generic, sys_setrlimit); // SVr4, 4.3BSD
199 DECL_TEMPLATE(generic, sys_old_getrlimit); // SVr4, 4.3BSD L?
200 DECL_TEMPLATE(generic, sys_statfs); // * L?
201 DECL_TEMPLATE(generic, sys_fstatfs); // * L?
202 DECL_TEMPLATE(generic, sys_iopl); // (x86/amd64) L
203 DECL_TEMPLATE(generic, sys_newuname); // * P
204 DECL_TEMPLATE(generic, sys_pread64); // * (Unix98?)
205 DECL_TEMPLATE(generic, sys_pwrite64); // * (Unix98?)
206 DECL_TEMPLATE(generic, sys_sigaltstack); // (x86) (XPG4-UNIX)
207 DECL_TEMPLATE(generic, sys_getpmsg); // (?) (?)
208 DECL_TEMPLATE(generic, sys_putpmsg); // (?) (?)
209 DECL_TEMPLATE(generic, sys_getrlimit); // * (?)
210 DECL_TEMPLATE(generic, sys_truncate64); // %% (P?)
211 DECL_TEMPLATE(generic, sys_ftruncate64); // %% (P?)
212 DECL_TEMPLATE(generic, sys_lchown); // * (L?)
213 DECL_TEMPLATE(generic, sys_mincore); // * L?
214 DECL_TEMPLATE(generic, sys_getdents64); // * (SVr4,SVID?)
215 DECL_TEMPLATE(generic, sys_statfs64); // * (?)
216 DECL_TEMPLATE(generic, sys_fstatfs64); // * (?)
219 /* ---------------------------------------------------------------------
220 Wrappers for sockets and ipc-ery. These are split into standalone
221 procedures because some platforms hides them inside multiplexors
222 (sys_socketcall and sys_ipc).
223 ------------------------------------------------------------------ */
225 #define TId ThreadId
226 #define UW UWord
227 #define SR SysRes
229 extern void ML_(generic_PRE_sys_socketpair) ( TId, UW, UW, UW, UW );
230 extern SysRes ML_(generic_POST_sys_socketpair) ( TId, SR, UW, UW, UW, UW );
231 extern SysRes ML_(generic_POST_sys_socket) ( TId, SR );
232 extern void ML_(generic_PRE_sys_bind) ( TId, UW, UW, UW );
233 extern void ML_(generic_PRE_sys_accept) ( TId, UW, UW, UW );
234 extern SysRes ML_(generic_POST_sys_accept) ( TId, SR, UW, UW, UW );
235 extern void ML_(generic_PRE_sys_sendto) ( TId, UW, UW, UW, UW, UW, UW );
236 extern void ML_(generic_PRE_sys_send) ( TId, UW, UW, UW );
237 extern void ML_(generic_PRE_sys_recvfrom) ( TId, UW, UW, UW, UW, UW, UW );
238 extern void ML_(generic_POST_sys_recvfrom) ( TId, SR, UW, UW, UW, UW, UW, UW );
239 extern void ML_(generic_PRE_sys_recv) ( TId, UW, UW, UW );
240 extern void ML_(generic_POST_sys_recv) ( TId, UW, UW, UW, UW );
241 extern void ML_(generic_PRE_sys_connect) ( TId, UW, UW, UW );
242 extern void ML_(generic_PRE_sys_setsockopt) ( TId, UW, UW, UW, UW, UW );
243 extern void ML_(generic_PRE_sys_getsockname) ( TId, UW, UW, UW );
244 extern void ML_(generic_POST_sys_getsockname) ( TId, SR, UW, UW, UW );
245 extern void ML_(generic_PRE_sys_getpeername) ( TId, UW, UW, UW );
246 extern void ML_(generic_POST_sys_getpeername) ( TId, SR, UW, UW, UW );
247 extern void ML_(generic_PRE_sys_sendmsg) ( TId, const HChar *,
248 struct vki_msghdr * );
249 extern void ML_(generic_PRE_sys_recvmsg) ( TId, const HChar *,
250 struct vki_msghdr * );
251 extern void ML_(generic_POST_sys_recvmsg) ( TId, const HChar *,
252 struct vki_msghdr *, UInt );
254 extern void ML_(generic_PRE_sys_semop) ( TId, UW, UW, UW );
255 extern void ML_(generic_PRE_sys_semtimedop) ( TId, UW, UW, UW, UW );
256 extern void ML_(generic_PRE_sys_semctl) ( TId, UW, UW, UW, UW );
257 extern void ML_(generic_POST_sys_semctl) ( TId, UW, UW, UW, UW, UW );
258 extern UWord ML_(generic_PRE_sys_shmat) ( TId, UW, UW, UW );
259 extern void ML_(generic_POST_sys_shmat) ( TId, UW, UW, UW, UW );
260 extern Bool ML_(generic_PRE_sys_shmdt) ( TId, UW );
261 extern void ML_(generic_POST_sys_shmdt) ( TId, UW, UW );
262 extern void ML_(generic_PRE_sys_shmctl) ( TId, UW, UW, UW );
263 extern void ML_(generic_POST_sys_shmctl) ( TId, UW, UW, UW, UW );
265 extern SysRes ML_(generic_PRE_sys_mmap) ( TId, UW, UW, UW, UW, UW, Off64T );
267 #define PRE_timeval_READ(zzname, zzarg) \
268 do { \
269 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \
270 PRE_FIELD_READ(zzname, zztv->tv_sec); \
271 PRE_FIELD_READ(zzname, zztv->tv_usec); \
272 } while (0)
273 #define PRE_timeval_WRITE(zzname, zzarg) \
274 do { \
275 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \
276 PRE_FIELD_WRITE(zzname, zztv->tv_sec); \
277 PRE_FIELD_WRITE(zzname, zztv->tv_usec); \
278 } while (0)
279 #define POST_timeval_WRITE(zzarg) \
280 do { \
281 struct vki_timeval *zztv = (struct vki_timeval *)(zzarg); \
282 POST_FIELD_WRITE(zztv->tv_sec); \
283 POST_FIELD_WRITE(zztv->tv_usec); \
284 } while (0)
287 #undef TId
288 #undef UW
289 #undef SR
292 /////////////////////////////////////////////////////////////////
295 #endif // __PRIV_SYSWRAP_GENERIC_H
297 /*--------------------------------------------------------------------*/
298 /*--- end ---*/
299 /*--------------------------------------------------------------------*/