IPC refactor part 3+4: New server HIPC message processor (#4188)
* IPC refactor part 3 + 4: New server HIPC message processor with source generator based serialization * Make types match on calls to AlignUp/AlignDown * Formatting * Address some PR feedback * Move BitfieldExtensions to Ryujinx.Common.Utilities and consolidate implementations * Rename Reader/Writer to SpanReader/SpanWriter and move to Ryujinx.Common.Memory * Implement EventType * Address more PR feedback * Log request processing errors since they are not normal * Rename waitable to multiwait and add missing lock * PR feedback * Ac_K PR feedback
This commit is contained in:
parent
c6a139a6e7
commit
08831eecf7
213 changed files with 9762 additions and 1010 deletions
|
@ -1,6 +1,7 @@
|
|||
using Ryujinx.Common;
|
||||
using Ryujinx.HLE.HOS.Kernel.Common;
|
||||
using Ryujinx.HLE.HOS.Kernel.Process;
|
||||
using Ryujinx.Horizon.Common;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
|
@ -88,7 +89,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
private static readonly int[] AddrSpaceSizes = new int[] { 32, 36, 32, 39 };
|
||||
|
||||
public KernelResult InitializeForProcess(
|
||||
public Result InitializeForProcess(
|
||||
AddressSpaceType addrSpaceType,
|
||||
bool aslrEnabled,
|
||||
bool aslrDisabled,
|
||||
|
@ -107,7 +108,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
ulong addrSpaceBase = 0;
|
||||
ulong addrSpaceSize = 1UL << AddrSpaceSizes[(int)addrSpaceType];
|
||||
|
||||
KernelResult result = CreateUserAddressSpace(
|
||||
Result result = CreateUserAddressSpace(
|
||||
addrSpaceType,
|
||||
aslrEnabled,
|
||||
aslrDisabled,
|
||||
|
@ -118,7 +119,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
size,
|
||||
slabManager);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
Context.ContextIdManager.PutId(_contextId);
|
||||
}
|
||||
|
@ -134,7 +135,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
public ulong AslrOffset;
|
||||
}
|
||||
|
||||
private KernelResult CreateUserAddressSpace(
|
||||
private Result CreateUserAddressSpace(
|
||||
AddressSpaceType addrSpaceType,
|
||||
bool aslrEnabled,
|
||||
bool aslrDisabled,
|
||||
|
@ -342,7 +343,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult MapPages(ulong address, KPageList pageList, MemoryState state, KMemoryPermission permission)
|
||||
public Result MapPages(ulong address, KPageList pageList, MemoryState state, KMemoryPermission permission)
|
||||
{
|
||||
ulong pagesCount = pageList.GetPagesCount();
|
||||
|
||||
|
@ -365,9 +366,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
return KernelResult.OutOfResource;
|
||||
}
|
||||
|
||||
KernelResult result = MapPages(address, pageList, permission);
|
||||
Result result = MapPages(address, pageList, permission);
|
||||
|
||||
if (result == KernelResult.Success)
|
||||
if (result == Result.Success)
|
||||
{
|
||||
_blockManager.InsertBlock(address, pagesCount, state, permission);
|
||||
}
|
||||
|
@ -376,7 +377,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult UnmapPages(ulong address, KPageList pageList, MemoryState stateExpected)
|
||||
public Result UnmapPages(ulong address, KPageList pageList, MemoryState stateExpected)
|
||||
{
|
||||
ulong pagesCount = pageList.GetPagesCount();
|
||||
ulong size = pagesCount * PageSize;
|
||||
|
@ -430,9 +431,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
return KernelResult.OutOfResource;
|
||||
}
|
||||
|
||||
KernelResult result = Unmap(address, pagesCount);
|
||||
Result result = Unmap(address, pagesCount);
|
||||
|
||||
if (result == KernelResult.Success)
|
||||
if (result == Result.Success)
|
||||
{
|
||||
_blockManager.InsertBlock(address, pagesCount, MemoryState.Unmapped);
|
||||
}
|
||||
|
@ -446,19 +447,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult MapNormalMemory(long address, long size, KMemoryPermission permission)
|
||||
public Result MapNormalMemory(long address, long size, KMemoryPermission permission)
|
||||
{
|
||||
// TODO.
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
public KernelResult MapIoMemory(long address, long size, KMemoryPermission permission)
|
||||
public Result MapIoMemory(long address, long size, KMemoryPermission permission)
|
||||
{
|
||||
// TODO.
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
public KernelResult MapPages(
|
||||
public Result MapPages(
|
||||
ulong pagesCount,
|
||||
int alignment,
|
||||
ulong srcPa,
|
||||
|
@ -497,7 +498,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
return KernelResult.OutOfResource;
|
||||
}
|
||||
|
||||
KernelResult result;
|
||||
Result result;
|
||||
|
||||
if (paIsValid)
|
||||
{
|
||||
|
@ -508,7 +509,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
result = AllocateAndMapPages(address, pagesCount, permission);
|
||||
}
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -516,10 +517,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
_blockManager.InsertBlock(address, pagesCount, state, permission);
|
||||
}
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
public KernelResult MapPages(ulong address, ulong pagesCount, MemoryState state, KMemoryPermission permission)
|
||||
public Result MapPages(ulong address, ulong pagesCount, MemoryState state, KMemoryPermission permission)
|
||||
{
|
||||
ulong size = pagesCount * PageSize;
|
||||
|
||||
|
@ -540,9 +541,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
return KernelResult.OutOfResource;
|
||||
}
|
||||
|
||||
KernelResult result = AllocateAndMapPages(address, pagesCount, permission);
|
||||
Result result = AllocateAndMapPages(address, pagesCount, permission);
|
||||
|
||||
if (result == KernelResult.Success)
|
||||
if (result == Result.Success)
|
||||
{
|
||||
_blockManager.InsertBlock(address, pagesCount, state, permission);
|
||||
}
|
||||
|
@ -551,13 +552,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
private KernelResult AllocateAndMapPages(ulong address, ulong pagesCount, KMemoryPermission permission)
|
||||
private Result AllocateAndMapPages(ulong address, ulong pagesCount, KMemoryPermission permission)
|
||||
{
|
||||
KMemoryRegionManager region = GetMemoryRegionManager();
|
||||
|
||||
KernelResult result = region.AllocatePages(out KPageList pageList, pagesCount);
|
||||
Result result = region.AllocatePages(out KPageList pageList, pagesCount);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -567,7 +568,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
return MapPages(address, pageList, permission);
|
||||
}
|
||||
|
||||
public KernelResult MapProcessCodeMemory(ulong dst, ulong src, ulong size)
|
||||
public Result MapProcessCodeMemory(ulong dst, ulong src, ulong size)
|
||||
{
|
||||
lock (_blockManager)
|
||||
{
|
||||
|
@ -596,12 +597,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
ulong pagesCount = size / PageSize;
|
||||
|
||||
KernelResult result = MapMemory(src, dst, pagesCount, permission, KMemoryPermission.None);
|
||||
Result result = MapMemory(src, dst, pagesCount, permission, KMemoryPermission.None);
|
||||
|
||||
_blockManager.InsertBlock(src, pagesCount, state, KMemoryPermission.None, MemoryAttribute.Borrowed);
|
||||
_blockManager.InsertBlock(dst, pagesCount, MemoryState.ModCodeStatic);
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -610,7 +611,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult UnmapProcessCodeMemory(ulong dst, ulong src, ulong size)
|
||||
public Result UnmapProcessCodeMemory(ulong dst, ulong src, ulong size)
|
||||
{
|
||||
lock (_blockManager)
|
||||
{
|
||||
|
@ -656,9 +657,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
{
|
||||
ulong pagesCount = size / PageSize;
|
||||
|
||||
KernelResult result = Unmap(dst, pagesCount);
|
||||
Result result = Unmap(dst, pagesCount);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -673,7 +674,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
_blockManager.InsertBlock(dst, pagesCount, MemoryState.Unmapped);
|
||||
_blockManager.InsertBlock(src, pagesCount, MemoryState.Heap, KMemoryPermission.ReadAndWrite);
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -682,7 +683,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult SetHeapSize(ulong size, out ulong address)
|
||||
public Result SetHeapSize(ulong size, out ulong address)
|
||||
{
|
||||
address = 0;
|
||||
|
||||
|
@ -712,7 +713,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
KMemoryRegionManager region = GetMemoryRegionManager();
|
||||
|
||||
KernelResult result = region.AllocatePages(out KPageList pageList, pagesCount);
|
||||
Result result = region.AllocatePages(out KPageList pageList, pagesCount);
|
||||
|
||||
using var _ = new OnScopeExit(() => pageList.DecrementPagesReferenceCount(Context.MemoryManager));
|
||||
|
||||
|
@ -724,7 +725,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
CleanUpForError();
|
||||
|
||||
|
@ -747,7 +748,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
result = MapPages(_currentHeapAddr, pageList, KMemoryPermission.ReadAndWrite, true, (byte)_heapFillValue);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
CleanUpForError();
|
||||
|
||||
|
@ -786,9 +787,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
ulong pagesCount = sizeDelta / PageSize;
|
||||
|
||||
KernelResult result = Unmap(freeAddr, pagesCount);
|
||||
Result result = Unmap(freeAddr, pagesCount);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -803,10 +804,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
address = HeapRegionStart;
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
public KernelResult SetMemoryPermission(ulong address, ulong size, KMemoryPermission permission)
|
||||
public Result SetMemoryPermission(ulong address, ulong size, KMemoryPermission permission)
|
||||
{
|
||||
lock (_blockManager)
|
||||
{
|
||||
|
@ -833,9 +834,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
ulong pagesCount = size / PageSize;
|
||||
|
||||
KernelResult result = Reprotect(address, pagesCount, permission);
|
||||
Result result = Reprotect(address, pagesCount, permission);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -843,7 +844,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
_blockManager.InsertBlock(address, pagesCount, oldState, permission);
|
||||
}
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -865,17 +866,17 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
return _currentHeapAddr - HeapRegionStart;
|
||||
}
|
||||
|
||||
public KernelResult SetHeapCapacity(ulong capacity)
|
||||
public Result SetHeapCapacity(ulong capacity)
|
||||
{
|
||||
lock (_blockManager)
|
||||
{
|
||||
_heapCapacity = capacity;
|
||||
}
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
public KernelResult SetMemoryAttribute(
|
||||
public Result SetMemoryAttribute(
|
||||
ulong address,
|
||||
ulong size,
|
||||
MemoryAttribute attributeMask,
|
||||
|
@ -909,7 +910,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
_blockManager.InsertBlock(address, pagesCount, state, permission, attribute);
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -942,7 +943,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult Map(ulong dst, ulong src, ulong size)
|
||||
public Result Map(ulong dst, ulong src, ulong size)
|
||||
{
|
||||
bool success;
|
||||
|
||||
|
@ -973,9 +974,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
ulong pagesCount = size / PageSize;
|
||||
|
||||
KernelResult result = MapMemory(src, dst, pagesCount, KMemoryPermission.ReadAndWrite, KMemoryPermission.ReadAndWrite);
|
||||
Result result = MapMemory(src, dst, pagesCount, KMemoryPermission.ReadAndWrite, KMemoryPermission.ReadAndWrite);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -983,7 +984,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
_blockManager.InsertBlock(src, pagesCount, srcState, KMemoryPermission.None, MemoryAttribute.Borrowed);
|
||||
_blockManager.InsertBlock(dst, pagesCount, MemoryState.Stack, KMemoryPermission.ReadAndWrite);
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -992,7 +993,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult UnmapForKernel(ulong address, ulong pagesCount, MemoryState stateExpected)
|
||||
public Result UnmapForKernel(ulong address, ulong pagesCount, MemoryState stateExpected)
|
||||
{
|
||||
ulong size = pagesCount * PageSize;
|
||||
|
||||
|
@ -1017,14 +1018,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
return KernelResult.OutOfResource;
|
||||
}
|
||||
|
||||
KernelResult result = Unmap(address, pagesCount);
|
||||
Result result = Unmap(address, pagesCount);
|
||||
|
||||
if (result == KernelResult.Success)
|
||||
if (result == Result.Success)
|
||||
{
|
||||
_blockManager.InsertBlock(address, pagesCount, MemoryState.Unmapped);
|
||||
}
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1033,7 +1034,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult Unmap(ulong dst, ulong src, ulong size)
|
||||
public Result Unmap(ulong dst, ulong src, ulong size)
|
||||
{
|
||||
bool success;
|
||||
|
||||
|
@ -1076,9 +1077,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
ulong pagesCount = size / PageSize;
|
||||
|
||||
KernelResult result = UnmapMemory(dst, src, pagesCount, dstPermission, KMemoryPermission.ReadAndWrite);
|
||||
Result result = UnmapMemory(dst, src, pagesCount, dstPermission, KMemoryPermission.ReadAndWrite);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -1086,7 +1087,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
_blockManager.InsertBlock(src, pagesCount, srcState, KMemoryPermission.ReadAndWrite);
|
||||
_blockManager.InsertBlock(dst, pagesCount, MemoryState.Unmapped);
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1095,7 +1096,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult UnmapProcessMemory(ulong dst, ulong size, KPageTableBase srcPageTable, ulong src)
|
||||
public Result UnmapProcessMemory(ulong dst, ulong size, KPageTableBase srcPageTable, ulong src)
|
||||
{
|
||||
lock (_blockManager)
|
||||
{
|
||||
|
@ -1153,20 +1154,20 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
ulong pagesCount = size / PageSize;
|
||||
|
||||
KernelResult result = Unmap(dst, pagesCount);
|
||||
Result result = Unmap(dst, pagesCount);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
_blockManager.InsertBlock(dst, pagesCount, MemoryState.Unmapped);
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
}
|
||||
|
||||
public KernelResult SetProcessMemoryPermission(ulong address, ulong size, KMemoryPermission permission)
|
||||
public Result SetProcessMemoryPermission(ulong address, ulong size, KMemoryPermission permission)
|
||||
{
|
||||
lock (_blockManager)
|
||||
{
|
||||
|
@ -1213,7 +1214,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
ulong pagesCount = size / PageSize;
|
||||
|
||||
KernelResult result;
|
||||
Result result;
|
||||
|
||||
if ((oldPermission & KMemoryPermission.Execute) != 0)
|
||||
{
|
||||
|
@ -1224,7 +1225,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
result = Reprotect(address, pagesCount, permission);
|
||||
}
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -1232,7 +1233,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
_blockManager.InsertBlock(address, pagesCount, newState, permission);
|
||||
}
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1241,7 +1242,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult MapPhysicalMemory(ulong address, ulong size)
|
||||
public Result MapPhysicalMemory(ulong address, ulong size)
|
||||
{
|
||||
ulong endAddr = address + size;
|
||||
|
||||
|
@ -1259,7 +1260,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
if (mappedSize == size)
|
||||
{
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
ulong remainingSize = size - mappedSize;
|
||||
|
@ -1276,7 +1277,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
KMemoryRegionManager region = GetMemoryRegionManager();
|
||||
|
||||
KernelResult result = region.AllocatePages(out KPageList pageList, remainingPages);
|
||||
Result result = region.AllocatePages(out KPageList pageList, remainingPages);
|
||||
|
||||
using var _ = new OnScopeExit(() => pageList.DecrementPagesReferenceCount(Context.MemoryManager));
|
||||
|
||||
|
@ -1285,7 +1286,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
currentProcess.ResourceLimit?.Release(LimitableResource.Memory, remainingSize);
|
||||
}
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
CleanUpForError();
|
||||
|
||||
|
@ -1357,10 +1358,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
MemoryAttribute.None);
|
||||
}
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
public KernelResult UnmapPhysicalMemory(ulong address, ulong size)
|
||||
public Result UnmapPhysicalMemory(ulong address, ulong size)
|
||||
{
|
||||
ulong endAddr = address + size;
|
||||
|
||||
|
@ -1391,7 +1392,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
if (heapMappedSize == 0)
|
||||
{
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
if (!_slabManager.CanAllocate(MaxBlocksNeededForInsertion))
|
||||
|
@ -1400,7 +1401,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
|
||||
// Try to unmap all the heap mapped memory inside range.
|
||||
KernelResult result = KernelResult.Success;
|
||||
Result result = Result.Success;
|
||||
|
||||
foreach (KMemoryInfo info in IterateOverRange(address, endAddr))
|
||||
{
|
||||
|
@ -1416,11 +1417,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
// The kernel would attempt to remap if this fails, but we don't because:
|
||||
// - The implementation may not support remapping if memory aliasing is not supported on the platform.
|
||||
// - Unmap can't ever fail here anyway.
|
||||
Debug.Assert(result == KernelResult.Success);
|
||||
Debug.Assert(result == Result.Success);
|
||||
}
|
||||
}
|
||||
|
||||
if (result == KernelResult.Success)
|
||||
if (result == Result.Success)
|
||||
{
|
||||
PhysicalMemoryUsage -= heapMappedSize;
|
||||
|
||||
|
@ -1437,7 +1438,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult CopyDataToCurrentProcess(
|
||||
public Result CopyDataToCurrentProcess(
|
||||
ulong dst,
|
||||
ulong size,
|
||||
ulong src,
|
||||
|
@ -1460,7 +1461,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
toServer: true);
|
||||
}
|
||||
|
||||
public KernelResult CopyDataFromCurrentProcess(
|
||||
public Result CopyDataFromCurrentProcess(
|
||||
ulong dst,
|
||||
ulong size,
|
||||
MemoryState stateMask,
|
||||
|
@ -1483,7 +1484,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
toServer: false);
|
||||
}
|
||||
|
||||
private KernelResult CopyDataFromOrToCurrentProcess(
|
||||
private Result CopyDataFromOrToCurrentProcess(
|
||||
ulong size,
|
||||
ulong clientAddress,
|
||||
ulong serverAddress,
|
||||
|
@ -1543,7 +1544,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
size -= copySize;
|
||||
}
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1552,7 +1553,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult MapBufferFromClientProcess(
|
||||
public Result MapBufferFromClientProcess(
|
||||
ulong size,
|
||||
ulong src,
|
||||
KPageTableBase srcPageTable,
|
||||
|
@ -1567,14 +1568,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
{
|
||||
lock (_blockManager)
|
||||
{
|
||||
KernelResult result = srcPageTable.ReprotectClientProcess(
|
||||
Result result = srcPageTable.ReprotectClientProcess(
|
||||
src,
|
||||
size,
|
||||
permission,
|
||||
state,
|
||||
out int blocksNeeded);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -1590,7 +1591,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
result = MapPagesFromClientProcess(size, src, permission, state, srcPageTable, send, out ulong va);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
if (srcMapEndAddr > srcMapAddress)
|
||||
{
|
||||
|
@ -1613,10 +1614,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
private KernelResult ReprotectClientProcess(
|
||||
private Result ReprotectClientProcess(
|
||||
ulong address,
|
||||
ulong size,
|
||||
KMemoryPermission permission,
|
||||
|
@ -1689,8 +1690,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
ulong blockPagesCount = blockSize / PageSize;
|
||||
|
||||
KernelResult reprotectResult = Reprotect(blockAddress, blockPagesCount, info.Permission);
|
||||
Debug.Assert(reprotectResult == KernelResult.Success);
|
||||
Result reprotectResult = Reprotect(blockAddress, blockPagesCount, info.Permission);
|
||||
Debug.Assert(reprotectResult == Result.Success);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1699,7 +1700,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
SignalMemoryTracking(addressTruncated, endAddrRounded - addressTruncated, false);
|
||||
|
||||
// Reprotect the aligned pages range on the client to make them inaccessible from the client process.
|
||||
KernelResult result;
|
||||
Result result;
|
||||
|
||||
if (addressRounded < endAddrTruncated)
|
||||
{
|
||||
|
@ -1736,7 +1737,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
{
|
||||
result = Reprotect(blockAddress, blockPagesCount, permissionMask);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
CleanUpForError();
|
||||
|
||||
|
@ -1748,10 +1749,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
private KernelResult MapPagesFromClientProcess(
|
||||
private Result MapPagesFromClientProcess(
|
||||
ulong size,
|
||||
ulong address,
|
||||
KMemoryPermission permission,
|
||||
|
@ -1877,9 +1878,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
Context.Memory.Fill(GetDramAddressFromPa(firstPageFillAddress), unusedSizeAfter, (byte)_ipcFillValue);
|
||||
}
|
||||
|
||||
KernelResult result = MapPages(currentVa, 1, dstFirstPagePa, permission);
|
||||
Result result = MapPages(currentVa, 1, dstFirstPagePa, permission);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
CleanUpForError();
|
||||
|
||||
|
@ -1896,9 +1897,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
KPageList pageList = new KPageList();
|
||||
srcPageTable.GetPhysicalRegions(addressRounded, alignedSize, pageList);
|
||||
|
||||
KernelResult result = MapPages(currentVa, pageList, permission);
|
||||
Result result = MapPages(currentVa, pageList, permission);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
CleanUpForError();
|
||||
|
||||
|
@ -1931,9 +1932,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
Context.Memory.Fill(GetDramAddressFromPa(lastPageFillAddr), unusedSizeAfter, (byte)_ipcFillValue);
|
||||
|
||||
KernelResult result = MapPages(currentVa, 1, dstLastPagePa, permission);
|
||||
Result result = MapPages(currentVa, 1, dstLastPagePa, permission);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
CleanUpForError();
|
||||
|
||||
|
@ -1945,10 +1946,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
dst = va + (address - addressTruncated);
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
public KernelResult UnmapNoAttributeIfStateEquals(ulong address, ulong size, MemoryState state)
|
||||
public Result UnmapNoAttributeIfStateEquals(ulong address, ulong size, MemoryState state)
|
||||
{
|
||||
if (AddrSpaceStart > address)
|
||||
{
|
||||
|
@ -1990,9 +1991,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
ulong pagesCount = (endAddrRounded - addressTruncated) / PageSize;
|
||||
|
||||
KernelResult result = Unmap(addressTruncated, pagesCount);
|
||||
Result result = Unmap(addressTruncated, pagesCount);
|
||||
|
||||
if (result == KernelResult.Success)
|
||||
if (result == Result.Success)
|
||||
{
|
||||
_blockManager.InsertBlock(addressTruncated, pagesCount, MemoryState.Unmapped);
|
||||
}
|
||||
|
@ -2006,7 +2007,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult UnmapIpcRestorePermission(ulong address, ulong size, MemoryState state)
|
||||
public Result UnmapIpcRestorePermission(ulong address, ulong size, MemoryState state)
|
||||
{
|
||||
ulong endAddr = address + size;
|
||||
|
||||
|
@ -2019,7 +2020,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
if (pagesCount == 0)
|
||||
{
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
MemoryState stateMask;
|
||||
|
@ -2069,9 +2070,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
ulong blockPagesCount = blockSize / PageSize;
|
||||
|
||||
KernelResult result = Reprotect(blockAddress, blockPagesCount, info.SourcePermission);
|
||||
Result result = Reprotect(blockAddress, blockPagesCount, info.SourcePermission);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -2080,7 +2081,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
_blockManager.InsertBlock(addressRounded, pagesCount, RestoreIpcMappingPermissions);
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2094,7 +2095,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
block.RestoreIpcMappingPermission();
|
||||
}
|
||||
|
||||
public KernelResult GetPagesIfStateEquals(
|
||||
public Result GetPagesIfStateEquals(
|
||||
ulong address,
|
||||
ulong size,
|
||||
MemoryState stateMask,
|
||||
|
@ -2128,7 +2129,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
{
|
||||
GetPhysicalRegions(address, size, pageList);
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2137,7 +2138,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult BorrowIpcBuffer(ulong address, ulong size)
|
||||
public Result BorrowIpcBuffer(ulong address, ulong size)
|
||||
{
|
||||
return SetAttributesAndChangePermission(
|
||||
address,
|
||||
|
@ -2152,7 +2153,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
MemoryAttribute.Borrowed);
|
||||
}
|
||||
|
||||
public KernelResult BorrowTransferMemory(KPageList pageList, ulong address, ulong size, KMemoryPermission permission)
|
||||
public Result BorrowTransferMemory(KPageList pageList, ulong address, ulong size, KMemoryPermission permission)
|
||||
{
|
||||
return SetAttributesAndChangePermission(
|
||||
address,
|
||||
|
@ -2168,7 +2169,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
pageList);
|
||||
}
|
||||
|
||||
public KernelResult BorrowCodeMemory(KPageList pageList, ulong address, ulong size)
|
||||
public Result BorrowCodeMemory(KPageList pageList, ulong address, ulong size)
|
||||
{
|
||||
return SetAttributesAndChangePermission(
|
||||
address,
|
||||
|
@ -2184,7 +2185,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
pageList);
|
||||
}
|
||||
|
||||
private KernelResult SetAttributesAndChangePermission(
|
||||
private Result SetAttributesAndChangePermission(
|
||||
ulong address,
|
||||
ulong size,
|
||||
MemoryState stateMask,
|
||||
|
@ -2237,9 +2238,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
if (newPermission != oldPermission)
|
||||
{
|
||||
KernelResult result = Reprotect(address, pagesCount, newPermission);
|
||||
Result result = Reprotect(address, pagesCount, newPermission);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -2249,7 +2250,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
_blockManager.InsertBlock(address, pagesCount, oldState, newPermission, newAttribute);
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2258,7 +2259,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult UnborrowIpcBuffer(ulong address, ulong size)
|
||||
public Result UnborrowIpcBuffer(ulong address, ulong size)
|
||||
{
|
||||
return ClearAttributesAndChangePermission(
|
||||
address,
|
||||
|
@ -2273,7 +2274,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
MemoryAttribute.Borrowed);
|
||||
}
|
||||
|
||||
public KernelResult UnborrowTransferMemory(ulong address, ulong size, KPageList pageList)
|
||||
public Result UnborrowTransferMemory(ulong address, ulong size, KPageList pageList)
|
||||
{
|
||||
return ClearAttributesAndChangePermission(
|
||||
address,
|
||||
|
@ -2289,7 +2290,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
pageList);
|
||||
}
|
||||
|
||||
public KernelResult UnborrowCodeMemory(ulong address, ulong size, KPageList pageList)
|
||||
public Result UnborrowCodeMemory(ulong address, ulong size, KPageList pageList)
|
||||
{
|
||||
return ClearAttributesAndChangePermission(
|
||||
address,
|
||||
|
@ -2305,7 +2306,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
pageList);
|
||||
}
|
||||
|
||||
private KernelResult ClearAttributesAndChangePermission(
|
||||
private Result ClearAttributesAndChangePermission(
|
||||
ulong address,
|
||||
ulong size,
|
||||
MemoryState stateMask,
|
||||
|
@ -2365,9 +2366,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
if (newPermission != oldPermission)
|
||||
{
|
||||
KernelResult result = Reprotect(address, pagesCount, newPermission);
|
||||
Result result = Reprotect(address, pagesCount, newPermission);
|
||||
|
||||
if (result != KernelResult.Success)
|
||||
if (result != Result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -2377,7 +2378,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
_blockManager.InsertBlock(address, pagesCount, oldState, newPermission, newAttribute);
|
||||
|
||||
return KernelResult.Success;
|
||||
return Result.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2915,7 +2916,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
/// <param name="oldSrcPermission">Current protection of the source memory region</param>
|
||||
/// <param name="newDstPermission">Desired protection for the destination memory region</param>
|
||||
/// <returns>Result of the mapping operation</returns>
|
||||
protected abstract KernelResult MapMemory(ulong src, ulong dst, ulong pagesCount, KMemoryPermission oldSrcPermission, KMemoryPermission newDstPermission);
|
||||
protected abstract Result MapMemory(ulong src, ulong dst, ulong pagesCount, KMemoryPermission oldSrcPermission, KMemoryPermission newDstPermission);
|
||||
|
||||
/// <summary>
|
||||
/// Unmaps a region of memory that was previously mapped with <see cref="MapMemory"/>.
|
||||
|
@ -2926,7 +2927,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
/// <param name="oldDstPermission">Current protection of the destination memory region</param>
|
||||
/// <param name="newSrcPermission">Desired protection of the source memory region</param>
|
||||
/// <returns>Result of the unmapping operation</returns>
|
||||
protected abstract KernelResult UnmapMemory(ulong dst, ulong src, ulong pagesCount, KMemoryPermission oldDstPermission, KMemoryPermission newSrcPermission);
|
||||
protected abstract Result UnmapMemory(ulong dst, ulong src, ulong pagesCount, KMemoryPermission oldDstPermission, KMemoryPermission newSrcPermission);
|
||||
|
||||
/// <summary>
|
||||
/// Maps a region of memory into the specified physical memory region.
|
||||
|
@ -2938,7 +2939,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
/// <param name="shouldFillPages">Indicate if the pages should be filled with the <paramref name="fillValue"/> value</param>
|
||||
/// <param name="fillValue">The value used to fill pages when <paramref name="shouldFillPages"/> is set to true</param>
|
||||
/// <returns>Result of the mapping operation</returns>
|
||||
protected abstract KernelResult MapPages(ulong dstVa, ulong pagesCount, ulong srcPa, KMemoryPermission permission, bool shouldFillPages = false, byte fillValue = 0);
|
||||
protected abstract Result MapPages(ulong dstVa, ulong pagesCount, ulong srcPa, KMemoryPermission permission, bool shouldFillPages = false, byte fillValue = 0);
|
||||
|
||||
/// <summary>
|
||||
/// Maps a region of memory into the specified physical memory region.
|
||||
|
@ -2949,7 +2950,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
/// <param name="shouldFillPages">Indicate if the pages should be filled with the <paramref name="fillValue"/> value</param>
|
||||
/// <param name="fillValue">The value used to fill pages when <paramref name="shouldFillPages"/> is set to true</param>
|
||||
/// <returns>Result of the mapping operation</returns>
|
||||
protected abstract KernelResult MapPages(ulong address, KPageList pageList, KMemoryPermission permission, bool shouldFillPages = false, byte fillValue = 0);
|
||||
protected abstract Result MapPages(ulong address, KPageList pageList, KMemoryPermission permission, bool shouldFillPages = false, byte fillValue = 0);
|
||||
|
||||
/// <summary>
|
||||
/// Unmaps a region of memory that was previously mapped with one of the page mapping methods.
|
||||
|
@ -2957,7 +2958,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
/// <param name="address">Virtual address of the region to unmap</param>
|
||||
/// <param name="pagesCount">Number of pages to unmap</param>
|
||||
/// <returns>Result of the unmapping operation</returns>
|
||||
protected abstract KernelResult Unmap(ulong address, ulong pagesCount);
|
||||
protected abstract Result Unmap(ulong address, ulong pagesCount);
|
||||
|
||||
/// <summary>
|
||||
/// Changes the permissions of a given virtual memory region.
|
||||
|
@ -2966,7 +2967,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
/// <param name="pagesCount">Number of pages to have their permissions changed</param>
|
||||
/// <param name="permission">New permission</param>
|
||||
/// <returns>Result of the permission change operation</returns>
|
||||
protected abstract KernelResult Reprotect(ulong address, ulong pagesCount, KMemoryPermission permission);
|
||||
protected abstract Result Reprotect(ulong address, ulong pagesCount, KMemoryPermission permission);
|
||||
|
||||
/// <summary>
|
||||
/// Changes the permissions of a given virtual memory region.
|
||||
|
@ -2975,7 +2976,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
/// <param name="pagesCount">Number of pages to have their permissions changed</param>
|
||||
/// <param name="permission">New permission</param>
|
||||
/// <returns>Result of the permission change operation</returns>
|
||||
protected abstract KernelResult ReprotectWithAttributes(ulong address, ulong pagesCount, KMemoryPermission permission);
|
||||
protected abstract Result ReprotectWithAttributes(ulong address, ulong pagesCount, KMemoryPermission permission);
|
||||
|
||||
/// <summary>
|
||||
/// Alerts the memory tracking that a given region has been read from or written to.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue