aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Instructions/NativeInterface.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ARMeilleure/Instructions/NativeInterface.cs')
-rw-r--r--ARMeilleure/Instructions/NativeInterface.cs43
1 files changed, 34 insertions, 9 deletions
diff --git a/ARMeilleure/Instructions/NativeInterface.cs b/ARMeilleure/Instructions/NativeInterface.cs
index 988e86bd..4514c0da 100644
--- a/ARMeilleure/Instructions/NativeInterface.cs
+++ b/ARMeilleure/Instructions/NativeInterface.cs
@@ -1,6 +1,8 @@
using ARMeilleure.Memory;
using ARMeilleure.State;
+using ARMeilleure.Translation;
using System;
+using System.Runtime.InteropServices;
namespace ARMeilleure.Instructions
{
@@ -10,17 +12,19 @@ namespace ARMeilleure.Instructions
private class ThreadContext
{
- public ExecutionContext Context { get; }
- public MemoryManager Memory { get; }
+ public ExecutionContext Context { get; }
+ public MemoryManager Memory { get; }
+ public Translator Translator { get; }
public ulong ExclusiveAddress { get; set; }
public ulong ExclusiveValueLow { get; set; }
public ulong ExclusiveValueHigh { get; set; }
- public ThreadContext(ExecutionContext context, MemoryManager memory)
+ public ThreadContext(ExecutionContext context, MemoryManager memory, Translator translator)
{
- Context = context;
- Memory = memory;
+ Context = context;
+ Memory = memory;
+ Translator = translator;
ExclusiveAddress = ulong.MaxValue;
}
@@ -29,9 +33,9 @@ namespace ARMeilleure.Instructions
[ThreadStatic]
private static ThreadContext _context;
- public static void RegisterThread(ExecutionContext context, MemoryManager memory)
+ public static void RegisterThread(ExecutionContext context, MemoryManager memory, Translator translator)
{
- _context = new ThreadContext(context, memory);
+ _context = new ThreadContext(context, memory, translator);
}
public static void UnregisterThread()
@@ -381,18 +385,39 @@ namespace ARMeilleure.Instructions
return address & ~((4UL << ErgSizeLog2) - 1);
}
+ public static ulong GetFunctionAddress(ulong address)
+ {
+ TranslatedFunction function = _context.Translator.GetOrTranslate(address, GetContext().ExecutionMode);
+ return (ulong)function.GetPointer().ToInt64();
+ }
+
+ public static ulong GetIndirectFunctionAddress(ulong address, ulong entryAddress)
+ {
+ TranslatedFunction function = _context.Translator.GetOrTranslate(address, GetContext().ExecutionMode);
+ ulong ptr = (ulong)function.GetPointer().ToInt64();
+ if (function.HighCq)
+ {
+ // Rewrite the host function address in the table to point to the highCq function.
+ Marshal.WriteInt64((IntPtr)entryAddress, 8, (long)ptr);
+ }
+ return ptr;
+ }
+
public static void ClearExclusive()
{
_context.ExclusiveAddress = ulong.MaxValue;
}
- public static void CheckSynchronization()
+ public static bool CheckSynchronization()
{
Statistics.PauseTimer();
- GetContext().CheckInterrupt();
+ ExecutionContext context = GetContext();
+ context.CheckInterrupt();
Statistics.ResumeTimer();
+
+ return context.Running;
}
public static ExecutionContext GetContext()