1//===-- mem_map.h -----------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef SCUDO_MEM_MAP_H_
10#define SCUDO_MEM_MAP_H_
11
12#include "mem_map_base.h"
13
14#include "common.h"
15#include "internal_defs.h"
16
17// TODO: This is only used for `MapPlatformData`. Remove these includes when we
18// have all three platform specific `MemMap` and `ReservedMemory`
19// implementations.
20#include "fuchsia.h"
21#include "linux.h"
22#include "trusty.h"
23
24#include "mem_map_fuchsia.h"
25#include "mem_map_linux.h"
26
27namespace scudo {
28
29// This will be deprecated when every allocator has been supported by each
30// platform's `MemMap` implementation.
31class MemMapDefault final : public MemMapBase<MemMapDefault> {
32public:
33 constexpr MemMapDefault() = default;
34 MemMapDefault(uptr Base, uptr Capacity) : Base(Base), Capacity(Capacity) {}
35
36 // Impls for base functions.
37 bool mapImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
38 void unmapImpl(uptr Addr, uptr Size);
39 bool remapImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
40 void setMemoryPermissionImpl(uptr Addr, uptr Size, uptr Flags);
41 void releasePagesToOSImpl(uptr From, uptr Size) {
42 return releaseAndZeroPagesToOSImpl(From, Size);
43 }
44 void releaseAndZeroPagesToOSImpl(uptr From, uptr Size);
45 uptr getBaseImpl() { return Base; }
46 uptr getCapacityImpl() { return Capacity; }
47
48 void setMapPlatformData(MapPlatformData &NewData) { Data = NewData; }
49
50private:
51 uptr Base = 0;
52 uptr Capacity = 0;
53 uptr MappedBase = 0;
54 MapPlatformData Data = {};
55};
56
57// This will be deprecated when every allocator has been supported by each
58// platform's `MemMap` implementation.
59class ReservedMemoryDefault final
60 : public ReservedMemory<ReservedMemoryDefault, MemMapDefault> {
61public:
62 constexpr ReservedMemoryDefault() = default;
63
64 bool createImpl(uptr Addr, uptr Size, const char *Name, uptr Flags);
65 void releaseImpl();
66 MemMapT dispatchImpl(uptr Addr, uptr Size);
67 uptr getBaseImpl() { return Base; }
68 uptr getCapacityImpl() { return Capacity; }
69
70private:
71 uptr Base = 0;
72 uptr Capacity = 0;
73 MapPlatformData Data = {};
74};
75
76#if SCUDO_LINUX
77using ReservedMemoryT = ReservedMemoryLinux;
78using MemMapT = ReservedMemoryT::MemMapT;
79#elif SCUDO_FUCHSIA
80using ReservedMemoryT = ReservedMemoryFuchsia;
81using MemMapT = ReservedMemoryT::MemMapT;
82#elif SCUDO_TRUSTY
83using ReservedMemoryT = ReservedMemoryDefault;
84using MemMapT = ReservedMemoryT::MemMapT;
85#else
86#error \
87 "Unsupported platform, please implement the ReservedMemory for your platform!"
88#endif
89
90} // namespace scudo
91
92#endif // SCUDO_MEM_MAP_H_
93