Config option to ignore missing services (#658)

* Implemented config option to ignore missing services

* Removed unused using statement

* Resolved comments from review
This commit is contained in:
BaronKiko 2019-04-16 00:22:55 +01:00 committed by jduncanator
parent 233fc95e1e
commit b2e88b04a8
6 changed files with 73 additions and 3 deletions

View file

@ -0,0 +1,20 @@
using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services
{
class DummyService : IpcService
{
private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public string ServiceName { get; set; }
public DummyService(string serviceName)
{
_commands = new Dictionary<int, ServiceProcessRequest>();
ServiceName = serviceName;
}
}
}

View file

@ -89,13 +89,29 @@ namespace Ryujinx.HLE.HOS.Services
long sfciMagic = context.RequestData.ReadInt64(); long sfciMagic = context.RequestData.ReadInt64();
int commandId = (int)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); 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) if (_isDomain)
{ {

View file

@ -1,3 +1,4 @@
using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Services.Acc; using Ryujinx.HLE.HOS.Services.Acc;
using Ryujinx.HLE.HOS.Services.Am; using Ryujinx.HLE.HOS.Services.Am;
using Ryujinx.HLE.HOS.Services.Apm; using Ryujinx.HLE.HOS.Services.Apm;
@ -30,6 +31,11 @@ using System;
namespace Ryujinx.HLE.HOS.Services namespace Ryujinx.HLE.HOS.Services
{ {
public static class ServiceConfiguration
{
public static bool IgnoreMissingServices { get; set; }
}
static class ServiceFactory static class ServiceFactory
{ {
public static IpcService MakeService(Horizon system, string name) public static IpcService MakeService(Horizon system, string name)
@ -209,6 +215,12 @@ namespace Ryujinx.HLE.HOS.Services
return new IApplicationRootService(); return new IApplicationRootService();
} }
if (ServiceConfiguration.IgnoreMissingServices)
{
Logger.PrintWarning(LogClass.Service, $"Missing service {name} ignored");
return new DummyService(name);
}
throw new NotImplementedException(name); throw new NotImplementedException(name);
} }
} }

View file

@ -44,6 +44,9 @@
// Enable or disable aggressive CPU optimizations // Enable or disable aggressive CPU optimizations
"enable_aggressive_cpu_opts": true, "enable_aggressive_cpu_opts": true,
// Enable or disable ignoring missing services, this may cause instability
"ignore_missing_services": false,
// The primary controller's type // The primary controller's type
// Supported Values: Handheld, ProController, NpadPair, NpadLeft, NpadRight // Supported Values: Handheld, ProController, NpadPair, NpadLeft, NpadRight
"controller_type": "Handheld", "controller_type": "Handheld",

View file

@ -4,6 +4,7 @@ using Ryujinx.Common;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.HLE; using Ryujinx.HLE;
using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.HLE.HOS.Services;
using Ryujinx.HLE.Input; using Ryujinx.HLE.Input;
using Ryujinx.UI.Input; using Ryujinx.UI.Input;
using System; using System;
@ -91,6 +92,11 @@ namespace Ryujinx
/// </summary> /// </summary>
public bool EnableAggressiveCpuOpts { get; private set; } public bool EnableAggressiveCpuOpts { get; private set; }
/// <summary>
/// Enable or disable ignoring missing services
/// </summary>
public bool IgnoreMissingServices { get; private set; }
/// <summary> /// <summary>
/// The primary controller's type /// The primary controller's type
/// </summary> /// </summary>
@ -207,6 +213,8 @@ namespace Ryujinx
Optimizations.AssumeStrictAbiCompliance = true; Optimizations.AssumeStrictAbiCompliance = true;
} }
ServiceConfiguration.IgnoreMissingServices = Instance.IgnoreMissingServices;
if(Instance.GamepadControls.Enabled) if(Instance.GamepadControls.Enabled)
{ {
if (GamePad.GetName(Instance.GamepadControls.Index) == "Unmapped Controller") if (GamePad.GetName(Instance.GamepadControls.Index) == "Unmapped Controller")

View file

@ -411,6 +411,17 @@
false false
] ]
}, },
"ignore_missing_services": {
"$id": "#/properties/ignore_missing_services",
"type": "boolean",
"title": "Ignore Missing Services",
"description": "Enable or disable ignoring missing services, this may cause instability",
"default": false,
"examples": [
true,
false
]
},
"controller_type": { "controller_type": {
"$id": "#/properties/controller_type", "$id": "#/properties/controller_type",
"type": "string", "type": "string",