diff options
| author | Matteo Gmür <matteo.gmuer1@ost.ch> | 2025-05-12 13:51:12 +0000 |
|---|---|---|
| committer | Matteo Gmür <matteo.gmuer1@ost.ch> | 2025-05-12 13:51:12 +0000 |
| commit | 29e067867e7a437d12351b481024d4bab431b202 (patch) | |
| tree | 97479edda8e06ea5b09ee77096ab117b4cfe8499 /arch/x86_64/src/memory | |
| parent | ee4c61f7313fedd23d01c69ea5036fa38ef6248a (diff) | |
| download | teachos-29e067867e7a437d12351b481024d4bab431b202.tar.xz teachos-29e067867e7a437d12351b481024d4bab431b202.zip | |
Fix crashes because of are frame allocator copy
Diffstat (limited to 'arch/x86_64/src/memory')
| -rw-r--r-- | arch/x86_64/src/memory/heap/memory_block.cpp | 5 | ||||
| -rw-r--r-- | arch/x86_64/src/memory/heap/user_heap_allocator.cpp | 13 | ||||
| -rw-r--r-- | arch/x86_64/src/memory/main.cpp | 11 |
3 files changed, 12 insertions, 17 deletions
diff --git a/arch/x86_64/src/memory/heap/memory_block.cpp b/arch/x86_64/src/memory/heap/memory_block.cpp index 6ee675a..bc97bd6 100644 --- a/arch/x86_64/src/memory/heap/memory_block.cpp +++ b/arch/x86_64/src/memory/heap/memory_block.cpp @@ -6,11 +6,10 @@ namespace teachos::arch::memory::heap { memory_block::memory_block(std::size_t size, memory_block * next) { - // TODO: Figure out why this memset fails - // memset(static_cast<void *>(this), 0, size); + memset(static_cast<void *>(this), 0U, size); this->size = size; this->next = next; } - memory_block::~memory_block() { /*memset(static_cast<void *>(this), 0, sizeof(memory_block));*/ } + memory_block::~memory_block() { memset(static_cast<void *>(this), 0U, sizeof(memory_block)); } } // namespace teachos::arch::memory::heap diff --git a/arch/x86_64/src/memory/heap/user_heap_allocator.cpp b/arch/x86_64/src/memory/heap/user_heap_allocator.cpp index 9cb6c17..f3fe1c2 100644 --- a/arch/x86_64/src/memory/heap/user_heap_allocator.cpp +++ b/arch/x86_64/src/memory/heap/user_heap_allocator.cpp @@ -104,16 +104,11 @@ namespace teachos::arch::memory::heap auto user_heap_allocator::expand_heap_if_full() -> memory_block * { - context_switching::syscall::arguments args{}; - auto const result = context_switching::syscall::syscall(context_switching::syscall::type::EXPAND_HEAP, args); + auto const result = context_switching::syscall::syscall(context_switching::syscall::type::EXPAND_HEAP); - if (!result.error_code) - { - uint64_t const heap_start = result.values.arg_0; - uint64_t const heap_size = result.values.arg_1; - return new (reinterpret_cast<void *>(heap_start)) memory_block(heap_size, nullptr); - } - return nullptr; + uint64_t const heap_start = result.values.arg_0; + uint64_t const heap_size = result.values.arg_1; + return !result.error_code ? new (reinterpret_cast<void *>(heap_start)) memory_block(heap_size, nullptr) : nullptr; } auto user_heap_allocator::remove_free_memory_block(memory_block * previous_block, memory_block * current_block) diff --git a/arch/x86_64/src/memory/main.cpp b/arch/x86_64/src/memory/main.cpp index 5e671ac..2746a71 100644 --- a/arch/x86_64/src/memory/main.cpp +++ b/arch/x86_64/src/memory/main.cpp @@ -18,22 +18,23 @@ namespace teachos::arch::memory static std::optional<allocator::area_frame_allocator> frame_allocator; auto create_frame_allocator(multiboot::memory_information const & memory_information) - -> allocator::area_frame_allocator + -> allocator::area_frame_allocator & { frame_allocator.emplace(memory_information); return frame_allocator.value(); } - auto get_frame_allocator() -> allocator::area_frame_allocator + auto get_frame_allocator() -> allocator::area_frame_allocator & { - exception_handling::assert(frame_allocator.has_value(), "[Memory main] Frame allocator has not been created yet"); + exception_handling::assert(frame_allocator.has_value(), + "[Initialization] Frame allocator has not been created yet"); return frame_allocator.value(); } } // namespace auto remap_heap(std::size_t heap_start, std::size_t heap_size, paging::entry::bitset additional_flags = {}) -> void { - auto allocator = get_frame_allocator(); + decltype(auto) allocator = get_frame_allocator(); decltype(auto) active_table = paging::active_page_table::create_or_get(); auto const start_page = paging::virtual_page::containing_address(heap_start); auto const end_page = ++(paging::virtual_page::containing_address(heap_start + heap_size - 1)); @@ -59,7 +60,7 @@ namespace teachos::arch::memory has_been_called = true; auto const memory_information = multiboot::read_multiboot2(); - auto allocator = create_frame_allocator(memory_information); + decltype(auto) allocator = create_frame_allocator(memory_information); kernel::cpu::set_cr0_bit(kernel::cpu::cr0_flags::WRITE_PROTECT); kernel::cpu::set_efer_bit(kernel::cpu::efer_flags::NXE); |
