diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-04-08 17:17:11 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-04-08 17:17:11 +0200 |
| commit | aa208226f992523865328d4612ae4a7679f57a04 (patch) | |
| tree | 41981f9b72f695ffc2848bfb9e13b1846c1ebe69 /kernel/kapi | |
| parent | 1ecc0c223a1bacfa1aee183a3573f57c265318df (diff) | |
| download | teachos-aa208226f992523865328d4612ae4a7679f57a04.tar.xz teachos-aa208226f992523865328d4612ae4a7679f57a04.zip | |
kapi: return region pair for MMIO allocation
Diffstat (limited to 'kernel/kapi')
| -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 |
