aboutsummaryrefslogtreecommitdiff
path: root/kernel/src
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-04-08 14:16:13 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-04-08 14:16:13 +0200
commit77b408b4e18fabb29f4cab5e899e7c8db1bc1204 (patch)
tree636cfd8d19e5d0dd837cd709bb84eaa9ba901532 /kernel/src
parent1c52a859d105f6b0f8afb16565b10435fa728882 (diff)
downloadteachos-77b408b4e18fabb29f4cab5e899e7c8db1bc1204.tar.xz
teachos-77b408b4e18fabb29f4cab5e899e7c8db1bc1204.zip
kernel: fix mmio allocator
Diffstat (limited to 'kernel/src')
-rw-r--r--kernel/src/memory/mmio_allocator.cpp26
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!");