From f5a1de6ac53e70a88c0aafefd7013c557d7671c0 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Mon, 17 Oct 2022 19:12:49 -0300 Subject: [PATCH] Fix kernel VA allocation when random allocation fails (#3755) * Fix kernel VA allocation when random allocation fails * This was off by one --- .../HOS/Kernel/Memory/KPageTableBase.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs index 857be7a6..501d1cc4 100644 --- a/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs +++ b/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs @@ -2540,11 +2540,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory for (int attempt = 0; attempt < 8; attempt++) { - address = BitUtils.AlignDown(regionStart + GetRandomValue(0, aslrMaxOffset) * (ulong)alignment, alignment); + ulong aslrAddress = BitUtils.AlignDown(regionStart + GetRandomValue(0, aslrMaxOffset) * (ulong)alignment, alignment); + ulong aslrEndAddr = aslrAddress + totalNeededSize; - ulong endAddr = address + totalNeededSize; - - KMemoryInfo info = _blockManager.FindBlock(address).GetInfo(); + KMemoryInfo info = _blockManager.FindBlock(aslrAddress).GetInfo(); if (info.State != MemoryState.Unmapped) { @@ -2554,11 +2553,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong currBaseAddr = info.Address + reservedPagesCount * PageSize; ulong currEndAddr = info.Address + info.Size; - if (address >= regionStart && - address >= currBaseAddr && - endAddr - 1 <= regionEndAddr - 1 && - endAddr - 1 <= currEndAddr - 1) + if (aslrAddress >= regionStart && + aslrAddress >= currBaseAddr && + aslrEndAddr - 1 <= regionEndAddr - 1 && + aslrEndAddr - 1 <= currEndAddr - 1) { + address = aslrAddress; break; } } @@ -2603,7 +2603,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong totalNeededSize = reservedSize + neededPagesCount * PageSize; - ulong regionEndAddr = regionStart + regionPagesCount * PageSize; + ulong regionEndAddr = (regionStart + regionPagesCount * PageSize) - 1; KMemoryBlock currBlock = _blockManager.FindBlock(regionStart);