blob: 555357ccfba54e96461a6144ade55027236446fc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include "arch/memory/paging.hpp"
namespace teachos::arch::memory
{
auto entry::is_unused() const -> bool { return flags == 0U; }
auto entry::set_unused() -> void { flags = 0U; }
auto entry::present() const -> bool { return is_bit_set(0U); }
auto entry::writable() const -> bool { return is_bit_set(1U); }
auto entry::user_accessible() const -> bool { return is_bit_set(2U); }
auto entry::write_through_caching() const -> bool { return is_bit_set(3U); }
auto entry::disabled_caching() const -> bool { return is_bit_set(4U); }
auto entry::is_accessing() const -> bool { return is_bit_set(5U); }
auto entry::is_diry() const -> bool { return is_bit_set(6U); }
auto entry::is_huge_page() const -> bool { return is_bit_set(7U); }
auto entry::is_global() const -> bool { return is_bit_set(8U); }
auto entry::executing_code_forbidden() const -> bool { return is_bit_set(63U); }
auto entry::calculate_pointed_to_frame() const -> std::optional<physical_frame>
{
if (present())
{
auto physical_address = calculate_physical_address();
return physical_frame::containing_address(physical_address);
}
return std::nullopt;
}
auto entry::calculate_physical_address() const -> std::size_t
{
constexpr std::size_t start_bit = 12U;
constexpr std::size_t end_bit = 51U;
size_t value = 0U;
for (auto i = start_bit; i < end_bit; i++)
{
value |= (flags[i] ? (1 << (i - start_bit)) : 0);
}
return value;
}
auto entry::is_bit_set(uint8_t index) const -> bool { return flags[index] == 1U; }
} // namespace teachos::arch::memory
|