xref: /aosp_15_r20/external/scudo/standalone/mem_map.cpp (revision 76559068c068bd27e82aff38fac3bfc865233bca)
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