649d372f7d
* misc: Implement address space size workarounds This adds code to support userland with less than 39 bits of address space available by testing reserving multiple sizes and reducing guess address space when needed. This is required for ARM64 support when the kernel is configured to use 63..39 bits for kernel space.(meaning only 38 bits is available to userland) * Address comments * Fix 32 bits address space support and address more comments
90 lines
2.6 KiB
C#
90 lines
2.6 KiB
C#
using ARMeilleure.Memory;
|
|
using Ryujinx.Cpu;
|
|
using Ryujinx.Graphics.Gpu;
|
|
using Ryujinx.HLE.HOS.Kernel.Process;
|
|
using Ryujinx.Memory;
|
|
|
|
namespace Ryujinx.HLE.HOS
|
|
{
|
|
interface IArmProcessContext : IProcessContext
|
|
{
|
|
IDiskCacheLoadState Initialize(
|
|
string titleIdText,
|
|
string displayVersion,
|
|
bool diskCacheEnabled,
|
|
ulong codeAddress,
|
|
ulong codeSize);
|
|
}
|
|
|
|
class ArmProcessContext<T> : IArmProcessContext where T : class, IVirtualMemoryManagerTracked, IMemoryManager
|
|
{
|
|
private readonly ulong _pid;
|
|
private readonly GpuContext _gpuContext;
|
|
private readonly ICpuContext _cpuContext;
|
|
private T _memoryManager;
|
|
|
|
public IVirtualMemoryManager AddressSpace => _memoryManager;
|
|
|
|
public ulong AddressSpaceSize { get; }
|
|
|
|
public ArmProcessContext(
|
|
ulong pid,
|
|
ICpuEngine cpuEngine,
|
|
GpuContext gpuContext,
|
|
T memoryManager,
|
|
ulong addressSpaceSize,
|
|
bool for64Bit)
|
|
{
|
|
if (memoryManager is IRefCounted rc)
|
|
{
|
|
rc.IncrementReferenceCount();
|
|
}
|
|
|
|
gpuContext.RegisterProcess(pid, memoryManager);
|
|
|
|
_pid = pid;
|
|
_gpuContext = gpuContext;
|
|
_cpuContext = cpuEngine.CreateCpuContext(memoryManager, for64Bit);
|
|
_memoryManager = memoryManager;
|
|
|
|
AddressSpaceSize = addressSpaceSize;
|
|
}
|
|
|
|
public IExecutionContext CreateExecutionContext(ExceptionCallbacks exceptionCallbacks)
|
|
{
|
|
return _cpuContext.CreateExecutionContext(exceptionCallbacks);
|
|
}
|
|
|
|
public void Execute(IExecutionContext context, ulong codeAddress)
|
|
{
|
|
_cpuContext.Execute(context, codeAddress);
|
|
}
|
|
|
|
public IDiskCacheLoadState Initialize(
|
|
string titleIdText,
|
|
string displayVersion,
|
|
bool diskCacheEnabled,
|
|
ulong codeAddress,
|
|
ulong codeSize)
|
|
{
|
|
_cpuContext.PrepareCodeRange(codeAddress, codeSize);
|
|
return _cpuContext.LoadDiskCache(titleIdText, displayVersion, diskCacheEnabled);
|
|
}
|
|
|
|
public void InvalidateCacheRegion(ulong address, ulong size)
|
|
{
|
|
_cpuContext.InvalidateCacheRegion(address, size);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (_memoryManager is IRefCounted rc)
|
|
{
|
|
rc.DecrementReferenceCount();
|
|
|
|
_memoryManager = null;
|
|
_gpuContext.UnregisterProcess(_pid);
|
|
}
|
|
}
|
|
}
|
|
}
|