aboutsummaryrefslogtreecommitdiff
path: root/src/ARMeilleure
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2024-03-14 22:38:27 +0000
committerGitHub <noreply@github.com>2024-03-14 19:38:27 -0300
commitfdd3263e31f8bf352a21e05703d0a6a82c800995 (patch)
tree24859502db57a2febaa5ab4c7d968d7375156079 /src/ARMeilleure
parentce607db944beb352065107830769d8570f0c245e (diff)
Separate guest/host tracking + unaligned protection (#6486)
* WIP: Separate guest/host tracking + unaligned protection Allow memory manager to define support for single byte guest tracking * Formatting * Improve docs * Properly handle cases where the address space bits are too low * Address feedback
Diffstat (limited to 'src/ARMeilleure')
-rw-r--r--src/ARMeilleure/Instructions/NativeInterface.cs20
-rw-r--r--src/ARMeilleure/Memory/IMemoryManager.cs22
2 files changed, 32 insertions, 10 deletions
diff --git a/src/ARMeilleure/Instructions/NativeInterface.cs b/src/ARMeilleure/Instructions/NativeInterface.cs
index d1b2e353..0cd3754f 100644
--- a/src/ARMeilleure/Instructions/NativeInterface.cs
+++ b/src/ARMeilleure/Instructions/NativeInterface.cs
@@ -91,54 +91,54 @@ namespace ARMeilleure.Instructions
#region "Read"
public static byte ReadByte(ulong address)
{
- return GetMemoryManager().ReadTracked<byte>(address);
+ return GetMemoryManager().ReadGuest<byte>(address);
}
public static ushort ReadUInt16(ulong address)
{
- return GetMemoryManager().ReadTracked<ushort>(address);
+ return GetMemoryManager().ReadGuest<ushort>(address);
}
public static uint ReadUInt32(ulong address)
{
- return GetMemoryManager().ReadTracked<uint>(address);
+ return GetMemoryManager().ReadGuest<uint>(address);
}
public static ulong ReadUInt64(ulong address)
{
- return GetMemoryManager().ReadTracked<ulong>(address);
+ return GetMemoryManager().ReadGuest<ulong>(address);
}
public static V128 ReadVector128(ulong address)
{
- return GetMemoryManager().ReadTracked<V128>(address);
+ return GetMemoryManager().ReadGuest<V128>(address);
}
#endregion
#region "Write"
public static void WriteByte(ulong address, byte value)
{
- GetMemoryManager().Write(address, value);
+ GetMemoryManager().WriteGuest(address, value);
}
public static void WriteUInt16(ulong address, ushort value)
{
- GetMemoryManager().Write(address, value);
+ GetMemoryManager().WriteGuest(address, value);
}
public static void WriteUInt32(ulong address, uint value)
{
- GetMemoryManager().Write(address, value);
+ GetMemoryManager().WriteGuest(address, value);
}
public static void WriteUInt64(ulong address, ulong value)
{
- GetMemoryManager().Write(address, value);
+ GetMemoryManager().WriteGuest(address, value);
}
public static void WriteVector128(ulong address, V128 value)
{
- GetMemoryManager().Write(address, value);
+ GetMemoryManager().WriteGuest(address, value);
}
#endregion
diff --git a/src/ARMeilleure/Memory/IMemoryManager.cs b/src/ARMeilleure/Memory/IMemoryManager.cs
index 952cd2b4..46d44265 100644
--- a/src/ARMeilleure/Memory/IMemoryManager.cs
+++ b/src/ARMeilleure/Memory/IMemoryManager.cs
@@ -29,6 +29,17 @@ namespace ARMeilleure.Memory
T ReadTracked<T>(ulong va) where T : unmanaged;
/// <summary>
+ /// Reads data from CPU mapped memory, from guest code. (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 ReadGuest<T>(ulong va) where T : unmanaged
+ {
+ return ReadTracked<T>(va);
+ }
+
+ /// <summary>
/// Writes data to CPU mapped memory.
/// </summary>
/// <typeparam name="T">Type of the data being written</typeparam>
@@ -37,6 +48,17 @@ namespace ARMeilleure.Memory
void Write<T>(ulong va, T value) where T : unmanaged;
/// <summary>
+ /// Writes data to CPU mapped memory, from guest code.
+ /// </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 WriteGuest<T>(ulong va, T value) where T : unmanaged
+ {
+ Write(va, value);
+ }
+
+ /// <summary>
/// Gets a read-only span of data from CPU mapped memory.
/// </summary>
/// <param name="va">Virtual address of the data</param>