From b2e88b04a85b41cc60af3485d88c90429e84a218 Mon Sep 17 00:00:00 2001 From: BaronKiko Date: Tue, 16 Apr 2019 00:22:55 +0100 Subject: Config option to ignore missing services (#658) * Implemented config option to ignore missing services * Removed unused using statement * Resolved comments from review --- Ryujinx.HLE/HOS/Services/DummyService.cs | 20 ++++++++++++++++++++ Ryujinx.HLE/HOS/Services/IpcService.cs | 22 +++++++++++++++++++--- Ryujinx.HLE/HOS/Services/ServiceFactory.cs | 12 ++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 Ryujinx.HLE/HOS/Services/DummyService.cs (limited to 'Ryujinx.HLE/HOS') diff --git a/Ryujinx.HLE/HOS/Services/DummyService.cs b/Ryujinx.HLE/HOS/Services/DummyService.cs new file mode 100644 index 00000000..28087bdf --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/DummyService.cs @@ -0,0 +1,20 @@ +using Ryujinx.HLE.HOS.Ipc; +using System.Collections.Generic; + +namespace Ryujinx.HLE.HOS.Services +{ + class DummyService : IpcService + { + private Dictionary _commands; + + public override IReadOnlyDictionary Commands => _commands; + + public string ServiceName { get; set; } + + public DummyService(string serviceName) + { + _commands = new Dictionary(); + ServiceName = serviceName; + } + } +} diff --git a/Ryujinx.HLE/HOS/Services/IpcService.cs b/Ryujinx.HLE/HOS/Services/IpcService.cs index 71683ce3..2a4a9319 100644 --- a/Ryujinx.HLE/HOS/Services/IpcService.cs +++ b/Ryujinx.HLE/HOS/Services/IpcService.cs @@ -89,13 +89,29 @@ namespace Ryujinx.HLE.HOS.Services long sfciMagic = context.RequestData.ReadInt64(); int commandId = (int)context.RequestData.ReadInt64(); - if (service.Commands.TryGetValue(commandId, out ServiceProcessRequest processRequest)) + bool serviceExists = service.Commands.TryGetValue(commandId, out ServiceProcessRequest processRequest); + + if (ServiceConfiguration.IgnoreMissingServices || serviceExists) { + long result = 0; + context.ResponseData.BaseStream.Seek(_isDomain ? 0x20 : 0x10, SeekOrigin.Begin); - Logger.PrintDebug(LogClass.KernelIpc, $"{service.GetType().Name}: {processRequest.Method.Name}"); + if (serviceExists) + { + Logger.PrintDebug(LogClass.KernelIpc, $"{service.GetType().Name}: {processRequest.Method.Name}"); - long result = processRequest(context); + result = processRequest(context); + } + else + { + string serviceName; + DummyService dummyService = service as DummyService; + + serviceName = (dummyService == null) ? service.GetType().FullName : dummyService.ServiceName; + + Logger.PrintWarning(LogClass.KernelIpc, $"Missing service {serviceName}: {commandId} ignored"); + } if (_isDomain) { diff --git a/Ryujinx.HLE/HOS/Services/ServiceFactory.cs b/Ryujinx.HLE/HOS/Services/ServiceFactory.cs index 83a217a5..113bbe51 100644 --- a/Ryujinx.HLE/HOS/Services/ServiceFactory.cs +++ b/Ryujinx.HLE/HOS/Services/ServiceFactory.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Acc; using Ryujinx.HLE.HOS.Services.Am; using Ryujinx.HLE.HOS.Services.Apm; @@ -30,6 +31,11 @@ using System; namespace Ryujinx.HLE.HOS.Services { + public static class ServiceConfiguration + { + public static bool IgnoreMissingServices { get; set; } + } + static class ServiceFactory { public static IpcService MakeService(Horizon system, string name) @@ -209,6 +215,12 @@ namespace Ryujinx.HLE.HOS.Services return new IApplicationRootService(); } + if (ServiceConfiguration.IgnoreMissingServices) + { + Logger.PrintWarning(LogClass.Service, $"Missing service {name} ignored"); + return new DummyService(name); + } + throw new NotImplementedException(name); } } -- cgit v1.2.3