aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64
diff options
context:
space:
mode:
authorFabian Imhof <fabian.imhof@ost.ch>2024-10-20 07:46:51 +0000
committerFabian Imhof <fabian.imhof@ost.ch>2024-10-20 07:46:51 +0000
commitf8928c877c48b5beba9bb42876f70213aba68f88 (patch)
treea72240b5765fccb98e05cdb0248023d5f5464823 /arch/x86_64
parente5206b3bf1883fd9601a37f5cce392d8080b8791 (diff)
downloadteachos-f8928c877c48b5beba9bb42876f70213aba68f88.tar.xz
teachos-f8928c877c48b5beba9bb42876f70213aba68f88.zip
translate
Diffstat (limited to 'arch/x86_64')
-rw-r--r--arch/x86_64/include/arch/memory/paging/virtual_page.hpp63
-rw-r--r--arch/x86_64/src/memory/multiboot/reader.cpp1
-rw-r--r--arch/x86_64/src/memory/paging/page_table.cpp2
-rw-r--r--arch/x86_64/src/memory/paging/virtual_page.cpp1
4 files changed, 64 insertions, 3 deletions
diff --git a/arch/x86_64/include/arch/memory/paging/virtual_page.hpp b/arch/x86_64/include/arch/memory/paging/virtual_page.hpp
index a2e5316..b2adca3 100644
--- a/arch/x86_64/include/arch/memory/paging/virtual_page.hpp
+++ b/arch/x86_64/include/arch/memory/paging/virtual_page.hpp
@@ -1,13 +1,74 @@
#ifndef TEACHOS_ARCH_X86_64_MEMORY_PAGING_VIRTUAL_PAGE_HPP
#define TEACHOS_ARCH_X86_64_MEMORY_PAGING_VIRTUAL_PAGE_HPP
-#include "page_table.hpp"
+#include "arch/memory/allocator/physical_frame.hpp"
+#include "arch/memory/paging/page_table.hpp"
+
#include <compare>
#include <cstdint>
+#include <optional>
namespace teachos::arch::memory::paging
{
/**
+ * @brief Translate virtual into phyical address
+ *
+ * @param virtual_address Address to translate into physical
+ * @return Physical address
+ */
+ auto static translate_address(std::size_t virtual_address) -> std::optional<std::size_t>
+ {
+ std::size_t offset = virtual_address % allocator::PAGE_FRAME_SIZE;
+ virtual_page page = virtual_page::containing_address(virtual_address);
+ allocator::physical_frame frame = paging::translate_page(page);
+
+ if (frame.value())
+ {
+ return frame->number * allocator::PAGE_FRAME_SIZE + offset;
+ }
+
+ return std::nullopt;
+ }
+
+ /**
+ * @brief Translate page into physical_frame
+ *
+ * @param page Page to translate into physical_frame
+ * @return Physical frame corresponding to the provided page_table
+ */
+ auto static translate_page(virtual_page page) -> std::optional<allocator::physical_frame>
+ {
+ auto level3 =
+ reinterpret_cast<page_table>(page_table::LEVEL4)->next_table(page.get_level_index(page_table::LEVEL4));
+
+ auto huge_page = []() {
+ // TODO
+ };
+
+ if (level3.value())
+ {
+ auto level2 = level3->next_table(page.get_level_index(page_table::LEVEL3));
+
+ if (level2.value())
+ {
+ auto level1 = level2->next_table(page.get_level_index(page_table::LEVEL2));
+
+ if (level1.value())
+ {
+ auto frame = level1[page.get_level_index(page_table::LEVEL1)].calculate_pointed_to_frame();
+
+ if (frame.value())
+ {
+ return frame;
+ }
+ }
+ }
+ }
+
+ return huge_page();
+ }
+
+ /**
* @brief Virtual page entry contained in P1 page tables
*/
struct virtual_page
diff --git a/arch/x86_64/src/memory/multiboot/reader.cpp b/arch/x86_64/src/memory/multiboot/reader.cpp
index 156b437..565f604 100644
--- a/arch/x86_64/src/memory/multiboot/reader.cpp
+++ b/arch/x86_64/src/memory/multiboot/reader.cpp
@@ -111,6 +111,7 @@ namespace teachos::arch::memory::multiboot
break;
}
}
+
return mem_info;
}
} // namespace teachos::arch::memory::multiboot
diff --git a/arch/x86_64/src/memory/paging/page_table.cpp b/arch/x86_64/src/memory/paging/page_table.cpp
index 9857294..3fb7a3f 100644
--- a/arch/x86_64/src/memory/paging/page_table.cpp
+++ b/arch/x86_64/src/memory/paging/page_table.cpp
@@ -45,7 +45,7 @@ namespace teachos::arch::memory::paging
if (entry.contains_flags(entry::PRESENT) && !entry.contains_flags(entry::HUGE_PAGE))
{
std::size_t const table_address = reinterpret_cast<std::size_t>(current_table);
- return (table_address << 9) | (table_index << 12);
+ return ((table_address << 9) | (table_index << 12));
}
// TODO: Implement behaviour for huge pages currently not done
return std::nullopt;
diff --git a/arch/x86_64/src/memory/paging/virtual_page.cpp b/arch/x86_64/src/memory/paging/virtual_page.cpp
index dcdec7f..9b803d2 100644
--- a/arch/x86_64/src/memory/paging/virtual_page.cpp
+++ b/arch/x86_64/src/memory/paging/virtual_page.cpp
@@ -1,7 +1,6 @@
#include "arch/memory/paging/virtual_page.hpp"
#include "arch/exception_handling/assert.hpp"
-#include "arch/memory/allocator/physical_frame.hpp"
namespace teachos::arch::memory::paging
{