ArmProcessContextFactory.cs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using Ryujinx.Common.Configuration;
  2. using Ryujinx.Cpu;
  3. using Ryujinx.Cpu.AppleHv;
  4. using Ryujinx.Cpu.Jit;
  5. using Ryujinx.Graphics.Gpu;
  6. using Ryujinx.HLE.HOS.Kernel;
  7. using Ryujinx.HLE.HOS.Kernel.Process;
  8. using Ryujinx.Memory;
  9. using System;
  10. using System.Runtime.InteropServices;
  11. namespace Ryujinx.HLE.HOS
  12. {
  13. class ArmProcessContextFactory : IProcessContextFactory
  14. {
  15. private readonly ITickSource _tickSource;
  16. private readonly GpuContext _gpu;
  17. private readonly string _titleIdText;
  18. private readonly string _displayVersion;
  19. private readonly bool _diskCacheEnabled;
  20. private readonly ulong _codeAddress;
  21. private readonly ulong _codeSize;
  22. public IDiskCacheLoadState DiskCacheLoadState { get; private set; }
  23. public ArmProcessContextFactory(
  24. ITickSource tickSource,
  25. GpuContext gpu,
  26. string titleIdText,
  27. string displayVersion,
  28. bool diskCacheEnabled,
  29. ulong codeAddress,
  30. ulong codeSize)
  31. {
  32. _tickSource = tickSource;
  33. _gpu = gpu;
  34. _titleIdText = titleIdText;
  35. _displayVersion = displayVersion;
  36. _diskCacheEnabled = diskCacheEnabled;
  37. _codeAddress = codeAddress;
  38. _codeSize = codeSize;
  39. }
  40. public IProcessContext Create(KernelContext context, ulong pid, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler, bool for64Bit)
  41. {
  42. IArmProcessContext processContext;
  43. if (OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64 && for64Bit && context.Device.Configuration.UseHypervisor)
  44. {
  45. var cpuEngine = new HvEngine(_tickSource);
  46. var memoryManager = new HvMemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler);
  47. processContext = new ArmProcessContext<HvMemoryManager>(pid, cpuEngine, _gpu, memoryManager, for64Bit);
  48. }
  49. else
  50. {
  51. MemoryManagerMode mode = context.Device.Configuration.MemoryManagerMode;
  52. if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible))
  53. {
  54. mode = MemoryManagerMode.SoftwarePageTable;
  55. }
  56. var cpuEngine = new JitEngine(_tickSource);
  57. switch (mode)
  58. {
  59. case MemoryManagerMode.SoftwarePageTable:
  60. var memoryManager = new MemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler);
  61. processContext = new ArmProcessContext<MemoryManager>(pid, cpuEngine, _gpu, memoryManager, for64Bit);
  62. break;
  63. case MemoryManagerMode.HostMapped:
  64. case MemoryManagerMode.HostMappedUnsafe:
  65. bool unsafeMode = mode == MemoryManagerMode.HostMappedUnsafe;
  66. var memoryManagerHostMapped = new MemoryManagerHostMapped(context.Memory, addressSpaceSize, unsafeMode, invalidAccessHandler);
  67. processContext = new ArmProcessContext<MemoryManagerHostMapped>(pid, cpuEngine, _gpu, memoryManagerHostMapped, for64Bit);
  68. break;
  69. default:
  70. throw new ArgumentOutOfRangeException();
  71. }
  72. }
  73. DiskCacheLoadState = processContext.Initialize(_titleIdText, _displayVersion, _diskCacheEnabled, _codeAddress, _codeSize);
  74. return processContext;
  75. }
  76. }
  77. }