diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 17 |
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 | } |