aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-08-17 10:39:35 -0300
committerGitHub <noreply@github.com>2018-08-17 10:39:35 -0300
commit056c2840b1851657c3855fb72776837c89ff59d3 (patch)
tree2d50e53891de39d55620fb5b47e778937b986866
parent34100051e454d13dc94be75f01ff1188598eff00 (diff)
Fix MapPhysicalMemory when block position is less than map position (#359)
* Fix MapPhysicalMemory when block position is less than map position * Only try to free pages that are actually mapped * Only unmap after freeing the memory
-rw-r--r--Ryujinx.HLE/HOS/Kernel/KMemoryManager.cs22
1 files changed, 17 insertions, 5 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/KMemoryManager.cs b/Ryujinx.HLE/HOS/Kernel/KMemoryManager.cs
index 0432aa88..3afdb570 100644
--- a/Ryujinx.HLE/HOS/Kernel/KMemoryManager.cs
+++ b/Ryujinx.HLE/HOS/Kernel/KMemoryManager.cs
@@ -259,9 +259,9 @@ namespace Ryujinx.HLE.HOS.Kernel
InsertBlock(FreeAddr, PagesCount, MemoryState.Unmapped);
- CpuMemory.Unmap(FreeAddr, DiffSize);
-
FreePages(FreeAddr, PagesCount);
+
+ CpuMemory.Unmap(FreeAddr, DiffSize);
}
}
}
@@ -631,7 +631,14 @@ namespace Ryujinx.HLE.HOS.Kernel
{
long CurrSize = GetSizeInRange(Info, Position, End);
- CpuMemory.Map(Info.Position, PA, CurrSize);
+ long MapPosition = Info.Position;
+
+ if ((ulong)MapPosition < (ulong)Position)
+ {
+ MapPosition = Position;
+ }
+
+ CpuMemory.Map(MapPosition, PA, CurrSize);
PA += CurrSize;
}
@@ -705,10 +712,10 @@ namespace Ryujinx.HLE.HOS.Kernel
InsertBlock(Position, PagesCount, MemoryState.Unmapped);
- CpuMemory.Unmap(Position, Size);
-
FreePages(Position, PagesCount);
+ CpuMemory.Unmap(Position, Size);
+
return 0;
}
}
@@ -737,6 +744,11 @@ namespace Ryujinx.HLE.HOS.Kernel
{
long VA = Position + Page * PageSize;
+ if (!CpuMemory.IsMapped(VA))
+ {
+ continue;
+ }
+
long PA = CpuMemory.GetPhysicalAddress(VA);
Allocator.Free(PA, PageSize);