using ARMeilleure.Common; using ARMeilleure.Memory; using Ryujinx.Cpu.Jit; using Ryujinx.Cpu.LightningJit.State; namespace Ryujinx.Cpu.LightningJit { class LightningJitCpuContext : ICpuContext { private readonly ITickSource _tickSource; private readonly Translator _translator; private readonly AddressTable _functionTable; public LightningJitCpuContext(ITickSource tickSource, IMemoryManager memory, bool for64Bit) { _tickSource = tickSource; _functionTable = AddressTable.CreateForArm(for64Bit, memory.Type); _translator = new Translator(memory, _functionTable); memory.UnmapEvent += UnmapHandler; } private void UnmapHandler(ulong address, ulong size) { _translator.InvalidateJitCacheRegion(address, size); } /// public IExecutionContext CreateExecutionContext(ExceptionCallbacks exceptionCallbacks) { return new ExecutionContext(new JitMemoryAllocator(), _tickSource, exceptionCallbacks); } /// public void Execute(IExecutionContext context, ulong address) { _translator.Execute((ExecutionContext)context, address); } /// public void InvalidateCacheRegion(ulong address, ulong size) { _translator.InvalidateJitCacheRegion(address, size); } /// public IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled, string cacheSelector) { return new DummyDiskCacheLoadState(); } /// public void PrepareCodeRange(ulong address, ulong size) { _functionTable.SignalCodeRange(address, size); } public void Dispose() { _translator.Dispose(); } } }