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