aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/test_support/page_mapper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/test_support/page_mapper.cpp')
-rw-r--r--kernel/src/test_support/page_mapper.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/kernel/src/test_support/page_mapper.cpp b/kernel/src/test_support/page_mapper.cpp
index 5a1b747..805998b 100644
--- a/kernel/src/test_support/page_mapper.cpp
+++ b/kernel/src/test_support/page_mapper.cpp
@@ -7,6 +7,7 @@
#include <cstddef>
#include <format>
#include <stdexcept>
+#include <sys/mman.h>
namespace kernel::tests
{
@@ -20,10 +21,25 @@ namespace kernel::tests
page_mappings.insert({page.number(), frame});
auto page_address = page.start_address();
+ auto sandbox_start = memory.heap_base();
+ auto sandbox_end = sandbox_start + memory.heap_size();
- if (page_address >= kapi::memory::mmio_base)
+ if (page_address >= sandbox_start && page_address < sandbox_end)
{
- throw std::invalid_argument{"MMIO mapping not yet supported in testing!"};
+ auto virtual_target = static_cast<std::byte *>(page_address);
+ auto physical_offset = frame.number() * kapi::memory::frame::size;
+ auto mapped_ptr = mmap(virtual_target, kapi::memory::page::size.value, PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_FIXED, memory.memory_descriptor(), physical_offset.value);
+ if (mapped_ptr == MAP_FAILED)
+ {
+ throw std::runtime_error("Failed to map page");
+ }
+
+ return static_cast<std::byte *>(mapped_ptr);
+ }
+ else if (page_address >= kapi::memory::mmio_base)
+ {
+ throw std::runtime_error("MMIO mapping not yet supported in testing!");
}
else if (page_address >= kapi::memory::higher_half_direct_map_base)
{