aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE
diff options
context:
space:
mode:
authorAc_K <Acoustik666@gmail.com>2024-01-25 23:06:53 +0100
committerGitHub <noreply@github.com>2024-01-25 23:06:53 +0100
commitcd37c75b82f97ad5d3bf6317ffcde62c06a6e920 (patch)
treedb4f6e9630878a4b32c8880ef95f7c877e20aab0 /src/Ryujinx.HLE
parent43705c2320c2ff7c8f6dca1141f3bf56033966d4 (diff)
Horizon: Implement arp:r and arp:w services (#5802)
* Horizon: Implement arp:r and arp:w services * Fix formatting * Remove HLE arp services * Revert "Remove HLE arp services" This reverts commit c576fcccadb963db56b96bacabd1c1ac7abfb1ab. * Keep LibHac impl since it's used in bcat * Addresses gdkchan's feedback * ArpApi in PrepoIpcServer and remove LmApi * Fix 2 * Fixes ArpApi init * Fix encoding * Update PrepoService.cs * Fix prepo
Diffstat (limited to 'src/Ryujinx.HLE')
-rw-r--r--src/Ryujinx.HLE/HOS/Services/Arp/IReader.cs8
-rw-r--r--src/Ryujinx.HLE/HOS/Services/Arp/IWriter.cs8
-rw-r--r--src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs2
-rw-r--r--src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs3
-rw-r--r--src/Ryujinx.HLE/Loaders/Processes/Extensions/LocalFileSystemExtensions.cs2
-rw-r--r--src/Ryujinx.HLE/Loaders/Processes/Extensions/NcaExtensions.cs2
-rw-r--r--src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs5
-rw-r--r--src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs23
8 files changed, 29 insertions, 24 deletions
diff --git a/src/Ryujinx.HLE/HOS/Services/Arp/IReader.cs b/src/Ryujinx.HLE/HOS/Services/Arp/IReader.cs
deleted file mode 100644
index 61131042..00000000
--- a/src/Ryujinx.HLE/HOS/Services/Arp/IReader.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Ryujinx.HLE.HOS.Services.Arp
-{
- [Service("arp:r")]
- class IReader : IpcService
- {
- public IReader(ServiceCtx context) { }
- }
-}
diff --git a/src/Ryujinx.HLE/HOS/Services/Arp/IWriter.cs b/src/Ryujinx.HLE/HOS/Services/Arp/IWriter.cs
deleted file mode 100644
index 22d081b9..00000000
--- a/src/Ryujinx.HLE/HOS/Services/Arp/IWriter.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Ryujinx.HLE.HOS.Services.Arp
-{
- [Service("arp:w")]
- class IWriter : IpcService
- {
- public IWriter(ServiceCtx context) { }
- }
-}
diff --git a/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs b/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs
index cf8c1f78..9b026a1c 100644
--- a/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs
@@ -159,9 +159,7 @@ namespace Ryujinx.HLE.HOS.Services.Pctl.ParentalControlServiceFactory
}
else
{
-#pragma warning disable CS0162 // Unreachable code
return ResultCode.StereoVisionRestrictionConfigurableDisabled;
-#pragma warning restore CS0162
}
}
diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs
index 28f6fcff..3904d660 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs
@@ -34,7 +34,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
return metaLoader;
}
- public static ProcessResult Load(this IFileSystem exeFs, Switch device, BlitStruct<ApplicationControlProperty> nacpData, MetaLoader metaLoader, bool isHomebrew = false)
+ public static ProcessResult Load(this IFileSystem exeFs, Switch device, BlitStruct<ApplicationControlProperty> nacpData, MetaLoader metaLoader, byte programIndex, bool isHomebrew = false)
{
ulong programId = metaLoader.GetProgramId();
@@ -119,6 +119,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
true,
programName,
metaLoader.GetProgramId(),
+ programIndex,
null,
nsoExecutables);
diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/LocalFileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/LocalFileSystemExtensions.cs
index 798a9261..39139ecc 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/LocalFileSystemExtensions.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/LocalFileSystemExtensions.cs
@@ -26,7 +26,7 @@ namespace Ryujinx.HLE.Loaders.Processes
ProcessLoaderHelper.EnsureSaveData(device, new ApplicationId(programId), nacpData);
}
- ProcessResult processResult = exeFs.Load(device, nacpData, metaLoader);
+ ProcessResult processResult = exeFs.Load(device, nacpData, metaLoader, 0);
// Load RomFS.
if (!string.IsNullOrEmpty(romFsPath))
diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/NcaExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/NcaExtensions.cs
index e369f4b0..e70fcb6f 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/NcaExtensions.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/NcaExtensions.cs
@@ -61,7 +61,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
*/
- ProcessResult processResult = exeFs.Load(device, nacpData, metaLoader);
+ ProcessResult processResult = exeFs.Load(device, nacpData, metaLoader, (byte)nca.GetProgramIndex());
// Load RomFS.
if (romFs == null)
diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs
index efeb9f61..e5056c89 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs
@@ -77,7 +77,7 @@ namespace Ryujinx.HLE.Loaders.Processes
if (processResult.ProcessId == 0)
{
// This is not a normal NSP, it's actually a ExeFS as a NSP
- processResult = partitionFileSystem.Load(_device, new BlitStruct<ApplicationControlProperty>(1), partitionFileSystem.GetNpdm(), true);
+ processResult = partitionFileSystem.Load(_device, new BlitStruct<ApplicationControlProperty>(1), partitionFileSystem.GetNpdm(), 0, true);
}
if (processResult.ProcessId != 0 && _processesByPid.TryAdd(processResult.ProcessId, processResult))
@@ -198,7 +198,7 @@ namespace Ryujinx.HLE.Loaders.Processes
}
else
{
- programName = System.IO.Path.GetFileNameWithoutExtension(path);
+ programName = Path.GetFileNameWithoutExtension(path);
executable = new NsoExecutable(new LocalStorage(path, FileAccess.Read), programName);
}
@@ -215,6 +215,7 @@ namespace Ryujinx.HLE.Loaders.Processes
allowCodeMemoryForJit: true,
programName,
programId,
+ 0,
null,
executable);
diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs
index a6a1d87e..fe2aaac6 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs
@@ -19,6 +19,7 @@ using Ryujinx.HLE.HOS.Kernel.Process;
using Ryujinx.HLE.Loaders.Executables;
using Ryujinx.HLE.Loaders.Processes.Extensions;
using Ryujinx.Horizon.Common;
+using Ryujinx.Horizon.Sdk.Arp;
using System;
using System.Linq;
using System.Runtime.InteropServices;
@@ -229,6 +230,7 @@ namespace Ryujinx.HLE.Loaders.Processes
bool allowCodeMemoryForJit,
string name,
ulong programId,
+ byte programIndex,
byte[] arguments = null,
params IExecutable[] executables)
{
@@ -421,7 +423,7 @@ namespace Ryujinx.HLE.Loaders.Processes
// Once everything is loaded, we can load cheats.
device.Configuration.VirtualFileSystem.ModLoader.LoadCheats(programId, tamperInfo, device.TamperMachine);
- return new ProcessResult(
+ ProcessResult processResult = new(
metaLoader,
applicationControlProperties,
diskCacheEnabled,
@@ -431,6 +433,25 @@ namespace Ryujinx.HLE.Loaders.Processes
meta.MainThreadPriority,
meta.MainThreadStackSize,
device.System.State.DesiredTitleLanguage);
+
+ // Register everything in arp service.
+ device.System.ServiceTable.ArpWriter.AcquireRegistrar(out IRegistrar registrar);
+ registrar.SetApplicationControlProperty(MemoryMarshal.Cast<byte, Horizon.Sdk.Ns.ApplicationControlProperty>(applicationControlProperties.ByteSpan)[0]);
+ // TODO: Handle Version and StorageId when it will be needed.
+ registrar.SetApplicationLaunchProperty(new ApplicationLaunchProperty()
+ {
+ ApplicationId = new Horizon.Sdk.Ncm.ApplicationId(programId),
+ Version = 0x00,
+ Storage = Horizon.Sdk.Ncm.StorageId.BuiltInUser,
+ PatchStorage = Horizon.Sdk.Ncm.StorageId.None,
+ ApplicationKind = ApplicationKind.Application,
+ });
+
+ device.System.ServiceTable.ArpReader.GetApplicationInstanceId(out ulong applicationInstanceId, process.Pid);
+ device.System.ServiceTable.ArpWriter.AcquireApplicationProcessPropertyUpdater(out IUpdater updater, applicationInstanceId);
+ updater.SetApplicationProcessProperty(process.Pid, new ApplicationProcessProperty() { ProgramIndex = programIndex });
+
+ return processResult;
}
public static Result LoadIntoMemory(KProcess process, IExecutable image, ulong baseAddress)