ArmProcessContext.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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 long _pid;
  12. private readonly GpuContext _gpuContext;
  13. private readonly CpuContext _cpuContext;
  14. private T _memoryManager;
  15. public IVirtualMemoryManager AddressSpace => _memoryManager;
  16. public ArmProcessContext(long 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 Dispose()
  33. {
  34. if (_memoryManager is IRefCounted rc)
  35. {
  36. rc.DecrementReferenceCount();
  37. _memoryManager = null;
  38. _gpuContext.UnregisterProcess(_pid);
  39. }
  40. }
  41. }
  42. }