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