Implement support for page sizes > 4KB (#4252)
* Implement support for page sizes > 4KB * Check and work around more alignment issues * Was not meant to change this * Use MemoryBlock.GetPageSize() value for signal handler code * Do not take the path for private allocations if host supports 4KB pages * Add Flags attribute on MemoryMapFlags * Fix dirty region size with 16kb pages Would accidentally report a size that was too high (generally 16k instead of 4k, uploading 4x as much data) Co-authored-by: riperiperi <rhy3756547@hotmail.com>
This commit is contained in:
parent
43a83a401e
commit
86fd0643c2
29 changed files with 1294 additions and 146 deletions
|
@ -6,6 +6,12 @@ namespace Ryujinx.Memory
|
|||
{
|
||||
public interface IVirtualMemoryManager
|
||||
{
|
||||
/// <summary>
|
||||
/// Indicates whenever the memory manager supports aliasing pages at 4KB granularity.
|
||||
/// </summary>
|
||||
/// <returns>True if 4KB pages are supported by the memory manager, false otherwise</returns>
|
||||
bool Supports4KBPages { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Maps a virtual memory range into a physical memory range.
|
||||
/// </summary>
|
||||
|
@ -15,7 +21,20 @@ namespace Ryujinx.Memory
|
|||
/// <param name="va">Virtual memory address</param>
|
||||
/// <param name="pa">Physical memory address where the region should be mapped to</param>
|
||||
/// <param name="size">Size to be mapped</param>
|
||||
void Map(ulong va, ulong pa, ulong size);
|
||||
/// <param name="flags">Flags controlling memory mapping</param>
|
||||
void Map(ulong va, ulong pa, ulong size, MemoryMapFlags flags);
|
||||
|
||||
/// <summary>
|
||||
/// Maps a virtual memory range into an arbitrary host memory range.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Addresses and size must be page aligned.
|
||||
/// Not all memory managers supports this feature.
|
||||
/// </remarks>
|
||||
/// <param name="va">Virtual memory address</param>
|
||||
/// <param name="hostPointer">Host pointer where the virtual region should be mapped</param>
|
||||
/// <param name="size">Size to be mapped</param>
|
||||
void MapForeign(ulong va, nuint hostPointer, ulong size);
|
||||
|
||||
/// <summary>
|
||||
/// Unmaps a previously mapped range of virtual memory.
|
||||
|
@ -115,6 +134,15 @@ namespace Ryujinx.Memory
|
|||
/// <exception cref="MemoryNotContiguousException">Throw if the specified memory region is not contiguous in physical memory</exception>
|
||||
ref T GetRef<T>(ulong va) where T : unmanaged;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the host regions that make up the given virtual address region.
|
||||
/// If any part of the virtual region is unmapped, null is returned.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address of the range</param>
|
||||
/// <param name="size">Size of the range</param>
|
||||
/// <returns>Array of host regions</returns>
|
||||
IEnumerable<HostMemoryRange> GetHostRegions(ulong va, ulong size);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the physical regions that make up the given virtual address region.
|
||||
/// If any part of the virtual region is unmapped, null is returned.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue