HvMemoryBlockAllocator.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using Ryujinx.Memory;
  2. using System.Collections.Generic;
  3. namespace Ryujinx.Cpu.AppleHv
  4. {
  5. class HvMemoryBlockAllocator : PrivateMemoryAllocatorImpl<HvMemoryBlockAllocator.Block>
  6. {
  7. private const ulong InvalidOffset = ulong.MaxValue;
  8. public class Block : PrivateMemoryAllocator.Block
  9. {
  10. private readonly HvIpaAllocator _ipaAllocator;
  11. public ulong Ipa { get; }
  12. public Block(HvIpaAllocator ipaAllocator, MemoryBlock memory, ulong size) : base(memory, size)
  13. {
  14. _ipaAllocator = ipaAllocator;
  15. lock (ipaAllocator)
  16. {
  17. Ipa = ipaAllocator.Allocate(size);
  18. }
  19. HvApi.hv_vm_map((ulong)Memory.Pointer, Ipa, size, hv_memory_flags_t.HV_MEMORY_READ | hv_memory_flags_t.HV_MEMORY_WRITE).ThrowOnError();
  20. }
  21. public override void Destroy()
  22. {
  23. HvApi.hv_vm_unmap(Ipa, Size).ThrowOnError();
  24. lock (_ipaAllocator)
  25. {
  26. _ipaAllocator.Free(Ipa, Size);
  27. }
  28. base.Destroy();
  29. }
  30. }
  31. private readonly HvIpaAllocator _ipaAllocator;
  32. public HvMemoryBlockAllocator(HvIpaAllocator ipaAllocator, int blockAlignment) : base(blockAlignment, MemoryAllocationFlags.None)
  33. {
  34. _ipaAllocator = ipaAllocator;
  35. }
  36. public unsafe HvMemoryBlockAllocation Allocate(ulong size, ulong alignment)
  37. {
  38. var allocation = Allocate(size, alignment, CreateBlock);
  39. return new HvMemoryBlockAllocation(this, allocation.Block, allocation.Offset, allocation.Size);
  40. }
  41. private Block CreateBlock(MemoryBlock memory, ulong size)
  42. {
  43. return new Block(_ipaAllocator, memory, size);
  44. }
  45. }
  46. }