aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Cpu/Jit/JitExecutionContext.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Cpu/Jit/JitExecutionContext.cs')
-rw-r--r--Ryujinx.Cpu/Jit/JitExecutionContext.cs123
1 files changed, 123 insertions, 0 deletions
diff --git a/Ryujinx.Cpu/Jit/JitExecutionContext.cs b/Ryujinx.Cpu/Jit/JitExecutionContext.cs
new file mode 100644
index 00000000..e1a527b1
--- /dev/null
+++ b/Ryujinx.Cpu/Jit/JitExecutionContext.cs
@@ -0,0 +1,123 @@
+using ARMeilleure.Memory;
+using ARMeilleure.State;
+
+namespace Ryujinx.Cpu.Jit
+{
+ class JitExecutionContext : IExecutionContext
+ {
+ private readonly ExecutionContext _impl;
+ internal ExecutionContext Impl => _impl;
+
+ /// <inheritdoc/>
+ public ulong Pc => _impl.Pc;
+
+ /// <inheritdoc/>
+ public long TpidrEl0
+ {
+ get => _impl.TpidrEl0;
+ set => _impl.TpidrEl0 = value;
+ }
+
+ /// <inheritdoc/>
+ public long TpidrroEl0
+ {
+ get => _impl.TpidrroEl0;
+ set => _impl.TpidrroEl0 = value;
+ }
+
+ /// <inheritdoc/>
+ public uint Pstate
+ {
+ get => _impl.Pstate;
+ set => _impl.Pstate = value;
+ }
+
+ /// <inheritdoc/>
+ public uint Fpcr
+ {
+ get => (uint)_impl.Fpcr;
+ set => _impl.Fpcr = (FPCR)value;
+ }
+
+ /// <inheritdoc/>
+ public uint Fpsr
+ {
+ get => (uint)_impl.Fpsr;
+ set => _impl.Fpsr = (FPSR)value;
+ }
+
+ /// <inheritdoc/>
+ public bool IsAarch32
+ {
+ get => _impl.IsAarch32;
+ set => _impl.IsAarch32 = value;
+ }
+
+ /// <inheritdoc/>
+ public bool Running => _impl.Running;
+
+ private readonly ExceptionCallbacks _exceptionCallbacks;
+
+ public JitExecutionContext(IJitMemoryAllocator allocator, ICounter counter, ExceptionCallbacks exceptionCallbacks)
+ {
+ _impl = new ExecutionContext(
+ allocator,
+ counter,
+ InterruptHandler,
+ BreakHandler,
+ SupervisorCallHandler,
+ UndefinedHandler);
+
+ _exceptionCallbacks = exceptionCallbacks;
+ }
+
+ /// <inheritdoc/>
+ public ulong GetX(int index) => _impl.GetX(index);
+
+ /// <inheritdoc/>
+ public void SetX(int index, ulong value) => _impl.SetX(index, value);
+
+ /// <inheritdoc/>
+ public V128 GetV(int index) => _impl.GetV(index);
+
+ /// <inheritdoc/>
+ public void SetV(int index, V128 value) => _impl.SetV(index, value);
+
+ private void InterruptHandler(ExecutionContext context)
+ {
+ _exceptionCallbacks.InterruptCallback?.Invoke(this);
+ }
+
+ private void BreakHandler(ExecutionContext context, ulong address, int imm)
+ {
+ _exceptionCallbacks.BreakCallback?.Invoke(this, address, imm);
+ }
+
+ private void SupervisorCallHandler(ExecutionContext context, ulong address, int imm)
+ {
+ _exceptionCallbacks.SupervisorCallback?.Invoke(this, address, imm);
+ }
+
+ private void UndefinedHandler(ExecutionContext context, ulong address, int opCode)
+ {
+ _exceptionCallbacks.UndefinedCallback?.Invoke(this, address, opCode);
+ }
+
+ /// <inheritdoc/>
+ public void RequestInterrupt()
+ {
+ _impl.RequestInterrupt();
+ }
+
+ /// <inheritdoc/>
+ public void StopRunning()
+ {
+ _impl.StopRunning();
+ }
+
+ public void Dispose()
+ {
+ _impl.Dispose();
+ }
+ }
+} \ No newline at end of file