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