1*f5fffbe2SChia-hung Duan //===-- mem_map_linux.h -----------------------------------------*- C++ -*-===// 2*f5fffbe2SChia-hung Duan // 3*f5fffbe2SChia-hung Duan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*f5fffbe2SChia-hung Duan // See https://llvm.org/LICENSE.txt for license information. 5*f5fffbe2SChia-hung Duan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*f5fffbe2SChia-hung Duan // 7*f5fffbe2SChia-hung Duan //===----------------------------------------------------------------------===// 8*f5fffbe2SChia-hung Duan 9*f5fffbe2SChia-hung Duan #ifndef SCUDO_MEM_MAP_LINUX_H_ 10*f5fffbe2SChia-hung Duan #define SCUDO_MEM_MAP_LINUX_H_ 11*f5fffbe2SChia-hung Duan 12*f5fffbe2SChia-hung Duan #include "platform.h" 13*f5fffbe2SChia-hung Duan 14*f5fffbe2SChia-hung Duan #if SCUDO_LINUX 15*f5fffbe2SChia-hung Duan 16*f5fffbe2SChia-hung Duan #include "common.h" 17*f5fffbe2SChia-hung Duan #include "mem_map_base.h" 18*f5fffbe2SChia-hung Duan 19*f5fffbe2SChia-hung Duan namespace scudo { 20*f5fffbe2SChia-hung Duan 21*f5fffbe2SChia-hung Duan class MemMapLinux final : public MemMapBase<MemMapLinux> { 22*f5fffbe2SChia-hung Duan public: 23*f5fffbe2SChia-hung Duan constexpr MemMapLinux() = default; MemMapLinux(uptr Base,uptr Capacity)24*f5fffbe2SChia-hung Duan MemMapLinux(uptr Base, uptr Capacity) 25*f5fffbe2SChia-hung Duan : MapBase(Base), MapCapacity(Capacity) {} 26*f5fffbe2SChia-hung Duan 27*f5fffbe2SChia-hung Duan // Impls for base functions. 28*f5fffbe2SChia-hung Duan bool mapImpl(uptr Addr, uptr Size, const char *Name, uptr Flags = 0); 29*f5fffbe2SChia-hung Duan void unmapImpl(uptr Addr, uptr Size); 30*f5fffbe2SChia-hung Duan bool remapImpl(uptr Addr, uptr Size, const char *Name, uptr Flags = 0); 31*f5fffbe2SChia-hung Duan void setMemoryPermissionImpl(uptr Addr, uptr Size, uptr Flags); releasePagesToOSImpl(uptr From,uptr Size)32*f5fffbe2SChia-hung Duan void releasePagesToOSImpl(uptr From, uptr Size) { 33*f5fffbe2SChia-hung Duan return releaseAndZeroPagesToOSImpl(From, Size); 34*f5fffbe2SChia-hung Duan } 35*f5fffbe2SChia-hung Duan void releaseAndZeroPagesToOSImpl(uptr From, uptr Size); getBaseImpl()36*f5fffbe2SChia-hung Duan uptr getBaseImpl() { return MapBase; } getCapacityImpl()37*f5fffbe2SChia-hung Duan uptr getCapacityImpl() { return MapCapacity; } 38*f5fffbe2SChia-hung Duan 39*f5fffbe2SChia-hung Duan private: 40*f5fffbe2SChia-hung Duan uptr MapBase = 0; 41*f5fffbe2SChia-hung Duan uptr MapCapacity = 0; 42*f5fffbe2SChia-hung Duan }; 43*f5fffbe2SChia-hung Duan 44*f5fffbe2SChia-hung Duan // This will be deprecated when every allocator has been supported by each 45*f5fffbe2SChia-hung Duan // platform's `MemMap` implementation. 46*f5fffbe2SChia-hung Duan class ReservedMemoryLinux final 47*f5fffbe2SChia-hung Duan : public ReservedMemory<ReservedMemoryLinux, MemMapLinux> { 48*f5fffbe2SChia-hung Duan public: 49*f5fffbe2SChia-hung Duan // The following two are the Impls for function in `MemMapBase`. getBaseImpl()50*f5fffbe2SChia-hung Duan uptr getBaseImpl() { return MapBase; } getCapacityImpl()51*f5fffbe2SChia-hung Duan uptr getCapacityImpl() { return MapCapacity; } 52*f5fffbe2SChia-hung Duan 53*f5fffbe2SChia-hung Duan // These threes are specific to `ReservedMemory`. 54*f5fffbe2SChia-hung Duan bool createImpl(uptr Addr, uptr Size, const char *Name, uptr Flags); 55*f5fffbe2SChia-hung Duan void releaseImpl(); 56*f5fffbe2SChia-hung Duan MemMapT dispatchImpl(uptr Addr, uptr Size); 57*f5fffbe2SChia-hung Duan 58*f5fffbe2SChia-hung Duan private: 59*f5fffbe2SChia-hung Duan uptr MapBase = 0; 60*f5fffbe2SChia-hung Duan uptr MapCapacity = 0; 61*f5fffbe2SChia-hung Duan }; 62*f5fffbe2SChia-hung Duan 63*f5fffbe2SChia-hung Duan } // namespace scudo 64*f5fffbe2SChia-hung Duan 65*f5fffbe2SChia-hung Duan #endif // SCUDO_LINUX 66*f5fffbe2SChia-hung Duan 67*f5fffbe2SChia-hung Duan #endif // SCUDO_MEM_MAP_LINUX_H_ 68