Fix session service disposal and improve transfer memory implementation (#1397)
* Fix session service disposal and improve transfer memory implementation * Remove useless assignment
This commit is contained in:
parent
3af2ce74ec
commit
e7f2a5ecb7
5 changed files with 123 additions and 113 deletions
|
@ -1129,82 +1129,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public KernelResult ReserveTransferMemory(ulong address, ulong size, MemoryPermission permission)
|
||||
{
|
||||
lock (_blocks)
|
||||
{
|
||||
if (CheckRange(
|
||||
address,
|
||||
size,
|
||||
MemoryState.TransferMemoryAllowed | MemoryState.IsPoolAllocated,
|
||||
MemoryState.TransferMemoryAllowed | MemoryState.IsPoolAllocated,
|
||||
MemoryPermission.Mask,
|
||||
MemoryPermission.ReadAndWrite,
|
||||
MemoryAttribute.Mask,
|
||||
MemoryAttribute.None,
|
||||
MemoryAttribute.IpcAndDeviceMapped,
|
||||
out MemoryState state,
|
||||
out _,
|
||||
out MemoryAttribute attribute))
|
||||
{
|
||||
// TODO: Missing checks.
|
||||
|
||||
if (!_blockAllocator.CanAllocate(MaxBlocksNeededForInsertion))
|
||||
{
|
||||
return KernelResult.OutOfResource;
|
||||
}
|
||||
|
||||
ulong pagesCount = size / PageSize;
|
||||
|
||||
attribute |= MemoryAttribute.Borrowed;
|
||||
|
||||
InsertBlock(address, pagesCount, state, permission, attribute);
|
||||
|
||||
return KernelResult.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public KernelResult ResetTransferMemory(ulong address, ulong size)
|
||||
{
|
||||
lock (_blocks)
|
||||
{
|
||||
if (CheckRange(
|
||||
address,
|
||||
size,
|
||||
MemoryState.TransferMemoryAllowed | MemoryState.IsPoolAllocated,
|
||||
MemoryState.TransferMemoryAllowed | MemoryState.IsPoolAllocated,
|
||||
MemoryPermission.None,
|
||||
MemoryPermission.None,
|
||||
MemoryAttribute.Mask,
|
||||
MemoryAttribute.Borrowed,
|
||||
MemoryAttribute.IpcAndDeviceMapped,
|
||||
out MemoryState state,
|
||||
out _,
|
||||
out _))
|
||||
{
|
||||
if (!_blockAllocator.CanAllocate(MaxBlocksNeededForInsertion))
|
||||
{
|
||||
return KernelResult.OutOfResource;
|
||||
}
|
||||
|
||||
ulong pagesCount = size / PageSize;
|
||||
|
||||
InsertBlock(address, pagesCount, state, MemoryPermission.ReadAndWrite);
|
||||
|
||||
return KernelResult.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public KernelResult SetProcessMemoryPermission(ulong address, ulong size, MemoryPermission permission)
|
||||
{
|
||||
lock (_blocks)
|
||||
|
@ -2195,6 +2119,22 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
MemoryAttribute.Borrowed);
|
||||
}
|
||||
|
||||
public KernelResult BorrowTransferMemory(KPageList pageList, ulong address, ulong size, MemoryPermission permission)
|
||||
{
|
||||
return SetAttributesAndChangePermission(
|
||||
address,
|
||||
size,
|
||||
MemoryState.TransferMemoryAllowed,
|
||||
MemoryState.TransferMemoryAllowed,
|
||||
MemoryPermission.Mask,
|
||||
MemoryPermission.ReadAndWrite,
|
||||
MemoryAttribute.Mask,
|
||||
MemoryAttribute.None,
|
||||
permission,
|
||||
MemoryAttribute.Borrowed,
|
||||
pageList);
|
||||
}
|
||||
|
||||
private KernelResult SetAttributesAndChangePermission(
|
||||
ulong address,
|
||||
ulong size,
|
||||
|
@ -2233,14 +2173,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
|
||||
if (pageList != null)
|
||||
{
|
||||
KPageList currPageList = new KPageList();
|
||||
|
||||
AddVaRangeToPageList(currPageList, address, pagesCount);
|
||||
|
||||
if (!currPageList.IsEqual(pageList))
|
||||
{
|
||||
return KernelResult.InvalidMemRange;
|
||||
}
|
||||
AddVaRangeToPageList(pageList, address, pagesCount);
|
||||
}
|
||||
|
||||
if (!_blockAllocator.CanAllocate(MaxBlocksNeededForInsertion))
|
||||
|
@ -2297,6 +2230,22 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
MemoryAttribute.Borrowed);
|
||||
}
|
||||
|
||||
public KernelResult UnborrowTransferMemory(ulong address, ulong size, KPageList pageList)
|
||||
{
|
||||
return ClearAttributesAndChangePermission(
|
||||
address,
|
||||
size,
|
||||
MemoryState.TransferMemoryAllowed,
|
||||
MemoryState.TransferMemoryAllowed,
|
||||
MemoryPermission.None,
|
||||
MemoryPermission.None,
|
||||
MemoryAttribute.Mask,
|
||||
MemoryAttribute.Borrowed,
|
||||
MemoryPermission.ReadAndWrite,
|
||||
MemoryAttribute.Borrowed,
|
||||
pageList);
|
||||
}
|
||||
|
||||
private KernelResult ClearAttributesAndChangePermission(
|
||||
ulong address,
|
||||
ulong size,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue