xref: /aosp_15_r20/external/scudo/standalone/mem_map.h (revision 76559068c068bd27e82aff38fac3bfc865233bca)
1*76559068SAndroid Build Coastguard Worker //===-- mem_map.h -----------------------------------------------*- 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 #ifndef SCUDO_MEM_MAP_H_
10*76559068SAndroid Build Coastguard Worker #define SCUDO_MEM_MAP_H_
11*76559068SAndroid Build Coastguard Worker 
12*76559068SAndroid Build Coastguard Worker #include "mem_map_base.h"
13*76559068SAndroid Build Coastguard Worker 
14*76559068SAndroid Build Coastguard Worker #include "common.h"
15*76559068SAndroid Build Coastguard Worker #include "internal_defs.h"
16*76559068SAndroid Build Coastguard Worker 
17*76559068SAndroid Build Coastguard Worker // TODO: This is only used for `MapPlatformData`. Remove these includes when we
18*76559068SAndroid Build Coastguard Worker // have all three platform specific `MemMap` and `ReservedMemory`
19*76559068SAndroid Build Coastguard Worker // implementations.
20*76559068SAndroid Build Coastguard Worker #include "fuchsia.h"
21*76559068SAndroid Build Coastguard Worker #include "linux.h"
22*76559068SAndroid Build Coastguard Worker #include "trusty.h"
23*76559068SAndroid Build Coastguard Worker 
24*76559068SAndroid Build Coastguard Worker #include "mem_map_fuchsia.h"
25*76559068SAndroid Build Coastguard Worker #include "mem_map_linux.h"
26*76559068SAndroid Build Coastguard Worker 
27*76559068SAndroid Build Coastguard Worker namespace scudo {
28*76559068SAndroid Build Coastguard Worker 
29*76559068SAndroid Build Coastguard Worker // This will be deprecated when every allocator has been supported by each
30*76559068SAndroid Build Coastguard Worker // platform's `MemMap` implementation.
31*76559068SAndroid Build Coastguard Worker class MemMapDefault final : public MemMapBase<MemMapDefault> {
32*76559068SAndroid Build Coastguard Worker public:
33*76559068SAndroid Build Coastguard Worker   constexpr MemMapDefault() = default;
MemMapDefault(uptr Base,uptr Capacity)34*76559068SAndroid Build Coastguard Worker   MemMapDefault(uptr Base, uptr Capacity) : Base(Base), Capacity(Capacity) {}
35*76559068SAndroid Build Coastguard Worker 
36*76559068SAndroid Build Coastguard Worker   // Impls for base functions.
37*76559068SAndroid Build Coastguard Worker   bool mapImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
38*76559068SAndroid Build Coastguard Worker   void unmapImpl(uptr Addr, uptr Size);
39*76559068SAndroid Build Coastguard Worker   bool remapImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
40*76559068SAndroid Build Coastguard Worker   void setMemoryPermissionImpl(uptr Addr, uptr Size, uptr Flags);
releasePagesToOSImpl(uptr From,uptr Size)41*76559068SAndroid Build Coastguard Worker   void releasePagesToOSImpl(uptr From, uptr Size) {
42*76559068SAndroid Build Coastguard Worker     return releaseAndZeroPagesToOSImpl(From, Size);
43*76559068SAndroid Build Coastguard Worker   }
44*76559068SAndroid Build Coastguard Worker   void releaseAndZeroPagesToOSImpl(uptr From, uptr Size);
getBaseImpl()45*76559068SAndroid Build Coastguard Worker   uptr getBaseImpl() { return Base; }
getCapacityImpl()46*76559068SAndroid Build Coastguard Worker   uptr getCapacityImpl() { return Capacity; }
47*76559068SAndroid Build Coastguard Worker 
setMapPlatformData(MapPlatformData & NewData)48*76559068SAndroid Build Coastguard Worker   void setMapPlatformData(MapPlatformData &NewData) { Data = NewData; }
49*76559068SAndroid Build Coastguard Worker 
50*76559068SAndroid Build Coastguard Worker private:
51*76559068SAndroid Build Coastguard Worker   uptr Base = 0;
52*76559068SAndroid Build Coastguard Worker   uptr Capacity = 0;
53*76559068SAndroid Build Coastguard Worker   uptr MappedBase = 0;
54*76559068SAndroid Build Coastguard Worker   MapPlatformData Data = {};
55*76559068SAndroid Build Coastguard Worker };
56*76559068SAndroid Build Coastguard Worker 
57*76559068SAndroid Build Coastguard Worker // This will be deprecated when every allocator has been supported by each
58*76559068SAndroid Build Coastguard Worker // platform's `MemMap` implementation.
59*76559068SAndroid Build Coastguard Worker class ReservedMemoryDefault final
60*76559068SAndroid Build Coastguard Worker     : public ReservedMemory<ReservedMemoryDefault, MemMapDefault> {
61*76559068SAndroid Build Coastguard Worker public:
62*76559068SAndroid Build Coastguard Worker   constexpr ReservedMemoryDefault() = default;
63*76559068SAndroid Build Coastguard Worker 
64*76559068SAndroid Build Coastguard Worker   bool createImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
65*76559068SAndroid Build Coastguard Worker   void releaseImpl();
66*76559068SAndroid Build Coastguard Worker   MemMapT dispatchImpl(uptr Addr, uptr Size);
getBaseImpl()67*76559068SAndroid Build Coastguard Worker   uptr getBaseImpl() { return Base; }
getCapacityImpl()68*76559068SAndroid Build Coastguard Worker   uptr getCapacityImpl() { return Capacity; }
69*76559068SAndroid Build Coastguard Worker 
70*76559068SAndroid Build Coastguard Worker private:
71*76559068SAndroid Build Coastguard Worker   uptr Base = 0;
72*76559068SAndroid Build Coastguard Worker   uptr Capacity = 0;
73*76559068SAndroid Build Coastguard Worker   MapPlatformData Data = {};
74*76559068SAndroid Build Coastguard Worker };
75*76559068SAndroid Build Coastguard Worker 
76*76559068SAndroid Build Coastguard Worker #if SCUDO_LINUX
77*76559068SAndroid Build Coastguard Worker using ReservedMemoryT = ReservedMemoryLinux;
78*76559068SAndroid Build Coastguard Worker using MemMapT = ReservedMemoryT::MemMapT;
79*76559068SAndroid Build Coastguard Worker #elif SCUDO_FUCHSIA
80*76559068SAndroid Build Coastguard Worker using ReservedMemoryT = ReservedMemoryFuchsia;
81*76559068SAndroid Build Coastguard Worker using MemMapT = ReservedMemoryT::MemMapT;
82*76559068SAndroid Build Coastguard Worker #elif SCUDO_TRUSTY
83*76559068SAndroid Build Coastguard Worker using ReservedMemoryT = ReservedMemoryDefault;
84*76559068SAndroid Build Coastguard Worker using MemMapT = ReservedMemoryT::MemMapT;
85*76559068SAndroid Build Coastguard Worker #else
86*76559068SAndroid Build Coastguard Worker #error                                                                         \
87*76559068SAndroid Build Coastguard Worker     "Unsupported platform, please implement the ReservedMemory for your platform!"
88*76559068SAndroid Build Coastguard Worker #endif
89*76559068SAndroid Build Coastguard Worker 
90*76559068SAndroid Build Coastguard Worker } // namespace scudo
91*76559068SAndroid Build Coastguard Worker 
92*76559068SAndroid Build Coastguard Worker #endif // SCUDO_MEM_MAP_H_
93