using System; namespace Ryujinx.Cpu.AppleHv { class HvIpaAllocator { private const ulong AllocationGranule = 1UL << 14; private const ulong IpaRegionSize = 1UL << 35; private readonly PrivateMemoryAllocator.Block _block; public HvIpaAllocator() { _block = new PrivateMemoryAllocator.Block(null, IpaRegionSize); } public ulong Allocate(ulong size, ulong alignment = AllocationGranule) { ulong offset = _block.Allocate(size, alignment); if (offset == PrivateMemoryAllocator.InvalidOffset) { throw new InvalidOperationException($"No enough free IPA memory to allocate 0x{size:X} bytes with alignment 0x{alignment:X}."); } return offset; } public void Free(ulong offset, ulong size) { _block.Free(offset, size); } } }