aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-04-08 17:17:11 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-04-08 17:17:11 +0200
commitaa208226f992523865328d4612ae4a7679f57a04 (patch)
tree41981f9b72f695ffc2848bfb9e13b1846c1ebe69 /kernel
parent1ecc0c223a1bacfa1aee183a3573f57c265318df (diff)
downloadteachos-aa208226f992523865328d4612ae4a7679f57a04.tar.xz
teachos-aa208226f992523865328d4612ae4a7679f57a04.zip
kapi: return region pair for MMIO allocation
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kapi/memory.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/kernel/kapi/memory.cpp b/kernel/kapi/memory.cpp
index b224c50..31cd1f4 100644
--- a/kernel/kapi/memory.cpp
+++ b/kernel/kapi/memory.cpp
@@ -154,22 +154,33 @@ namespace kapi::memory
mmio_allocator.emplace(base, page_count);
}
- auto allocate_mmio_region(std::size_t page_count) -> linear_address
+ auto allocate_mmio_region(std::size_t page_count) -> mmio_region
{
auto region = mmio_allocator->allocate(page_count);
- return region;
+ return {region, page_count};
}
- auto map_mmio_region(linear_address base, physical_address hw_base, page_mapper::flags flags) -> std::byte *
+ auto map_mmio_region(mmio_region region, physical_address hw_base, page_mapper::flags flags) -> std::byte *
{
- auto start_page = page::containing(base);
+ auto start_page = page::containing(region.first);
auto start_frame = frame::containing(hw_base);
- return map(start_page, start_frame, flags | page_mapper::flags::uncached);
+
+ flags |= page_mapper::flags::uncached;
+
+ auto start = map(start_page, start_frame, flags);
+
+ std::ranges::for_each(std::views::iota(1uz, region.second), [&](auto index) {
+ auto page = page::containing(region.first + index * page::size);
+ auto frame = frame::containing(hw_base + index * page::size);
+ map(page, frame, flags);
+ });
+
+ return start;
}
- auto release_mmio_region(linear_address base) -> void
+ auto release_mmio_region(mmio_region region) -> void
{
- mmio_allocator->release(base);
+ mmio_allocator->release(region.first);
}
} // namespace kapi::memory