diff options
author | Yuri Kunde Schlesner <yuriks@yuriks.net> | 2016-08-29 07:21:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-29 07:21:24 +0200 |
commit | 474586bc53eb6fda40fb0db23ea1d50d32af28b6 (patch) | |
tree | 49df9979f3351f3eac26d8a74e25c5181ba35e6c /src/core/hle/service/ldr_ro/memory_synchronizer.cpp | |
parent | Merge pull request #1987 from Lectem/ipcdescriptors (diff) | |
parent | LDR: Implement CRO (diff) | |
download | yuzu-474586bc53eb6fda40fb0db23ea1d50d32af28b6.tar yuzu-474586bc53eb6fda40fb0db23ea1d50d32af28b6.tar.gz yuzu-474586bc53eb6fda40fb0db23ea1d50d32af28b6.tar.bz2 yuzu-474586bc53eb6fda40fb0db23ea1d50d32af28b6.tar.lz yuzu-474586bc53eb6fda40fb0db23ea1d50d32af28b6.tar.xz yuzu-474586bc53eb6fda40fb0db23ea1d50d32af28b6.tar.zst yuzu-474586bc53eb6fda40fb0db23ea1d50d32af28b6.zip |
Diffstat (limited to 'src/core/hle/service/ldr_ro/memory_synchronizer.cpp')
-rw-r--r-- | src/core/hle/service/ldr_ro/memory_synchronizer.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/core/hle/service/ldr_ro/memory_synchronizer.cpp b/src/core/hle/service/ldr_ro/memory_synchronizer.cpp new file mode 100644 index 000000000..4402876e6 --- /dev/null +++ b/src/core/hle/service/ldr_ro/memory_synchronizer.cpp @@ -0,0 +1,46 @@ +// 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" + +#include "core/hle/service/ldr_ro/memory_synchronizer.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Namespace LDR_RO + +namespace LDR_RO { + +auto MemorySynchronizer::FindMemoryBlock(VAddr mapping, VAddr original) { + auto block = std::find_if(memory_blocks.begin(), memory_blocks.end(), [=](MemoryBlock& b){ + return b.original == original; + }); + 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); + } +} + +} // namespace |