diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-04-08 14:16:13 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-04-08 14:16:13 +0200 |
| commit | 77b408b4e18fabb29f4cab5e899e7c8db1bc1204 (patch) | |
| tree | 636cfd8d19e5d0dd837cd709bb84eaa9ba901532 /kernel/src | |
| parent | 1c52a859d105f6b0f8afb16565b10435fa728882 (diff) | |
| download | teachos-77b408b4e18fabb29f4cab5e899e7c8db1bc1204.tar.xz teachos-77b408b4e18fabb29f4cab5e899e7c8db1bc1204.zip | |
kernel: fix mmio allocator
Diffstat (limited to 'kernel/src')
| -rw-r--r-- | kernel/src/memory/mmio_allocator.cpp | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/kernel/src/memory/mmio_allocator.cpp b/kernel/src/memory/mmio_allocator.cpp index f77f14f..ddbdfc2 100644 --- a/kernel/src/memory/mmio_allocator.cpp +++ b/kernel/src/memory/mmio_allocator.cpp @@ -26,21 +26,25 @@ namespace kernel::memory auto current = m_head; while (current) { - if (current->page_count > count) + if (current->is_free && current->page_count >= count) { - auto new_base = current->base + (count * kapi::memory::page::size); - auto split_node = make_node(new_base, current->page_count - count, std::move(current->next), current, true); - - if (current->next) + if (current->page_count > count) { - current->next->previous = split_node; + auto new_base = current->base + (count * kapi::memory::page::size); + auto split_node = make_node(new_base, current->page_count - count, std::move(current->next), current, true); + + if (current->next) + { + current->next->previous = split_node; + } + current->next = split_node; + current->page_count = count; } - current->next = split_node; - current->page_count = count; - } - current->is_free = false; - return current->base; + current->is_free = false; + return current->base; + } + current = current->next; } kapi::system::panic("[OS:MEM] MMIO alloctor out of memory!"); |
