summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/ldr_ro/memory_synchronizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/ldr_ro/memory_synchronizer.cpp')
-rw-r--r--src/core/hle/service/ldr_ro/memory_synchronizer.cpp46
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