aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Cpu/Jit/JitCpuContext.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Cpu/Jit/JitCpuContext.cs')
-rw-r--r--src/Ryujinx.Cpu/Jit/JitCpuContext.cs53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/Ryujinx.Cpu/Jit/JitCpuContext.cs b/src/Ryujinx.Cpu/Jit/JitCpuContext.cs
new file mode 100644
index 00000000..02465a0b
--- /dev/null
+++ b/src/Ryujinx.Cpu/Jit/JitCpuContext.cs
@@ -0,0 +1,53 @@
+using ARMeilleure.Memory;
+using ARMeilleure.Translation;
+
+namespace Ryujinx.Cpu.Jit
+{
+ class JitCpuContext : ICpuContext
+ {
+ private readonly ITickSource _tickSource;
+ private readonly Translator _translator;
+
+ public JitCpuContext(ITickSource tickSource, IMemoryManager memory, bool for64Bit)
+ {
+ _tickSource = tickSource;
+ _translator = new Translator(new JitMemoryAllocator(), memory, for64Bit);
+ memory.UnmapEvent += UnmapHandler;
+ }
+
+ private void UnmapHandler(ulong address, ulong size)
+ {
+ _translator.InvalidateJitCacheRegion(address, size);
+ }
+
+ /// <inheritdoc/>
+ public IExecutionContext CreateExecutionContext(ExceptionCallbacks exceptionCallbacks)
+ {
+ return new JitExecutionContext(new JitMemoryAllocator(), _tickSource, exceptionCallbacks);
+ }
+
+ /// <inheritdoc/>
+ public void Execute(IExecutionContext context, ulong address)
+ {
+ _translator.Execute(((JitExecutionContext)context).Impl, address);
+ }
+
+ /// <inheritdoc/>
+ public void InvalidateCacheRegion(ulong address, ulong size)
+ {
+ _translator.InvalidateJitCacheRegion(address, size);
+ }
+
+ /// <inheritdoc/>
+ public IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled)
+ {
+ return new JitDiskCacheLoadState(_translator.LoadDiskCache(titleIdText, displayVersion, enabled));
+ }
+
+ /// <inheritdoc/>
+ public void PrepareCodeRange(ulong address, ulong size)
+ {
+ _translator.PrepareCodeRange(address, size);
+ }
+ }
+}