xref: /llvm-project/compiler-rt/lib/scudo/standalone/mem_map_linux.h (revision f5fffbe2a587a8ac39b98448a9fb3b552543464f)
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