xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/scudo/standalone/mem_map.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
106c3fb27SDimitry Andric //===-- mem_map.h -----------------------------------------------*- C++ -*-===//
206c3fb27SDimitry Andric //
306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606c3fb27SDimitry Andric //
706c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
806c3fb27SDimitry Andric 
906c3fb27SDimitry Andric #ifndef SCUDO_MEM_MAP_H_
1006c3fb27SDimitry Andric #define SCUDO_MEM_MAP_H_
1106c3fb27SDimitry Andric 
1206c3fb27SDimitry Andric #include "mem_map_base.h"
1306c3fb27SDimitry Andric 
1406c3fb27SDimitry Andric #include "common.h"
1506c3fb27SDimitry Andric #include "internal_defs.h"
1606c3fb27SDimitry Andric 
1706c3fb27SDimitry Andric // TODO: This is only used for `MapPlatformData`. Remove these includes when we
1806c3fb27SDimitry Andric // have all three platform specific `MemMap` and `ReservedMemory`
1906c3fb27SDimitry Andric // implementations.
2006c3fb27SDimitry Andric #include "fuchsia.h"
2106c3fb27SDimitry Andric #include "linux.h"
2206c3fb27SDimitry Andric #include "trusty.h"
2306c3fb27SDimitry Andric 
2406c3fb27SDimitry Andric #include "mem_map_fuchsia.h"
25*5f757f3fSDimitry Andric #include "mem_map_linux.h"
2606c3fb27SDimitry Andric 
2706c3fb27SDimitry Andric namespace scudo {
2806c3fb27SDimitry Andric 
2906c3fb27SDimitry Andric // This will be deprecated when every allocator has been supported by each
3006c3fb27SDimitry Andric // platform's `MemMap` implementation.
3106c3fb27SDimitry Andric class MemMapDefault final : public MemMapBase<MemMapDefault> {
3206c3fb27SDimitry Andric public:
3306c3fb27SDimitry Andric   constexpr MemMapDefault() = default;
MemMapDefault(uptr Base,uptr Capacity)3406c3fb27SDimitry Andric   MemMapDefault(uptr Base, uptr Capacity) : Base(Base), Capacity(Capacity) {}
3506c3fb27SDimitry Andric 
3606c3fb27SDimitry Andric   // Impls for base functions.
3706c3fb27SDimitry Andric   bool mapImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
3806c3fb27SDimitry Andric   void unmapImpl(uptr Addr, uptr Size);
3906c3fb27SDimitry Andric   bool remapImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
4006c3fb27SDimitry Andric   void setMemoryPermissionImpl(uptr Addr, uptr Size, uptr Flags);
releasePagesToOSImpl(uptr From,uptr Size)4106c3fb27SDimitry Andric   void releasePagesToOSImpl(uptr From, uptr Size) {
4206c3fb27SDimitry Andric     return releaseAndZeroPagesToOSImpl(From, Size);
4306c3fb27SDimitry Andric   }
4406c3fb27SDimitry Andric   void releaseAndZeroPagesToOSImpl(uptr From, uptr Size);
getBaseImpl()4506c3fb27SDimitry Andric   uptr getBaseImpl() { return Base; }
getCapacityImpl()4606c3fb27SDimitry Andric   uptr getCapacityImpl() { return Capacity; }
4706c3fb27SDimitry Andric 
setMapPlatformData(MapPlatformData & NewData)4806c3fb27SDimitry Andric   void setMapPlatformData(MapPlatformData &NewData) { Data = NewData; }
4906c3fb27SDimitry Andric 
5006c3fb27SDimitry Andric private:
5106c3fb27SDimitry Andric   uptr Base = 0;
5206c3fb27SDimitry Andric   uptr Capacity = 0;
5306c3fb27SDimitry Andric   uptr MappedBase = 0;
5406c3fb27SDimitry Andric   MapPlatformData Data = {};
5506c3fb27SDimitry Andric };
5606c3fb27SDimitry Andric 
5706c3fb27SDimitry Andric // This will be deprecated when every allocator has been supported by each
5806c3fb27SDimitry Andric // platform's `MemMap` implementation.
5906c3fb27SDimitry Andric class ReservedMemoryDefault final
6006c3fb27SDimitry Andric     : public ReservedMemory<ReservedMemoryDefault, MemMapDefault> {
6106c3fb27SDimitry Andric public:
6206c3fb27SDimitry Andric   constexpr ReservedMemoryDefault() = default;
6306c3fb27SDimitry Andric 
6406c3fb27SDimitry Andric   bool createImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
6506c3fb27SDimitry Andric   void releaseImpl();
6606c3fb27SDimitry Andric   MemMapT dispatchImpl(uptr Addr, uptr Size);
getBaseImpl()6706c3fb27SDimitry Andric   uptr getBaseImpl() { return Base; }
getCapacityImpl()6806c3fb27SDimitry Andric   uptr getCapacityImpl() { return Capacity; }
6906c3fb27SDimitry Andric 
7006c3fb27SDimitry Andric private:
7106c3fb27SDimitry Andric   uptr Base = 0;
7206c3fb27SDimitry Andric   uptr Capacity = 0;
7306c3fb27SDimitry Andric   MapPlatformData Data = {};
7406c3fb27SDimitry Andric };
7506c3fb27SDimitry Andric 
7606c3fb27SDimitry Andric #if SCUDO_LINUX
77*5f757f3fSDimitry Andric using ReservedMemoryT = ReservedMemoryLinux;
7806c3fb27SDimitry Andric using MemMapT = ReservedMemoryT::MemMapT;
7906c3fb27SDimitry Andric #elif SCUDO_FUCHSIA
80*5f757f3fSDimitry Andric using ReservedMemoryT = ReservedMemoryFuchsia;
8106c3fb27SDimitry Andric using MemMapT = ReservedMemoryT::MemMapT;
8206c3fb27SDimitry Andric #elif SCUDO_TRUSTY
8306c3fb27SDimitry Andric using ReservedMemoryT = ReservedMemoryDefault;
8406c3fb27SDimitry Andric using MemMapT = ReservedMemoryT::MemMapT;
8506c3fb27SDimitry Andric #else
8606c3fb27SDimitry Andric #error                                                                         \
8706c3fb27SDimitry Andric     "Unsupported platform, please implement the ReservedMemory for your platform!"
8806c3fb27SDimitry Andric #endif
8906c3fb27SDimitry Andric 
9006c3fb27SDimitry Andric } // namespace scudo
9106c3fb27SDimitry Andric 
9206c3fb27SDimitry Andric #endif // SCUDO_MEM_MAP_H_
93