aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2020-12-08 00:42:17 +0000
committerGitHub <noreply@github.com>2020-12-07 21:42:17 -0300
commit4594c3b31014655fb0b37f1305598fc3cbafdc73 (patch)
tree5eb920173a8da883e1d3fa2288fd375d3fb1fa0c /Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs
parent36f6bbf5b9082193abb33b26e654ce973ed0ee83 (diff)
Signal memory tracking before/after mapping into another process (#1785)
* Signal memory tracking before/after mapping into another process * Wording. * Add missing method.
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs8
1 files changed, 8 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs
index 63ac8583..05ad9f61 100644
--- a/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs
@@ -1656,6 +1656,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
}
}
+ // Signal a read for any resources tracking reads in the region, as the other process is likely to use their data.
+ _cpuMemory.SignalMemoryTracking(addressTruncated, endAddrRounded - addressTruncated, false);
+
lock (_blocks)
{
KernelResult result;
@@ -2036,6 +2039,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
ulong endAddr = address + size;
ulong addressRounded = BitUtils.AlignUp (address, PageSize);
+ ulong addressTruncated = BitUtils.AlignDown(address, PageSize);
+ ulong endAddrRounded = BitUtils.AlignUp (endAddr, PageSize);
ulong endAddrTruncated = BitUtils.AlignDown(endAddr, PageSize);
ulong pagesCount = addressRounded < endAddrTruncated ? (endAddrTruncated - addressRounded) / PageSize : 0;
@@ -2071,6 +2076,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
return KernelResult.OutOfResource;
}
+ // Anything on the client side should see this memory as modified.
+ _cpuMemory.SignalMemoryTracking(addressTruncated, endAddrRounded - addressTruncated, true);
+
lock (_blocks)
{
foreach (KMemoryInfo info in IterateOverRange(addressRounded, endAddrTruncated))