summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/vm_manager.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp
index 231e42baa..e86796ba5 100644
--- a/src/core/hle/kernel/vm_manager.cpp
+++ b/src/core/hle/kernel/vm_manager.cpp
@@ -757,19 +757,22 @@ void VMManager::MergeAdjacentVMA(VirtualMemoryArea& left, const VirtualMemoryAre
757 // Always merge allocated memory blocks, even when they don't share the same backing block. 757 // Always merge allocated memory blocks, even when they don't share the same backing block.
758 if (left.type == VMAType::AllocatedMemoryBlock && 758 if (left.type == VMAType::AllocatedMemoryBlock &&
759 (left.backing_block != right.backing_block || left.offset + left.size != right.offset)) { 759 (left.backing_block != right.backing_block || left.offset + left.size != right.offset)) {
760 const auto right_begin = right.backing_block->begin() + right.offset;
761 const auto right_end = right_begin + right.size;
762
760 // Check if we can save work. 763 // Check if we can save work.
761 if (left.offset == 0 && left.size == left.backing_block->size()) { 764 if (left.offset == 0 && left.size == left.backing_block->size()) {
762 // Fast case: left is an entire backing block. 765 // Fast case: left is an entire backing block.
763 left.backing_block->insert(left.backing_block->end(), 766 left.backing_block->insert(left.backing_block->end(), right_begin, right_end);
764 right.backing_block->begin() + right.offset,
765 right.backing_block->begin() + right.offset + right.size);
766 } else { 767 } else {
768 const auto left_begin = left.backing_block->begin() + left.offset;
769 const auto left_end = left_begin + left.size;
770
767 // Slow case: make a new memory block for left and right. 771 // Slow case: make a new memory block for left and right.
768 auto new_memory = std::make_shared<PhysicalMemory>(); 772 auto new_memory = std::make_shared<PhysicalMemory>();
769 new_memory->insert(new_memory->end(), left.backing_block->begin() + left.offset, 773 new_memory->insert(new_memory->end(), left_begin, left_end);
770 left.backing_block->begin() + left.offset + left.size); 774 new_memory->insert(new_memory->end(), right_begin, right_end);
771 new_memory->insert(new_memory->end(), right.backing_block->begin() + right.offset, 775
772 right.backing_block->begin() + right.offset + right.size);
773 left.backing_block = new_memory; 776 left.backing_block = new_memory;
774 left.offset = 0; 777 left.offset = 0;
775 } 778 }