| |
| /*--------------------------------------------------------------------*/ |
| /*--- Address space manager. pub_tool_aspacemgr.h ---*/ |
| /*--------------------------------------------------------------------*/ |
| |
| /* |
| This file is part of Valgrind, a dynamic binary instrumentation |
| framework. |
| |
| Copyright (C) 2000-2017 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 __PUB_TOOL_ASPACEMGR_H |
| #define __PUB_TOOL_ASPACEMGR_H |
| |
| #include "pub_tool_basics.h" // VG_ macro |
| |
| //-------------------------------------------------------------- |
| // Definition of address-space segments |
| |
| /* Describes segment kinds. Enumerators are one-hot encoded so they |
| can be or'ed together. */ |
| typedef |
| enum { |
| SkFree = 0x01, // unmapped space |
| SkAnonC = 0x02, // anonymous mapping belonging to the client |
| SkAnonV = 0x04, // anonymous mapping belonging to valgrind |
| SkFileC = 0x08, // file mapping belonging to the client |
| SkFileV = 0x10, // file mapping belonging to valgrind |
| SkShmC = 0x20, // shared memory segment belonging to the client |
| SkResvn = 0x40 // reservation |
| } |
| SegKind; |
| |
| /* Describes how a reservation segment can be resized. */ |
| typedef |
| enum { |
| SmLower, // lower end can move up |
| SmFixed, // cannot be shrunk |
| SmUpper // upper end can move down |
| } |
| ShrinkMode; |
| |
| /* Describes a segment. Invariants: |
| |
| kind == SkFree: |
| // the only meaningful fields are .start and .end |
| |
| kind == SkAnon{C,V}: |
| // smode==SmFixed |
| // there's no associated file: |
| dev==ino==foff = 0, fnidx == -1 |
| // segment may have permissions |
| |
| kind == SkFile{C,V}: |
| // smode==SmFixed |
| // there is an associated file |
| // segment may have permissions |
| |
| kind == SkShmC: |
| // smode==SmFixed |
| // there's no associated file: |
| dev==ino==foff = 0, fnidx == -1 |
| // segment may have permissions |
| |
| kind == SkResvn |
| // the segment may be resized if required |
| // there's no associated file: |
| dev==ino==foff = 0, fnidx == -1 |
| // segment has no permissions |
| hasR==hasW==hasX == False |
| |
| Also: hasT==True is only allowed in SkFileC, SkAnonC, and SkShmC |
| (viz, not allowed to make translations from non-client areas) |
| */ |
| typedef |
| struct { |
| SegKind kind; |
| /* Extent */ |
| Addr start; // lowest address in range |
| Addr end; // highest address in range |
| /* Shrinkable? (SkResvn only) */ |
| ShrinkMode smode; |
| /* Associated file (SkFile{C,V} only) */ |
| ULong dev; |
| ULong ino; |
| Off64T offset; |
| UInt mode; |
| Int fnIdx; // file name table index, if name is known |
| /* Permissions (SkAnon{C,V}, SkFile{C,V} only) */ |
| Bool hasR; |
| Bool hasW; |
| Bool hasX; |
| Bool hasT; // True --> translations have (or MAY have) |
| // been taken from this segment |
| Bool isCH; // True --> is client heap (SkAnonC ONLY) |
| } |
| NSegment; |
| |
| |
| /* Collect up the start addresses of segments whose kind matches one of |
| the kinds specified in kind_mask. |
| The interface is a bit strange in order to avoid potential |
| segment-creation races caused by dynamic allocation of the result |
| buffer *starts. |
| |
| The function first computes how many entries in the result |
| buffer *starts will be needed. If this number <= nStarts, |
| they are placed in starts[0..], and the number is returned. |
| If nStarts is not large enough, nothing is written to |
| starts[0..], and the negation of the size is returned. |
| |
| Correct use of this function may mean calling it multiple times in |
| order to establish a suitably-sized buffer. */ |
| extern Int VG_(am_get_segment_starts)( UInt kind_mask, Addr* starts, |
| Int nStarts ); |
| |
| /* Finds the segment containing 'a'. Only returns file/anon/resvn |
| segments. This returns a 'NSegment const *' - a pointer to |
| readonly data. */ |
| extern NSegment const * VG_(am_find_nsegment) ( Addr a ); |
| |
| /* Get the filename corresponding to this segment, if known and if it |
| has one. The function may return NULL if the file name is not known. */ |
| extern const HChar* VG_(am_get_filename)( NSegment const * ); |
| |
| /* Is the area [start .. start+len-1] validly accessible by the |
| client with at least the permissions 'prot' ? To find out |
| simply if said area merely belongs to the client, pass |
| VKI_PROT_NONE as 'prot'. Will return False if any part of the |
| area does not belong to the client or does not have at least |
| the stated permissions. */ |
| extern Bool VG_(am_is_valid_for_client) ( Addr start, SizeT len, |
| UInt prot ); |
| |
| /* Really just a wrapper around VG_(am_mmap_anon_float_valgrind). */ |
| extern void* VG_(am_shadow_alloc)(SizeT size); |
| |
| /* Unmap the given address range and update the segment array |
| accordingly. This fails if the range isn't valid for valgrind. */ |
| extern SysRes VG_(am_munmap_valgrind)( Addr start, SizeT length ); |
| |
| #endif // __PUB_TOOL_ASPACEMGR_H |
| |
| /*--------------------------------------------------------------------*/ |
| /*--- end ---*/ |
| /*--------------------------------------------------------------------*/ |