IPC refactor part 2: Use ReplyAndReceive on HLE services and remove special handling from kernel (#1458)

* IPC refactor part 2: Use ReplyAndReceive on HLE services and remove special handling from kernel

* Fix for applet transfer memory + some nits

* Keep handles if possible to avoid server handle table exhaustion

* Fix IPC ZeroFill bug

* am: Correctly implement CreateManagedDisplayLayer and implement CreateManagedDisplaySeparableLayer

CreateManagedDisplaySeparableLayer is requires since 10.x+ when appletResourceUserId != 0

* Make it exit properly

* Make ServiceNotImplementedException show the full message again

* Allow yielding execution to avoid starving other threads

* Only wait if active

* Merge IVirtualMemoryManager and IAddressSpaceManager

* Fix Ro loading data from the wrong process

Co-authored-by: Thog <me@thog.eu>
This commit is contained in:
gdkchan 2020-12-01 20:23:43 -03:00 committed by GitHub
parent 461c24092a
commit cf6cd71488
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
115 changed files with 2356 additions and 1088 deletions

View file

@ -14,28 +14,31 @@ namespace Ryujinx.HLE.Exceptions
[Serializable]
internal class ServiceNotImplementedException : Exception
{
public IIpcService Service { get; }
public ServiceCtx Context { get; }
public IpcMessage Request { get; }
public ServiceNotImplementedException(ServiceCtx context)
: this(context, "The service call is not implemented.")
public ServiceNotImplementedException(IIpcService service, ServiceCtx context)
: this(service, context, "The service call is not implemented.")
{ }
public ServiceNotImplementedException(ServiceCtx context, string message)
public ServiceNotImplementedException(IIpcService service, ServiceCtx context, string message)
: base(message)
{
Service = service;
Context = context;
Request = context.Request;
}
public ServiceNotImplementedException(ServiceCtx context, string message, Exception inner)
public ServiceNotImplementedException(IIpcService service, ServiceCtx context, string message, Exception inner)
: base(message, inner)
{
Service = service;
Context = context;
Request = context.Request;
}
protected ServiceNotImplementedException(SerializationInfo info, StreamingContext context)
protected ServiceNotImplementedException(SerializationInfo info, StreamingContext context)
: base(info, context)
{ }
@ -59,17 +62,16 @@ namespace Ryujinx.HLE.Exceptions
if (callingType != null && callingMethod != null)
{
var ipcService = Context.Session.Service;
var ipcCommands = ipcService.Commands;
var ipcCommands = Service.Commands;
// Find the handler for the method called
var ipcHandler = ipcCommands.FirstOrDefault(x => x.Value as MethodBase == callingMethod);
var ipcHandler = ipcCommands.FirstOrDefault(x => x.Value == callingMethod);
var ipcCommandId = ipcHandler.Key;
var ipcMethod = ipcHandler.Value;
if (ipcMethod != null)
{
sb.AppendLine($"Service Command: {ipcService.GetType().FullName}: {ipcCommandId} ({ipcMethod.Name})");
sb.AppendLine($"Service Command: {Service.GetType().FullName}: {ipcCommandId} ({ipcMethod.Name})");
sb.AppendLine();
}
}