aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Memory
diff options
context:
space:
mode:
authorTSR Berry <20988865+TSRBerry@users.noreply.github.com>2023-04-08 01:22:00 +0200
committerMary <thog@protonmail.com>2023-04-27 23:51:14 +0200
commitcee712105850ac3385cd0091a923438167433f9f (patch)
tree4a5274b21d8b7f938c0d0ce18736d3f2993b11b1 /ARMeilleure/Memory
parentcd124bda587ef09668a971fa1cac1c3f0cfc9f21 (diff)
Move solution and projects to src
Diffstat (limited to 'ARMeilleure/Memory')
-rw-r--r--ARMeilleure/Memory/IJitMemoryAllocator.cs10
-rw-r--r--ARMeilleure/Memory/IJitMemoryBlock.cs14
-rw-r--r--ARMeilleure/Memory/IMemoryManager.cs77
-rw-r--r--ARMeilleure/Memory/InvalidAccessException.cs23
-rw-r--r--ARMeilleure/Memory/MemoryManagerType.cs41
-rw-r--r--ARMeilleure/Memory/ReservedRegion.cs58
6 files changed, 0 insertions, 223 deletions
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<ulong, ulong> UnmapEvent;
-
- /// <summary>
- /// Reads data from CPU mapped memory.
- /// </summary>
- /// <typeparam name="T">Type of the data being read</typeparam>
- /// <param name="va">Virtual address of the data in memory</param>
- /// <returns>The data</returns>
- T Read<T>(ulong va) where T : unmanaged;
-
- /// <summary>
- /// Reads data from CPU mapped memory, with read tracking
- /// </summary>
- /// <typeparam name="T">Type of the data being read</typeparam>
- /// <param name="va">Virtual address of the data in memory</param>
- /// <returns>The data</returns>
- T ReadTracked<T>(ulong va) where T : unmanaged;
-
- /// <summary>
- /// Writes data to CPU mapped memory.
- /// </summary>
- /// <typeparam name="T">Type of the data being written</typeparam>
- /// <param name="va">Virtual address to write the data into</param>
- /// <param name="value">Data to be written</param>
- void Write<T>(ulong va, T value) where T : unmanaged;
-
- /// <summary>
- /// Gets a read-only span of data from CPU mapped memory.
- /// </summary>
- /// <param name="va">Virtual address of the data</param>
- /// <param name="size">Size of the data</param>
- /// <param name="tracked">True if read tracking is triggered on the span</param>
- /// <returns>A read-only span of the data</returns>
- ReadOnlySpan<byte> GetSpan(ulong va, int size, bool tracked = false);
-
- /// <summary>
- /// Gets a reference for the given type at the specified virtual memory address.
- /// </summary>
- /// <remarks>
- /// The data must be located at a contiguous memory region.
- /// </remarks>
- /// <typeparam name="T">Type of the data to get the reference</typeparam>
- /// <param name="va">Virtual address of the data</param>
- /// <returns>A reference to the data in memory</returns>
- ref T GetRef<T>(ulong va) where T : unmanaged;
-
- /// <summary>
- /// Checks if the page at a given CPU virtual address is mapped.
- /// </summary>
- /// <param name="va">Virtual address to check</param>
- /// <returns>True if the address is mapped, false otherwise</returns>
- bool IsMapped(ulong va);
-
- /// <summary>
- /// Alerts the memory tracking that a given region has been read from or written to.
- /// This should be called before read/write is performed.
- /// </summary>
- /// <param name="va">Virtual address of the region</param>
- /// <param name="size">Size of the region</param>
- /// <param name="write">True if the region was written, false if read</param>
- /// <param name="precise">True if the access is precise, false otherwise</param>
- /// <param name="exemptId">Optional ID of the handles that should not be signalled</param>
- 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
-{
- /// <summary>
- /// 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.
- /// </summary>
- public enum MemoryManagerType
- {
- /// <summary>
- /// Complete software MMU implementation, the read/write methods are always called,
- /// without any attempt to perform faster memory access.
- /// </summary>
- SoftwareMmu,
-
- /// <summary>
- /// 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.
- /// </summary>
- SoftwarePageTable,
-
- /// <summary>
- /// 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.
- /// </summary>
- HostMapped,
-
- /// <summary>
- /// 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.
- /// </summary>
- 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();
- }
- }
-}