mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Merge pull request #1820 from mailwl/service-ver
Set client SDK version to Service APIs
This commit is contained in:
		
						commit
						e5a7f2ef29
					
				
					 8 changed files with 88 additions and 16 deletions
				
			
		|  | @ -60,7 +60,7 @@ enum class Class : ClassType { | ||||||
|     Service_AM,        ///< The AM (Application manager) service
 |     Service_AM,        ///< The AM (Application manager) service
 | ||||||
|     Service_PTM,       ///< The PTM (Power status & misc.) service
 |     Service_PTM,       ///< The PTM (Power status & misc.) service
 | ||||||
|     Service_LDR,       ///< The LDR (3ds dll loader) service
 |     Service_LDR,       ///< The LDR (3ds dll loader) service
 | ||||||
|     Service_MIC,       ///< The MIC (microphone) service
 |     Service_MIC,       ///< The MIC (Microphone) service
 | ||||||
|     Service_NDM,       ///< The NDM (Network daemon manager) service
 |     Service_NDM,       ///< The NDM (Network daemon manager) service
 | ||||||
|     Service_NIM,       ///< The NIM (Network interface manager) service
 |     Service_NIM,       ///< The NIM (Network interface manager) service
 | ||||||
|     Service_NWM,       ///< The NWM (Network wlan manager) service
 |     Service_NWM,       ///< The NWM (Network wlan manager) service
 | ||||||
|  | @ -85,7 +85,6 @@ enum class Class : ClassType { | ||||||
|     Audio_DSP,         ///< The HLE implementation of the DSP
 |     Audio_DSP,         ///< The HLE implementation of the DSP
 | ||||||
|     Audio_Sink,        ///< Emulator audio output backend
 |     Audio_Sink,        ///< Emulator audio output backend
 | ||||||
|     Loader,            ///< ROM loader
 |     Loader,            ///< ROM loader
 | ||||||
| 
 |  | ||||||
|     Count              ///< Total number of logging classes
 |     Count              ///< Total number of logging classes
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -230,6 +230,24 @@ static void IsConnected(Service::Interface* self) { | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called"); |     LOG_WARNING(Service_AC, "(STUBBED) called"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * AC_U::SetClientVersion service function | ||||||
|  |  *  Inputs: | ||||||
|  |  *      1 : Used SDK Version | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  */ | ||||||
|  | static void SetClientVersion(Service::Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  | 
 | ||||||
|  |     const u32 version = cmd_buff[1]; | ||||||
|  |     self->SetVersion(version); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_AC, "(STUBBED) called, version: 0x%08X", version); | ||||||
|  | 
 | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; // No error
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| const Interface::FunctionInfo FunctionTable[] = { | const Interface::FunctionInfo FunctionTable[] = { | ||||||
|     {0x00010000, CreateDefaultConfig, "CreateDefaultConfig"}, |     {0x00010000, CreateDefaultConfig, "CreateDefaultConfig"}, | ||||||
|     {0x00040006, ConnectAsync, "ConnectAsync"}, |     {0x00040006, ConnectAsync, "ConnectAsync"}, | ||||||
|  | @ -250,7 +268,7 @@ const Interface::FunctionInfo FunctionTable[] = { | ||||||
|     {0x00300004, RegisterDisconnectEvent, "RegisterDisconnectEvent"}, |     {0x00300004, RegisterDisconnectEvent, "RegisterDisconnectEvent"}, | ||||||
|     {0x003C0042, nullptr, "GetAPSSIDList"}, |     {0x003C0042, nullptr, "GetAPSSIDList"}, | ||||||
|     {0x003E0042, IsConnected, "IsConnected"}, |     {0x003E0042, IsConnected, "IsConnected"}, | ||||||
|     {0x00400042, nullptr, "SetClientVersion"}, |     {0x00400042, SetClientVersion, "SetClientVersion"}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  |  | ||||||
|  | @ -100,6 +100,18 @@ void GetMyScreenName(Service::Interface* self) { | ||||||
|     LOG_WARNING(Service_FRD, "(STUBBED) called"); |     LOG_WARNING(Service_FRD, "(STUBBED) called"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void SetClientSdkVersion(Service::Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  | 
 | ||||||
|  |     const u32 version = cmd_buff[1]; | ||||||
|  | 
 | ||||||
|  |     self->SetVersion(version); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_FRD, "(STUBBED) called, version: 0x%08X", version); | ||||||
|  | 
 | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; // No error
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Init() { | void Init() { | ||||||
|     using namespace Kernel; |     using namespace Kernel; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -95,6 +95,15 @@ void GetMyFriendKey(Service::Interface* self); | ||||||
|  */ |  */ | ||||||
| void GetMyScreenName(Service::Interface* self); | void GetMyScreenName(Service::Interface* self); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * FRD::SetClientSdkVersion service function | ||||||
|  |  *  Inputs: | ||||||
|  |  *      1 : Used SDK Version | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  */ | ||||||
|  | void SetClientSdkVersion(Service::Interface* self); | ||||||
|  | 
 | ||||||
| /// Initialize FRD service(s)
 | /// Initialize FRD service(s)
 | ||||||
| void Init(); | void Init(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -58,7 +58,7 @@ const Interface::FunctionInfo FunctionTable[] = { | ||||||
|     {0x002F0040, nullptr, "AllowHalfAwake"}, |     {0x002F0040, nullptr, "AllowHalfAwake"}, | ||||||
|     {0x00300000, nullptr, "GetServerTypes"}, |     {0x00300000, nullptr, "GetServerTypes"}, | ||||||
|     {0x00310082, nullptr, "GetFriendComment"}, |     {0x00310082, nullptr, "GetFriendComment"}, | ||||||
|     {0x00320042, nullptr, "SetClientSdkVersion"}, |     {0x00320042, SetClientSdkVersion, "SetClientSdkVersion"}, | ||||||
|     {0x00330000, nullptr, "GetMyApproachContext"}, |     {0x00330000, nullptr, "GetMyApproachContext"}, | ||||||
|     {0x00340046, nullptr, "AddFriendWithApproach"}, |     {0x00340046, nullptr, "AddFriendWithApproach"}, | ||||||
|     {0x00350082, nullptr, "DecryptApproachContext"}, |     {0x00350082, nullptr, "DecryptApproachContext"}, | ||||||
|  |  | ||||||
|  | @ -763,23 +763,27 @@ static void CreateLegacySystemSaveData(Service::Interface* self) { | ||||||
|  * FS_User::InitializeWithSdkVersion service function. |  * FS_User::InitializeWithSdkVersion service function. | ||||||
|  *  Inputs: |  *  Inputs: | ||||||
|  *      0 : 0x08610042 |  *      0 : 0x08610042 | ||||||
|  *      1 : Unknown |  *      1 : Used SDK Version | ||||||
|  *      2 : Unknown |  *      2 : ProcessId Header | ||||||
|  *      3 : Unknown |  *      3 : placeholder for ProcessId | ||||||
|  *  Outputs: |  *  Outputs: | ||||||
|  *      1 : Result of function, 0 on success, otherwise error code |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  */ |  */ | ||||||
| static void InitializeWithSdkVersion(Service::Interface* self) { | static void InitializeWithSdkVersion(Service::Interface* self) { | ||||||
|     u32* cmd_buff = Kernel::GetCommandBuffer(); |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
| 
 | 
 | ||||||
|     u32 unk1 = cmd_buff[1]; |     const u32 version = cmd_buff[1]; | ||||||
|     u32 unk2 = cmd_buff[2]; |     self->SetVersion(version); | ||||||
|     u32 unk3 = cmd_buff[3]; |  | ||||||
| 
 | 
 | ||||||
|  |     if (cmd_buff[2] == IPC::CallingPidDesc()) { | ||||||
|  |         LOG_WARNING(Service_FS, "(STUBBED) called, version: 0x%08X", version); | ||||||
|         cmd_buff[1] = RESULT_SUCCESS.raw; |         cmd_buff[1] = RESULT_SUCCESS.raw; | ||||||
| 
 |     } else { | ||||||
|     LOG_WARNING(Service_FS, "(STUBBED) called unk1=0x%08X, unk2=0x%08X, unk3=0x%08X", unk1, unk2, |         LOG_ERROR(Service_FS, "ProcessId Header must be 0x20"); | ||||||
|                 unk3); |         cmd_buff[1] = ResultCode(ErrorDescription::OS_InvalidBufferDescriptor, ErrorModule::OS, | ||||||
|  |                                  ErrorSummary::WrongArgument, ErrorLevel::Permanent) | ||||||
|  |                           .raw; | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  |  | ||||||
|  | @ -287,6 +287,24 @@ static void SetAllowShellClosed(Service::Interface* self) { | ||||||
|     LOG_WARNING(Service_MIC, "(STUBBED) called, allow_shell_closed=%u", allow_shell_closed); |     LOG_WARNING(Service_MIC, "(STUBBED) called, allow_shell_closed=%u", allow_shell_closed); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * MIC_U::SetClientVersion service function | ||||||
|  |  *  Inputs: | ||||||
|  |  *      1 : Used SDK Version | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  */ | ||||||
|  | static void SetClientVersion(Service::Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  | 
 | ||||||
|  |     const u32 version = cmd_buff[1]; | ||||||
|  |     self->SetVersion(version); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_MIC, "(STUBBED) called, version: 0x%08X", version); | ||||||
|  | 
 | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; // No error
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| const Interface::FunctionInfo FunctionTable[] = { | const Interface::FunctionInfo FunctionTable[] = { | ||||||
|     {0x00010042, MapSharedMem, "MapSharedMem"}, |     {0x00010042, MapSharedMem, "MapSharedMem"}, | ||||||
|     {0x00020000, UnmapSharedMem, "UnmapSharedMem"}, |     {0x00020000, UnmapSharedMem, "UnmapSharedMem"}, | ||||||
|  | @ -303,7 +321,7 @@ const Interface::FunctionInfo FunctionTable[] = { | ||||||
|     {0x000D0040, SetClamp, "SetClamp"}, |     {0x000D0040, SetClamp, "SetClamp"}, | ||||||
|     {0x000E0000, GetClamp, "GetClamp"}, |     {0x000E0000, GetClamp, "GetClamp"}, | ||||||
|     {0x000F0040, SetAllowShellClosed, "SetAllowShellClosed"}, |     {0x000F0040, SetAllowShellClosed, "SetAllowShellClosed"}, | ||||||
|     {0x00100040, nullptr, "SetClientSDKVersion"}, |     {0x00100040, SetClientVersion, "SetClientVersion"}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  |  | ||||||
|  | @ -29,6 +29,10 @@ public: | ||||||
|         return GetPortName(); |         return GetPortName(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     virtual void SetVersion(u32 raw_version) { | ||||||
|  |         version.raw = raw_version; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     typedef void (*Function)(Interface*); |     typedef void (*Function)(Interface*); | ||||||
| 
 | 
 | ||||||
|     struct FunctionInfo { |     struct FunctionInfo { | ||||||
|  | @ -58,6 +62,14 @@ protected: | ||||||
| 
 | 
 | ||||||
|     void Register(const FunctionInfo* functions, size_t n); |     void Register(const FunctionInfo* functions, size_t n); | ||||||
| 
 | 
 | ||||||
|  |     union { | ||||||
|  |         u32 raw; | ||||||
|  |         BitField<0, 8, u32> major; | ||||||
|  |         BitField<8, 8, u32> minor; | ||||||
|  |         BitField<16, 8, u32> build; | ||||||
|  |         BitField<24, 8, u32> revision; | ||||||
|  |     } version = {}; | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
|     boost::container::flat_map<u32, FunctionInfo> m_functions; |     boost::container::flat_map<u32, FunctionInfo> m_functions; | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue