aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs92
1 files changed, 45 insertions, 47 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
index 516b53f4..f2ba675f 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
@@ -25,7 +25,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
(KernelVersionMinor << 15) |
(KernelVersionRevision << 0);
- public KMemoryManager MemoryManager { get; private set; }
+ public KPageTableBase MemoryManager { get; private set; }
private SortedDictionary<ulong, KTlsPageInfo> _fullTlsPages;
private SortedDictionary<ulong, KTlsPageInfo> _freeTlsPages;
@@ -132,11 +132,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
ulong codeAddress = creationInfo.CodeAddress;
- ulong codeSize = (ulong)creationInfo.CodePagesCount * KMemoryManager.PageSize;
+ ulong codeSize = (ulong)creationInfo.CodePagesCount * KPageTableBase.PageSize;
- KMemoryBlockAllocator memoryBlockAllocator = creationInfo.Flags.HasFlag(ProcessCreationFlags.IsApplication)
- ? KernelContext.LargeMemoryBlockAllocator
- : KernelContext.SmallMemoryBlockAllocator;
+ KMemoryBlockSlabManager slabManager = creationInfo.Flags.HasFlag(ProcessCreationFlags.IsApplication)
+ ? KernelContext.LargeMemoryBlockSlabManager
+ : KernelContext.SmallMemoryBlockSlabManager;
KernelResult result = MemoryManager.InitializeForProcess(
addrSpaceType,
@@ -145,7 +145,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
memRegion,
codeAddress,
codeSize,
- memoryBlockAllocator);
+ slabManager);
if (result != KernelResult.Success)
{
@@ -157,11 +157,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
return KernelResult.InvalidMemRange;
}
- result = MemoryManager.MapPages(
- codeAddress,
- pageList,
- MemoryState.CodeStatic,
- KMemoryPermission.None);
+ result = MemoryManager.MapPages(codeAddress, pageList, MemoryState.CodeStatic, KMemoryPermission.None);
if (result != KernelResult.Success)
{
@@ -202,7 +198,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
ulong codePagesCount = (ulong)creationInfo.CodePagesCount;
- ulong neededSizeForProcess = personalMmHeapSize + codePagesCount * KMemoryManager.PageSize;
+ ulong neededSizeForProcess = personalMmHeapSize + codePagesCount * KPageTableBase.PageSize;
if (neededSizeForProcess != 0 && resourceLimit != null)
{
@@ -222,17 +218,17 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
PersonalMmHeapPagesCount = (ulong)creationInfo.SystemResourcePagesCount;
- KMemoryBlockAllocator memoryBlockAllocator;
+ KMemoryBlockSlabManager slabManager;
if (PersonalMmHeapPagesCount != 0)
{
- memoryBlockAllocator = new KMemoryBlockAllocator(PersonalMmHeapPagesCount * KMemoryManager.PageSize);
+ slabManager = new KMemoryBlockSlabManager(PersonalMmHeapPagesCount * KPageTableBase.PageSize);
}
else
{
- memoryBlockAllocator = creationInfo.Flags.HasFlag(ProcessCreationFlags.IsApplication)
- ? KernelContext.LargeMemoryBlockAllocator
- : KernelContext.SmallMemoryBlockAllocator;
+ slabManager = creationInfo.Flags.HasFlag(ProcessCreationFlags.IsApplication)
+ ? KernelContext.LargeMemoryBlockSlabManager
+ : KernelContext.SmallMemoryBlockSlabManager;
}
AddressSpaceType addrSpaceType = (AddressSpaceType)((int)(creationInfo.Flags & ProcessCreationFlags.AddressSpaceMask) >> (int)ProcessCreationFlags.AddressSpaceShift);
@@ -243,7 +239,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
ulong codeAddress = creationInfo.CodeAddress;
- ulong codeSize = codePagesCount * KMemoryManager.PageSize;
+ ulong codeSize = codePagesCount * KPageTableBase.PageSize;
KernelResult result = MemoryManager.InitializeForProcess(
addrSpaceType,
@@ -252,7 +248,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
memRegion,
codeAddress,
codeSize,
- memoryBlockAllocator);
+ slabManager);
if (result != KernelResult.Success)
{
@@ -268,7 +264,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
return KernelResult.InvalidMemRange;
}
- result = MemoryManager.MapNewProcessCode(
+ result = MemoryManager.MapPages(
codeAddress,
codePagesCount,
MemoryState.CodeStatic,
@@ -352,7 +348,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
_version = creationInfo.Version;
TitleId = creationInfo.TitleId;
_entrypoint = creationInfo.CodeAddress;
- _imageSize = (ulong)creationInfo.CodePagesCount * KMemoryManager.PageSize;
+ _imageSize = (ulong)creationInfo.CodePagesCount * KPageTableBase.PageSize;
switch (Flags & ProcessCreationFlags.AddressSpaceMask)
{
@@ -396,9 +392,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
if (pageInfo.IsFull())
{
- _freeTlsPages.Remove(pageInfo.PageAddr);
+ _freeTlsPages.Remove(pageInfo.PageVirtualAddress);
- _fullTlsPages.Add(pageInfo.PageAddr, pageInfo);
+ _fullTlsPages.Add(pageInfo.PageVirtualAddress, pageInfo);
}
result = KernelResult.Success;
@@ -415,7 +411,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
throw new InvalidOperationException("Unexpected failure getting free TLS page!");
}
- _freeTlsPages.Add(pageInfo.PageAddr, pageInfo);
+ _freeTlsPages.Add(pageInfo.PageVirtualAddress, pageInfo);
}
else
{
@@ -440,11 +436,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
ulong regionStart = MemoryManager.TlsIoRegionStart;
ulong regionSize = MemoryManager.TlsIoRegionEnd - regionStart;
- ulong regionPagesCount = regionSize / KMemoryManager.PageSize;
+ ulong regionPagesCount = regionSize / KPageTableBase.PageSize;
- KernelResult result = MemoryManager.AllocateOrMapPa(
+ KernelResult result = MemoryManager.MapPages(
1,
- KMemoryManager.PageSize,
+ KPageTableBase.PageSize,
tlsPagePa,
true,
regionStart,
@@ -459,9 +455,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
}
else
{
- pageInfo = new KTlsPageInfo(tlsPageVa);
+ pageInfo = new KTlsPageInfo(tlsPageVa, tlsPagePa);
- MemoryHelper.FillWithZeros(CpuMemory, tlsPageVa, KMemoryManager.PageSize);
+ MemoryHelper.FillWithZeros(CpuMemory, tlsPageVa, KPageTableBase.PageSize);
}
return result;
@@ -469,7 +465,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
public KernelResult FreeThreadLocalStorage(ulong tlsSlotAddr)
{
- ulong tlsPageAddr = BitUtils.AlignDown(tlsSlotAddr, KMemoryManager.PageSize);
+ ulong tlsPageAddr = BitUtils.AlignDown(tlsSlotAddr, KPageTableBase.PageSize);
KernelContext.CriticalSection.Enter();
@@ -514,16 +510,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
private KernelResult FreeTlsPage(KTlsPageInfo pageInfo)
{
- if (!MemoryManager.TryConvertVaToPa(pageInfo.PageAddr, out ulong tlsPagePa))
- {
- throw new InvalidOperationException("Unexpected failure translating virtual address to physical.");
- }
-
- KernelResult result = MemoryManager.UnmapForKernel(pageInfo.PageAddr, 1, MemoryState.ThreadLocal);
+ KernelResult result = MemoryManager.UnmapForKernel(pageInfo.PageVirtualAddress, 1, MemoryState.ThreadLocal);
if (result == KernelResult.Success)
{
- KernelContext.UserSlabHeapPages.Free(tlsPagePa);
+ KernelContext.UserSlabHeapPages.Free(pageInfo.PagePhysicalAddress);
}
return result;
@@ -556,7 +547,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
throw new InvalidOperationException("Trying to start a process with a invalid state!");
}
- ulong stackSizeRounded = BitUtils.AlignUp(stackSize, KMemoryManager.PageSize);
+ ulong stackSizeRounded = BitUtils.AlignUp(stackSize, KPageTableBase.PageSize);
ulong neededSize = stackSizeRounded + _imageSize;
@@ -598,7 +589,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
ulong stackBottom = stackTop - _mainThreadStackSize;
- ulong stackPagesCount = _mainThreadStackSize / KMemoryManager.PageSize;
+ ulong stackPagesCount = _mainThreadStackSize / KPageTableBase.PageSize;
MemoryManager.UnmapForKernel(stackBottom, stackPagesCount, MemoryState.Stack);
@@ -611,16 +602,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
if (stackSizeRounded != 0)
{
- ulong stackPagesCount = stackSizeRounded / KMemoryManager.PageSize;
+ ulong stackPagesCount = stackSizeRounded / KPageTableBase.PageSize;
ulong regionStart = MemoryManager.StackRegionStart;
ulong regionSize = MemoryManager.StackRegionEnd - regionStart;
- ulong regionPagesCount = regionSize / KMemoryManager.PageSize;
+ ulong regionPagesCount = regionSize / KPageTableBase.PageSize;
- result = MemoryManager.AllocateOrMapPa(
+ result = MemoryManager.MapPages(
stackPagesCount,
- KMemoryManager.PageSize,
+ KPageTableBase.PageSize,
0,
false,
regionStart,
@@ -834,7 +825,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
return 0;
}
- return personalMmHeapPagesCount * KMemoryManager.PageSize;
+ return personalMmHeapPagesCount * KPageTableBase.PageSize;
}
public void AddCpuTime(long ticks)
@@ -1058,16 +1049,23 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
_ => 39
};
- Context = _contextFactory.Create(KernelContext.Memory, 1UL << addrSpaceBits, InvalidAccessHandler);
+ Context = _contextFactory.Create(KernelContext, 1UL << addrSpaceBits, InvalidAccessHandler);
// TODO: This should eventually be removed.
// The GPU shouldn't depend on the CPU memory manager at all.
if (flags.HasFlag(ProcessCreationFlags.IsApplication))
{
- KernelContext.Device.Gpu.SetVmm((MemoryManager)CpuMemory);
+ KernelContext.Device.Gpu.SetVmm((IVirtualMemoryManagerTracked)CpuMemory);
}
- MemoryManager = new KMemoryManager(KernelContext, CpuMemory);
+ if (Context.AddressSpace is MemoryManagerHostMapped)
+ {
+ MemoryManager = new KPageTableHostMapped(KernelContext, CpuMemory);
+ }
+ else
+ {
+ MemoryManager = new KPageTable(KernelContext, CpuMemory);
+ }
}
private bool InvalidAccessHandler(ulong va)