IVirtualMemoryManager.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. using System;
  2. namespace Ryujinx.Memory
  3. {
  4. public interface IVirtualMemoryManager
  5. {
  6. void Map(ulong va, ulong pa, ulong size);
  7. void Unmap(ulong va, ulong size);
  8. T Read<T>(ulong va) where T : unmanaged;
  9. void Read(ulong va, Span<byte> data);
  10. void Write<T>(ulong va, T value) where T : unmanaged;
  11. void Write(ulong va, ReadOnlySpan<byte> data);
  12. void Fill(ulong va, ulong size, byte value)
  13. {
  14. const int MaxChunkSize = 1 << 30;
  15. for (ulong subOffset = 0; subOffset < size; subOffset += MaxChunkSize)
  16. {
  17. int copySize = (int)Math.Min(MaxChunkSize, size - subOffset);
  18. GetWritableRegion(va + subOffset, copySize).Memory.Span.Fill(0);
  19. }
  20. }
  21. ReadOnlySpan<byte> GetSpan(ulong va, int size, bool tracked = false);
  22. WritableRegion GetWritableRegion(ulong va, int size);
  23. ref T GetRef<T>(ulong va) where T : unmanaged;
  24. (ulong address, ulong size)[] GetPhysicalRegions(ulong va, ulong size);
  25. bool IsMapped(ulong va);
  26. bool IsRangeMapped(ulong va, ulong size);
  27. ulong GetPhysicalAddress(ulong va);
  28. void SignalMemoryTracking(ulong va, ulong size, bool write);
  29. void TrackingReprotect(ulong va, ulong size, MemoryPermission protection);
  30. }
  31. }