aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Process
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Process')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/IProcessContextFactory.cs2
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs92
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs10
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/KTlsPageInfo.cs16
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/KTlsPageManager.cs2
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/ProcessContextFactory.cs4
6 files changed, 63 insertions, 63 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/IProcessContextFactory.cs b/Ryujinx.HLE/HOS/Kernel/Process/IProcessContextFactory.cs
index c438b570..e9fbf618 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/IProcessContextFactory.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/IProcessContextFactory.cs
@@ -5,6 +5,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
interface IProcessContextFactory
{
- IProcessContext Create(MemoryBlock backingMemory, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler);
+ IProcessContext Create(KernelContext context, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler);
}
}
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)
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs b/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs
index e1cdb30f..28944c4f 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs
@@ -25,7 +25,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
IrqAccessMask = new byte[0x80];
}
- public KernelResult InitializeForKernel(ReadOnlySpan<int> capabilities, KMemoryManager memoryManager)
+ public KernelResult InitializeForKernel(ReadOnlySpan<int> capabilities, KPageTableBase memoryManager)
{
AllowedCpuCoresMask = 0xf;
AllowedThreadPriosMask = -1;
@@ -35,12 +35,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
return Parse(capabilities, memoryManager);
}
- public KernelResult InitializeForUser(ReadOnlySpan<int> capabilities, KMemoryManager memoryManager)
+ public KernelResult InitializeForUser(ReadOnlySpan<int> capabilities, KPageTableBase memoryManager)
{
return Parse(capabilities, memoryManager);
}
- private KernelResult Parse(ReadOnlySpan<int> capabilities, KMemoryManager memoryManager)
+ private KernelResult Parse(ReadOnlySpan<int> capabilities, KPageTableBase memoryManager)
{
int mask0 = 0;
int mask1 = 0;
@@ -117,7 +117,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
return KernelResult.Success;
}
- private KernelResult ParseCapability(int cap, ref int mask0, ref int mask1, KMemoryManager memoryManager)
+ private KernelResult ParseCapability(int cap, ref int mask0, ref int mask1, KPageTableBase memoryManager)
{
int code = (cap + 1) & ~cap;
@@ -217,7 +217,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
long address = ((long)(uint)cap << 4) & 0xffffff000;
- memoryManager.MapIoMemory(address, KMemoryManager.PageSize, KMemoryPermission.ReadAndWrite);
+ memoryManager.MapIoMemory(address, KPageTableBase.PageSize, KMemoryPermission.ReadAndWrite);
break;
}
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KTlsPageInfo.cs b/Ryujinx.HLE/HOS/Kernel/Process/KTlsPageInfo.cs
index 5ce5a299..f55e3c10 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/KTlsPageInfo.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/KTlsPageInfo.cs
@@ -6,15 +6,17 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
public const int TlsEntrySize = 0x200;
- public ulong PageAddr { get; private set; }
+ public ulong PageVirtualAddress { get; }
+ public ulong PagePhysicalAddress { get; }
- private bool[] _isSlotFree;
+ private readonly bool[] _isSlotFree;
- public KTlsPageInfo(ulong pageAddress)
+ public KTlsPageInfo(ulong pageVirtualAddress, ulong pagePhysicalAddress)
{
- PageAddr = pageAddress;
+ PageVirtualAddress = pageVirtualAddress;
+ PagePhysicalAddress = pagePhysicalAddress;
- _isSlotFree = new bool[KMemoryManager.PageSize / TlsEntrySize];
+ _isSlotFree = new bool[KPageTableBase.PageSize / TlsEntrySize];
for (int index = 0; index < _isSlotFree.Length; index++)
{
@@ -24,7 +26,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
public bool TryGetFreePage(out ulong address)
{
- address = PageAddr;
+ address = PageVirtualAddress;
for (int index = 0; index < _isSlotFree.Length; index++)
{
@@ -69,7 +71,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
public void FreeTlsSlot(ulong address)
{
- _isSlotFree[(address - PageAddr) / TlsEntrySize] = true;
+ _isSlotFree[(address - PageVirtualAddress) / TlsEntrySize] = true;
}
}
} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KTlsPageManager.cs b/Ryujinx.HLE/HOS/Kernel/Process/KTlsPageManager.cs
index 03174e5b..0fde495c 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/KTlsPageManager.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/KTlsPageManager.cs
@@ -20,7 +20,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
_pagePosition = pagePosition;
- _slots = new bool[KMemoryManager.PageSize / TlsEntrySize];
+ _slots = new bool[KPageTableBase.PageSize / TlsEntrySize];
}
public bool TryGetFreeTlsAddr(out long position)
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/ProcessContextFactory.cs b/Ryujinx.HLE/HOS/Kernel/Process/ProcessContextFactory.cs
index 03db62fa..29860b3b 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/ProcessContextFactory.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/ProcessContextFactory.cs
@@ -5,9 +5,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
class ProcessContextFactory : IProcessContextFactory
{
- public IProcessContext Create(MemoryBlock backingMemory, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler)
+ public IProcessContext Create(KernelContext context, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler)
{
- return new ProcessContext(new AddressSpaceManager(backingMemory, addressSpaceSize));
+ return new ProcessContext(new AddressSpaceManager(addressSpaceSize));
}
}
}