ArmProcessContext.cs 1.6 KB

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