diff options
Diffstat (limited to 'Ryujinx.Cpu')
| -rw-r--r-- | Ryujinx.Cpu/MemoryEhMeilleure.cs | 2 | ||||
| -rw-r--r-- | Ryujinx.Cpu/MemoryManager.cs | 8 | ||||
| -rw-r--r-- | Ryujinx.Cpu/MemoryManagerHostMapped.cs | 8 | ||||
| -rw-r--r-- | Ryujinx.Cpu/Tracking/CpuMultiRegionHandle.cs | 1 | ||||
| -rw-r--r-- | Ryujinx.Cpu/Tracking/CpuRegionHandle.cs | 1 | ||||
| -rw-r--r-- | Ryujinx.Cpu/Tracking/CpuSmartMultiRegionHandle.cs | 1 |
6 files changed, 18 insertions, 3 deletions
diff --git a/Ryujinx.Cpu/MemoryEhMeilleure.cs b/Ryujinx.Cpu/MemoryEhMeilleure.cs index ac7791b4..73edec47 100644 --- a/Ryujinx.Cpu/MemoryEhMeilleure.cs +++ b/Ryujinx.Cpu/MemoryEhMeilleure.cs @@ -8,7 +8,7 @@ namespace Ryujinx.Cpu { class MemoryEhMeilleure : IDisposable { - private delegate bool TrackingEventDelegate(ulong address, ulong size, bool write); + private delegate bool TrackingEventDelegate(ulong address, ulong size, bool write, bool precise = false); private readonly MemoryBlock _addressSpace; private readonly MemoryTracking _tracking; diff --git a/Ryujinx.Cpu/MemoryManager.cs b/Ryujinx.Cpu/MemoryManager.cs index 2c11bab8..85ab763e 100644 --- a/Ryujinx.Cpu/MemoryManager.cs +++ b/Ryujinx.Cpu/MemoryManager.cs @@ -567,10 +567,16 @@ namespace Ryujinx.Cpu } /// <inheritdoc/> - public void SignalMemoryTracking(ulong va, ulong size, bool write) + public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false) { AssertValidAddressAndSize(va, size); + if (precise) + { + Tracking.VirtualMemoryEvent(va, size, write, precise: true); + return; + } + // We emulate guard pages for software memory access. This makes for an easy transition to // tracking using host guard pages in future, but also supporting platforms where this is not possible. diff --git a/Ryujinx.Cpu/MemoryManagerHostMapped.cs b/Ryujinx.Cpu/MemoryManagerHostMapped.cs index 705cedeb..c37d23a5 100644 --- a/Ryujinx.Cpu/MemoryManagerHostMapped.cs +++ b/Ryujinx.Cpu/MemoryManagerHostMapped.cs @@ -405,10 +405,16 @@ namespace Ryujinx.Cpu /// <remarks> /// This function also validates that the given range is both valid and mapped, and will throw if it is not. /// </remarks> - public void SignalMemoryTracking(ulong va, ulong size, bool write) + public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false) { AssertValidAddressAndSize(va, size); + if (precise) + { + Tracking.VirtualMemoryEvent(va, size, write, precise: true); + return; + } + // Software table, used for managed memory tracking. int pages = GetPagesCount(va, size, out _); diff --git a/Ryujinx.Cpu/Tracking/CpuMultiRegionHandle.cs b/Ryujinx.Cpu/Tracking/CpuMultiRegionHandle.cs index 78c1b240..0ed8bfc5 100644 --- a/Ryujinx.Cpu/Tracking/CpuMultiRegionHandle.cs +++ b/Ryujinx.Cpu/Tracking/CpuMultiRegionHandle.cs @@ -22,6 +22,7 @@ namespace Ryujinx.Cpu.Tracking public void QueryModified(ulong address, ulong size, Action<ulong, ulong> modifiedAction) => _impl.QueryModified(address, size, modifiedAction); public void QueryModified(ulong address, ulong size, Action<ulong, ulong> modifiedAction, int sequenceNumber) => _impl.QueryModified(address, size, modifiedAction, sequenceNumber); public void RegisterAction(ulong address, ulong size, RegionSignal action) => _impl.RegisterAction(address, size, action); + public void RegisterPreciseAction(ulong address, ulong size, PreciseRegionSignal action) => _impl.RegisterPreciseAction(address, size, action); public void SignalWrite() => _impl.SignalWrite(); } } diff --git a/Ryujinx.Cpu/Tracking/CpuRegionHandle.cs b/Ryujinx.Cpu/Tracking/CpuRegionHandle.cs index dd122288..d2a28749 100644 --- a/Ryujinx.Cpu/Tracking/CpuRegionHandle.cs +++ b/Ryujinx.Cpu/Tracking/CpuRegionHandle.cs @@ -23,6 +23,7 @@ namespace Ryujinx.Cpu.Tracking public void ForceDirty() => _impl.ForceDirty(); public IRegionHandle GetHandle() => _impl; public void RegisterAction(RegionSignal action) => _impl.RegisterAction(action); + public void RegisterPreciseAction(PreciseRegionSignal action) => _impl.RegisterPreciseAction(action); public void RegisterDirtyEvent(Action action) => _impl.RegisterDirtyEvent(action); public void Reprotect(bool asDirty = false) => _impl.Reprotect(asDirty); diff --git a/Ryujinx.Cpu/Tracking/CpuSmartMultiRegionHandle.cs b/Ryujinx.Cpu/Tracking/CpuSmartMultiRegionHandle.cs index 944e4c02..665271c6 100644 --- a/Ryujinx.Cpu/Tracking/CpuSmartMultiRegionHandle.cs +++ b/Ryujinx.Cpu/Tracking/CpuSmartMultiRegionHandle.cs @@ -17,6 +17,7 @@ namespace Ryujinx.Cpu.Tracking public void Dispose() => _impl.Dispose(); public void ForceDirty(ulong address, ulong size) => _impl.ForceDirty(address, size); public void RegisterAction(RegionSignal action) => _impl.RegisterAction(action); + public void RegisterPreciseAction(PreciseRegionSignal action) => _impl.RegisterPreciseAction(action); public void QueryModified(Action<ulong, ulong> modifiedAction) => _impl.QueryModified(modifiedAction); public void QueryModified(ulong address, ulong size, Action<ulong, ulong> modifiedAction) => _impl.QueryModified(address, size, modifiedAction); public void QueryModified(ulong address, ulong size, Action<ulong, ulong> modifiedAction, int sequenceNumber) => _impl.QueryModified(address, size, modifiedAction, sequenceNumber); |
