mirror of
https://git.naxdy.org/Mirror/Ryujinx.git
synced 2025-03-15 08:40:20 +00:00
Make shared and transfer memory not depend on SharedMemoryStorage
This commit is contained in:
parent
5834b9aab6
commit
616b3568e4
4 changed files with 13 additions and 111 deletions
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue