diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs
index d262c159d7..4ffa447dde 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs
@@ -2,6 +2,7 @@ using Ryujinx.Horizon.Common;
using Ryujinx.Memory;
using Ryujinx.Memory.Range;
using System;
+using System.Buffers;
using System.Collections.Generic;
using System.Diagnostics;
@@ -34,6 +35,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
}
}
+ ///
+ protected override ReadOnlySequence GetReadOnlySequence(ulong va, int size)
+ {
+ return _cpuMemory.GetReadOnlySequence(va, size);
+ }
+
///
protected override ReadOnlySpan GetSpan(ulong va, int size)
{
@@ -247,6 +254,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
_cpuMemory.SignalMemoryTracking(va, size, write);
}
+ ///
+ protected override void Write(ulong va, ReadOnlySequence data)
+ {
+ _cpuMemory.Write(va, data);
+ }
+
///
protected override void Write(ulong va, ReadOnlySpan data)
{
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs
index ae99a434ad..c836b06500 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs
@@ -5,6 +5,7 @@ using Ryujinx.Horizon.Common;
using Ryujinx.Memory;
using Ryujinx.Memory.Range;
using System;
+using System.Buffers;
using System.Collections.Generic;
using System.Diagnostics;
@@ -2943,6 +2944,18 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
/// Page list where the ranges will be added
protected abstract void GetPhysicalRegions(ulong va, ulong size, KPageList pageList);
+ ///
+ /// Gets a read-only sequence of data from CPU mapped memory.
+ ///
+ ///
+ /// Allows reading non-contiguous memory without first copying it to a newly allocated single contiguous block.
+ ///
+ /// Virtual address of the data
+ /// Size of the data
+ /// A read-only sequence of the data
+ /// Throw for unhandled invalid or unmapped memory accesses
+ protected abstract ReadOnlySequence GetReadOnlySequence(ulong va, int size);
+
///
/// Gets a read-only span of data from CPU mapped memory.
///
@@ -2952,7 +2965,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
///
/// Virtual address of the data
/// Size of the data
- /// True if read tracking is triggered on the span
/// A read-only span of the data
/// Throw for unhandled invalid or unmapped memory accesses
protected abstract ReadOnlySpan GetSpan(ulong va, int size);
@@ -3060,6 +3072,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
/// Size of the region
protected abstract void SignalMemoryTracking(ulong va, ulong size, bool write);
+ ///
+ /// Writes data to CPU mapped memory, with write tracking.
+ ///
+ /// Virtual address to write the data into
+ /// Data to be written
+ /// Throw for unhandled invalid or unmapped memory accesses
+ protected abstract void Write(ulong va, ReadOnlySequence data);
+
///
/// Writes data to CPU mapped memory, with write tracking.
///