Iros
 
Loading...
Searching...
No Matches
region.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/assert/prelude.h"
7
8namespace iris::mm {
9enum class RegionFlags {
10 None = 0,
14 User = 8,
15};
16
18
19class Region;
20
22 constexpr static void did_remove(auto&, auto& node);
23};
24
25class Region : public di::IntrusiveTreeSetNode<AddressSpaceRegionListTag> {
26public:
27 Region() = default;
28
30 : m_base(base), m_length(length), m_flags(flags) {
31 ASSERT_GT(length, 0U);
32 ASSERT_EQ(length % 0x1000, 0U);
33 }
34
35 constexpr auto base() const -> VirtualAddress { return m_base; }
36 constexpr auto end() const -> VirtualAddress { return m_base + length(); }
37 constexpr auto length() const -> usize { return m_length; }
38 constexpr auto pages() const -> usize { return length() / 0x1000; }
39
40 constexpr auto each_page() const { return di::iota(base(), end()) | di::stride(0x1000z); }
41
42 constexpr void set_base(VirtualAddress base) { m_base = base; }
43 constexpr void set_length(usize length) { m_length = length; }
44 constexpr void set_flags(RegionFlags flags) { m_flags = flags; }
46 m_backing_object = di::move(backing_object);
47 }
48 constexpr void set_end(VirtualAddress end) { m_length = end - m_base; }
49
50 constexpr auto flags() const -> RegionFlags { return m_flags; }
51 constexpr auto backing_object() const -> BackingObject& { return *m_backing_object; }
52
53 constexpr auto readable() const -> bool { return !!(m_flags & RegionFlags::Readable); }
54 constexpr auto writable() const -> bool { return !!(m_flags & RegionFlags::Writable); }
55 constexpr auto executable() const -> bool { return !!(m_flags & RegionFlags::Executable); }
56 constexpr auto user() const -> bool { return !!(m_flags & RegionFlags::User); }
57
58 constexpr auto contains(VirtualAddress b) const -> bool { return b >= base() && b < end(); }
59
60 constexpr auto compare_with_address(VirtualAddress b) const -> di::strong_ordering {
61 if (contains(b)) {
62 return di::strong_ordering::equal;
63 }
64 if (base() < b) {
65 return di::strong_ordering::less;
66 }
67 return di::strong_ordering::greater;
68 }
69
70private:
71 constexpr friend auto operator==(Region const& a, Region const& b) -> bool { return a.base() == b.base(); }
72 constexpr friend auto operator<=>(Region const& a, Region const& b) -> di::strong_ordering {
73 // We assume that Region object which are compared are not overlapping.
74 // This invariant is ensured by the AddressSpace object, which internally
75 // uses this comparison function in its di::TreeSet<> of Regions.
76 return a.base() <=> b.base();
77 }
78
79 // There overloads are provided to enable heterogenous lookup of Region objects in a
80 // di::TreeSet by a VirtualAddress.
81 constexpr friend auto operator==(Region const& a, VirtualAddress b) -> bool { return a.contains(b); }
82 constexpr friend auto operator<=>(Region const& a, VirtualAddress b) -> di::strong_ordering {
83 return a.compare_with_address(b);
84 }
85
86 VirtualAddress m_base;
87 usize m_length { 0 };
88 di::Arc<BackingObject> m_backing_object;
89 RegionFlags m_flags {};
90};
91
92constexpr void AddressSpaceRegionListTag::did_remove(auto&, auto& node) {
93 auto to_drop = di::Box<Region>(di::addressof(node));
94}
95}
#define ASSERT_EQ
Definition assert_binary.h:84
#define ASSERT_GT
Definition assert_binary.h:89
#define DI_DEFINE_ENUM_BITWISE_OPERATIONS(Type)
Definition bitwise_enum.h:5
Definition box.h:28
Definition backing_object.h:21
constexpr auto pages() const -> usize
Definition region.h:38
constexpr auto readable() const -> bool
Definition region.h:53
constexpr friend auto operator<=>(Region const &a, Region const &b) -> di::strong_ordering
Definition region.h:72
constexpr void set_base(VirtualAddress base)
Definition region.h:42
constexpr auto base() const -> VirtualAddress
Definition region.h:35
constexpr Region(VirtualAddress base, usize length, RegionFlags flags)
Definition region.h:29
Region()=default
constexpr auto length() const -> usize
Definition region.h:37
constexpr auto writable() const -> bool
Definition region.h:54
constexpr auto backing_object() const -> BackingObject &
Definition region.h:51
constexpr void set_backing_object(di::Arc< BackingObject > backing_object)
Definition region.h:45
constexpr auto each_page() const
Definition region.h:40
constexpr void set_end(VirtualAddress end)
Definition region.h:48
constexpr friend auto operator<=>(Region const &a, VirtualAddress b) -> di::strong_ordering
Definition region.h:82
constexpr auto executable() const -> bool
Definition region.h:55
constexpr friend auto operator==(Region const &a, VirtualAddress b) -> bool
Definition region.h:81
constexpr auto flags() const -> RegionFlags
Definition region.h:50
constexpr auto end() const -> VirtualAddress
Definition region.h:36
constexpr auto contains(VirtualAddress b) const -> bool
Definition region.h:58
constexpr friend auto operator==(Region const &a, Region const &b) -> bool
Definition region.h:71
constexpr void set_flags(RegionFlags flags)
Definition region.h:44
constexpr auto user() const -> bool
Definition region.h:56
constexpr auto compare_with_address(VirtualAddress b) const -> di::strong_ordering
Definition region.h:60
constexpr void set_length(usize length)
Definition region.h:43
RBTreeNode< Tag > IntrusiveTreeSetNode
Definition tree_set.h:11
size_t usize
Definition integers.h:33
IntrusivePtr< T, ArcTag > Arc
Definition arc.h:21
Definition address_space.cpp:20
di::StrongInt< VirtualAddressTag > VirtualAddress
Definition virtual_address.h:25
RegionFlags
Definition region.h:9
@ Executable
Definition region.h:13
@ Readable
Definition region.h:11
@ User
Definition region.h:14
@ Writable
Definition region.h:12
@ None
Definition local_apic.h:125
Definition intrusive_tag_base.h:8
static constexpr void did_remove(auto &, auto &node)
Definition region.h:92