diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/ArmProcessContextFactory.cs')
-rw-r--r-- | Ryujinx.HLE/HOS/ArmProcessContextFactory.cs | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs b/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs index 5ecaf38e..1b0d66ac 100644 --- a/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs +++ b/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs @@ -1,17 +1,19 @@ using Ryujinx.Common.Configuration; using Ryujinx.Cpu; +using Ryujinx.Cpu.AppleHv; using Ryujinx.Cpu.Jit; using Ryujinx.Graphics.Gpu; using Ryujinx.HLE.HOS.Kernel; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.Memory; using System; +using System.Runtime.InteropServices; namespace Ryujinx.HLE.HOS { class ArmProcessContextFactory : IProcessContextFactory { - private readonly ICpuEngine _cpuEngine; + private readonly ITickSource _tickSource; private readonly GpuContext _gpu; private readonly string _titleIdText; private readonly string _displayVersion; @@ -22,7 +24,7 @@ namespace Ryujinx.HLE.HOS public IDiskCacheLoadState DiskCacheLoadState { get; private set; } public ArmProcessContextFactory( - ICpuEngine cpuEngine, + ITickSource tickSource, GpuContext gpu, string titleIdText, string displayVersion, @@ -30,7 +32,7 @@ namespace Ryujinx.HLE.HOS ulong codeAddress, ulong codeSize) { - _cpuEngine = cpuEngine; + _tickSource = tickSource; _gpu = gpu; _titleIdText = titleIdText; _displayVersion = displayVersion; @@ -41,31 +43,42 @@ namespace Ryujinx.HLE.HOS public IProcessContext Create(KernelContext context, ulong pid, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler, bool for64Bit) { - MemoryManagerMode mode = context.Device.Configuration.MemoryManagerMode; + IArmProcessContext processContext; - if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible)) + if (OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64 && for64Bit && context.Device.Configuration.UseHypervisor) { - mode = MemoryManagerMode.SoftwarePageTable; + var cpuEngine = new HvEngine(_tickSource); + var memoryManager = new HvMemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler); + processContext = new ArmProcessContext<HvMemoryManager>(pid, cpuEngine, _gpu, memoryManager, for64Bit); } + else + { + MemoryManagerMode mode = context.Device.Configuration.MemoryManagerMode; - IArmProcessContext processContext; + if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible)) + { + mode = MemoryManagerMode.SoftwarePageTable; + } - switch (mode) - { - case MemoryManagerMode.SoftwarePageTable: - var memoryManager = new MemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler); - processContext = new ArmProcessContext<MemoryManager>(pid, _cpuEngine, _gpu, memoryManager, for64Bit); - break; + var cpuEngine = new JitEngine(_tickSource); + + switch (mode) + { + case MemoryManagerMode.SoftwarePageTable: + var memoryManager = new MemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler); + processContext = new ArmProcessContext<MemoryManager>(pid, cpuEngine, _gpu, memoryManager, for64Bit); + break; - case MemoryManagerMode.HostMapped: - case MemoryManagerMode.HostMappedUnsafe: - bool unsafeMode = mode == MemoryManagerMode.HostMappedUnsafe; - var memoryManagerHostMapped = new MemoryManagerHostMapped(context.Memory, addressSpaceSize, unsafeMode, invalidAccessHandler); - processContext = new ArmProcessContext<MemoryManagerHostMapped>(pid, _cpuEngine, _gpu, memoryManagerHostMapped, for64Bit); - break; + case MemoryManagerMode.HostMapped: + case MemoryManagerMode.HostMappedUnsafe: + bool unsafeMode = mode == MemoryManagerMode.HostMappedUnsafe; + var memoryManagerHostMapped = new MemoryManagerHostMapped(context.Memory, addressSpaceSize, unsafeMode, invalidAccessHandler); + processContext = new ArmProcessContext<MemoryManagerHostMapped>(pid, cpuEngine, _gpu, memoryManagerHostMapped, for64Bit); + break; - default: - throw new ArgumentOutOfRangeException(); + default: + throw new ArgumentOutOfRangeException(); + } } DiskCacheLoadState = processContext.Initialize(_titleIdText, _displayVersion, _diskCacheEnabled, _codeAddress, _codeSize); |