#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 { 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