aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE/HOS/Kernel/Process
diff options
context:
space:
mode:
authorMary <mary@mary.zone>2023-06-20 17:33:54 +0200
committerGitHub <noreply@github.com>2023-06-20 17:33:54 +0200
commit649d372f7da8559f8b6d74ca44af64ba7d7853c4 (patch)
tree813e6af65602b4c1138a36bd8c214b0dd228ba60 /src/Ryujinx.HLE/HOS/Kernel/Process
parentf9a538bb0f02b4665f8cccbde0730e08da208024 (diff)
misc: Implement address space size workarounds (#5191)
* 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
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Kernel/Process')
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Process/IProcessContext.cs2
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs2
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Process/ProcessContext.cs5
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Process/ProcessContextFactory.cs2
4 files changed, 8 insertions, 3 deletions
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/IProcessContext.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/IProcessContext.cs
index c8063a62..bdfef9d7 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Process/IProcessContext.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Process/IProcessContext.cs
@@ -8,6 +8,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
IVirtualMemoryManager AddressSpace { get; }
+ ulong AddressSpaceSize { get; }
+
IExecutionContext CreateExecutionContext(ExceptionCallbacks exceptionCallbacks);
void Execute(IExecutionContext context, ulong codeAddress);
void InvalidateCacheRegion(ulong address, ulong size);
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
index 510c99ea..c284243a 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
@@ -1082,7 +1082,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
Context = _contextFactory.Create(KernelContext, Pid, 1UL << addrSpaceBits, InvalidAccessHandler, for64Bit);
- MemoryManager = new KPageTable(KernelContext, CpuMemory);
+ MemoryManager = new KPageTable(KernelContext, CpuMemory, Context.AddressSpaceSize);
}
private bool InvalidAccessHandler(ulong va)
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessContext.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessContext.cs
index 87296830..cab5c608 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessContext.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessContext.cs
@@ -8,9 +8,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
public IVirtualMemoryManager AddressSpace { get; }
- public ProcessContext(IVirtualMemoryManager asManager)
+ public ulong AddressSpaceSize { get; }
+
+ public ProcessContext(IVirtualMemoryManager asManager, ulong addressSpaceSize)
{
AddressSpace = asManager;
+ AddressSpaceSize = addressSpaceSize;
}
public IExecutionContext CreateExecutionContext(ExceptionCallbacks exceptionCallbacks)
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessContextFactory.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessContextFactory.cs
index 1c5798b4..60dd5abf 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessContextFactory.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessContextFactory.cs
@@ -6,7 +6,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
public IProcessContext Create(KernelContext context, ulong pid, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler, bool for64Bit)
{
- return new ProcessContext(new AddressSpaceManager(context.Memory, addressSpaceSize));
+ return new ProcessContext(new AddressSpaceManager(context.Memory, addressSpaceSize), addressSpaceSize);
}
}
}