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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "mem_map.h" 10 11 #include "common.h" 12 13 namespace scudo { 14 15 bool 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 27 void 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 41 bool 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 50 void 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 56 void MemMapDefault::setMemoryPermissionImpl(uptr Addr, uptr Size, uptr Flags) { 57 return ::scudo::setMemoryPermission(Addr, Size, Flags); 58 } 59 60 void ReservedMemoryDefault::releaseImpl() { 61 ::scudo::unmap(reinterpret_cast<void *>(Base), Capacity, UNMAP_ALL, &Data); 62 } 63 64 bool 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 77 ReservedMemoryDefault::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 scudo 85