1297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 2297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/*--------------------------------------------------------------------*/ 3297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/*--- Module-local header file for m_aspacemgr. ---*/ 4297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/*--- priv_aspacemgr.h ---*/ 5297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/*--------------------------------------------------------------------*/ 6297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 7297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* 8297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj This file is part of Valgrind, a dynamic binary instrumentation 9297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj framework. 10297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 11ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes Copyright (C) 2006-2017 OpenWorks LLP 12297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj info@open-works.co.uk 13297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 14297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj This program is free software; you can redistribute it and/or 15297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj modify it under the terms of the GNU General Public License as 16297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj published by the Free Software Foundation; either version 2 of the 17297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj License, or (at your option) any later version. 18297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 19297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj This program is distributed in the hope that it will be useful, but 20297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj WITHOUT ANY WARRANTY; without even the implied warranty of 21297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj General Public License for more details. 23297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 24297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj You should have received a copy of the GNU General Public License 25297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj along with this program; if not, write to the Free Software 26297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 27297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 02111-1307, USA. 28297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 29297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj The GNU General Public License is contained in the file COPYING. 30297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj*/ 31297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 32297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj#ifndef __PRIV_ASPACEMGR_H 33297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj#define __PRIV_ASPACEMGR_H 34297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 35297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* One of the important design goals of the address space manager is 36297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj to minimise dependence on other modules. Hence the following 37297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj minimal set of imports. */ 38297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 39297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj#include "pub_core_basics.h" // types 40297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj#include "pub_core_vkiscnums.h" // system call numbers 41297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj#include "pub_core_vki.h" // VKI_PAGE_SIZE, VKI_MREMAP_MAYMOVE, 42297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj // VKI_MREMAP_FIXED, vki_stat64 43297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 44297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj#include "pub_core_debuglog.h" // VG_(debugLog) 45297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 46dad944add53e6361751c6832066c00c456854622njn#include "pub_core_libcbase.h" // VG_(strlen), VG_(strcmp), VG_(strncpy) 47297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj // VG_IS_PAGE_ALIGNED 48297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj // VG_PGROUNDDN, VG_PGROUNDUP 49297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 50421c26e30de64ccf441ec398c1f8beda7afbb47cflorian#include "pub_core_libcassert.h" // VG_(exit_now) 51421c26e30de64ccf441ec398c1f8beda7afbb47cflorian 52297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj#include "pub_core_syscall.h" // VG_(do_syscallN) 53297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj // VG_(mk_SysRes_Error) 54297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj // VG_(mk_SysRes_Success) 55297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 56297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj#include "pub_core_options.h" // VG_(clo_sanity_level) 57297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 58297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj#include "pub_core_aspacemgr.h" // self 59297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 60297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 61297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* --------------- Implemented in aspacemgr-common.c ---------------*/ 62297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 63297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* Simple assert-like, file I/O and syscall facilities, which avoid 64297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj dependence on m_libcassert, and hence on the entire module graph. 65297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj This is important since most of the system itself depends on 66297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj aspacem, so we have to do this to avoid a circular dependency. */ 67297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 684c245e595b9f6300d3120408ca873f7115d9cc7dnjn__attribute__ ((noreturn)) 69297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjextern void ML_(am_exit) ( Int status ); 703c9f1869b65b121ae41cac0ea66f5c2513819352florian__attribute__ ((noreturn)) 71dbb3584f591710a15a437918c0fc27e300993566florianextern void ML_(am_barf) ( const HChar* what ); 723c9f1869b65b121ae41cac0ea66f5c2513819352florian__attribute__ ((noreturn)) 73dbb3584f591710a15a437918c0fc27e300993566florianextern void ML_(am_barf_toolow) ( const HChar* what ); 74297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 754c245e595b9f6300d3120408ca873f7115d9cc7dnjn__attribute__ ((noreturn)) 76297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjextern void ML_(am_assert_fail) ( const HChar* expr, 77dbb3584f591710a15a437918c0fc27e300993566florian const HChar* file, 78297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj Int line, 79dbb3584f591710a15a437918c0fc27e300993566florian const HChar* fn ); 80297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 81297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj#define aspacem_assert(expr) \ 828f9b0d20a3452164ee7c6fb4492a6989aeefe772florian ((void) (LIKELY(expr) ? 0 : \ 83297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj (ML_(am_assert_fail)(#expr, \ 84297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj __FILE__, __LINE__, \ 85297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj __PRETTY_FUNCTION__)))) 86297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 87297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* Dude, what's my process ID ? */ 88297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjextern Int ML_(am_getpid)( void ); 89297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 90297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* A simple, self-contained sprintf implementation. */ 91297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjextern UInt ML_(am_sprintf) ( HChar* buf, const HChar *format, ... ); 92297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 93297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* mmap et al wrappers */ 94297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* wrapper for munmap */ 95297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjextern SysRes ML_(am_do_munmap_NO_NOTIFY)(Addr start, SizeT length); 96297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 97297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* wrapper for the ghastly 'mremap' syscall */ 98297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjextern SysRes ML_(am_do_extend_mapping_NO_NOTIFY)( 99297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj Addr old_addr, 100297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj SizeT old_len, 101297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj SizeT new_len 102297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj ); 103297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* ditto */ 104297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjextern SysRes ML_(am_do_relocate_nooverlap_mapping_NO_NOTIFY)( 105297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj Addr old_addr, Addr old_len, 106297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj Addr new_addr, Addr new_len 107297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj ); 108297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 109297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* There is also VG_(do_mmap_NO_NOTIFY), but that's not declared 110297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj here (obviously). */ 111297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 112dbb3584f591710a15a437918c0fc27e300993566florianextern SysRes ML_(am_open) ( const HChar* pathname, Int flags, Int mode ); 113297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjextern void ML_(am_close) ( Int fd ); 114297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjextern Int ML_(am_read) ( Int fd, void* buf, Int count); 1153297124fa2116737066ac3cd709f18fdd5405163florianextern Int ML_(am_readlink) ( const HChar* path, HChar* buf, UInt bufsiz ); 116dad944add53e6361751c6832066c00c456854622njnextern Int ML_(am_fcntl) ( Int fd, Int cmd, Addr arg ); 117297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 118297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* Get the dev, inode and mode info for a file descriptor, if 119297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj possible. Returns True on success. */ 120297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjextern 121297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjBool ML_(am_get_fd_d_i_m)( Int fd, 122dad944add53e6361751c6832066c00c456854622njn /*OUT*/ULong* dev, 123dad944add53e6361751c6832066c00c456854622njn /*OUT*/ULong* ino, /*OUT*/UInt* mode ); 124dad944add53e6361751c6832066c00c456854622njn 125dad944add53e6361751c6832066c00c456854622njnextern 126dad944add53e6361751c6832066c00c456854622njnBool ML_(am_resolve_filename) ( Int fd, /*OUT*/HChar* buf, Int nbuf ); 127297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 1286e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj/* ------ Implemented separately in aspacemgr-linux.c ------ */ 129297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 130297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/* Do a sanity check (/proc/self/maps sync check) */ 131297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardjextern void ML_(am_do_sanity_check)( void ); 132297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 133297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 134346ee2f7978bf2ab1ead4982e56870da276fc44bflorian/* ------ Implemented in aspacemgr-segnames.c ------ */ 1354ecd48360351f666f008148c12a24cbda455c6b1florianvoid ML_(am_segnames_init)(void); 1364ecd48360351f666f008148c12a24cbda455c6b1florianvoid ML_(am_show_segnames)(Int logLevel, const HChar *prefix); 137346ee2f7978bf2ab1ead4982e56870da276fc44bflorian 138346ee2f7978bf2ab1ead4982e56870da276fc44bflorian/* Put NAME into the string table of segment names. Return index for 139346ee2f7978bf2ab1ead4982e56870da276fc44bflorian future reference. A return value of -1 indicates that the segment name 140346ee2f7978bf2ab1ead4982e56870da276fc44bflorian could not be stored. Basically an out-of-memory situation. */ 1414ecd48360351f666f008148c12a24cbda455c6b1florianInt ML_(am_allocate_segname)(const HChar *name); 142346ee2f7978bf2ab1ead4982e56870da276fc44bflorian 143346ee2f7978bf2ab1ead4982e56870da276fc44bflorian/* Increment / decrement the reference counter for this segment name. */ 1444ecd48360351f666f008148c12a24cbda455c6b1florianvoid ML_(am_inc_refcount)(Int); 1454ecd48360351f666f008148c12a24cbda455c6b1florianvoid ML_(am_dec_refcount)(Int); 146346ee2f7978bf2ab1ead4982e56870da276fc44bflorian 147346ee2f7978bf2ab1ead4982e56870da276fc44bflorian/* Check whether the segname index is sane. */ 1484ecd48360351f666f008148c12a24cbda455c6b1florianBool ML_(am_sane_segname)(Int fnIdx); 149346ee2f7978bf2ab1ead4982e56870da276fc44bflorian 150346ee2f7978bf2ab1ead4982e56870da276fc44bflorian/* Return the segment name for the given index. Maybe return NULL, if the 151346ee2f7978bf2ab1ead4982e56870da276fc44bflorian segment does not have a name. */ 1524ecd48360351f666f008148c12a24cbda455c6b1florianconst HChar *ML_(am_get_segname)(Int fnIdx); 153346ee2f7978bf2ab1ead4982e56870da276fc44bflorian 154346ee2f7978bf2ab1ead4982e56870da276fc44bflorian/* Return the sequence number of the segment name */ 1554ecd48360351f666f008148c12a24cbda455c6b1florianInt ML_(am_segname_get_seqnr)(Int fnIdx); 156346ee2f7978bf2ab1ead4982e56870da276fc44bflorian 157297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj#endif // __PRIV_ASPACEMGR_H 158297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj 159297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/*--------------------------------------------------------------------*/ 160297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/*--- end ---*/ 161297f6b0565fd0bb08fd3ddc1f2377ee6b3306b82sewardj/*--------------------------------------------------------------------*/ 162