mirror of
https://git.ryujinx.app/projects/Kenji-NX.git
synced 2026-10-04 19:48:56 +02:00
Android changes
This commit is contained in:
@@ -36,8 +36,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
protected readonly KernelContext Context;
|
||||
protected virtual bool UsesPrivateAllocations => false;
|
||||
|
||||
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; }
|
||||
@@ -69,6 +69,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
private MemoryRegion _memRegion;
|
||||
|
||||
private bool _allocateFromBack;
|
||||
|
||||
private readonly bool _isKernel;
|
||||
|
||||
private bool _aslrEnabled;
|
||||
@@ -104,6 +105,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
MemoryRegion memRegion,
|
||||
ulong address,
|
||||
ulong size,
|
||||
ulong reservedSize,
|
||||
KMemoryBlockSlabManager slabManager)
|
||||
{
|
||||
_contextId = Context.ContextIdManager.GetId();
|
||||
@@ -119,6 +121,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
memRegion,
|
||||
address,
|
||||
size,
|
||||
reservedSize,
|
||||
slabManager);
|
||||
|
||||
if (result != Result.Success)
|
||||
@@ -161,6 +164,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
MemoryRegion memRegion,
|
||||
ulong address,
|
||||
ulong size,
|
||||
ulong reservedSize,
|
||||
KMemoryBlockSlabManager slabManager)
|
||||
{
|
||||
ulong endAddr = address + size;
|
||||
@@ -186,7 +190,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
CodeRegionStart = 0x200000;
|
||||
codeRegionSize = 0x3fe00000;
|
||||
AslrRegionStart = 0x200000;
|
||||
AslrRegionEnd = AslrRegionStart + 0xffe00000;
|
||||
AslrRegionEnd = 0x100000000;
|
||||
stackAndTlsIoStart = 0x200000;
|
||||
stackAndTlsIoEnd = 0x40000000;
|
||||
break;
|
||||
@@ -199,7 +203,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
CodeRegionStart = 0x8000000;
|
||||
codeRegionSize = 0x78000000;
|
||||
AslrRegionStart = 0x8000000;
|
||||
AslrRegionEnd = AslrRegionStart + 0xff8000000;
|
||||
AslrRegionEnd = 0x1000000000;
|
||||
stackAndTlsIoStart = 0x8000000;
|
||||
stackAndTlsIoEnd = 0x80000000;
|
||||
break;
|
||||
@@ -212,17 +216,18 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
CodeRegionStart = 0x200000;
|
||||
codeRegionSize = 0x3fe00000;
|
||||
AslrRegionStart = 0x200000;
|
||||
AslrRegionEnd = AslrRegionStart + 0xffe00000;
|
||||
AslrRegionEnd = 0x100000000;
|
||||
stackAndTlsIoStart = 0x200000;
|
||||
stackAndTlsIoEnd = 0x40000000;
|
||||
break;
|
||||
|
||||
case ProcessCreationFlags.AddressSpace64Bit:
|
||||
ulong reservedAddressSpaceSize = _reservedAddressSpaceSize;
|
||||
if (_reservedAddressSpaceSize < addrSpaceEnd)
|
||||
{
|
||||
int addressSpaceWidth = (int)ulong.Log2(_reservedAddressSpaceSize);
|
||||
int addressSpaceWidth = (int)ulong.Log2(reservedAddressSpaceSize);
|
||||
|
||||
aliasRegion.Size = 1UL << (addressSpaceWidth - 3);
|
||||
aliasRegion.Size = reservedAddressSpaceSize >= 0x1800000000 ? 0x1000000000 : 1UL << (addressSpaceWidth - 3);
|
||||
heapRegion.Size = 0x180000000;
|
||||
stackRegion.Size = 1UL << (addressSpaceWidth - 8);
|
||||
tlsIoRegion.Size = 1UL << (addressSpaceWidth - 3);
|
||||
@@ -230,8 +235,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
codeRegionSize = BitUtils.AlignUp(endAddr, RegionAlignment) - CodeRegionStart;
|
||||
stackAndTlsIoStart = 0;
|
||||
stackAndTlsIoEnd = 0;
|
||||
AslrRegionStart = 0x8000000;
|
||||
addrSpaceEnd = 1UL << addressSpaceWidth;
|
||||
AslrRegionStart = Math.Max(reservedSize, 0x8000000);
|
||||
addrSpaceEnd = reservedSize + reservedAddressSpaceSize;
|
||||
AslrRegionEnd = addrSpaceEnd;
|
||||
}
|
||||
else
|
||||
@@ -242,8 +247,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
tlsIoRegion.Size = 0x1000000000;
|
||||
CodeRegionStart = BitUtils.AlignDown(address, RegionAlignment);
|
||||
codeRegionSize = BitUtils.AlignUp(endAddr, RegionAlignment) - CodeRegionStart;
|
||||
AslrRegionStart = 0x8000000;
|
||||
AslrRegionEnd = AslrRegionStart + 0x7ff8000000;
|
||||
AslrRegionStart = Math.Max(reservedSize, 0x8000000);
|
||||
AslrRegionEnd = 0x8000000000;
|
||||
stackAndTlsIoStart = 0;
|
||||
stackAndTlsIoEnd = 0;
|
||||
}
|
||||
@@ -285,8 +290,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
|
||||
_aslrEnabled = aslrEnabled;
|
||||
|
||||
AddrSpaceStart = addrSpaceStart;
|
||||
AddrSpaceEnd = addrSpaceEnd;
|
||||
AddressSpaceStart = addrSpaceStart;
|
||||
AddressSpaceEnd = addrSpaceEnd;
|
||||
|
||||
_slabManager = slabManager;
|
||||
|
||||
@@ -309,10 +314,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);
|
||||
|
||||
@@ -439,9 +440,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;
|
||||
}
|
||||
@@ -451,7 +452,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
|
||||
if (endAddr - 1 > AddrSpaceEnd - 1)
|
||||
if (endAddr - 1 > AddressSpaceEnd - 1)
|
||||
{
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
@@ -984,8 +985,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
|
||||
public KMemoryInfo QueryMemory(ulong address)
|
||||
{
|
||||
if (address >= AddrSpaceStart &&
|
||||
address < AddrSpaceEnd)
|
||||
if (address >= AddressSpaceStart &&
|
||||
address < AddressSpaceEnd)
|
||||
{
|
||||
lock (_blockManager)
|
||||
{
|
||||
@@ -995,8 +996,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
else
|
||||
{
|
||||
return new KMemoryInfo(
|
||||
AddrSpaceEnd,
|
||||
~AddrSpaceEnd + 1,
|
||||
AddressSpaceEnd,
|
||||
~AddressSpaceEnd + 1,
|
||||
MemoryState.Reserved,
|
||||
KMemoryPermission.None,
|
||||
MemoryAttribute.None,
|
||||
@@ -1558,14 +1559,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;
|
||||
}
|
||||
@@ -1689,14 +1690,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;
|
||||
}
|
||||
@@ -2029,14 +2030,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;
|
||||
}
|
||||
@@ -2810,7 +2811,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;
|
||||
@@ -2824,7 +2825,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
return StackRegionStart;
|
||||
|
||||
case MemoryState.KernelStack:
|
||||
return AddrSpaceStart;
|
||||
return AddressSpaceStart;
|
||||
}
|
||||
|
||||
throw new ArgumentException($"Invalid state value \"{state}\".");
|
||||
@@ -2849,7 +2850,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;
|
||||
@@ -2863,22 +2864,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;
|
||||
@@ -2904,12 +2895,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)
|
||||
@@ -2934,7 +2925,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)
|
||||
|
||||
Reference in New Issue
Block a user