forked from Mirror/Ryujinx
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:
parent
233fc95e1e
commit
b2e88b04a8
6 changed files with 73 additions and 3 deletions
20
Ryujinx.HLE/HOS/Services/DummyService.cs
Normal file
20
Ryujinx.HLE/HOS/Services/DummyService.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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",
|
||||||
|
|
Loading…
Reference in a new issue