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