summaryrefslogtreecommitdiffstats
path: root/src/core/memory/freezer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/memory/freezer.h')
-rw-r--r--src/core/memory/freezer.h58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/core/memory/freezer.h b/src/core/memory/freezer.h
new file mode 100644
index 000000000..3e271793e
--- /dev/null
+++ b/src/core/memory/freezer.h
@@ -0,0 +1,58 @@
+// Copyright 2019 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <optional>
+#include <vector>
+#include "common/common_types.h"
+#include "core/core_timing.h"
+
+namespace Core {
+class System;
+} // namespace Core
+
+namespace Memory {
+
+// A class that will effectively freeze memory values.
+class Freezer {
+public:
+ struct Entry {
+ VAddr address;
+ u8 width;
+ u64 value;
+ };
+
+ Freezer(Core::Timing::CoreTiming& core_timing);
+ ~Freezer();
+
+ void SetActive(bool active);
+ bool IsActive() const;
+
+ void Clear();
+
+ u64 Freeze(VAddr address, u8 width);
+ void Unfreeze(VAddr address);
+
+ bool IsFrozen(VAddr address);
+ void SetFrozenValue(VAddr address, u64 value);
+
+ std::optional<Entry> GetEntry(VAddr address);
+
+ std::vector<Entry> GetEntries();
+
+private:
+ void FrameCallback(u64 userdata, s64 cycles_late);
+ void FillEntryReads();
+
+ std::atomic_bool active{false};
+
+ std::recursive_mutex entries_mutex;
+ std::vector<Entry> entries;
+
+ Core::Timing::EventType* event;
+ Core::Timing::CoreTiming& core_timing;
+};
+
+} // namespace Memory