aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-05-04 00:41:29 -0300
committerGitHub <noreply@github.com>2020-05-04 13:41:29 +1000
commit15d1cc806b1b978bab83d8bb426a124d9f0f788c (patch)
tree4fd10fdd11412bafcf3022e7cc4eb21179eef1b1 /Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
parentcd48576f5846aa89a36bfc833e9de5dde9627aed (diff)
Move kernel state out of the Horizon class (#1107)
* Move kernel state from Horizon to KernelContext * Merge syscalls partial classes, split 32 and 64-bit variants * Sort usings
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs119
1 files changed, 53 insertions, 66 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
index c7d11130..81f8bb6a 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
@@ -4,7 +4,6 @@ using Ryujinx.Cpu;
using Ryujinx.HLE.Exceptions;
using Ryujinx.HLE.HOS.Kernel.Common;
using Ryujinx.HLE.HOS.Kernel.Memory;
-using Ryujinx.HLE.HOS.Kernel.SupervisorCall;
using Ryujinx.HLE.HOS.Kernel.Threading;
using System;
using System.Collections.Generic;
@@ -80,20 +79,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
public MemoryManager CpuMemory { get; private set; }
public CpuContext CpuContext { get; private set; }
- private SvcHandler _svcHandler;
-
- private Horizon _system;
-
public HleProcessDebugger Debugger { get; private set; }
- public KProcess(Horizon system) : base(system)
+ public KProcess(KernelContext context) : base(context)
{
_processLock = new object();
_threadingLock = new object();
- _system = system;
-
- AddressArbiter = new KAddressArbiter(system);
+ AddressArbiter = new KAddressArbiter(context);
_fullTlsPages = new SortedDictionary<ulong, KTlsPageInfo>();
_freeTlsPages = new SortedDictionary<ulong, KTlsPageInfo>();
@@ -104,8 +97,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
_threads = new LinkedList<KThread>();
- _svcHandler = new SvcHandler(system.Device, this);
-
Debugger = new HleProcessDebugger(this);
}
@@ -130,8 +121,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
ulong codeSize = (ulong)creationInfo.CodePagesCount * KMemoryManager.PageSize;
KMemoryBlockAllocator memoryBlockAllocator = (MmuFlags & 0x40) != 0
- ? System.LargeMemoryBlockAllocator
- : System.SmallMemoryBlockAllocator;
+ ? KernelContext.LargeMemoryBlockAllocator
+ : KernelContext.SmallMemoryBlockAllocator;
KernelResult result = MemoryManager.InitializeForProcess(
addrSpaceType,
@@ -170,9 +161,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
return result;
}
- Pid = System.GetKipId();
+ Pid = KernelContext.NewKipId();
- if (Pid == 0 || (ulong)Pid >= Horizon.InitialProcessId)
+ if (Pid == 0 || (ulong)Pid >= KernelConstants.InitialProcessId)
{
throw new InvalidOperationException($"Invalid KIP Id {Pid}.");
}
@@ -224,8 +215,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
else
{
memoryBlockAllocator = (MmuFlags & 0x40) != 0
- ? System.LargeMemoryBlockAllocator
- : System.SmallMemoryBlockAllocator;
+ ? KernelContext.LargeMemoryBlockAllocator
+ : KernelContext.SmallMemoryBlockAllocator;
}
AddressSpaceType addrSpaceType = (AddressSpaceType)((creationInfo.MmuFlags >> 1) & 7);
@@ -283,9 +274,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
return result;
}
- Pid = System.GetProcessId();
+ Pid = KernelContext.NewProcessId();
- if (Pid == -1 || (ulong)Pid < Horizon.InitialProcessId)
+ if (Pid == -1 || (ulong)Pid < KernelConstants.InitialProcessId)
{
throw new InvalidOperationException($"Invalid Process Id {Pid}.");
}
@@ -350,7 +341,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
uint requiredKernelVersionMajor = (uint)Capabilities.KernelReleaseVersion >> 19;
uint requiredKernelVersionMinor = ((uint)Capabilities.KernelReleaseVersion >> 15) & 0xf;
- if (System.EnableVersionChecks)
+ if (KernelContext.EnableVersionChecks)
{
if (requiredKernelVersionMajor > KernelVersionMajor)
{
@@ -419,7 +410,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
public KernelResult AllocateThreadLocalStorage(out ulong address)
{
- System.CriticalSection.Enter();
+ KernelContext.CriticalSection.Enter();
KernelResult result;
@@ -462,16 +453,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
}
}
- System.CriticalSection.Leave();
+ KernelContext.CriticalSection.Leave();
return result;
}
private KernelResult AllocateTlsPage(out KTlsPageInfo pageInfo)
{
- pageInfo = default(KTlsPageInfo);
+ pageInfo = default;
- if (!System.UserSlabHeapPages.TryGetItem(out ulong tlsPagePa))
+ if (!KernelContext.UserSlabHeapPages.TryGetItem(out ulong tlsPagePa))
{
return KernelResult.OutOfMemory;
}
@@ -494,7 +485,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
if (result != KernelResult.Success)
{
- System.UserSlabHeapPages.Free(tlsPagePa);
+ KernelContext.UserSlabHeapPages.Free(tlsPagePa);
}
else
{
@@ -510,7 +501,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
ulong tlsPageAddr = BitUtils.AlignDown(tlsSlotAddr, KMemoryManager.PageSize);
- System.CriticalSection.Enter();
+ KernelContext.CriticalSection.Enter();
KernelResult result = KernelResult.Success;
@@ -538,7 +529,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
// from all trees, and free the memory it was using.
_freeTlsPages.Remove(tlsPageAddr);
- System.CriticalSection.Leave();
+ KernelContext.CriticalSection.Leave();
FreeTlsPage(pageInfo);
@@ -546,7 +537,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
}
}
- System.CriticalSection.Leave();
+ KernelContext.CriticalSection.Leave();
return result;
}
@@ -562,7 +553,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
if (result == KernelResult.Success)
{
- System.UserSlabHeapPages.Free(tlsPagePa);
+ KernelContext.UserSlabHeapPages.Free(tlsPagePa);
}
return result;
@@ -692,7 +683,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
return result;
}
- HandleTable = new KHandleTable(System);
+ HandleTable = new KHandleTable(KernelContext);
result = HandleTable.Initialize(Capabilities.HandleTableSize);
@@ -703,7 +694,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
return result;
}
- mainThread = new KThread(System);
+ mainThread = new KThread(KernelContext);
result = mainThread.Initialize(
_entrypoint,
@@ -792,25 +783,25 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
public void SubscribeThreadEventHandlers(ARMeilleure.State.ExecutionContext context)
{
context.Interrupt += InterruptHandler;
- context.SupervisorCall += _svcHandler.SvcCall;
+ context.SupervisorCall += KernelContext.SyscallHandler.SvcCall;
context.Undefined += UndefinedInstructionHandler;
}
private void InterruptHandler(object sender, EventArgs e)
{
- System.Scheduler.ContextSwitch();
+ KernelContext.Scheduler.ContextSwitch();
}
public void IncrementThreadCount()
{
Interlocked.Increment(ref _threadCount);
- System.ThreadCounter.AddCount();
+ KernelContext.ThreadCounter.AddCount();
}
public void DecrementThreadCountAndTerminateIfZero()
{
- System.ThreadCounter.Signal();
+ KernelContext.ThreadCounter.Signal();
if (Interlocked.Decrement(ref _threadCount) == 0)
{
@@ -820,7 +811,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
public void DecrementToZeroWhileTerminatingCurrent()
{
- System.ThreadCounter.Signal();
+ KernelContext.ThreadCounter.Signal();
while (Interlocked.Decrement(ref _threadCount) != 0)
{
@@ -917,7 +908,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
bool shallTerminate = false;
- System.CriticalSection.Enter();
+ KernelContext.CriticalSection.Enter();
lock (_processLock)
{
@@ -941,11 +932,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
}
}
- System.CriticalSection.Leave();
+ KernelContext.CriticalSection.Leave();
if (shallTerminate)
{
- UnpauseAndTerminateAllThreadsExcept(System.Scheduler.GetCurrentThread());
+ UnpauseAndTerminateAllThreadsExcept(KernelContext.Scheduler.GetCurrentThread());
HandleTable.Destroy();
@@ -960,7 +951,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
bool shallTerminate = false;
- System.CriticalSection.Enter();
+ KernelContext.CriticalSection.Enter();
lock (_processLock)
{
@@ -977,11 +968,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
}
}
- System.CriticalSection.Leave();
+ KernelContext.CriticalSection.Leave();
if (shallTerminate)
{
- UnpauseAndTerminateAllThreadsExcept(System.Scheduler.GetCurrentThread());
+ UnpauseAndTerminateAllThreadsExcept(KernelContext.Scheduler.GetCurrentThread());
HandleTable.Destroy();
@@ -995,7 +986,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
lock (_threadingLock)
{
- System.CriticalSection.Enter();
+ KernelContext.CriticalSection.Enter();
foreach (KThread thread in _threads)
{
@@ -1005,7 +996,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
}
}
- System.CriticalSection.Leave();
+ KernelContext.CriticalSection.Leave();
}
KThread blockedThread = null;
@@ -1048,18 +1039,18 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
ResourceLimit.Release(LimitableResource.Memory, GetMemoryUsage());
}
- System.CriticalSection.Enter();
+ KernelContext.CriticalSection.Enter();
SetState(ProcessState.Exited);
- System.CriticalSection.Leave();
+ KernelContext.CriticalSection.Leave();
}
public KernelResult ClearIfNotExited()
{
KernelResult result;
- System.CriticalSection.Enter();
+ KernelContext.CriticalSection.Enter();
lock (_processLock)
{
@@ -1075,7 +1066,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
}
}
- System.CriticalSection.Leave();
+ KernelContext.CriticalSection.Leave();
return result;
}
@@ -1086,40 +1077,36 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
foreach (KThread thread in _threads)
{
- System.Scheduler.ExitThread(thread);
-
- System.Scheduler.CoreManager.Set(thread.HostThread);
+ KernelContext.Scheduler.ExitThread(thread);
+ KernelContext.Scheduler.CoreManager.Set(thread.HostThread);
}
}
}
private void InitializeMemoryManager(AddressSpaceType addrSpaceType, MemoryRegion memRegion)
{
- int addrSpaceBits;
-
- switch (addrSpaceType)
+ int addrSpaceBits = addrSpaceType switch
{
- case AddressSpaceType.Addr32Bits: addrSpaceBits = 32; break;
- case AddressSpaceType.Addr36Bits: addrSpaceBits = 36; break;
- case AddressSpaceType.Addr32BitsNoMap: addrSpaceBits = 32; break;
- case AddressSpaceType.Addr39Bits: addrSpaceBits = 39; break;
-
- default: throw new ArgumentException(nameof(addrSpaceType));
- }
-
- CpuMemory = new MemoryManager(_system.Device.Memory, 1UL << addrSpaceBits);
+ AddressSpaceType.Addr32Bits => 32,
+ AddressSpaceType.Addr36Bits => 36,
+ AddressSpaceType.Addr32BitsNoMap => 32,
+ AddressSpaceType.Addr39Bits => 39,
+ _ => throw new ArgumentException(nameof(addrSpaceType))
+ };
+
+ CpuMemory = new MemoryManager(KernelContext.Memory, 1UL << addrSpaceBits);
CpuContext = new CpuContext(CpuMemory);
// TODO: This should eventually be removed.
// The GPU shouldn't depend on the CPU memory manager at all.
- _system.Device.Gpu.SetVmm(CpuMemory);
+ KernelContext.Device.Gpu.SetVmm(CpuMemory);
- MemoryManager = new KMemoryManager(_system, CpuMemory);
+ MemoryManager = new KMemoryManager(KernelContext, CpuMemory);
}
public void PrintCurrentThreadStackTrace()
{
- System.Scheduler.GetCurrentThread().PrintGuestStackTrace();
+ KernelContext.Scheduler.GetCurrentThread().PrintGuestStackTrace();
}
private void UndefinedInstructionHandler(object sender, InstUndefinedEventArgs e)