diff --git a/kernel/include/kernel/Memory/GeneralAllocator.h b/kernel/include/kernel/Memory/GeneralAllocator.h index e14823f032..6ec2f4c8f4 100644 --- a/kernel/include/kernel/Memory/GeneralAllocator.h +++ b/kernel/include/kernel/Memory/GeneralAllocator.h @@ -14,7 +14,7 @@ namespace Kernel BAN_NON_MOVABLE(GeneralAllocator); public: - static BAN::ErrorOr> create(PageTable&); + static BAN::ErrorOr> create(PageTable&, vaddr_t first_vaddr); ~GeneralAllocator(); BAN::ErrorOr> clone(PageTable&); @@ -23,7 +23,7 @@ namespace Kernel bool deallocate(vaddr_t); private: - GeneralAllocator(PageTable&); + GeneralAllocator(PageTable&, vaddr_t first_vaddr); private: struct Allocation @@ -33,6 +33,7 @@ namespace Kernel }; private: + const vaddr_t m_first_vaddr; PageTable& m_page_table; BAN::LinkedList m_allocations; }; diff --git a/kernel/kernel/Memory/GeneralAllocator.cpp b/kernel/kernel/Memory/GeneralAllocator.cpp index f9ff1793bd..2bf4ab73f1 100644 --- a/kernel/kernel/Memory/GeneralAllocator.cpp +++ b/kernel/kernel/Memory/GeneralAllocator.cpp @@ -3,16 +3,17 @@ namespace Kernel { - BAN::ErrorOr> GeneralAllocator::create(PageTable& page_table) + BAN::ErrorOr> GeneralAllocator::create(PageTable& page_table, vaddr_t first_vaddr) { - auto* allocator = new GeneralAllocator(page_table); + auto* allocator = new GeneralAllocator(page_table, first_vaddr); if (allocator == nullptr) return BAN::Error::from_errno(ENOMEM); return BAN::UniqPtr::adopt(allocator); } - GeneralAllocator::GeneralAllocator(PageTable& page_table) + GeneralAllocator::GeneralAllocator(PageTable& page_table, vaddr_t first_vaddr) : m_page_table(page_table) + , m_first_vaddr(first_vaddr) { } GeneralAllocator::~GeneralAllocator() @@ -41,7 +42,11 @@ namespace Kernel allocation.pages[i] = paddr; } - allocation.address = m_page_table.get_free_contiguous_pages(needed_pages); + m_page_table.lock(); + + allocation.address = m_page_table.get_free_contiguous_pages(needed_pages, m_first_vaddr); + ASSERT(allocation.address); + for (size_t i = 0; i < needed_pages; i++) { vaddr_t vaddr = allocation.address + i * PAGE_SIZE; @@ -49,6 +54,8 @@ namespace Kernel m_page_table.invalidate(vaddr); } + m_page_table.unlock(); + MUST(m_allocations.push_back(BAN::move(allocation))); return allocation.address; } @@ -74,7 +81,7 @@ namespace Kernel BAN::ErrorOr> GeneralAllocator::clone(PageTable& new_page_table) { - auto allocator = TRY(GeneralAllocator::create(new_page_table)); + auto allocator = TRY(GeneralAllocator::create(new_page_table, m_first_vaddr)); m_page_table.lock(); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 9735f1b008..40c5371c45 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -791,7 +791,7 @@ namespace Kernel LockGuard _(m_lock); if (!m_general_allocator) - m_general_allocator = TRY(GeneralAllocator::create(page_table())); + m_general_allocator = TRY(GeneralAllocator::create(page_table(), 0x400000)); address = m_general_allocator->allocate(bytes); }