|
@@ -75,6 +75,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|
|
|
|
|
|
|
public abstract bool SupportsMemoryAliasing { get; }
|
|
public abstract bool SupportsMemoryAliasing { get; }
|
|
|
|
|
|
|
|
|
|
+ private MemoryFillValue _heapFillValue;
|
|
|
|
|
+ private MemoryFillValue _ipcFillValue;
|
|
|
|
|
+
|
|
|
public KPageTableBase(KernelContext context)
|
|
public KPageTableBase(KernelContext context)
|
|
|
{
|
|
{
|
|
|
Context = context;
|
|
Context = context;
|
|
@@ -82,6 +85,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|
|
_blockManager = new KMemoryBlockManager();
|
|
_blockManager = new KMemoryBlockManager();
|
|
|
|
|
|
|
|
_isKernel = false;
|
|
_isKernel = false;
|
|
|
|
|
+
|
|
|
|
|
+ _heapFillValue = MemoryFillValue.Zero;
|
|
|
|
|
+ _ipcFillValue = MemoryFillValue.Zero;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private static readonly int[] AddrSpaceSizes = new int[] { 32, 36, 32, 39 };
|
|
private static readonly int[] AddrSpaceSizes = new int[] { 32, 36, 32, 39 };
|
|
@@ -299,6 +305,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|
|
TlsIoRegionStart = tlsIoRegion.Start;
|
|
TlsIoRegionStart = tlsIoRegion.Start;
|
|
|
TlsIoRegionEnd = tlsIoRegion.End;
|
|
TlsIoRegionEnd = tlsIoRegion.End;
|
|
|
|
|
|
|
|
|
|
+ // TODO: Check kernel configuration via secure monitor call when implemented to set memory fill values.
|
|
|
|
|
+
|
|
|
_currentHeapAddr = HeapRegionStart;
|
|
_currentHeapAddr = HeapRegionStart;
|
|
|
_heapCapacity = 0;
|
|
_heapCapacity = 0;
|
|
|
PhysicalMemoryUsage = 0;
|
|
PhysicalMemoryUsage = 0;
|
|
@@ -738,7 +746,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|
|
return KernelResult.InvalidMemState;
|
|
return KernelResult.InvalidMemState;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- result = MapPages(_currentHeapAddr, pageList, KMemoryPermission.ReadAndWrite);
|
|
|
|
|
|
|
+ result = MapPages(_currentHeapAddr, pageList, KMemoryPermission.ReadAndWrite, true, (byte)_heapFillValue);
|
|
|
|
|
|
|
|
if (result != KernelResult.Success)
|
|
if (result != KernelResult.Success)
|
|
|
{
|
|
{
|
|
@@ -1783,7 +1791,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|
|
{
|
|
{
|
|
|
ulong unusedSizeBefore = address - addressTruncated;
|
|
ulong unusedSizeBefore = address - addressTruncated;
|
|
|
|
|
|
|
|
- Context.Memory.ZeroFill(GetDramAddressFromPa(dstFirstPagePa), unusedSizeBefore);
|
|
|
|
|
|
|
+ Context.Memory.Fill(GetDramAddressFromPa(dstFirstPagePa), unusedSizeBefore, (byte)_ipcFillValue);
|
|
|
|
|
|
|
|
ulong copySize = addressRounded <= endAddr ? addressRounded - address : size;
|
|
ulong copySize = addressRounded <= endAddr ? addressRounded - address : size;
|
|
|
var data = srcPageTable.GetSpan(addressTruncated + unusedSizeBefore, (int)copySize);
|
|
var data = srcPageTable.GetSpan(addressTruncated + unusedSizeBefore, (int)copySize);
|
|
@@ -1801,7 +1809,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|
|
|
|
|
|
|
if (unusedSizeAfter != 0)
|
|
if (unusedSizeAfter != 0)
|
|
|
{
|
|
{
|
|
|
- Context.Memory.ZeroFill(GetDramAddressFromPa(firstPageFillAddress), unusedSizeAfter);
|
|
|
|
|
|
|
+ Context.Memory.Fill(GetDramAddressFromPa(firstPageFillAddress), unusedSizeAfter, (byte)_ipcFillValue);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
KernelResult result = MapPages(currentVa, 1, dstFirstPagePa, permission);
|
|
KernelResult result = MapPages(currentVa, 1, dstFirstPagePa, permission);
|
|
@@ -1853,7 +1861,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|
|
unusedSizeAfter = PageSize;
|
|
unusedSizeAfter = PageSize;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- Context.Memory.ZeroFill(GetDramAddressFromPa(lastPageFillAddr), unusedSizeAfter);
|
|
|
|
|
|
|
+ Context.Memory.Fill(GetDramAddressFromPa(lastPageFillAddr), unusedSizeAfter, (byte)_ipcFillValue);
|
|
|
|
|
|
|
|
KernelResult result = MapPages(currentVa, 1, dstLastPagePa, permission);
|
|
KernelResult result = MapPages(currentVa, 1, dstLastPagePa, permission);
|
|
|
|
|
|
|
@@ -2779,8 +2787,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|
|
/// <param name="pagesCount">Number of pages to map</param>
|
|
/// <param name="pagesCount">Number of pages to map</param>
|
|
|
/// <param name="srcPa">Physical address where the pages should be mapped. May be ignored if aliasing is not supported</param>
|
|
/// <param name="srcPa">Physical address where the pages should be mapped. May be ignored if aliasing is not supported</param>
|
|
|
/// <param name="permission">Permission of the region to be mapped</param>
|
|
/// <param name="permission">Permission of the region to be mapped</param>
|
|
|
|
|
+ /// <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>
|
|
/// <returns>Result of the mapping operation</returns>
|
|
|
- protected abstract KernelResult MapPages(ulong dstVa, ulong pagesCount, ulong srcPa, KMemoryPermission permission);
|
|
|
|
|
|
|
+ protected abstract KernelResult MapPages(ulong dstVa, ulong pagesCount, ulong srcPa, KMemoryPermission permission, bool shouldFillPages = false, byte fillValue = 0);
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// Maps a region of memory into the specified physical memory region.
|
|
/// Maps a region of memory into the specified physical memory region.
|
|
@@ -2788,8 +2798,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|
|
/// <param name="address">Destination virtual address that should be mapped</param>
|
|
/// <param name="address">Destination virtual address that should be mapped</param>
|
|
|
/// <param name="pageList">List of physical memory pages where the pages should be mapped. May be ignored if aliasing is not supported</param>
|
|
/// <param name="pageList">List of physical memory pages where the pages should be mapped. May be ignored if aliasing is not supported</param>
|
|
|
/// <param name="permission">Permission of the region to be mapped</param>
|
|
/// <param name="permission">Permission of the region to be mapped</param>
|
|
|
|
|
+ /// <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>
|
|
/// <returns>Result of the mapping operation</returns>
|
|
|
- protected abstract KernelResult MapPages(ulong address, KPageList pageList, KMemoryPermission permission);
|
|
|
|
|
|
|
+ protected abstract KernelResult MapPages(ulong address, KPageList pageList, KMemoryPermission permission, bool shouldFillPages = false, byte fillValue = 0);
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// Maps a region of memory into the specified host memory ranges.
|
|
/// Maps a region of memory into the specified host memory ranges.
|