Make shared and transfer memory not depend on SharedMemoryStorage

This commit is contained in:
gdk 2021-12-30 14:31:16 -03:00
parent 5834b9aab6
commit 616b3568e4
4 changed files with 13 additions and 111 deletions

View file

@ -376,8 +376,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
} }
} }
public KernelResult UnmapPages(ulong address, ulong pagesCount, KPageList pageList, MemoryState stateExpected) public KernelResult UnmapPages(ulong address, KPageList pageList, MemoryState stateExpected)
{ {
ulong pagesCount = pageList.GetPagesCount();
ulong size = pagesCount * PageSize; ulong size = pagesCount * PageSize;
ulong endAddr = address + size; ulong endAddr = address + size;

View file

@ -6,7 +6,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
{ {
class KSharedMemory : KAutoObject class KSharedMemory : KAutoObject
{ {
private readonly SharedMemoryStorage _storage; private readonly KPageList _pageList;
private readonly long _ownerPid; private readonly long _ownerPid;
@ -20,7 +20,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
KMemoryPermission ownerPermission, KMemoryPermission ownerPermission,
KMemoryPermission userPermission) : base(context) KMemoryPermission userPermission) : base(context)
{ {
_storage = storage; _pageList = storage.GetPageList();
_ownerPid = ownerPid; _ownerPid = ownerPid;
_ownerPermission = ownerPermission; _ownerPermission = ownerPermission;
_userPermission = userPermission; _userPermission = userPermission;
@ -33,10 +33,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
KProcess process, KProcess process,
KMemoryPermission permission) KMemoryPermission permission)
{ {
ulong pagesCountRounded = BitUtils.DivRoundUp(size, KPageTableBase.PageSize); if (_pageList.GetPagesCount() != BitUtils.DivRoundUp(size, KPageTableBase.PageSize))
var pageList = _storage.GetPageList();
if (pageList.GetPagesCount() != pagesCountRounded)
{ {
return KernelResult.InvalidSize; return KernelResult.InvalidSize;
} }
@ -50,22 +47,17 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
return KernelResult.InvalidPermission; return KernelResult.InvalidPermission;
} }
return memoryManager.MapPages(address, pageList, MemoryState.SharedMemory, permission); return memoryManager.MapPages(address, _pageList, MemoryState.SharedMemory, permission);
} }
public KernelResult UnmapFromProcess(KPageTableBase memoryManager, ulong address, ulong size, KProcess process) public KernelResult UnmapFromProcess(KPageTableBase memoryManager, ulong address, ulong size, KProcess process)
{ {
ulong pagesCountRounded = BitUtils.DivRoundUp(size, KPageTableBase.PageSize); if (_pageList.GetPagesCount() != BitUtils.DivRoundUp(size, KPageTableBase.PageSize))
var pageList = _storage.GetPageList();
ulong pagesCount = pageList.GetPagesCount();
if (pagesCount != pagesCountRounded)
{ {
return KernelResult.InvalidSize; return KernelResult.InvalidSize;
} }
return memoryManager.UnmapPages(address, pagesCount, pageList, MemoryState.SharedMemory); return memoryManager.UnmapPages(address, _pageList, MemoryState.SharedMemory);
} }
} }
} }

View file

@ -14,8 +14,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
private readonly KPageList _pageList; private readonly KPageList _pageList;
private readonly SharedMemoryStorage _storage;
public ulong Address { get; private set; } public ulong Address { get; private set; }
public ulong Size { get; private set; } public ulong Size { get; private set; }
@ -31,7 +29,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
public KTransferMemory(KernelContext context, SharedMemoryStorage storage) : base(context) public KTransferMemory(KernelContext context, SharedMemoryStorage storage) : base(context)
{ {
_storage = storage; _pageList = storage.GetPageList();
Permission = KMemoryPermission.ReadAndWrite; Permission = KMemoryPermission.ReadAndWrite;
_hasBeenInitialized = true; _hasBeenInitialized = true;
@ -69,15 +67,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
KProcess process, KProcess process,
KMemoryPermission permission) KMemoryPermission permission)
{ {
if (_storage == null) if (_pageList.GetPagesCount() != BitUtils.DivRoundUp(size, KPageTableBase.PageSize))
{
throw new NotImplementedException();
}
ulong pagesCountRounded = BitUtils.DivRoundUp(size, KPageTableBase.PageSize);
var pageList = _storage.GetPageList();
if (pageList.GetPagesCount() != pagesCountRounded)
{ {
return KernelResult.InvalidSize; return KernelResult.InvalidSize;
} }
@ -89,7 +79,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
MemoryState state = Permission == KMemoryPermission.None ? MemoryState.TransferMemoryIsolated : MemoryState.TransferMemory; MemoryState state = Permission == KMemoryPermission.None ? MemoryState.TransferMemoryIsolated : MemoryState.TransferMemory;
KernelResult result = memoryManager.MapPages(address, pageList, state, KMemoryPermission.ReadAndWrite); KernelResult result = memoryManager.MapPages(address, _pageList, state, KMemoryPermission.ReadAndWrite);
if (result == KernelResult.Success) if (result == KernelResult.Success)
{ {
@ -105,24 +95,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
ulong size, ulong size,
KProcess process) KProcess process)
{ {
if (_storage == null) if (_pageList.GetPagesCount() != BitUtils.DivRoundUp(size, KPageTableBase.PageSize))
{
throw new NotImplementedException();
}
ulong pagesCountRounded = BitUtils.DivRoundUp(size, KPageTableBase.PageSize);
var pageList = _storage.GetPageList();
ulong pagesCount = pageList.GetPagesCount();
if (pagesCount != pagesCountRounded)
{ {
return KernelResult.InvalidSize; return KernelResult.InvalidSize;
} }
MemoryState state = Permission == KMemoryPermission.None ? MemoryState.TransferMemoryIsolated : MemoryState.TransferMemory; MemoryState state = Permission == KMemoryPermission.None ? MemoryState.TransferMemoryIsolated : MemoryState.TransferMemory;
KernelResult result = memoryManager.UnmapPages(address, pagesCount, pageList, state); KernelResult result = memoryManager.UnmapPages(address, _pageList, state);
if (result == KernelResult.Success) if (result == KernelResult.Success)
{ {

View file

@ -1,71 +0,0 @@
using System;
namespace Ryujinx.Memory.Range
{
/// <summary>
/// Range of memory composed of an address and size.
/// </summary>
public struct HostMemoryRange : IEquatable<HostMemoryRange>
{
/// <summary>
/// An empty memory range, with a null address and zero size.
/// </summary>
public static HostMemoryRange Empty => new HostMemoryRange(0, 0);
/// <summary>
/// Start address of the range.
/// </summary>
public nuint Address { get; }
/// <summary>
/// Size of the range in bytes.
/// </summary>
public ulong Size { get; }
/// <summary>
/// Address where the range ends (exclusive).
/// </summary>
public nuint EndAddress => Address + (nuint)Size;
/// <summary>
/// Creates a new memory range with the specified address and size.
/// </summary>
/// <param name="address">Start address</param>
/// <param name="size">Size in bytes</param>
public HostMemoryRange(nuint address, ulong size)
{
Address = address;
Size = size;
}
/// <summary>
/// Checks if the range overlaps with another.
/// </summary>
/// <param name="other">The other range to check for overlap</param>
/// <returns>True if the ranges overlap, false otherwise</returns>
public bool OverlapsWith(HostMemoryRange other)
{
nuint thisAddress = Address;
nuint thisEndAddress = EndAddress;
nuint otherAddress = other.Address;
nuint otherEndAddress = other.EndAddress;
return thisAddress < otherEndAddress && otherAddress < thisEndAddress;
}
public override bool Equals(object obj)
{
return obj is HostMemoryRange other && Equals(other);
}
public bool Equals(HostMemoryRange other)
{
return Address == other.Address && Size == other.Size;
}
public override int GetHashCode()
{
return HashCode.Combine(Address, Size);
}
}
}