1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- The address space manager.              pub_core_aspacemgr.h ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of Valgrind, a dynamic binary instrumentation
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   framework.
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2000-2013 Julian Seward
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      jseward@acm.org
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02111-1307, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __PUB_CORE_ASPACEMGR_H
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __PUB_CORE_ASPACEMGR_H
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//--------------------------------------------------------------------
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// PURPOSE: This module deals with management of the entire process
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// address space.  Almost everything depends upon it, including dynamic
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// memory management.  Hence this module is almost completely
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// standalone; the only module it uses is m_debuglog.  DO NOT CHANGE
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// THIS.
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//--------------------------------------------------------------------
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_aspacemgr.h"
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//--------------------------------------------------------------
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Definition of address-space segments
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* types SegKind, ShrinkMode and NSegment are described in
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the tool-visible header file, not here. */
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//--------------------------------------------------------------
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Initialisation
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Initialise the address space manager, setting up the initial
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   segment list, and reading /proc/self/maps into it.  This must
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   be called before any other function.
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Takes a pointer to the SP at the time V gained control.  This is
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   taken to be the highest usable address (more or less).  Based on
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   that (and general consultation of tea leaves, etc) return a
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   suggested end address for the client's stack. */
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Addr VG_(am_startup) ( Addr sp_at_startup );
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//--------------------------------------------------------------
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Querying current status
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Finds the segment containing 'a'.  Only returns file/anon/resvn
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   segments.  This returns a 'NSegment const *' - a pointer to
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   readonly data. */
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Is in tool-visible header file.
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// extern NSegment const * VG_(am_find_nsegment) ( Addr a );
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Find the next segment along from 'here', if it is a file/anon/resvn
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   segment. */
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern NSegment const* VG_(am_next_nsegment) ( const NSegment* here,
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               Bool fwds );
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Is the area [start .. start+len-1] validly accessible by the
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   client with at least the permissions 'prot' ?  To find out
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   simply if said area merely belongs to the client, pass
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VKI_PROT_NONE as 'prot'.  Will return False if any part of the
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   area does not belong to the client or does not have at least
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the stated permissions. */
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Is in tool-visible header file.
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// extern Bool VG_(am_is_valid_for_client)
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//   ( Addr start, SizeT len, UInt prot );
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
89eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/* Same as VG_(am_is_valid_for_client) but for valgrind :
90eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   test if memory is addressable by valgrind with at least
91eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   the protection 'prot'. */
92eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovextern Bool VG_(am_is_valid_for_valgrind)
93eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   ( Addr start, SizeT len, UInt prot );
94eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Variant of VG_(am_is_valid_for_client) which allows free areas to
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   be consider part of the client's addressable space.  It also
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   considers reservations to be allowable, since from the client's
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   point of view they don't exist. */
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(am_is_valid_for_client_or_free_or_resvn)
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ( Addr start, SizeT len, UInt prot );
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Trivial fn: return the total amount of space in anonymous mappings,
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   both for V and the client.  Is used for printing stats in
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   out-of-memory messages. */
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ULong VG_(am_get_anonsize_total)( void );
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Show the segment array on the debug log, at given loglevel. */
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern void VG_(am_show_nsegments) ( Int logLevel, const HChar* who );
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Get the filename corresponding to this segment, if known and if it
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   has one.  The returned name's storage cannot be assumed to be
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   persistent, so the caller should immediately copy the name
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   elsewhere.  This may return NULL if the file name is not known or
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for arbitrary other implementation-dependent reasons, so callers
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   need to be able to handle a NULL return value. */
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Is in tool-visible header file.
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// extern HChar* VG_(am_get_filename)( NSegment* );
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* VG_(am_get_segment_starts) is also part of this section, but its
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   prototype is tool-visible, hence not in this header file. */
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Sanity check: check that Valgrind and the kernel agree on the
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   address space layout.  Prints offending segments and call point if
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   a discrepancy is detected, but does not abort the system.  Returned
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Bool is False if a discrepancy was found. */
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(am_do_sync_check) ( const HChar* fn,
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    const HChar* file, Int line );
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//--------------------------------------------------------------
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Functions pertaining to the central query-notify mechanism
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// used to handle mmap/munmap/mprotect resulting from client
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// syscalls.
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Describes a request for VG_(am_get_advisory). */
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      enum { MFixed, MHint, MAny } rkind;
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Addr start;
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Addr len;
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MapRequest;
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Query aspacem to ask where a mapping should go.  On success, the
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   advised placement is returned, and *ok is set to True.  On failure,
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   zero is returned and *ok is set to False.  Note that *ok must be
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   consulted by the caller to establish success or failure; that
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cannot be established reliably from the returned value.  If *ok is
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set to False, it means aspacem has vetoed the mapping, and so the
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   caller should not proceed with it. */
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Addr VG_(am_get_advisory)
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ( MapRequest* req, Bool forClient, /*OUT*/Bool* ok );
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Convenience wrapper for VG_(am_get_advisory) for client floating or
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fixed requests.  If start is zero, a floating request is issued; if
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   nonzero, a fixed request at that address is issued.  Same comments
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   about return values apply. */
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Addr VG_(am_get_advisory_client_simple)
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ( Addr start, SizeT len, /*OUT*/Bool* ok );
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Returns True if [start, start + len - 1] is covered by a single
162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   free segment, otherwise returns False.
163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   This allows to check the following case:
164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VG_(am_get_advisory_client_simple) (first arg == 0, meaning
165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   this-or-nothing) is too lenient, and may allow us to trash
166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   the next segment along.  So make very sure that the proposed
167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   new area really is free.  This is perhaps overly
168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   conservative, but it fixes #129866. */
169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Bool VG_(am_covered_by_single_free_segment)
170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ( Addr start, SizeT len);
171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notifies aspacem that the client completed an mmap successfully.
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The segment array is updated accordingly.  If the returned Bool is
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   True, the caller should immediately discard translations from the
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   specified address range. */
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(am_notify_client_mmap)
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ( Addr a, SizeT len, UInt prot, UInt flags, Int fd, Off64T offset );
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notifies aspacem that the client completed a shmat successfully.
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The segment array is updated accordingly.  If the returned Bool is
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   True, the caller should immediately discard translations from the
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   specified address range. */
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(am_notify_client_shmat)( Addr a, SizeT len, UInt prot );
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notifies aspacem that an mprotect was completed successfully.  The
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   segment array is updated accordingly.  Note, as with
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(am_notify_munmap), it is not the job of this function to reject
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   stupid mprotects, for example the client doing mprotect of
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   non-client areas.  Such requests should be intercepted earlier, by
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the syscall wrapper for mprotect.  This function merely records
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   whatever it is told.  If the returned Bool is True, the caller
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   should immediately discard translations from the specified address
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   range. */
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(am_notify_mprotect)( Addr start, SizeT len, UInt prot );
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Notifies aspacem that an munmap completed successfully.  The
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   segment array is updated accordingly.  As with
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(am_notify_munmap), we merely record the given info, and don't
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   check it for sensibleness.  If the returned Bool is True, the
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   caller should immediately discard translations from the specified
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   address range. */
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(am_notify_munmap)( Addr start, SizeT len );
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Hand a raw mmap to the kernel, without aspacem updating the segment
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   array.  THIS FUNCTION IS DANGEROUS -- it will cause aspacem's view
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   of the address space to diverge from that of the kernel.  DO NOT
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   USE IT UNLESS YOU UNDERSTAND the request-notify model used by
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   aspacem.  In short, DO NOT USE THIS FUNCTION. */
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern SysRes VG_(am_do_mmap_NO_NOTIFY)
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ( Addr start, SizeT length, UInt prot, UInt flags, Int fd, Off64T offset);
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//--------------------------------------------------------------
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Dealing with mappings which do not arise directly from the
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// simulation of the client.  These are typically used for
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// loading the client and building its stack/data segment, before
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// execution begins.  Also for V's own administrative use.
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --- --- --- map, unmap, protect  --- --- --- */
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Map a file at a fixed address for the client, and update the
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   segment array accordingly. */
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern SysRes VG_(am_mmap_file_fixed_client)
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ( Addr start, SizeT length, UInt prot, Int fd, Off64T offset );
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern SysRes VG_(am_mmap_named_file_fixed_client)
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ( Addr start, SizeT length, UInt prot, Int fd, Off64T offset, const HChar *name );
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Map anonymously at a fixed address for the client, and update
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the segment array accordingly. */
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern SysRes VG_(am_mmap_anon_fixed_client)
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ( Addr start, SizeT length, UInt prot );
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Map anonymously at an unconstrained address for the client, and
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   update the segment array accordingly.  */
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern SysRes VG_(am_mmap_anon_float_client) ( SizeT length, Int prot );
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Map anonymously at an unconstrained address for V, and update the
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   segment array accordingly.  This is fundamentally how V allocates
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   itself more address space when needed. */
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern SysRes VG_(am_mmap_anon_float_valgrind)( SizeT cszB );
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Map privately a file at an unconstrained address for V, and update the
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   segment array accordingly.  This is used by V for transiently
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mapping in object files to read their debug info.  */
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern SysRes VG_(am_mmap_file_float_valgrind)
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ( SizeT length, UInt prot, Int fd, Off64T offset );
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Map shared a file at an unconstrained address for V, and update the
250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   segment array accordingly.  This is used by V for communicating
251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   with vgdb.  */
252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern SysRes VG_(am_shared_mmap_file_float_valgrind)
253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ( SizeT length, UInt prot, Int fd, Off64T offset );
254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Unmap the given address range and update the segment array
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   accordingly.  This fails if the range isn't valid for the client.
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   If *need_discard is True after a successful return, the caller
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   should immediately discard translations from the specified address
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   range. */
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern SysRes VG_(am_munmap_client)( /*OUT*/Bool* need_discard,
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     Addr start, SizeT length );
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Let (start,len) denote an area within a single Valgrind-owned
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  segment (anon or file).  Change the ownership of [start, start+len)
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  to the client instead.  Fails if (start,len) does not denote a
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  suitable segment. */
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(am_change_ownership_v_to_c)( Addr start, SizeT len );
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 'seg' must be NULL or have been obtained from
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VG_(am_find_nsegment), and still valid.  If non-NULL, and if it
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   denotes a SkAnonC (anonymous client mapping) area, set the .isCH
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (is-client-heap) flag for that area.  Otherwise do nothing.
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (Bizarre interface so that the same code works for both Linux and
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AIX and does not impose inefficiencies on the Linux version.) */
275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern void VG_(am_set_segment_isCH_if_SkAnonC)( const NSegment* seg );
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Same idea as VG_(am_set_segment_isCH_if_SkAnonC), except set the
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   segment's hasT bit (has-cached-code) if this is SkFileC or SkAnonC
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   segment. */
280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern void VG_(am_set_segment_hasT_if_SkFileC_or_SkAnonC)( const NSegment* );
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --- --- --- reservations --- --- --- */
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Create a reservation from START .. START+LENGTH-1, with the given
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ShrinkMode.  When checking whether the reservation can be created,
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   also ensure that at least abs(EXTRA) extra free bytes will remain
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   above (> 0) or below (< 0) the reservation.
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The reservation will only be created if it, plus the extra-zone,
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   falls entirely within a single free segment.  The returned Bool
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   indicates whether the creation succeeded. */
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(am_create_reservation)
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ( Addr start, SizeT length, ShrinkMode smode, SSizeT extra );
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Let SEG be an anonymous client mapping.  This fn extends the
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mapping by DELTA bytes, taking the space from a reservation section
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   which must be adjacent.  If DELTA is positive, the segment is
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   extended forwards in the address space, and the reservation must be
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the next one along.  If DELTA is negative, the segment is extended
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   backwards in the address space and the reservation must be the
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   previous one.  DELTA must be page aligned.  abs(DELTA) must not
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   exceed the size of the reservation segment minus one page, that is,
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the reservation segment after the operation must be at least one
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   page long. */
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(am_extend_into_adjacent_reservation_client)
306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ( const NSegment* seg, SSizeT delta );
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --- --- --- resizing/move a mapping --- --- --- */
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Let SEG be a client mapping (anonymous or file).  This fn extends
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the mapping forwards only by DELTA bytes, and trashes whatever was
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   in the new area.  Fails if SEG is not a single client mapping or if
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the new area is not accessible to the client.  Fails if DELTA is
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   not page aligned.  *seg is invalid after a successful return.  If
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *need_discard is True after a successful return, the caller should
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   immediately discard translations from the new area. */
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(am_extend_map_client)( /*OUT*/Bool* need_discard,
318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       const NSegment* seg, SizeT delta );
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Remap the old address range to the new address range.  Fails if any
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   parameter is not page aligned, if the either size is zero, if any
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   wraparound is implied, if the old address range does not fall
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   entirely within a single segment, if the new address range overlaps
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   with the old one, or if the old address range is not a valid client
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mapping.  If *need_discard is True after a successful return, the
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   caller should immediately discard translations from both specified
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   address ranges.  */
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(am_relocate_nooverlap_client)( /*OUT*/Bool* need_discard,
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                               Addr old_addr, SizeT old_len,
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                               Addr new_addr, SizeT new_len );
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//--------------------------------------------------------------
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Valgrind (non-client) thread stacks.  V itself runs on such
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// stacks.  The address space manager provides and suitably
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// protects such stacks.
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux) \
338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    || defined(VGP_mips32_linux) || defined(VGP_mips64_linux) \
339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    || defined(VGP_arm64_linux)
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define VG_STACK_GUARD_SZB  65536  // 1 or 16 pages
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define VG_STACK_ACTIVE_SZB (4096 * 256) // 1Mb
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define VG_STACK_GUARD_SZB  8192   // 2 pages
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define VG_STACK_ACTIVE_SZB (4096 * 256) // 1Mb
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      HChar bytes[VG_STACK_GUARD_SZB
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  + VG_STACK_ACTIVE_SZB
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  + VG_STACK_GUARD_SZB];
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VgStack;
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
356eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/* Allocate and initialise a VgStack (anonymous valgrind space).
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Protect the stack active area and the guard areas appropriately.
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Returns NULL on failure, else the address of the bottom of the
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   stack.  On success, also sets *initial_sp to what the stack pointer
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   should be set to. */
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern VgStack* VG_(am_alloc_VgStack)( /*OUT*/Addr* initial_sp );
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Figure out how many bytes of the stack's active area have not been
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   used.  Used for estimating if we are close to overflowing it.  If
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the free area is larger than 'limit', just return 'limit'. */
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern SizeT VG_(am_get_VgStack_unused_szB)( VgStack* stack, SizeT limit );
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// DDD: this is ugly
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGO_darwin)
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool   is_added;  // Added or removed seg?
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Addr   start;
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SizeT  end;
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   prot;      // Not used for removed segs.
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Off64T offset;    // Not used for removed segs.
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ChangedSeg;
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool VG_(get_changed_segments)(
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      const HChar* when, const HChar* where, /*OUT*/ChangedSeg* css,
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int css_size, /*OUT*/Int* css_used);
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif   // __PUB_CORE_ASPACEMGR_H
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                                          ---*/
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
391