Files
ftmemsim-valgrind/coregrind/m_syswrap/priv_syswrap-generic.h
Tom Hughes 6c610b89c7 Rationalise the mmap system call handling - after examining the kernel
source it turns out that there are five different versions of mmap for
the three platforms we currently support:

  - On x86-linux there is mmap (aka old_mmap) which takes the
    arguments in a memory block and the offset in bytes; and
    mmap2 (aka sys_mmap2) which takes the arguments in the normal
    way and the offset in pages.

  - On ppc32-linux there is mmap (aka sys_mmap) which takes the
    arguments in the normal way and the offset in bytes; and
    mmap2 (aka sys_mmap2) which takes the arguments in the normal
    way and the offset in pages.

  - On amd64-linux everything is simple and there is just the one
    call, mmap (aka sys_mmap)  which takes the arguments in the normal
    way and the offset in bytes.

To reconcile all this I have created a generic handler and then
written five platform specific wrappers which normalise all the
arguments and then call the generic handler.

I have also modified the address space manager to use mmap2 rather
than mmap on x86 and ppc32 so that large offsets can be correctly
handled.

There is still an issue of OffT truncating offsets as we go through
the address space manager that will need to be addressed.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@4834
2005-09-30 08:07:53 +00:00

260 lines
12 KiB
C

/*--------------------------------------------------------------------*/
/*--- Private syscalls header. priv_syswrap-generic.h ---*/
/*--------------------------------------------------------------------*/
/*
This file is part of Valgrind, a dynamic binary instrumentation
framework.
Copyright (C) 2000-2005 Julian Seward
jseward@acm.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_GENERIC_H
#define __PRIV_SYSWRAP_GENERIC_H
/* requires #include "priv_types_n_macros.h" */
// Return true if address range entirely contained within client
// address space.
extern
Bool ML_(valid_client_addr)(Addr start, SizeT size, ThreadId tid,
const Char *syscallname);
/* Handy small function to help stop wrappers from segfaulting when
presented with bogus client addresses. Is not used for generating
user-visible errors. */
extern Bool ML_(safe_to_deref) ( void* start, SizeT size );
// Returns True if the signal is OK for the client to use.
extern Bool ML_(client_signal_OK)(Int sigNo);
// Return true if we're allowed to use or create this fd.
extern
Bool ML_(fd_allowed)(Int fd, const Char *syscallname, ThreadId tid, Bool soft);
extern void ML_(record_fd_open_nameless) (ThreadId tid, Int fd);
extern void ML_(record_fd_open_with_given_name)(ThreadId tid, Int fd,
char *pathname);
// Used when killing threads -- we must not kill a thread if it's the thread
// that would do Valgrind's final cleanup and output.
extern
Bool ML_(do_sigkill)(Int pid, Int tgid);
/* So that it can be seen from syswrap-x86-linux.c. */
/* When a client mmap has been successfully done, both aspacem and the
tool need to be notified of the new mapping. Hence this fn. */
extern
void
ML_(notify_aspacem_and_tool_of_mmap) ( Addr a, SizeT len, UInt prot,
UInt mm_flags, Int fd, ULong offset );
DECL_TEMPLATE(generic, sys_ni_syscall); // * P -- unimplemented
DECL_TEMPLATE(generic, sys_exit);
DECL_TEMPLATE(generic, sys_fork);
DECL_TEMPLATE(generic, sys_read);
DECL_TEMPLATE(generic, sys_write);
DECL_TEMPLATE(generic, sys_open);
DECL_TEMPLATE(generic, sys_close);
DECL_TEMPLATE(generic, sys_waitpid);
DECL_TEMPLATE(generic, sys_creat);
DECL_TEMPLATE(generic, sys_link);
DECL_TEMPLATE(generic, sys_unlink);
DECL_TEMPLATE(generic, sys_execve); // (*??) P
DECL_TEMPLATE(generic, sys_chdir);
DECL_TEMPLATE(generic, sys_time);
DECL_TEMPLATE(generic, sys_mknod);
DECL_TEMPLATE(generic, sys_chmod);
DECL_TEMPLATE(generic, sys_getpid);
DECL_TEMPLATE(generic, sys_alarm);
DECL_TEMPLATE(generic, sys_pause);
DECL_TEMPLATE(generic, sys_access);
DECL_TEMPLATE(generic, sys_kill);
DECL_TEMPLATE(generic, sys_rename);
DECL_TEMPLATE(generic, sys_mkdir);
DECL_TEMPLATE(generic, sys_rmdir);
DECL_TEMPLATE(generic, sys_dup);
DECL_TEMPLATE(generic, sys_times);
DECL_TEMPLATE(generic, sys_fcntl); // POSIX (but complicated)
DECL_TEMPLATE(generic, sys_setpgid);
DECL_TEMPLATE(generic, sys_umask);
DECL_TEMPLATE(generic, sys_dup2);
DECL_TEMPLATE(generic, sys_getppid);
DECL_TEMPLATE(generic, sys_getpgrp);
DECL_TEMPLATE(generic, sys_setsid);
DECL_TEMPLATE(generic, sys_munmap);
DECL_TEMPLATE(generic, sys_truncate);
DECL_TEMPLATE(generic, sys_ftruncate);
DECL_TEMPLATE(generic, sys_fchmod);
DECL_TEMPLATE(generic, sys_msync);
DECL_TEMPLATE(generic, sys_readv);
DECL_TEMPLATE(generic, sys_writev);
DECL_TEMPLATE(generic, sys_getsid);
DECL_TEMPLATE(generic, sys_fdatasync);
DECL_TEMPLATE(generic, sys_mlock);
DECL_TEMPLATE(generic, sys_munlock);
DECL_TEMPLATE(generic, sys_mlockall);
DECL_TEMPLATE(generic, sys_nanosleep);
DECL_TEMPLATE(generic, sys_mremap); // POSIX, but Linux arg order may be odd
DECL_TEMPLATE(generic, sys_getuid);
DECL_TEMPLATE(generic, sys_getgid);
DECL_TEMPLATE(generic, sys_geteuid);
DECL_TEMPLATE(generic, sys_getegid);
DECL_TEMPLATE(generic, sys_getpgid);
DECL_TEMPLATE(generic, sys_fsync);
DECL_TEMPLATE(generic, sys_wait4);
DECL_TEMPLATE(generic, sys_mprotect);
DECL_TEMPLATE(generic, sys_getcwd);
DECL_TEMPLATE(generic, sys_symlink);
DECL_TEMPLATE(generic, sys_getgroups);
DECL_TEMPLATE(generic, sys_setgroups); // SVr4, SVID, X/OPEN, 4.3BSD
DECL_TEMPLATE(generic, sys_chown);
DECL_TEMPLATE(generic, sys_setuid);
DECL_TEMPLATE(generic, sys_gettimeofday);
DECL_TEMPLATE(generic, sys_madvise);
// These ones aren't POSIX, but are in some standard and look reasonably
// generic, and are the same for all architectures under Linux.
DECL_TEMPLATE(generic, sys_nice); // SVr4, SVID EXT, AT&T, X/OPEN, BSD 4.3
DECL_TEMPLATE(generic, sys_sync); // SVr4, SVID, X/OPEN, BSD 4.3
DECL_TEMPLATE(generic, sys_brk); // 4.3BSD
DECL_TEMPLATE(generic, sys_acct); // SVR4, non-POSIX
DECL_TEMPLATE(generic, sys_chroot); // SVr4, SVID, 4.4BSD, X/OPEN
DECL_TEMPLATE(generic, sys_readlink); // X/OPEN, 4.4BSD
DECL_TEMPLATE(generic, sys_fchdir); // SVr4, SVID, POSIX, X/OPEN, 4.4BSD
DECL_TEMPLATE(generic, sys_getdents); // SVr4,SVID
DECL_TEMPLATE(generic, sys_select); // 4.4BSD
DECL_TEMPLATE(generic, sys_flock); // 4.4BSD
DECL_TEMPLATE(generic, sys_poll); // XPG4-UNIX
DECL_TEMPLATE(generic, sys_getrusage); // SVr4, 4.3BSD
DECL_TEMPLATE(generic, sys_stime); // SVr4, SVID, X/OPEN
DECL_TEMPLATE(generic, sys_settimeofday); // SVr4, 4.3BSD (non-POSIX)
DECL_TEMPLATE(generic, sys_getpriority); // SVr4, 4.4BSD
DECL_TEMPLATE(generic, sys_setpriority); // SVr4, 4.4BSD
DECL_TEMPLATE(generic, sys_setitimer); // SVr4, 4.4BSD
DECL_TEMPLATE(generic, sys_getitimer); // SVr4, 4.4BSD
DECL_TEMPLATE(generic, sys_setreuid); // 4.3BSD
DECL_TEMPLATE(generic, sys_setregid); // 4.3BSD
DECL_TEMPLATE(generic, sys_fchown); // SVr4,4.3BSD
DECL_TEMPLATE(generic, sys_setgid); // SVr4,SVID
DECL_TEMPLATE(generic, sys_utimes); // 4.3BSD
// May not be generic for every architecture under Linux.
DECL_TEMPLATE(generic, sys_sigaction); // (x86) P
// Funny names, not sure...
DECL_TEMPLATE(generic, sys_newstat); // * P
DECL_TEMPLATE(generic, sys_newlstat); // *
DECL_TEMPLATE(generic, sys_newfstat); // * P (SVr4,BSD4.3)
// For the remainder, not really sure yet
DECL_TEMPLATE(generic, sys_ptrace); // (x86?) (almost-P)
DECL_TEMPLATE(generic, sys_sigsuspend); // POSIX, but L (proto varies across archs)
DECL_TEMPLATE(generic, sys_setrlimit); // SVr4, 4.3BSD
DECL_TEMPLATE(generic, sys_ioctl); // x86? (various)
DECL_TEMPLATE(generic, sys_old_getrlimit); // SVr4, 4.3BSD L?
DECL_TEMPLATE(generic, sys_statfs); // * L?
DECL_TEMPLATE(generic, sys_fstatfs); // * L?
DECL_TEMPLATE(generic, sys_iopl); // (x86/amd64) L
DECL_TEMPLATE(generic, sys_ipc); // (x86) L
DECL_TEMPLATE(generic, sys_newuname); // * P
DECL_TEMPLATE(generic, sys_init_module); // * L?
DECL_TEMPLATE(generic, sys_pread64); // * (Unix98?)
DECL_TEMPLATE(generic, sys_pwrite64); // * (Unix98?)
DECL_TEMPLATE(generic, sys_sigaltstack); // (x86) (XPG4-UNIX)
DECL_TEMPLATE(generic, sys_getpmsg); // (?) (?)
DECL_TEMPLATE(generic, sys_putpmsg); // (?) (?)
DECL_TEMPLATE(generic, sys_getrlimit); // * (?)
DECL_TEMPLATE(generic, sys_truncate64); // %% (P?)
DECL_TEMPLATE(generic, sys_ftruncate64); // %% (P?)
DECL_TEMPLATE(generic, sys_lchown); // * (L?)
DECL_TEMPLATE(generic, sys_mincore); // * L?
DECL_TEMPLATE(generic, sys_getdents64); // * (SVr4,SVID?)
DECL_TEMPLATE(generic, sys_fcntl64); // * P?
DECL_TEMPLATE(generic, sys_lookup_dcookie); // (*/32/64) L
DECL_TEMPLATE(generic, sys_statfs64); // * (?)
DECL_TEMPLATE(generic, sys_fstatfs64); // * (?)
/* ---------------------------------------------------------------------
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_(generic_PRE_sys_socketpair) ( TId, UW, UW, UW, UW );
extern SysRes ML_(generic_POST_sys_socketpair) ( TId, SR, UW, UW, UW, UW );
extern SysRes ML_(generic_POST_sys_socket) ( TId, SR );
extern void ML_(generic_PRE_sys_bind) ( TId, UW, UW, UW );
extern void ML_(generic_PRE_sys_accept) ( TId, UW, UW, UW );
extern SysRes ML_(generic_POST_sys_accept) ( TId, SR, UW, UW, UW );
extern void ML_(generic_PRE_sys_sendto) ( TId, UW, UW, UW, UW, UW, UW );
extern void ML_(generic_PRE_sys_send) ( TId, UW, UW, UW );
extern void ML_(generic_PRE_sys_recvfrom) ( TId, UW, UW, UW, UW, UW, UW );
extern void ML_(generic_POST_sys_recvfrom) ( TId, SR, UW, UW, UW, UW, UW, UW );
extern void ML_(generic_PRE_sys_recv) ( TId, UW, UW, UW );
extern void ML_(generic_POST_sys_recv) ( TId, UW, UW, UW, UW );
extern void ML_(generic_PRE_sys_connect) ( TId, UW, UW, UW );
extern void ML_(generic_PRE_sys_setsockopt) ( TId, UW, UW, UW, UW, UW );
extern void ML_(generic_PRE_sys_getsockopt) ( TId, UW, UW, UW, UW, UW );
extern void ML_(generic_POST_sys_getsockopt) ( TId, SR, UW, UW, UW, UW, UW );
extern void ML_(generic_PRE_sys_getsockname) ( TId, UW, UW, UW );
extern void ML_(generic_POST_sys_getsockname) ( TId, SR, UW, UW, UW );
extern void ML_(generic_PRE_sys_getpeername) ( TId, UW, UW, UW );
extern void ML_(generic_POST_sys_getpeername) ( TId, SR, UW, UW, UW );
extern void ML_(generic_PRE_sys_sendmsg) ( TId, UW, UW );
extern void ML_(generic_PRE_sys_recvmsg) ( TId, UW, UW );
extern void ML_(generic_POST_sys_recvmsg) ( TId, UW, UW );
extern void ML_(generic_PRE_sys_semop) ( TId, UW, UW, UW );
extern void ML_(generic_PRE_sys_semtimedop) ( TId, UW, UW, UW, UW );
extern void ML_(generic_PRE_sys_semctl) ( TId, UW, UW, UW, UW );
extern void ML_(generic_POST_sys_semctl) ( TId, UW, UW, UW, UW, UW );
extern UWord ML_(generic_PRE_sys_shmat) ( TId, UW, UW, UW );
extern void ML_(generic_POST_sys_shmat) ( TId, UW, UW, UW, UW );
extern Bool ML_(generic_PRE_sys_shmdt) ( TId, UW );
extern void ML_(generic_POST_sys_shmdt) ( TId, UW, UW );
extern void ML_(generic_PRE_sys_shmctl) ( TId, UW, UW, UW );
extern void ML_(generic_POST_sys_shmctl) ( TId, UW, UW, UW, UW );
extern SysRes ML_(generic_PRE_sys_mmap) ( TId, UW, UW, UW, UW, UW, UW );
#undef TId
#undef UW
#undef SR
/////////////////////////////////////////////////////////////////
#endif // __PRIV_SYSWRAP_GENERIC_H
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/