aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory/paging.cpp
diff options
context:
space:
mode:
authorFabian Imhof <fabian.imhof@ost.ch>2024-10-15 08:23:39 +0000
committerFabian Imhof <fabian.imhof@ost.ch>2024-10-15 08:23:39 +0000
commit205934ca45d591924b4be6e7ae5a8849958e0cf6 (patch)
tree5f0b193fa9620a253690f494405e5d407d97ca56 /arch/x86_64/src/memory/paging.cpp
parent38e0b13ab9a4997fdf9f311fd125825919d2e6c7 (diff)
downloadteachos-205934ca45d591924b4be6e7ae5a8849958e0cf6.tar.xz
teachos-205934ca45d591924b4be6e7ae5a8849958e0cf6.zip
continue implementing paging
Diffstat (limited to 'arch/x86_64/src/memory/paging.cpp')
-rw-r--r--arch/x86_64/src/memory/paging.cpp36
1 files changed, 13 insertions, 23 deletions
diff --git a/arch/x86_64/src/memory/paging.cpp b/arch/x86_64/src/memory/paging.cpp
index 555357c..90c4199 100644
--- a/arch/x86_64/src/memory/paging.cpp
+++ b/arch/x86_64/src/memory/paging.cpp
@@ -1,34 +1,16 @@
#include "arch/memory/paging.hpp"
+#include "arch/exception_handling/assert.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())
+ if (contains_flags(1))
{
auto physical_address = calculate_physical_address();
return physical_frame::containing_address(physical_address);
@@ -39,7 +21,7 @@ namespace teachos::arch::memory
auto entry::calculate_physical_address() const -> std::size_t
{
constexpr std::size_t start_bit = 12U;
- constexpr std::size_t end_bit = 51U;
+ constexpr std::size_t end_bit = 52U;
size_t value = 0U;
for (auto i = start_bit; i < end_bit; i++)
@@ -49,5 +31,13 @@ namespace teachos::arch::memory
return value;
}
- auto entry::is_bit_set(uint8_t index) const -> bool { return flags[index] == 1U; }
+ auto entry::set(physical_frame frame) -> void
+ {
+ arch::exception_handling::assert((frame.start_address() & ~0x000fffff'fffff000) == 0,
+ "Start address is not aligned with Page");
+ flags = std::bitset<64U>(frame.start_address()) | flags;
+ }
+
+ auto entry::contains_flags(std::bitset<64U> b) const -> bool { return (flags & b) == b; }
+
} // namespace teachos::arch::memory