xref: /llvm-project/compiler-rt/lib/scudo/standalone/mem_map.cpp (revision bfa02523b2e7ed66368ea61866a474e55ef354a3)
1405ceaa0SChia-hung Duan //===-- mem_map.cpp ---------------------------------------------*- C++ -*-===//
2405ceaa0SChia-hung Duan //
3405ceaa0SChia-hung Duan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4405ceaa0SChia-hung Duan // See https://llvm.org/LICENSE.txt for license information.
5405ceaa0SChia-hung Duan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6405ceaa0SChia-hung Duan //
7405ceaa0SChia-hung Duan //===----------------------------------------------------------------------===//
8405ceaa0SChia-hung Duan 
9405ceaa0SChia-hung Duan #include "mem_map.h"
10405ceaa0SChia-hung Duan 
11405ceaa0SChia-hung Duan #include "common.h"
12405ceaa0SChia-hung Duan 
13405ceaa0SChia-hung Duan namespace scudo {
14405ceaa0SChia-hung Duan 
mapImpl(uptr Addr,uptr Size,const char * Name,uptr Flags)15405ceaa0SChia-hung Duan bool MemMapDefault::mapImpl(uptr Addr, uptr Size, const char *Name,
16405ceaa0SChia-hung Duan                             uptr Flags) {
17405ceaa0SChia-hung Duan   void *MappedAddr =
18405ceaa0SChia-hung Duan       ::scudo::map(reinterpret_cast<void *>(Addr), Size, Name, Flags, &Data);
19405ceaa0SChia-hung Duan   if (MappedAddr == nullptr)
20405ceaa0SChia-hung Duan     return false;
21405ceaa0SChia-hung Duan   Base = reinterpret_cast<uptr>(MappedAddr);
22*bfa02523SChia-hung Duan   MappedBase = Base;
23405ceaa0SChia-hung Duan   Capacity = Size;
24405ceaa0SChia-hung Duan   return true;
25405ceaa0SChia-hung Duan }
26405ceaa0SChia-hung Duan 
unmapImpl(uptr Addr,uptr Size)27405ceaa0SChia-hung Duan void MemMapDefault::unmapImpl(uptr Addr, uptr Size) {
28405ceaa0SChia-hung Duan   if (Size == Capacity) {
29*bfa02523SChia-hung Duan     Base = MappedBase = Capacity = 0;
30405ceaa0SChia-hung Duan   } else {
31*bfa02523SChia-hung Duan     if (Base == Addr) {
32405ceaa0SChia-hung Duan       Base = Addr + Size;
33*bfa02523SChia-hung Duan       MappedBase = MappedBase == 0 ? Base : Max(MappedBase, Base);
34*bfa02523SChia-hung Duan     }
35405ceaa0SChia-hung Duan     Capacity -= Size;
36405ceaa0SChia-hung Duan   }
37405ceaa0SChia-hung Duan 
38405ceaa0SChia-hung Duan   ::scudo::unmap(reinterpret_cast<void *>(Addr), Size, UNMAP_ALL, &Data);
39405ceaa0SChia-hung Duan }
40405ceaa0SChia-hung Duan 
remapImpl(uptr Addr,uptr Size,const char * Name,uptr Flags)41405ceaa0SChia-hung Duan bool MemMapDefault::remapImpl(uptr Addr, uptr Size, const char *Name,
42405ceaa0SChia-hung Duan                               uptr Flags) {
43*bfa02523SChia-hung Duan   void *RemappedPtr =
44405ceaa0SChia-hung Duan       ::scudo::map(reinterpret_cast<void *>(Addr), Size, Name, Flags, &Data);
45*bfa02523SChia-hung Duan   const uptr RemappedAddr = reinterpret_cast<uptr>(RemappedPtr);
46*bfa02523SChia-hung Duan   MappedBase = MappedBase == 0 ? RemappedAddr : Min(MappedBase, RemappedAddr);
47*bfa02523SChia-hung Duan   return RemappedAddr == Addr;
48405ceaa0SChia-hung Duan }
49405ceaa0SChia-hung Duan 
releaseAndZeroPagesToOSImpl(uptr From,uptr Size)50405ceaa0SChia-hung Duan void MemMapDefault::releaseAndZeroPagesToOSImpl(uptr From, uptr Size) {
51*bfa02523SChia-hung Duan   DCHECK_NE(MappedBase, 0U);
52*bfa02523SChia-hung Duan   DCHECK_GE(From, MappedBase);
53*bfa02523SChia-hung Duan   return ::scudo::releasePagesToOS(MappedBase, From - MappedBase, Size, &Data);
54405ceaa0SChia-hung Duan }
55405ceaa0SChia-hung Duan 
setMemoryPermissionImpl(uptr Addr,uptr Size,uptr Flags)5609239636SChia-hung Duan void MemMapDefault::setMemoryPermissionImpl(uptr Addr, uptr Size, uptr Flags) {
5709239636SChia-hung Duan   return ::scudo::setMemoryPermission(Addr, Size, Flags);
5809239636SChia-hung Duan }
5909239636SChia-hung Duan 
releaseImpl()60405ceaa0SChia-hung Duan void ReservedMemoryDefault::releaseImpl() {
61405ceaa0SChia-hung Duan   ::scudo::unmap(reinterpret_cast<void *>(Base), Capacity, UNMAP_ALL, &Data);
62405ceaa0SChia-hung Duan }
63405ceaa0SChia-hung Duan 
createImpl(uptr Addr,uptr Size,const char * Name,uptr Flags)64405ceaa0SChia-hung Duan bool ReservedMemoryDefault::createImpl(uptr Addr, uptr Size, const char *Name,
65405ceaa0SChia-hung Duan                                        uptr Flags) {
66405ceaa0SChia-hung Duan   void *Reserved = ::scudo::map(reinterpret_cast<void *>(Addr), Size, Name,
67405ceaa0SChia-hung Duan                                 Flags | MAP_NOACCESS, &Data);
68405ceaa0SChia-hung Duan   if (Reserved == nullptr)
69405ceaa0SChia-hung Duan     return false;
70405ceaa0SChia-hung Duan 
71405ceaa0SChia-hung Duan   Base = reinterpret_cast<uptr>(Reserved);
72405ceaa0SChia-hung Duan   Capacity = Size;
73405ceaa0SChia-hung Duan 
74405ceaa0SChia-hung Duan   return true;
75405ceaa0SChia-hung Duan }
76405ceaa0SChia-hung Duan 
dispatchImpl(uptr Addr,uptr Size)77405ceaa0SChia-hung Duan ReservedMemoryDefault::MemMapT ReservedMemoryDefault::dispatchImpl(uptr Addr,
78405ceaa0SChia-hung Duan                                                                    uptr Size) {
79405ceaa0SChia-hung Duan   ReservedMemoryDefault::MemMapT NewMap(Addr, Size);
80405ceaa0SChia-hung Duan   NewMap.setMapPlatformData(Data);
81405ceaa0SChia-hung Duan   return NewMap;
82405ceaa0SChia-hung Duan }
83405ceaa0SChia-hung Duan 
84405ceaa0SChia-hung Duan } // namespace scudo
85