aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory/page_table.cpp
blob: c716c5c120519af9e60961e8e944d7f456b5feea (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
54
55
56
57
#include "x86_64/memory/page_table.hpp"

#include <algorithm>

namespace teachos::memory::x86_64
{

  auto page_table::entry::clear() -> void
  {
    m_raw = 0;
  }

  auto page_table::entry::present() const -> bool
  {
    return (flags() & flags::present) != flags::empty;
  }

  auto page_table::entry::huge() const -> bool
  {
    return (flags() & flags::huge_page) != flags::empty;
  }

  auto page_table::entry::all_flags() const -> flags
  {
    return std::bit_cast<flags>(m_raw & ~frame_number_mask);
  }

  auto page_table::entry::frame() const -> std::optional<struct frame>
  {
    if (present())
    {
      return frame::containing(physical_address{m_raw & frame_number_mask});
    }
    return std::nullopt;
  }

  auto page_table::entry::frame(struct frame frame, flags flags) -> void
  {
    m_raw = (frame.start_address().raw() | static_cast<std::uint64_t>(flags));
  };

  auto page_table::operator[](std::size_t index) -> entry &
  {
    return m_entries.at(index);
  }

  auto page_table::operator[](std::size_t index) const -> entry const &
  {
    return m_entries.at(index);
  }

  auto page_table::clear() -> void
  {
    std::ranges::for_each(m_entries, &page_table::entry::clear);
  }

}  // namespace teachos::memory::x86_64