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:
gdkchan 2023-01-04 19:15:45 -03:00 committed by GitHub
parent c6a139a6e7
commit 08831eecf7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
213 changed files with 9762 additions and 1010 deletions

View file

@ -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.