ArmProcessContext.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using ARMeilleure.Memory;
  2. using Ryujinx.Cpu;
  3. using Ryujinx.Graphics.Gpu;
  4. using Ryujinx.HLE.HOS.Kernel.Process;
  5. using Ryujinx.Memory;
  6. namespace Ryujinx.HLE.HOS
  7. {
  8. class ArmProcessContext<T> : IProcessContext where T : class, IVirtualMemoryManagerTracked, IMemoryManager
  9. {
  10. private readonly ulong _pid;
  11. private readonly GpuContext _gpuContext;
  12. private readonly ICpuContext _cpuContext;
  13. private T _memoryManager;
  14. public IVirtualMemoryManager AddressSpace => _memoryManager;
  15. public ArmProcessContext(ulong pid, ICpuEngine cpuEngine, GpuContext gpuContext, T memoryManager, bool for64Bit)
  16. {
  17. if (memoryManager is IRefCounted rc)
  18. {
  19. rc.IncrementReferenceCount();
  20. }
  21. gpuContext.RegisterProcess(pid, memoryManager);
  22. _pid = pid;
  23. _gpuContext = gpuContext;
  24. _cpuContext = cpuEngine.CreateCpuContext(memoryManager, for64Bit);
  25. _memoryManager = memoryManager;
  26. }
  27. public IExecutionContext CreateExecutionContext(ExceptionCallbacks exceptionCallbacks)
  28. {
  29. return _cpuContext.CreateExecutionContext(exceptionCallbacks);
  30. }
  31. public void Execute(IExecutionContext context, ulong codeAddress)
  32. {
  33. _cpuContext.Execute(context, codeAddress);
  34. }
  35. public void InvalidateCacheRegion(ulong address, ulong size)
  36. {
  37. _cpuContext.InvalidateCacheRegion(address, size);
  38. }
  39. public void Dispose()
  40. {
  41. if (_memoryManager is IRefCounted rc)
  42. {
  43. rc.DecrementReferenceCount();
  44. _memoryManager = null;
  45. _gpuContext.UnregisterProcess(_pid);
  46. }
  47. }
  48. }
  49. }