ArmProcessContextFactory.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using Ryujinx.Common.Configuration;
  2. using Ryujinx.Cpu;
  3. using Ryujinx.Graphics.Gpu;
  4. using Ryujinx.HLE.HOS.Kernel;
  5. using Ryujinx.HLE.HOS.Kernel.Process;
  6. using Ryujinx.Memory;
  7. using System;
  8. namespace Ryujinx.HLE.HOS
  9. {
  10. class ArmProcessContextFactory : IProcessContextFactory
  11. {
  12. private readonly GpuContext _gpu;
  13. public ArmProcessContextFactory(GpuContext gpu)
  14. {
  15. _gpu = gpu;
  16. }
  17. public IProcessContext Create(KernelContext context, ulong pid, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler, bool for64Bit)
  18. {
  19. MemoryManagerMode mode = context.Device.Configuration.MemoryManagerMode;
  20. if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible))
  21. {
  22. mode = MemoryManagerMode.SoftwarePageTable;
  23. }
  24. switch (mode)
  25. {
  26. case MemoryManagerMode.SoftwarePageTable:
  27. return new ArmProcessContext<MemoryManager>(pid, _gpu, new MemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler), for64Bit);
  28. case MemoryManagerMode.HostMapped:
  29. case MemoryManagerMode.HostMappedUnsafe:
  30. bool unsafeMode = mode == MemoryManagerMode.HostMappedUnsafe;
  31. return new ArmProcessContext<MemoryManagerHostMapped>(pid, _gpu, new MemoryManagerHostMapped(context.Memory, addressSpaceSize, unsafeMode, invalidAccessHandler), for64Bit);
  32. default:
  33. throw new ArgumentOutOfRangeException();
  34. }
  35. }
  36. }
  37. }