85 lines · cpp
1//===-- mem_map.cpp ---------------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "mem_map.h"10 11#include "common.h"12 13namespace scudo {14 15bool MemMapDefault::mapImpl(uptr Addr, uptr Size, const char *Name,16 uptr Flags) {17 void *MappedAddr =18 ::scudo::map(reinterpret_cast<void *>(Addr), Size, Name, Flags, &Data);19 if (MappedAddr == nullptr)20 return false;21 Base = reinterpret_cast<uptr>(MappedAddr);22 MappedBase = Base;23 Capacity = Size;24 return true;25}26 27void MemMapDefault::unmapImpl(uptr Addr, uptr Size) {28 if (Size == Capacity) {29 Base = MappedBase = Capacity = 0;30 } else {31 if (Base == Addr) {32 Base = Addr + Size;33 MappedBase = MappedBase == 0 ? Base : Max(MappedBase, Base);34 }35 Capacity -= Size;36 }37 38 ::scudo::unmap(reinterpret_cast<void *>(Addr), Size, UNMAP_ALL, &Data);39}40 41bool MemMapDefault::remapImpl(uptr Addr, uptr Size, const char *Name,42 uptr Flags) {43 void *RemappedPtr =44 ::scudo::map(reinterpret_cast<void *>(Addr), Size, Name, Flags, &Data);45 const uptr RemappedAddr = reinterpret_cast<uptr>(RemappedPtr);46 MappedBase = MappedBase == 0 ? RemappedAddr : Min(MappedBase, RemappedAddr);47 return RemappedAddr == Addr;48}49 50void MemMapDefault::releaseAndZeroPagesToOSImpl(uptr From, uptr Size) {51 DCHECK_NE(MappedBase, 0U);52 DCHECK_GE(From, MappedBase);53 return ::scudo::releasePagesToOS(MappedBase, From - MappedBase, Size, &Data);54}55 56void MemMapDefault::setMemoryPermissionImpl(uptr Addr, uptr Size, uptr Flags) {57 return ::scudo::setMemoryPermission(Addr, Size, Flags);58}59 60void ReservedMemoryDefault::releaseImpl() {61 ::scudo::unmap(reinterpret_cast<void *>(Base), Capacity, UNMAP_ALL, &Data);62}63 64bool ReservedMemoryDefault::createImpl(uptr Addr, uptr Size, const char *Name,65 uptr Flags) {66 void *Reserved = ::scudo::map(reinterpret_cast<void *>(Addr), Size, Name,67 Flags | MAP_NOACCESS, &Data);68 if (Reserved == nullptr)69 return false;70 71 Base = reinterpret_cast<uptr>(Reserved);72 Capacity = Size;73 74 return true;75}76 77ReservedMemoryDefault::MemMapT ReservedMemoryDefault::dispatchImpl(uptr Addr,78 uptr Size) {79 ReservedMemoryDefault::MemMapT NewMap(Addr, Size);80 NewMap.setMapPlatformData(Data);81 return NewMap;82}83 84} // namespace scudo85