Преглед на файлове

svc: Implement `ref` parameters (#798)

Allows passing data into and out of the same registers when calling via the Kernel ABI. This allows implementing specific supervisor calls like "CallSecureMonitor", that expect their args and results in the same registers.
jduncanator преди 6 години
родител
ревизия
86b42f176a
променени са 1 файла, в които са добавени 10 реда и са изтрити 1 реда
  1. 10 1
      Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcTable.cs

+ 10 - 1
Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcTable.cs

@@ -231,7 +231,16 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 
                     if (!methodArgs[index].IsOut)
                     {
-                        throw new InvalidOperationException($"Method \"{svcName}\" has a invalid ref type \"{argType.Name}\".");
+                        generator.Emit(OpCodes.Ldarg_1);
+                        generator.Emit(OpCodes.Ldc_I4, index);
+
+                        MethodInfo info = typeof(IExecutionContext).GetMethod(nameof(IExecutionContext.GetX));
+
+                        generator.Emit(OpCodes.Call, info);
+
+                        ConvertToArgType(argType);
+
+                        generator.Emit(OpCodes.Stloc, local);
                     }
 
                     generator.Emit(OpCodes.Ldloca, local);