diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/ApplicationLoader.cs')
-rw-r--r-- | Ryujinx.HLE/HOS/ApplicationLoader.cs | 55 |
1 files changed, 26 insertions, 29 deletions
diff --git a/Ryujinx.HLE/HOS/ApplicationLoader.cs b/Ryujinx.HLE/HOS/ApplicationLoader.cs index 61fcd0c3..06281b49 100644 --- a/Ryujinx.HLE/HOS/ApplicationLoader.cs +++ b/Ryujinx.HLE/HOS/ApplicationLoader.cs @@ -1,4 +1,3 @@ -using ARMeilleure.Translation.PTC; using LibHac; using LibHac.Account; using LibHac.Common; @@ -14,8 +13,8 @@ using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; +using Ryujinx.Cpu; using Ryujinx.HLE.FileSystem; -using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.Loaders.Executables; using Ryujinx.Memory; using System; @@ -67,6 +66,8 @@ namespace Ryujinx.HLE.HOS public string TitleIdText => TitleId.ToString("x16"); + public IDiskCacheLoadState DiskCacheLoadState { get; private set; } + public ApplicationLoader(Switch device) { _device = device; @@ -94,7 +95,7 @@ namespace Ryujinx.HLE.HOS EnsureSaveData(new ApplicationId(TitleId)); } - LoadExeFs(codeFs, metaData); + LoadExeFs(codeFs, string.Empty, metaData); } public static (Nca main, Nca patch, Nca control) GetGameData(VirtualFileSystem fileSystem, PartitionFileSystem pfs, int programIndex) @@ -302,12 +303,6 @@ namespace Ryujinx.HLE.HOS public void LoadServiceNca(string ncaFile) { - // Disable PPTC here as it does not support multiple processes running. - // TODO: This should be eventually removed and it should stop using global state and - // instead manage the cache per process. - Ptc.Close(); - PtcProfiler.Stop(); - FileStream file = new FileStream(ncaFile, FileMode.Open, FileAccess.Read); Nca mainNca = new Nca(_device.Configuration.VirtualFileSystem.KeySet, file.AsStorage(false)); @@ -369,16 +364,12 @@ namespace Ryujinx.HLE.HOS // Collect the nsos, ignoring ones that aren't used. NsoExecutable[] programs = nsos.Where(x => x != null).ToArray(); - MemoryManagerMode memoryManagerMode = _device.Configuration.MemoryManagerMode; - - if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible)) - { - memoryManagerMode = MemoryManagerMode.SoftwarePageTable; - } + string displayVersion = _device.System.ContentManager.GetCurrentFirmwareVersion().VersionString; + bool usePtc = _device.System.EnablePtc; metaData.GetNpdm(out Npdm npdm).ThrowIfFailure(); - ProgramInfo programInfo = new ProgramInfo(in npdm, allowCodeMemoryForJit: false); - ProgramLoader.LoadNsos(_device.System.KernelContext, out _, metaData, programInfo, executables: programs); + ProgramInfo programInfo = new ProgramInfo(in npdm, displayVersion, usePtc, allowCodeMemoryForJit: false); + ProgramLoader.LoadNsos(_device.System.KernelContext, metaData, programInfo, executables: programs); string titleIdText = npdm.Aci.Value.ProgramId.Value.ToString("x16"); bool titleIs64Bit = (npdm.Meta.Value.Flags & 1) != 0; @@ -477,9 +468,11 @@ namespace Ryujinx.HLE.HOS _device.Configuration.VirtualFileSystem.ModLoader.GetModsBasePath(), _device.Configuration.VirtualFileSystem.ModLoader.GetSdModsBasePath()); + string displayVersion = string.Empty; + if (controlNca != null) { - ReadControlData(_device, controlNca, ref _controlData, ref _titleName, ref _displayVersion); + ReadControlData(_device, controlNca, ref _controlData, ref _titleName, ref displayVersion); } else { @@ -493,9 +486,11 @@ namespace Ryujinx.HLE.HOS string dummyTitleName = ""; BlitStruct<ApplicationControlProperty> dummyControl = new BlitStruct<ApplicationControlProperty>(1); - ReadControlData(_device, updateProgram0ControlNca, ref dummyControl, ref dummyTitleName, ref _displayVersion); + ReadControlData(_device, updateProgram0ControlNca, ref dummyControl, ref dummyTitleName, ref displayVersion); } + _displayVersion = displayVersion; + if (dataStorage == null) { Logger.Warning?.Print(LogClass.Loader, "No RomFS found in NCA"); @@ -515,7 +510,7 @@ namespace Ryujinx.HLE.HOS EnsureSaveData(new ApplicationId(TitleId & ~0xFul)); } - LoadExeFs(codeFs, metaData); + LoadExeFs(codeFs, displayVersion, metaData); Logger.Info?.Print(LogClass.Loader, $"Application Loaded: {TitleName} v{DisplayVersion} [{TitleIdText}] [{(TitleIs64Bit ? "64-bit" : "32-bit")}]"); } @@ -584,7 +579,7 @@ namespace Ryujinx.HLE.HOS } } - private void LoadExeFs(IFileSystem codeFs, MetaLoader metaData = null, bool isHomebrew = false) + private void LoadExeFs(IFileSystem codeFs, string displayVersion, MetaLoader metaData = null, bool isHomebrew = false) { if (_device.Configuration.VirtualFileSystem.ModLoader.ReplaceExefsPartition(TitleId, ref codeFs)) { @@ -649,23 +644,23 @@ namespace Ryujinx.HLE.HOS memoryManagerMode = MemoryManagerMode.SoftwarePageTable; } - Ptc.Initialize(TitleIdText, DisplayVersion, usePtc, memoryManagerMode); - // We allow it for nx-hbloader because it can be used to launch homebrew. bool allowCodeMemoryForJit = TitleId == 0x010000000000100DUL || isHomebrew; metaData.GetNpdm(out Npdm npdm).ThrowIfFailure(); - ProgramInfo programInfo = new ProgramInfo(in npdm, allowCodeMemoryForJit); - ProgramLoader.LoadNsos(_device.System.KernelContext, out ProcessTamperInfo tamperInfo, metaData, programInfo, executables: programs); + ProgramInfo programInfo = new ProgramInfo(in npdm, displayVersion, usePtc, allowCodeMemoryForJit); + ProgramLoadResult result = ProgramLoader.LoadNsos(_device.System.KernelContext, metaData, programInfo, executables: programs); + + DiskCacheLoadState = result.DiskCacheLoadState; - _device.Configuration.VirtualFileSystem.ModLoader.LoadCheats(TitleId, tamperInfo, _device.TamperMachine); + _device.Configuration.VirtualFileSystem.ModLoader.LoadCheats(TitleId, result.TamperInfo, _device.TamperMachine); } public void LoadProgram(string filePath) { MetaLoader metaData = GetDefaultNpdm(); metaData.GetNpdm(out Npdm npdm).ThrowIfFailure(); - ProgramInfo programInfo = new ProgramInfo(in npdm, allowCodeMemoryForJit: true); + ProgramInfo programInfo = new ProgramInfo(in npdm, string.Empty, diskCacheEnabled: false, allowCodeMemoryForJit: true); bool isNro = Path.GetExtension(filePath).ToLower() == ".nro"; @@ -761,9 +756,11 @@ namespace Ryujinx.HLE.HOS Graphics.Gpu.GraphicsConfig.TitleId = null; _device.Gpu.HostInitalized.Set(); - ProgramLoader.LoadNsos(_device.System.KernelContext, out ProcessTamperInfo tamperInfo, metaData, programInfo, executables: executable); + ProgramLoadResult result = ProgramLoader.LoadNsos(_device.System.KernelContext, metaData, programInfo, executables: executable); + + DiskCacheLoadState = result.DiskCacheLoadState; - _device.Configuration.VirtualFileSystem.ModLoader.LoadCheats(TitleId, tamperInfo, _device.TamperMachine); + _device.Configuration.VirtualFileSystem.ModLoader.LoadCheats(TitleId, result.TamperInfo, _device.TamperMachine); } private MetaLoader GetDefaultNpdm() |