2016-07-15 08:17:01 +02:00
|
|
|
// Copyright 2016 Citra Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include "common/assert.h"
|
2016-09-21 08:52:38 +02:00
|
|
|
#include "core/hle/service/ldr_ro/memory_synchronizer.h"
|
2016-07-15 08:17:01 +02:00
|
|
|
|
2016-12-10 13:51:50 +01:00
|
|
|
namespace Service {
|
|
|
|
namespace LDR {
|
2016-07-15 08:17:01 +02:00
|
|
|
|
|
|
|
auto MemorySynchronizer::FindMemoryBlock(VAddr mapping, VAddr original) {
|
2016-09-18 02:38:01 +02:00
|
|
|
auto block = std::find_if(memory_blocks.begin(), memory_blocks.end(),
|
|
|
|
[=](MemoryBlock& b) { return b.original == original; });
|
2016-07-15 08:17:01 +02:00
|
|
|
ASSERT(block->mapping == mapping);
|
|
|
|
return block;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MemorySynchronizer::Clear() {
|
|
|
|
memory_blocks.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MemorySynchronizer::AddMemoryBlock(VAddr mapping, VAddr original, u32 size) {
|
|
|
|
memory_blocks.push_back(MemoryBlock{mapping, original, size});
|
|
|
|
}
|
|
|
|
|
|
|
|
void MemorySynchronizer::ResizeMemoryBlock(VAddr mapping, VAddr original, u32 size) {
|
|
|
|
FindMemoryBlock(mapping, original)->size = size;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MemorySynchronizer::RemoveMemoryBlock(VAddr mapping, VAddr original) {
|
|
|
|
memory_blocks.erase(FindMemoryBlock(mapping, original));
|
|
|
|
}
|
|
|
|
|
|
|
|
void MemorySynchronizer::SynchronizeOriginalMemory() {
|
|
|
|
for (auto& block : memory_blocks) {
|
|
|
|
Memory::CopyBlock(block.original, block.mapping, block.size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-10 13:51:50 +01:00
|
|
|
} // namespace LDR
|
|
|
|
} // namespace Service
|