Path: blob/main/contrib/llvm-project/compiler-rt/lib/scudo/standalone/mem_map.cpp
35292 views
//===-- mem_map.cpp ---------------------------------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "mem_map.h"910#include "common.h"1112namespace scudo {1314bool MemMapDefault::mapImpl(uptr Addr, uptr Size, const char *Name,15uptr Flags) {16void *MappedAddr =17::scudo::map(reinterpret_cast<void *>(Addr), Size, Name, Flags, &Data);18if (MappedAddr == nullptr)19return false;20Base = reinterpret_cast<uptr>(MappedAddr);21MappedBase = Base;22Capacity = Size;23return true;24}2526void MemMapDefault::unmapImpl(uptr Addr, uptr Size) {27if (Size == Capacity) {28Base = MappedBase = Capacity = 0;29} else {30if (Base == Addr) {31Base = Addr + Size;32MappedBase = MappedBase == 0 ? Base : Max(MappedBase, Base);33}34Capacity -= Size;35}3637::scudo::unmap(reinterpret_cast<void *>(Addr), Size, UNMAP_ALL, &Data);38}3940bool MemMapDefault::remapImpl(uptr Addr, uptr Size, const char *Name,41uptr Flags) {42void *RemappedPtr =43::scudo::map(reinterpret_cast<void *>(Addr), Size, Name, Flags, &Data);44const uptr RemappedAddr = reinterpret_cast<uptr>(RemappedPtr);45MappedBase = MappedBase == 0 ? RemappedAddr : Min(MappedBase, RemappedAddr);46return RemappedAddr == Addr;47}4849void MemMapDefault::releaseAndZeroPagesToOSImpl(uptr From, uptr Size) {50DCHECK_NE(MappedBase, 0U);51DCHECK_GE(From, MappedBase);52return ::scudo::releasePagesToOS(MappedBase, From - MappedBase, Size, &Data);53}5455void MemMapDefault::setMemoryPermissionImpl(uptr Addr, uptr Size, uptr Flags) {56return ::scudo::setMemoryPermission(Addr, Size, Flags);57}5859void ReservedMemoryDefault::releaseImpl() {60::scudo::unmap(reinterpret_cast<void *>(Base), Capacity, UNMAP_ALL, &Data);61}6263bool ReservedMemoryDefault::createImpl(uptr Addr, uptr Size, const char *Name,64uptr Flags) {65void *Reserved = ::scudo::map(reinterpret_cast<void *>(Addr), Size, Name,66Flags | MAP_NOACCESS, &Data);67if (Reserved == nullptr)68return false;6970Base = reinterpret_cast<uptr>(Reserved);71Capacity = Size;7273return true;74}7576ReservedMemoryDefault::MemMapT ReservedMemoryDefault::dispatchImpl(uptr Addr,77uptr Size) {78ReservedMemoryDefault::MemMapT NewMap(Addr, Size);79NewMap.setMapPlatformData(Data);80return NewMap;81}8283} // namespace scudo848586