From 3c60d4b0eaa54983cf8e347fb156742c925f0594 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Tue, 10 Nov 2020 22:07:52 -0300 Subject: Do not report unmapped pages as dirty (#1672) * Do not report unmapped pages as dirty * Make tests pass again * PR feedback --- Ryujinx.Memory/Tracking/IVirtualMemoryManager.cs | 1 + Ryujinx.Memory/Tracking/MemoryTracking.cs | 3 ++- Ryujinx.Memory/Tracking/RegionHandle.cs | 6 ++++-- 3 files changed, 7 insertions(+), 3 deletions(-) (limited to 'Ryujinx.Memory/Tracking') diff --git a/Ryujinx.Memory/Tracking/IVirtualMemoryManager.cs b/Ryujinx.Memory/Tracking/IVirtualMemoryManager.cs index 6b5474e1..e6d8e8c9 100644 --- a/Ryujinx.Memory/Tracking/IVirtualMemoryManager.cs +++ b/Ryujinx.Memory/Tracking/IVirtualMemoryManager.cs @@ -4,6 +4,7 @@ { (ulong address, ulong size)[] GetPhysicalRegions(ulong va, ulong size); + bool IsRangeMapped(ulong va, ulong size); void TrackingReprotect(ulong va, ulong size, MemoryPermission protection); } } diff --git a/Ryujinx.Memory/Tracking/MemoryTracking.cs b/Ryujinx.Memory/Tracking/MemoryTracking.cs index 779166c4..aff223e8 100644 --- a/Ryujinx.Memory/Tracking/MemoryTracking.cs +++ b/Ryujinx.Memory/Tracking/MemoryTracking.cs @@ -75,6 +75,7 @@ namespace Ryujinx.Memory.Tracking { VirtualRegion region = results[i]; region.RecalculatePhysicalChildren(); + region.UpdateProtection(); } } } @@ -200,7 +201,7 @@ namespace Ryujinx.Memory.Tracking lock (TrackingLock) { - RegionHandle handle = new RegionHandle(this, address, size); + RegionHandle handle = new RegionHandle(this, address, size, _memoryManager.IsRangeMapped(address, size)); return handle; } diff --git a/Ryujinx.Memory/Tracking/RegionHandle.cs b/Ryujinx.Memory/Tracking/RegionHandle.cs index c00d039b..96898c21 100644 --- a/Ryujinx.Memory/Tracking/RegionHandle.cs +++ b/Ryujinx.Memory/Tracking/RegionHandle.cs @@ -10,7 +10,7 @@ namespace Ryujinx.Memory.Tracking /// public class RegionHandle : IRegionHandle, IRange { - public bool Dirty { get; private set; } = true; + public bool Dirty { get; private set; } public ulong Address { get; } public ulong Size { get; } @@ -32,8 +32,10 @@ namespace Ryujinx.Memory.Tracking /// Tracking object for the target memory block /// Virtual address of the region to track /// Size of the region to track - internal RegionHandle(MemoryTracking tracking, ulong address, ulong size) + /// Initial value of the dirty flag + internal RegionHandle(MemoryTracking tracking, ulong address, ulong size, bool dirty = true) { + Dirty = dirty; Address = address; Size = size; EndAddress = address + size; -- cgit v1.2.3