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

nfc/nfp: Implement ISystemManager and ISystem (#2381)

* nfc/nfp: Implement ISystemManager and ISystem

This PR add permission levels for `nfc` and `nfp` services:
- `nfc`: `CreateUserInterface` and `CreateSystemInterface` are implemented.
- `INfc`: `Initialize` and `IsNfcEnabled` calls are stubbed.
- `nfp`: `CreateDebugInterface` and `CreateSystemInterface` are implemented.
- `INfp`: `GetRegisterInfo2` for `IDebug` and `ISystem` are implemented.

* Addresses gdkchan feedback
Ac_K преди 4 години
родител
ревизия
55e0c71489
променени са 24 файла, в които са добавени 153 реда и са изтрити 33 реда
  1. 1 0
      Ryujinx.Common/Logging/LogClass.cs
  2. 1 1
      Ryujinx.HLE/HOS/Horizon.cs
  3. 12 1
      Ryujinx.HLE/HOS/Services/Nfc/ISystemManager.cs
  4. 12 1
      Ryujinx.HLE/HOS/Services/Nfc/IUserManager.cs
  5. 37 0
      Ryujinx.HLE/HOS/Services/Nfc/NfcManager/INfc.cs
  6. 8 0
      Ryujinx.HLE/HOS/Services/Nfc/NfcManager/Types/NfcPermissionLevel.cs
  7. 12 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/IDebugManager.cs
  8. 12 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/ISystemManager.cs
  9. 5 3
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/IUserManager.cs
  10. 25 6
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs
  11. 1 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/AmiiboConstants.cs
  12. 1 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/CommonInfo.cs
  13. 7 0
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/DeviceType.cs
  14. 1 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/ModelInfo.cs
  15. 1 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/MountTarget.cs
  16. 1 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/NfpDevice.cs
  17. 1 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/NfpDeviceState.cs
  18. 9 0
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/NfpPermissionLevel.cs
  19. 2 2
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/RegisterInfo.cs
  20. 1 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/State.cs
  21. 1 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/TagInfo.cs
  22. 1 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/VirtualAmiiboFile.cs
  23. 0 7
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/DeviceType.cs
  24. 1 1
      Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs

+ 1 - 0
Ryujinx.Common/Logging/LogClass.cs

@@ -38,6 +38,7 @@ namespace Ryujinx.Common.Logging
         ServiceLdr,
         ServiceLm,
         ServiceMm,
+        ServiceNfc,
         ServiceNfp,
         ServiceNgct,
         ServiceNifm,

+ 1 - 1
Ryujinx.HLE/HOS/Horizon.cs

@@ -22,7 +22,7 @@ using Ryujinx.HLE.HOS.Services.Arp;
 using Ryujinx.HLE.HOS.Services.Audio.AudioRenderer;
 using Ryujinx.HLE.HOS.Services.Caps;
 using Ryujinx.HLE.HOS.Services.Mii;
-using Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager;
+using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
 using Ryujinx.HLE.HOS.Services.Nv;
 using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl;
 using Ryujinx.HLE.HOS.Services.Pcv.Bpc;

+ 12 - 1
Ryujinx.HLE/HOS/Services/Nfc/ISystemManager.cs

@@ -1,8 +1,19 @@
-namespace Ryujinx.HLE.HOS.Services.Nfc
+using Ryujinx.HLE.HOS.Services.Nfc.NfcManager;
+
+namespace Ryujinx.HLE.HOS.Services.Nfc
 {
     [Service("nfc:sys")]
     class ISystemManager : IpcService
     {
         public ISystemManager(ServiceCtx context) { }
+
+        [CommandHipc(0)]
+        // CreateSystemInterface() -> object<nn::nfc::detail::ISystem>
+        public ResultCode CreateSystemInterface(ServiceCtx context)
+        {
+            MakeObject(context, new INfc(NfcPermissionLevel.System));
+
+            return ResultCode.Success;
+        }
     }
 }

+ 12 - 1
Ryujinx.HLE/HOS/Services/Nfc/IUserManager.cs

@@ -1,8 +1,19 @@
-namespace Ryujinx.HLE.HOS.Services.Nfc
+using Ryujinx.HLE.HOS.Services.Nfc.NfcManager;
+
+namespace Ryujinx.HLE.HOS.Services.Nfc
 {
     [Service("nfc:user")]
     class IUserManager : IpcService
     {
         public IUserManager(ServiceCtx context) { }
+
+        [CommandHipc(0)]
+        // CreateUserInterface() -> object<nn::nfc::detail::IUser>
+        public ResultCode CreateUserInterface(ServiceCtx context)
+        {
+            MakeObject(context, new INfc(NfcPermissionLevel.User));
+
+            return ResultCode.Success;
+        }
     }
 }

+ 37 - 0
Ryujinx.HLE/HOS/Services/Nfc/NfcManager/INfc.cs

@@ -0,0 +1,37 @@
+using Ryujinx.Common.Logging;
+
+namespace Ryujinx.HLE.HOS.Services.Nfc.NfcManager
+{
+    class INfc : IpcService
+    {
+        private NfcPermissionLevel _permissionLevel;
+
+        public INfc(NfcPermissionLevel permissionLevel)
+        {
+            _permissionLevel = permissionLevel;
+        }
+
+        [CommandHipc(0)]
+        [CommandHipc(400)] // 4.0.0+
+        // Initialize()
+        public ResultCode Initialize(ServiceCtx context)
+        {
+            Logger.Stub?.PrintStub(LogClass.ServiceNfc, new { _permissionLevel });
+
+            return ResultCode.Success;
+        }
+
+        [CommandHipc(3)]
+        [CommandHipc(403)] // 4.0.0+
+        // IsNfcEnabled() -> b8
+        public ResultCode IsNfcEnabled(ServiceCtx context)
+        {
+            // NOTE: Write false value here could make nfp service not called.
+            context.ResponseData.Write(true);
+
+            Logger.Stub?.PrintStub(LogClass.ServiceNfc, new { _permissionLevel });
+
+            return ResultCode.Success;
+        }
+    }
+}

+ 8 - 0
Ryujinx.HLE/HOS/Services/Nfc/NfcManager/Types/NfcPermissionLevel.cs

@@ -0,0 +1,8 @@
+namespace Ryujinx.HLE.HOS.Services.Nfc.NfcManager
+{
+    enum NfcPermissionLevel
+    {
+        User,
+        System
+    }
+}

+ 12 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/IDebugManager.cs

@@ -1,8 +1,19 @@
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
+using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
+
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
 {
     [Service("nfp:dbg")]
     class IAmManager : IpcService
     {
         public IAmManager(ServiceCtx context) { }
+
+        [CommandHipc(0)]
+        // CreateDebugInterface() -> object<nn::nfp::detail::IDebug>
+        public ResultCode CreateDebugInterface(ServiceCtx context)
+        {
+            MakeObject(context, new INfp(NfpPermissionLevel.Debug));
+
+            return ResultCode.Success;
+        }
     }
 }

+ 12 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/ISystemManager.cs

@@ -1,8 +1,19 @@
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
+using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
+
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
 {
     [Service("nfp:sys")]
     class ISystemManager : IpcService
     {
         public ISystemManager(ServiceCtx context) { }
+
+        [CommandHipc(0)]
+        // CreateSystemInterface() -> object<nn::nfp::detail::ISystem>
+        public ResultCode CreateSystemInterface(ServiceCtx context)
+        {
+            MakeObject(context, new INfp(NfpPermissionLevel.System));
+
+            return ResultCode.Success;
+        }
     }
 }

+ 5 - 3
Ryujinx.HLE/HOS/Services/Nfc/Nfp/IUserManager.cs

@@ -1,4 +1,6 @@
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
+using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
+
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
 {
     [Service("nfp:user")]
     class IUserManager : IpcService
@@ -7,9 +9,9 @@
 
         [CommandHipc(0)]
         // CreateUserInterface() -> object<nn::nfp::detail::IUser>
-        public ResultCode GetUserInterface(ServiceCtx context)
+        public ResultCode CreateUserInterface(ServiceCtx context)
         {
-            MakeObject(context, new IUser());
+            MakeObject(context, new INfp(NfpPermissionLevel.User));
 
             return ResultCode.Success;
         }

+ 25 - 6
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/IUser.cs → Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs

@@ -6,7 +6,7 @@ using Ryujinx.HLE.HOS.Kernel.Common;
 using Ryujinx.HLE.HOS.Kernel.Threading;
 using Ryujinx.HLE.HOS.Services.Hid;
 using Ryujinx.HLE.HOS.Services.Hid.HidServer;
-using Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager;
+using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
 using System;
 using System.Buffers.Binary;
 using System.Globalization;
@@ -16,7 +16,7 @@ using System.Threading.Tasks;
 
 namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
 {
-    class IUser : IpcService
+    class INfp : IpcService
     {
         private ulong  _appletResourceUserId;
         private ulong  _mcuVersionData;
@@ -28,7 +28,12 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
 
         private CancellationTokenSource _cancelTokenSource;
 
-        public IUser() { }
+        private NfpPermissionLevel _permissionLevel;
+
+        public INfp(NfpPermissionLevel permissionLevel)
+        {
+            _permissionLevel = permissionLevel;
+        }
 
         [CommandHipc(0)]
         // Initialize(u64, u64, pid, buffer<unknown, 5>)
@@ -213,9 +218,9 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
                 return resultCode;
             }
 
-            uint                   deviceHandle = (uint)context.RequestData.ReadUInt64();
-            UserManager.DeviceType deviceType   = (UserManager.DeviceType)context.RequestData.ReadUInt32();
-            MountTarget            mountTarget  = (MountTarget)context.RequestData.ReadUInt32();
+            uint        deviceHandle = (uint)context.RequestData.ReadUInt64();
+            DeviceType  deviceType   = (DeviceType)context.RequestData.ReadUInt32();
+            MountTarget mountTarget  = (MountTarget)context.RequestData.ReadUInt32();
 
             if (deviceType != 0)
             {
@@ -969,6 +974,20 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
             throw new ServiceNotImplementedException(this, context, false);
         }
 
+        [CommandHipc(102)]
+        // GetRegisterInfo2(bytes<8, 4>) -> buffer<unknown<0x100>, 0x1a>
+        public ResultCode GetRegisterInfo2(ServiceCtx context)
+        {
+            // TODO: Find the differencies between IUser and ISystem/IDebug.
+
+            if (_permissionLevel == NfpPermissionLevel.Debug || _permissionLevel == NfpPermissionLevel.System)
+            {
+                return GetRegisterInfo(context);
+            }
+
+            return ResultCode.DeviceNotFound;
+        }
+
         private ResultCode CheckNfcIsEnabled()
         {
             // TODO: Call nn::settings::detail::GetNfcEnableFlag when it will be implemented.

+ 1 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/AmiiboConstants.cs → Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/AmiiboConstants.cs

@@ -1,4 +1,4 @@
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
 {
     static class AmiiboConstants
     {

+ 1 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/CommonInfo.cs → Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/CommonInfo.cs

@@ -1,7 +1,7 @@
 using Ryujinx.Common.Memory;
 using System.Runtime.InteropServices;
 
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
 {
     [StructLayout(LayoutKind.Sequential, Size = 0x40)]
     struct CommonInfo

+ 7 - 0
Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/DeviceType.cs

@@ -0,0 +1,7 @@
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
+{
+    enum DeviceType : uint
+    {
+        Amiibo
+    }
+}

+ 1 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/ModelInfo.cs → Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/ModelInfo.cs

@@ -1,7 +1,7 @@
 using Ryujinx.Common.Memory;
 using System.Runtime.InteropServices;
 
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
 {
     [StructLayout(LayoutKind.Sequential, Size = 0x40)]
     struct ModelInfo

+ 1 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/MountTarget.cs → Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/MountTarget.cs

@@ -1,4 +1,4 @@
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
 {
     enum MountTarget : uint
     {

+ 1 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/NfpDevice.cs → Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/NfpDevice.cs

@@ -1,7 +1,7 @@
 using Ryujinx.HLE.HOS.Kernel.Threading;
 using Ryujinx.HLE.HOS.Services.Hid;
 
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
 {
     class NfpDevice
     {

+ 1 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/NfpDeviceState.cs → Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/NfpDeviceState.cs

@@ -1,4 +1,4 @@
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
 {
     enum NfpDeviceState
     {

+ 9 - 0
Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/NfpPermissionLevel.cs

@@ -0,0 +1,9 @@
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
+{
+    enum NfpPermissionLevel
+    {
+        Debug,
+        User,
+        System
+    }
+}

+ 2 - 2
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/RegisterInfo.cs → Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/RegisterInfo.cs

@@ -2,7 +2,7 @@
 using Ryujinx.HLE.HOS.Services.Mii.Types;
 using System.Runtime.InteropServices;
 
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
 {
     [StructLayout(LayoutKind.Sequential, Size = 0x100)]
     struct RegisterInfo
@@ -11,7 +11,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
         public ushort        FirstWriteYear;
         public byte          FirstWriteMonth;
         public byte          FirstWriteDay;
-        public Array11<byte> Nickname;
+        public Array41<byte> Nickname;
         public byte          FontRegion;
         public Array64<byte> Reserved1;
         public Array58<byte> Reserved2;

+ 1 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/State.cs → Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/State.cs

@@ -1,4 +1,4 @@
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
 {
     enum State
     {

+ 1 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/TagInfo.cs → Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/TagInfo.cs

@@ -1,7 +1,7 @@
 using Ryujinx.Common.Memory;
 using System.Runtime.InteropServices;
 
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
 {
     [StructLayout(LayoutKind.Sequential, Size = 0x58)]
     struct TagInfo

+ 1 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/VirtualAmiiboFile.cs → Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/VirtualAmiiboFile.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
+namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
 {
     struct VirtualAmiiboFile
     {

+ 0 - 7
Ryujinx.HLE/HOS/Services/Nfc/Nfp/UserManager/Types/DeviceType.cs

@@ -1,7 +0,0 @@
-namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager
-{
-    enum DeviceType : uint
-    {
-        Amiibo
-    }
-}

+ 1 - 1
Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs

@@ -2,7 +2,7 @@
 using Ryujinx.Common.Memory;
 using Ryujinx.HLE.HOS.Services.Mii;
 using Ryujinx.HLE.HOS.Services.Mii.Types;
-using Ryujinx.HLE.HOS.Services.Nfc.Nfp.UserManager;
+using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
 using System;
 using System.Collections.Generic;
 using System.IO;