diff options
Diffstat (limited to 'kernel/kapi/memory.cpp')
| -rw-r--r-- | kernel/kapi/memory.cpp | 25 |
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 |
