aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs64
1 files changed, 28 insertions, 36 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs
index fb3d669d..518a0f09 100644
--- a/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs
@@ -1,11 +1,9 @@
using Ryujinx.Common;
using Ryujinx.HLE.HOS.Kernel.Common;
using Ryujinx.HLE.HOS.Kernel.Process;
-using Ryujinx.Memory.Range;
using System;
using System.Collections.Generic;
using System.Diagnostics;
-using System.Linq;
namespace Ryujinx.HLE.HOS.Kernel.Memory
{
@@ -73,8 +71,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
private MersenneTwister _randomNumberGenerator;
- public abstract bool SupportsMemoryAliasing { get; }
-
private MemoryFillValue _heapFillValue;
private MemoryFillValue _ipcFillValue;
@@ -305,7 +301,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
TlsIoRegionStart = tlsIoRegion.Start;
TlsIoRegionEnd = tlsIoRegion.End;
- // TODO: Check kernel configuration via secure monitor call when implemented to set memory fill values.
+ // TODO: Check kernel configuration via secure monitor call when implemented to set memory fill values.
_currentHeapAddr = HeapRegionStart;
_heapCapacity = 0;
@@ -380,8 +376,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
}
}
- public KernelResult UnmapPages(ulong address, ulong pagesCount, IEnumerable<HostMemoryRange> ranges, MemoryState stateExpected)
+ public KernelResult UnmapPages(ulong address, KPageList pageList, MemoryState stateExpected)
{
+ ulong pagesCount = pageList.GetPagesCount();
ulong size = pagesCount * PageSize;
ulong endAddr = address + size;
@@ -405,9 +402,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
lock (_blockManager)
{
- var currentRanges = GetPhysicalRegions(address, size);
+ KPageList currentPageList = new KPageList();
- if (!currentRanges.SequenceEqual(ranges))
+ GetPhysicalRegions(address, size, currentPageList);
+
+ if (!currentPageList.IsEqual(pageList))
{
return KernelResult.InvalidMemRange;
}
@@ -1690,11 +1689,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
bool send,
out ulong dst)
{
- if (!SupportsMemoryAliasing)
- {
- throw new NotSupportedException("Memory aliasing not supported, can't map IPC buffers.");
- }
-
dst = 0;
if (!_slabManager.CanAllocate(MaxBlocksNeededForInsertion))
@@ -1828,7 +1822,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
{
ulong alignedSize = endAddrTruncated - addressRounded;
- KernelResult result = MapPages(currentVa, srcPageTable.GetPhysicalRegions(addressRounded, alignedSize), permission);
+ KPageList pageList = new KPageList();
+ srcPageTable.GetPhysicalRegions(addressRounded, alignedSize, pageList);
+
+ KernelResult result = MapPages(currentVa, pageList, permission);
if (result != KernelResult.Success)
{
@@ -2041,7 +2038,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
MemoryAttribute.Borrowed);
}
- public KernelResult BorrowTransferMemory(List<HostMemoryRange> ranges, ulong address, ulong size, KMemoryPermission permission)
+ public KernelResult BorrowTransferMemory(KPageList pageList, ulong address, ulong size, KMemoryPermission permission)
{
return SetAttributesAndChangePermission(
address,
@@ -2054,7 +2051,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
MemoryAttribute.None,
permission,
MemoryAttribute.Borrowed,
- ranges);
+ pageList);
}
private KernelResult SetAttributesAndChangePermission(
@@ -2068,7 +2065,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
MemoryAttribute attributeExpected,
KMemoryPermission newPermission,
MemoryAttribute attributeSetMask,
- List<HostMemoryRange> ranges = null)
+ KPageList pageList = null)
{
if (address + size <= address || !InsideAddrSpace(address, size))
{
@@ -2093,7 +2090,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
{
ulong pagesCount = size / PageSize;
- ranges?.AddRange(GetPhysicalRegions(address, size));
+ if (pageList != null)
+ {
+ GetPhysicalRegions(address, pagesCount * PageSize, pageList);
+ }
if (!_slabManager.CanAllocate(MaxBlocksNeededForInsertion))
{
@@ -2143,7 +2143,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
MemoryAttribute.Borrowed);
}
- public KernelResult UnborrowTransferMemory(ulong address, ulong size, List<HostMemoryRange> ranges)
+ public KernelResult UnborrowTransferMemory(ulong address, ulong size, KPageList pageList)
{
return ClearAttributesAndChangePermission(
address,
@@ -2156,7 +2156,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
MemoryAttribute.Borrowed,
KMemoryPermission.ReadAndWrite,
MemoryAttribute.Borrowed,
- ranges);
+ pageList);
}
private KernelResult ClearAttributesAndChangePermission(
@@ -2170,7 +2170,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
MemoryAttribute attributeExpected,
KMemoryPermission newPermission,
MemoryAttribute attributeClearMask,
- List<HostMemoryRange> ranges = null)
+ KPageList pageList = null)
{
if (address + size <= address || !InsideAddrSpace(address, size))
{
@@ -2195,11 +2195,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
{
ulong pagesCount = size / PageSize;
- if (ranges != null)
+ if (pageList != null)
{
- var currentRanges = GetPhysicalRegions(address, size);
+ KPageList currentPageList = new KPageList();
+
+ GetPhysicalRegions(address, pagesCount * PageSize, currentPageList);
- if (!currentRanges.SequenceEqual(ranges))
+ if (!currentPageList.IsEqual(pageList))
{
return KernelResult.InvalidMemRange;
}
@@ -2741,8 +2743,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
/// </summary>
/// <param name="va">Virtual address of the range</param>
/// <param name="size">Size of the range</param>
- /// <returns>Array of physical regions</returns>
- protected abstract IEnumerable<HostMemoryRange> GetPhysicalRegions(ulong va, ulong size);
+ /// <param name="pageList">Page list where the ranges will be added</param>
+ protected abstract void GetPhysicalRegions(ulong va, ulong size, KPageList pageList);
/// <summary>
/// Gets a read-only span of data from CPU mapped memory.
@@ -2804,16 +2806,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
protected abstract KernelResult MapPages(ulong address, KPageList pageList, KMemoryPermission permission, bool shouldFillPages = false, byte fillValue = 0);
/// <summary>
- /// Maps a region of memory into the specified host memory ranges.
- /// </summary>
- /// <param name="address">Destination virtual address that should be mapped</param>
- /// <param name="ranges">Ranges of host memory that should be mapped</param>
- /// <param name="permission">Permission of the region to be mapped</param>
- /// <returns>Result of the mapping operation</returns>
- /// <exception cref="NotSupportedException">The implementation does not support memory aliasing</exception>
- protected abstract KernelResult MapPages(ulong address, IEnumerable<HostMemoryRange> ranges, KMemoryPermission permission);
-
- /// <summary>
/// Unmaps a region of memory that was previously mapped with one of the page mapping methods.
/// </summary>
/// <param name="address">Virtual address of the region to unmap</param>