From cee712105850ac3385cd0091a923438167433f9f Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Sat, 8 Apr 2023 01:22:00 +0200 Subject: Move solution and projects to src --- ARMeilleure/Memory/IJitMemoryAllocator.cs | 10 ---- ARMeilleure/Memory/IJitMemoryBlock.cs | 14 ----- ARMeilleure/Memory/IMemoryManager.cs | 77 ---------------------------- ARMeilleure/Memory/InvalidAccessException.cs | 23 --------- ARMeilleure/Memory/MemoryManagerType.cs | 41 --------------- ARMeilleure/Memory/ReservedRegion.cs | 58 --------------------- 6 files changed, 223 deletions(-) delete mode 100644 ARMeilleure/Memory/IJitMemoryAllocator.cs delete mode 100644 ARMeilleure/Memory/IJitMemoryBlock.cs delete mode 100644 ARMeilleure/Memory/IMemoryManager.cs delete mode 100644 ARMeilleure/Memory/InvalidAccessException.cs delete mode 100644 ARMeilleure/Memory/MemoryManagerType.cs delete mode 100644 ARMeilleure/Memory/ReservedRegion.cs (limited to 'ARMeilleure/Memory') diff --git a/ARMeilleure/Memory/IJitMemoryAllocator.cs b/ARMeilleure/Memory/IJitMemoryAllocator.cs deleted file mode 100644 index 19b696b0..00000000 --- a/ARMeilleure/Memory/IJitMemoryAllocator.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ARMeilleure.Memory -{ - public interface IJitMemoryAllocator - { - IJitMemoryBlock Allocate(ulong size); - IJitMemoryBlock Reserve(ulong size); - - ulong GetPageSize(); - } -} diff --git a/ARMeilleure/Memory/IJitMemoryBlock.cs b/ARMeilleure/Memory/IJitMemoryBlock.cs deleted file mode 100644 index 670f2862..00000000 --- a/ARMeilleure/Memory/IJitMemoryBlock.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace ARMeilleure.Memory -{ - public interface IJitMemoryBlock : IDisposable - { - IntPtr Pointer { get; } - - bool Commit(ulong offset, ulong size); - - void MapAsRx(ulong offset, ulong size); - void MapAsRwx(ulong offset, ulong size); - } -} diff --git a/ARMeilleure/Memory/IMemoryManager.cs b/ARMeilleure/Memory/IMemoryManager.cs deleted file mode 100644 index 5eb1fadd..00000000 --- a/ARMeilleure/Memory/IMemoryManager.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; - -namespace ARMeilleure.Memory -{ - public interface IMemoryManager - { - int AddressSpaceBits { get; } - - IntPtr PageTablePointer { get; } - - MemoryManagerType Type { get; } - - event Action UnmapEvent; - - /// - /// Reads data from CPU mapped memory. - /// - /// Type of the data being read - /// Virtual address of the data in memory - /// The data - T Read(ulong va) where T : unmanaged; - - /// - /// Reads data from CPU mapped memory, with read tracking - /// - /// Type of the data being read - /// Virtual address of the data in memory - /// The data - T ReadTracked(ulong va) where T : unmanaged; - - /// - /// Writes data to CPU mapped memory. - /// - /// Type of the data being written - /// Virtual address to write the data into - /// Data to be written - void Write(ulong va, T value) where T : unmanaged; - - /// - /// Gets a read-only span of data from CPU mapped 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 - ReadOnlySpan GetSpan(ulong va, int size, bool tracked = false); - - /// - /// Gets a reference for the given type at the specified virtual memory address. - /// - /// - /// The data must be located at a contiguous memory region. - /// - /// Type of the data to get the reference - /// Virtual address of the data - /// A reference to the data in memory - ref T GetRef(ulong va) where T : unmanaged; - - /// - /// Checks if the page at a given CPU virtual address is mapped. - /// - /// Virtual address to check - /// True if the address is mapped, false otherwise - bool IsMapped(ulong va); - - /// - /// Alerts the memory tracking that a given region has been read from or written to. - /// This should be called before read/write is performed. - /// - /// Virtual address of the region - /// Size of the region - /// True if the region was written, false if read - /// True if the access is precise, false otherwise - /// Optional ID of the handles that should not be signalled - void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null); - } -} \ No newline at end of file diff --git a/ARMeilleure/Memory/InvalidAccessException.cs b/ARMeilleure/Memory/InvalidAccessException.cs deleted file mode 100644 index ad540719..00000000 --- a/ARMeilleure/Memory/InvalidAccessException.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace ARMeilleure.Memory -{ - class InvalidAccessException : Exception - { - public InvalidAccessException() - { - } - - public InvalidAccessException(ulong address) : base($"Invalid memory access at virtual address 0x{address:X16}.") - { - } - - public InvalidAccessException(string message) : base(message) - { - } - - public InvalidAccessException(string message, Exception innerException) : base(message, innerException) - { - } - } -} diff --git a/ARMeilleure/Memory/MemoryManagerType.cs b/ARMeilleure/Memory/MemoryManagerType.cs deleted file mode 100644 index ce84ccaf..00000000 --- a/ARMeilleure/Memory/MemoryManagerType.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace ARMeilleure.Memory -{ - /// - /// Indicates the type of a memory manager and the method it uses for memory mapping - /// and address translation. This controls the code generated for memory accesses on the JIT. - /// - public enum MemoryManagerType - { - /// - /// Complete software MMU implementation, the read/write methods are always called, - /// without any attempt to perform faster memory access. - /// - SoftwareMmu, - - /// - /// High level implementation using a software flat page table for address translation, - /// used to speed up address translation if possible without calling the read/write methods. - /// - SoftwarePageTable, - - /// - /// High level implementation with mappings managed by the host OS, effectively using hardware - /// page tables. No address translation is performed in software and the memory is just accessed directly. - /// - HostMapped, - - /// - /// Same as the host mapped memory manager type, but without masking the address within the address space. - /// Allows invalid access from JIT code to the rest of the program, but is faster. - /// - HostMappedUnsafe - } - - static class MemoryManagerTypeExtensions - { - public static bool IsHostMapped(this MemoryManagerType type) - { - return type == MemoryManagerType.HostMapped || type == MemoryManagerType.HostMappedUnsafe; - } - } -} diff --git a/ARMeilleure/Memory/ReservedRegion.cs b/ARMeilleure/Memory/ReservedRegion.cs deleted file mode 100644 index 2197afad..00000000 --- a/ARMeilleure/Memory/ReservedRegion.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; - -namespace ARMeilleure.Memory -{ - class ReservedRegion - { - public const int DefaultGranularity = 65536; // Mapping granularity in Windows. - - public IJitMemoryBlock Block { get; } - - public IntPtr Pointer => Block.Pointer; - - private readonly ulong _maxSize; - private readonly ulong _sizeGranularity; - private ulong _currentSize; - - public ReservedRegion(IJitMemoryAllocator allocator, ulong maxSize, ulong granularity = 0) - { - if (granularity == 0) - { - granularity = DefaultGranularity; - } - - Block = allocator.Reserve(maxSize); - _maxSize = maxSize; - _sizeGranularity = granularity; - _currentSize = 0; - } - - public void ExpandIfNeeded(ulong desiredSize) - { - if (desiredSize > _maxSize) - { - throw new OutOfMemoryException(); - } - - if (desiredSize > _currentSize) - { - // Lock, and then check again. We only want to commit once. - lock (this) - { - if (desiredSize >= _currentSize) - { - ulong overflowBytes = desiredSize - _currentSize; - ulong moreToCommit = (((_sizeGranularity - 1) + overflowBytes) / _sizeGranularity) * _sizeGranularity; // Round up. - Block.Commit(_currentSize, moreToCommit); - _currentSize += moreToCommit; - } - } - } - } - - public void Dispose() - { - Block.Dispose(); - } - } -} -- cgit v1.2.3