diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Process')
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)); } } } |
