forked from MeloNX/MeloNX
Minor refactoring of KPageTableBase to make custom address space layouts easier to implement
This commit is contained in:
parent
c5bcdc06f5
commit
a1e34041fa
@ -34,8 +34,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
protected readonly KernelContext Context;
|
||||
protected virtual bool Supports4KBPages => true;
|
||||
|
||||
public ulong AddrSpaceStart { get; private set; }
|
||||
public ulong AddrSpaceEnd { get; private set; }
|
||||
public ulong AddressSpaceStart { get; private set; }
|
||||
public ulong AddressSpaceEnd { get; private set; }
|
||||
|
||||
public ulong CodeRegionStart { get; private set; }
|
||||
public ulong CodeRegionEnd { get; private set; }
|
||||
@ -68,6 +68,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
private MemoryRegion _memRegion;
|
||||
|
||||
private bool _allocateFromBack;
|
||||
|
||||
private readonly bool _isKernel;
|
||||
|
||||
private bool _aslrEnabled;
|
||||
@ -267,8 +268,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
|
||||
_aslrEnabled = aslrEnabled;
|
||||
|
||||
AddrSpaceStart = addrSpaceStart;
|
||||
AddrSpaceEnd = addrSpaceEnd;
|
||||
AddressSpaceStart = addrSpaceStart;
|
||||
AddressSpaceEnd = addrSpaceEnd;
|
||||
|
||||
_slabManager = slabManager;
|
||||
|
||||
@ -291,10 +292,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
aliasRegion.End = aliasRegion.Start + aliasRegion.Size;
|
||||
heapRegion.Start = mapBaseAddress + heapRegion.AslrOffset;
|
||||
heapRegion.End = heapRegion.Start + heapRegion.Size;
|
||||
stackRegion.Start = mapBaseAddress + stackRegion.AslrOffset;
|
||||
stackRegion.End = stackRegion.Start + stackRegion.Size;
|
||||
tlsIoRegion.Start = mapBaseAddress + tlsIoRegion.AslrOffset;
|
||||
tlsIoRegion.End = tlsIoRegion.Start + tlsIoRegion.Size;
|
||||
|
||||
SortRegion(ref aliasRegion, ref heapRegion, true);
|
||||
|
||||
@ -421,9 +418,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
|
||||
ulong endAddr = address + size;
|
||||
|
||||
ulong addrSpacePagesCount = (AddrSpaceEnd - AddrSpaceStart) / PageSize;
|
||||
ulong addrSpacePagesCount = (AddressSpaceEnd - AddressSpaceStart) / PageSize;
|
||||
|
||||
if (AddrSpaceStart > address)
|
||||
if (AddressSpaceStart > address)
|
||||
{
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
@ -433,7 +430,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
|
||||
if (endAddr - 1 > AddrSpaceEnd - 1)
|
||||
if (endAddr - 1 > AddressSpaceEnd - 1)
|
||||
{
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
@ -966,8 +963,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
|
||||
public KMemoryInfo QueryMemory(ulong address)
|
||||
{
|
||||
if (address >= AddrSpaceStart &&
|
||||
address < AddrSpaceEnd)
|
||||
if (address >= AddressSpaceStart &&
|
||||
address < AddressSpaceEnd)
|
||||
{
|
||||
lock (_blockManager)
|
||||
{
|
||||
@ -977,8 +974,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
else
|
||||
{
|
||||
return new KMemoryInfo(
|
||||
AddrSpaceEnd,
|
||||
~AddrSpaceEnd + 1,
|
||||
AddressSpaceEnd,
|
||||
~AddressSpaceEnd + 1,
|
||||
MemoryState.Reserved,
|
||||
KMemoryPermission.None,
|
||||
MemoryAttribute.None,
|
||||
@ -1540,14 +1537,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
MemoryAttribute attributeExpected,
|
||||
bool toServer)
|
||||
{
|
||||
if (AddrSpaceStart > clientAddress)
|
||||
if (AddressSpaceStart > clientAddress)
|
||||
{
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
|
||||
ulong srcEndAddr = clientAddress + size;
|
||||
|
||||
if (srcEndAddr <= clientAddress || srcEndAddr - 1 > AddrSpaceEnd - 1)
|
||||
if (srcEndAddr <= clientAddress || srcEndAddr - 1 > AddressSpaceEnd - 1)
|
||||
{
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
@ -1671,14 +1668,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
{
|
||||
blocksNeeded = 0;
|
||||
|
||||
if (AddrSpaceStart > address)
|
||||
if (AddressSpaceStart > address)
|
||||
{
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
|
||||
ulong endAddr = address + size;
|
||||
|
||||
if (endAddr <= address || endAddr - 1 > AddrSpaceEnd - 1)
|
||||
if (endAddr <= address || endAddr - 1 > AddressSpaceEnd - 1)
|
||||
{
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
@ -2011,14 +2008,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
|
||||
public Result UnmapNoAttributeIfStateEquals(ulong address, ulong size, MemoryState state)
|
||||
{
|
||||
if (AddrSpaceStart > address)
|
||||
if (AddressSpaceStart > address)
|
||||
{
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
|
||||
ulong endAddr = address + size;
|
||||
|
||||
if (endAddr <= address || endAddr - 1 > AddrSpaceEnd - 1)
|
||||
if (endAddr <= address || endAddr - 1 > AddressSpaceEnd - 1)
|
||||
{
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
@ -2792,7 +2789,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
case MemoryState.ProcessMemory:
|
||||
case MemoryState.CodeReadOnly:
|
||||
case MemoryState.CodeWritable:
|
||||
return GetAddrSpaceBaseAddr();
|
||||
return AslrRegionStart;
|
||||
|
||||
case MemoryState.Heap:
|
||||
return HeapRegionStart;
|
||||
@ -2806,7 +2803,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
return StackRegionStart;
|
||||
|
||||
case MemoryState.KernelStack:
|
||||
return AddrSpaceStart;
|
||||
return AddressSpaceStart;
|
||||
}
|
||||
|
||||
throw new ArgumentException($"Invalid state value \"{state}\".");
|
||||
@ -2831,7 +2828,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
case MemoryState.ProcessMemory:
|
||||
case MemoryState.CodeReadOnly:
|
||||
case MemoryState.CodeWritable:
|
||||
return GetAddrSpaceSize();
|
||||
return AslrRegionEnd - AslrRegionStart;
|
||||
|
||||
case MemoryState.Heap:
|
||||
return HeapRegionEnd - HeapRegionStart;
|
||||
@ -2845,22 +2842,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
return StackRegionEnd - StackRegionStart;
|
||||
|
||||
case MemoryState.KernelStack:
|
||||
return AddrSpaceEnd - AddrSpaceStart;
|
||||
return AddressSpaceEnd - AddressSpaceStart;
|
||||
}
|
||||
|
||||
throw new ArgumentException($"Invalid state value \"{state}\".");
|
||||
}
|
||||
|
||||
public ulong GetAddrSpaceBaseAddr()
|
||||
{
|
||||
return AslrRegionStart;
|
||||
}
|
||||
|
||||
public ulong GetAddrSpaceSize()
|
||||
{
|
||||
return AslrRegionEnd - AslrRegionStart;
|
||||
}
|
||||
|
||||
private static ulong GetDramAddressFromPa(ulong pa)
|
||||
{
|
||||
return pa - DramMemoryMap.DramBase;
|
||||
@ -2886,12 +2873,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
|
||||
public bool IsInvalidRegion(ulong address, ulong size)
|
||||
{
|
||||
return address + size - 1 > GetAddrSpaceBaseAddr() + GetAddrSpaceSize() - 1;
|
||||
return address + size - 1 > AslrRegionEnd - 1;
|
||||
}
|
||||
|
||||
public bool InsideAddrSpace(ulong address, ulong size)
|
||||
{
|
||||
return AddrSpaceStart <= address && address + size - 1 <= AddrSpaceEnd - 1;
|
||||
return AddressSpaceStart <= address && address + size - 1 <= AddressSpaceEnd - 1;
|
||||
}
|
||||
|
||||
public bool InsideAliasRegion(ulong address, ulong size)
|
||||
@ -2916,7 +2903,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
|
||||
public bool OutsideAddrSpace(ulong address, ulong size)
|
||||
{
|
||||
return AddrSpaceStart > address || address + size - 1 > AddrSpaceEnd - 1;
|
||||
return AddressSpaceStart > address || address + size - 1 > AddressSpaceEnd - 1;
|
||||
}
|
||||
|
||||
public bool OutsideStackRegion(ulong address, ulong size)
|
||||
|
@ -2005,16 +2005,15 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
||||
value = process.MemoryManager.AliasRegionStart;
|
||||
break;
|
||||
case InfoType.AliasRegionSize:
|
||||
value = (process.MemoryManager.AliasRegionEnd -
|
||||
process.MemoryManager.AliasRegionStart);
|
||||
value = process.MemoryManager.AliasRegionEnd - process.MemoryManager.AliasRegionStart;
|
||||
break;
|
||||
|
||||
case InfoType.HeapRegionAddress:
|
||||
value = process.MemoryManager.HeapRegionStart;
|
||||
break;
|
||||
|
||||
case InfoType.HeapRegionSize:
|
||||
value = (process.MemoryManager.HeapRegionEnd -
|
||||
process.MemoryManager.HeapRegionStart);
|
||||
value = process.MemoryManager.HeapRegionEnd - process.MemoryManager.HeapRegionStart;
|
||||
break;
|
||||
|
||||
case InfoType.TotalMemorySize:
|
||||
@ -2026,19 +2025,19 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
||||
break;
|
||||
|
||||
case InfoType.AslrRegionAddress:
|
||||
value = process.MemoryManager.GetAddrSpaceBaseAddr();
|
||||
value = process.MemoryManager.AslrRegionStart;
|
||||
break;
|
||||
|
||||
case InfoType.AslrRegionSize:
|
||||
value = process.MemoryManager.GetAddrSpaceSize();
|
||||
value = process.MemoryManager.AslrRegionEnd - process.MemoryManager.AslrRegionStart;
|
||||
break;
|
||||
|
||||
case InfoType.StackRegionAddress:
|
||||
value = process.MemoryManager.StackRegionStart;
|
||||
break;
|
||||
|
||||
case InfoType.StackRegionSize:
|
||||
value = (process.MemoryManager.StackRegionEnd -
|
||||
process.MemoryManager.StackRegionStart);
|
||||
value = process.MemoryManager.StackRegionEnd - process.MemoryManager.StackRegionStart;
|
||||
break;
|
||||
|
||||
case InfoType.SystemResourceSizeTotal:
|
||||
@ -2872,7 +2871,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
||||
{
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
if (currentProcess.MemoryManager.AddrSpaceStart > handlesPtr)
|
||||
if (currentProcess.MemoryManager.AddressSpaceStart > handlesPtr)
|
||||
{
|
||||
return KernelResult.UserCopyFailed;
|
||||
}
|
||||
@ -2884,7 +2883,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
||||
return KernelResult.UserCopyFailed;
|
||||
}
|
||||
|
||||
if (handlesPtr + (ulong)handlesSize - 1 > currentProcess.MemoryManager.AddrSpaceEnd - 1)
|
||||
if (handlesPtr + (ulong)handlesSize - 1 > currentProcess.MemoryManager.AddressSpaceEnd - 1)
|
||||
{
|
||||
return KernelResult.UserCopyFailed;
|
||||
}
|
||||
|
@ -270,7 +270,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro
|
||||
|
||||
int retryCount;
|
||||
|
||||
ulong addressSpacePageLimit = (memMgr.GetAddrSpaceSize() - size) >> 12;
|
||||
ulong addressSpacePageLimit = ((memMgr.AslrRegionEnd - memMgr.AslrRegionStart) - size) >> 12;
|
||||
|
||||
for (retryCount = 0; retryCount < MaxMapRetries; retryCount++)
|
||||
{
|
||||
@ -278,7 +278,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro
|
||||
{
|
||||
ulong randomOffset = (ulong)(uint)Random.Shared.Next(0, (int)addressSpacePageLimit) << 12;
|
||||
|
||||
targetAddress = memMgr.GetAddrSpaceBaseAddr() + randomOffset;
|
||||
targetAddress = memMgr.AslrRegionStart + randomOffset;
|
||||
|
||||
if (memMgr.InsideAddrSpace(targetAddress, size) && !memMgr.InsideHeapRegion(targetAddress, size) && !memMgr.InsideAliasRegion(targetAddress, size))
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user