xref: /llvm-project/compiler-rt/lib/scudo/standalone/mem_map.h (revision f5fffbe2a587a8ac39b98448a9fb3b552543464f)
1405ceaa0SChia-hung Duan //===-- mem_map.h -----------------------------------------------*- 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 #ifndef SCUDO_MEM_MAP_H_
10405ceaa0SChia-hung Duan #define SCUDO_MEM_MAP_H_
11405ceaa0SChia-hung Duan 
12405ceaa0SChia-hung Duan #include "mem_map_base.h"
13405ceaa0SChia-hung Duan 
14405ceaa0SChia-hung Duan #include "common.h"
15405ceaa0SChia-hung Duan #include "internal_defs.h"
16405ceaa0SChia-hung Duan 
17405ceaa0SChia-hung Duan // TODO: This is only used for `MapPlatformData`. Remove these includes when we
18405ceaa0SChia-hung Duan // have all three platform specific `MemMap` and `ReservedMemory`
19405ceaa0SChia-hung Duan // implementations.
20405ceaa0SChia-hung Duan #include "fuchsia.h"
21405ceaa0SChia-hung Duan #include "linux.h"
22405ceaa0SChia-hung Duan #include "trusty.h"
23405ceaa0SChia-hung Duan 
243003da71SFabio D'Urso #include "mem_map_fuchsia.h"
25*f5fffbe2SChia-hung Duan #include "mem_map_linux.h"
263003da71SFabio D'Urso 
27405ceaa0SChia-hung Duan namespace scudo {
28405ceaa0SChia-hung Duan 
29405ceaa0SChia-hung Duan // This will be deprecated when every allocator has been supported by each
30405ceaa0SChia-hung Duan // platform's `MemMap` implementation.
31405ceaa0SChia-hung Duan class MemMapDefault final : public MemMapBase<MemMapDefault> {
32405ceaa0SChia-hung Duan public:
33405ceaa0SChia-hung Duan   constexpr MemMapDefault() = default;
MemMapDefault(uptr Base,uptr Capacity)34405ceaa0SChia-hung Duan   MemMapDefault(uptr Base, uptr Capacity) : Base(Base), Capacity(Capacity) {}
35405ceaa0SChia-hung Duan 
36405ceaa0SChia-hung Duan   // Impls for base functions.
37405ceaa0SChia-hung Duan   bool mapImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
38405ceaa0SChia-hung Duan   void unmapImpl(uptr Addr, uptr Size);
39405ceaa0SChia-hung Duan   bool remapImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
4009239636SChia-hung Duan   void setMemoryPermissionImpl(uptr Addr, uptr Size, uptr Flags);
releasePagesToOSImpl(uptr From,uptr Size)41405ceaa0SChia-hung Duan   void releasePagesToOSImpl(uptr From, uptr Size) {
42405ceaa0SChia-hung Duan     return releaseAndZeroPagesToOSImpl(From, Size);
43405ceaa0SChia-hung Duan   }
44405ceaa0SChia-hung Duan   void releaseAndZeroPagesToOSImpl(uptr From, uptr Size);
getBaseImpl()45405ceaa0SChia-hung Duan   uptr getBaseImpl() { return Base; }
getCapacityImpl()46405ceaa0SChia-hung Duan   uptr getCapacityImpl() { return Capacity; }
47405ceaa0SChia-hung Duan 
setMapPlatformData(MapPlatformData & NewData)48405ceaa0SChia-hung Duan   void setMapPlatformData(MapPlatformData &NewData) { Data = NewData; }
49405ceaa0SChia-hung Duan 
50405ceaa0SChia-hung Duan private:
51405ceaa0SChia-hung Duan   uptr Base = 0;
52405ceaa0SChia-hung Duan   uptr Capacity = 0;
53bfa02523SChia-hung Duan   uptr MappedBase = 0;
54405ceaa0SChia-hung Duan   MapPlatformData Data = {};
55405ceaa0SChia-hung Duan };
56405ceaa0SChia-hung Duan 
57405ceaa0SChia-hung Duan // This will be deprecated when every allocator has been supported by each
58405ceaa0SChia-hung Duan // platform's `MemMap` implementation.
59405ceaa0SChia-hung Duan class ReservedMemoryDefault final
60405ceaa0SChia-hung Duan     : public ReservedMemory<ReservedMemoryDefault, MemMapDefault> {
61405ceaa0SChia-hung Duan public:
62405ceaa0SChia-hung Duan   constexpr ReservedMemoryDefault() = default;
63405ceaa0SChia-hung Duan 
64405ceaa0SChia-hung Duan   bool createImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
65405ceaa0SChia-hung Duan   void releaseImpl();
66405ceaa0SChia-hung Duan   MemMapT dispatchImpl(uptr Addr, uptr Size);
getBaseImpl()67405ceaa0SChia-hung Duan   uptr getBaseImpl() { return Base; }
getCapacityImpl()68405ceaa0SChia-hung Duan   uptr getCapacityImpl() { return Capacity; }
69405ceaa0SChia-hung Duan 
70405ceaa0SChia-hung Duan private:
71405ceaa0SChia-hung Duan   uptr Base = 0;
72405ceaa0SChia-hung Duan   uptr Capacity = 0;
73405ceaa0SChia-hung Duan   MapPlatformData Data = {};
74405ceaa0SChia-hung Duan };
75405ceaa0SChia-hung Duan 
76405ceaa0SChia-hung Duan #if SCUDO_LINUX
77*f5fffbe2SChia-hung Duan using ReservedMemoryT = ReservedMemoryLinux;
78405ceaa0SChia-hung Duan using MemMapT = ReservedMemoryT::MemMapT;
79405ceaa0SChia-hung Duan #elif SCUDO_FUCHSIA
80254d28fcSFabio D'Urso using ReservedMemoryT = ReservedMemoryFuchsia;
81405ceaa0SChia-hung Duan using MemMapT = ReservedMemoryT::MemMapT;
82405ceaa0SChia-hung Duan #elif SCUDO_TRUSTY
83405ceaa0SChia-hung Duan using ReservedMemoryT = ReservedMemoryDefault;
84405ceaa0SChia-hung Duan using MemMapT = ReservedMemoryT::MemMapT;
85405ceaa0SChia-hung Duan #else
86405ceaa0SChia-hung Duan #error                                                                         \
87405ceaa0SChia-hung Duan     "Unsupported platform, please implement the ReservedMemory for your platform!"
88405ceaa0SChia-hung Duan #endif
89405ceaa0SChia-hung Duan 
90405ceaa0SChia-hung Duan } // namespace scudo
91405ceaa0SChia-hung Duan 
92405ceaa0SChia-hung Duan #endif // SCUDO_MEM_MAP_H_
93