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