forked from eden-emu/eden
		
	Merge pull request #380 from ogniK5377/service-impl
Implemented some useful interfaces needed for games.
This commit is contained in:
		
						commit
						327fd2c31e
					
				
					 13 changed files with 140 additions and 13 deletions
				
			
		|  | @ -48,6 +48,7 @@ namespace Log { | ||||||
|     SUB(Service, NS)                                                                               \ |     SUB(Service, NS)                                                                               \ | ||||||
|     SUB(Service, NVDRV)                                                                            \ |     SUB(Service, NVDRV)                                                                            \ | ||||||
|     SUB(Service, PCTL)                                                                             \ |     SUB(Service, PCTL)                                                                             \ | ||||||
|  |     SUB(Service, PREPO)                                                                            \ | ||||||
|     SUB(Service, SET)                                                                              \ |     SUB(Service, SET)                                                                              \ | ||||||
|     SUB(Service, SM)                                                                               \ |     SUB(Service, SM)                                                                               \ | ||||||
|     SUB(Service, SPL)                                                                              \ |     SUB(Service, SPL)                                                                              \ | ||||||
|  |  | ||||||
|  | @ -65,6 +65,7 @@ enum class Class : ClassType { | ||||||
|     Service_NS,        ///< The NS services
 |     Service_NS,        ///< The NS services
 | ||||||
|     Service_NVDRV,     ///< The NVDRV (Nvidia driver) service
 |     Service_NVDRV,     ///< The NVDRV (Nvidia driver) service
 | ||||||
|     Service_PCTL,      ///< The PCTL (Parental control) service
 |     Service_PCTL,      ///< The PCTL (Parental control) service
 | ||||||
|  |     Service_PREPO,     ///< The PREPO (Play report) service
 | ||||||
|     Service_SET,       ///< The SET (Settings) service
 |     Service_SET,       ///< The SET (Settings) service
 | ||||||
|     Service_SM,        ///< The SM (Service manager) service
 |     Service_SM,        ///< The SM (Service manager) service
 | ||||||
|     Service_SPL,       ///< The SPL service
 |     Service_SPL,       ///< The SPL service
 | ||||||
|  |  | ||||||
|  | @ -185,6 +185,8 @@ add_library(core STATIC | ||||||
|     hle/service/pctl/module.h |     hle/service/pctl/module.h | ||||||
|     hle/service/pctl/pctl.cpp |     hle/service/pctl/pctl.cpp | ||||||
|     hle/service/pctl/pctl.h |     hle/service/pctl/pctl.h | ||||||
|  |     hle/service/prepo/prepo.cpp | ||||||
|  |     hle/service/prepo/prepo.h | ||||||
|     hle/service/service.cpp |     hle/service/service.cpp | ||||||
|     hle/service/service.h |     hle/service/service.h | ||||||
|     hle/service/set/set.cpp |     hle/service/set/set.cpp | ||||||
|  |  | ||||||
|  | @ -162,12 +162,13 @@ public: | ||||||
|             {0x3, &IAudioDevice::GetActiveAudioDeviceName, "GetActiveAudioDeviceName"}, |             {0x3, &IAudioDevice::GetActiveAudioDeviceName, "GetActiveAudioDeviceName"}, | ||||||
|             {0x4, &IAudioDevice::QueryAudioDeviceSystemEvent, "QueryAudioDeviceSystemEvent"}, |             {0x4, &IAudioDevice::QueryAudioDeviceSystemEvent, "QueryAudioDeviceSystemEvent"}, | ||||||
|             {0x5, &IAudioDevice::GetActiveChannelCount, "GetActiveChannelCount"}, |             {0x5, &IAudioDevice::GetActiveChannelCount, "GetActiveChannelCount"}, | ||||||
|             {0x6, nullptr, "ListAudioDeviceNameAuto"}, |             {0x6, &IAudioDevice::ListAudioDeviceName, | ||||||
|             {0x7, nullptr, "SetAudioDeviceOutputVolumeAuto"}, |              "ListAudioDeviceNameAuto"}, // TODO(ogniK): Confirm if autos are identical to non auto
 | ||||||
|  |             {0x7, &IAudioDevice::SetAudioDeviceOutputVolume, "SetAudioDeviceOutputVolumeAuto"}, | ||||||
|             {0x8, nullptr, "GetAudioDeviceOutputVolumeAuto"}, |             {0x8, nullptr, "GetAudioDeviceOutputVolumeAuto"}, | ||||||
|             {0x10, nullptr, "GetActiveAudioDeviceNameAuto"}, |             {0xa, &IAudioDevice::GetActiveAudioDeviceName, "GetActiveAudioDeviceNameAuto"}, | ||||||
|             {0x11, nullptr, "QueryAudioDeviceInputEvent"}, |             {0xb, nullptr, "QueryAudioDeviceInputEvent"}, | ||||||
|             {0x12, nullptr, "QueryAudioDeviceOutputEvent"}}; |             {0xc, nullptr, "QueryAudioDeviceOutputEvent"}}; | ||||||
|         RegisterHandlers(functions); |         RegisterHandlers(functions); | ||||||
| 
 | 
 | ||||||
|         buffer_event = |         buffer_event = | ||||||
|  | @ -257,7 +258,7 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::ResponseBuilder rb{ctx, 4}; |     IPC::ResponseBuilder rb{ctx, 4}; | ||||||
| 
 | 
 | ||||||
|     rb.Push(RESULT_SUCCESS); |     rb.Push(RESULT_SUCCESS); | ||||||
|     rb.Push<u64>(0x400); |     rb.Push<u64>(0x4000); | ||||||
| 
 | 
 | ||||||
|     NGLOG_WARNING(Service_Audio, "(STUBBED) called"); |     NGLOG_WARNING(Service_Audio, "(STUBBED) called"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -12,10 +12,52 @@ namespace Service::NFP { | ||||||
| Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) | Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) | ||||||
|     : ServiceFramework(name), module(std::move(module)) {} |     : ServiceFramework(name), module(std::move(module)) {} | ||||||
| 
 | 
 | ||||||
| void Module::Interface::Unknown(Kernel::HLERequestContext& ctx) { | class IUser final : public ServiceFramework<IUser> { | ||||||
|  | public: | ||||||
|  |     IUser() : ServiceFramework("IUser") { | ||||||
|  |         static const FunctionInfo functions[] = { | ||||||
|  |             {0, &IUser::Initialize, "Initialize"}, | ||||||
|  |             {1, nullptr, "Unknown1"}, | ||||||
|  |             {2, nullptr, "Unknown2"}, | ||||||
|  |             {3, nullptr, "Unknown3"}, | ||||||
|  |             {4, nullptr, "Unknown4"}, | ||||||
|  |             {5, nullptr, "Unknown5"}, | ||||||
|  |             {6, nullptr, "Unknown6"}, | ||||||
|  |             {7, nullptr, "Unknown7"}, | ||||||
|  |             {8, nullptr, "Unknown8"}, | ||||||
|  |             {9, nullptr, "Unknown9"}, | ||||||
|  |             {10, nullptr, "Unknown10"}, | ||||||
|  |             {11, nullptr, "Unknown11"}, | ||||||
|  |             {12, nullptr, "Unknown12"}, | ||||||
|  |             {13, nullptr, "Unknown13"}, | ||||||
|  |             {14, nullptr, "Unknown14"}, | ||||||
|  |             {15, nullptr, "Unknown15"}, | ||||||
|  |             {16, nullptr, "Unknown16"}, | ||||||
|  |             {17, nullptr, "Unknown17"}, | ||||||
|  |             {18, nullptr, "Unknown18"}, | ||||||
|  |             {19, nullptr, "Unknown19"}, | ||||||
|  |             {20, nullptr, "Unknown20"}, | ||||||
|  |             {21, nullptr, "Unknown21"}, | ||||||
|  |             {22, nullptr, "Unknown22"}, | ||||||
|  |             {23, nullptr, "Unknown23"}, | ||||||
|  |             {24, nullptr, "Unknown24"}, | ||||||
|  |         }; | ||||||
|  |         RegisterHandlers(functions); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     void Initialize(Kernel::HLERequestContext& ctx) { | ||||||
|         NGLOG_WARNING(Service_NFP, "(STUBBED) called"); |         NGLOG_WARNING(Service_NFP, "(STUBBED) called"); | ||||||
|         IPC::ResponseBuilder rb{ctx, 2}; |         IPC::ResponseBuilder rb{ctx, 2}; | ||||||
|         rb.Push(RESULT_SUCCESS); |         rb.Push(RESULT_SUCCESS); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) { | ||||||
|  |     NGLOG_DEBUG(Service_NFP, "called"); | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushIpcInterface<IUser>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void InstallInterfaces(SM::ServiceManager& service_manager) { | void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ public: | ||||||
|     public: |     public: | ||||||
|         Interface(std::shared_ptr<Module> module, const char* name); |         Interface(std::shared_ptr<Module> module, const char* name); | ||||||
| 
 | 
 | ||||||
|         void Unknown(Kernel::HLERequestContext& ctx); |         void CreateUserInterface(Kernel::HLERequestContext& ctx); | ||||||
| 
 | 
 | ||||||
|     protected: |     protected: | ||||||
|         std::shared_ptr<Module> module; |         std::shared_ptr<Module> module; | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ namespace Service::NFP { | ||||||
| NFP_User::NFP_User(std::shared_ptr<Module> module) | NFP_User::NFP_User(std::shared_ptr<Module> module) | ||||||
|     : Module::Interface(std::move(module), "nfp:user") { |     : Module::Interface(std::move(module), "nfp:user") { | ||||||
|     static const FunctionInfo functions[] = { |     static const FunctionInfo functions[] = { | ||||||
|         {0, &NFP_User::Unknown, "Unknown"}, |         {0, &NFP_User::CreateUserInterface, "CreateUserInterface"}, | ||||||
|     }; |     }; | ||||||
|     RegisterHandlers(functions); |     RegisterHandlers(functions); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -79,6 +79,7 @@ u32 nvhost_ctrl_gpu::GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& | ||||||
|     std::memcpy(¶ms, input.data(), input.size()); |     std::memcpy(¶ms, input.data(), input.size()); | ||||||
|     NGLOG_WARNING(Service_NVDRV, "(STUBBED) called, mask={:#X}, mask_buf_addr={:#X}", |     NGLOG_WARNING(Service_NVDRV, "(STUBBED) called, mask={:#X}, mask_buf_addr={:#X}", | ||||||
|                   params.mask_buf_size, params.mask_buf_addr); |                   params.mask_buf_size, params.mask_buf_addr); | ||||||
|  |     params.unk = 0xcafe; // TODO(ogniK): Needs to be non 0, what does this actually do?
 | ||||||
|     std::memcpy(output.data(), ¶ms, sizeof(params)); |     std::memcpy(output.data(), ¶ms, sizeof(params)); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										43
									
								
								src/core/hle/service/prepo/prepo.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/core/hle/service/prepo/prepo.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,43 @@ | ||||||
|  | #include <cinttypes> | ||||||
|  | #include "common/logging/log.h" | ||||||
|  | #include "core/hle/ipc_helpers.h" | ||||||
|  | #include "core/hle/kernel/event.h" | ||||||
|  | #include "core/hle/service/prepo/prepo.h" | ||||||
|  | 
 | ||||||
|  | namespace Service::PlayReport { | ||||||
|  | PlayReport::PlayReport(const char* name) : ServiceFramework(name) { | ||||||
|  |     static const FunctionInfo functions[] = { | ||||||
|  |         {10100, nullptr, "SaveReport"}, | ||||||
|  |         {10101, &PlayReport::SaveReportWithUser, "SaveReportWithUser"}, | ||||||
|  |         {10200, nullptr, "RequestImmediateTransmission"}, | ||||||
|  |         {10300, nullptr, "GetTransmissionStatus"}, | ||||||
|  |         {20100, nullptr, "SaveSystemReport"}, | ||||||
|  |         {20200, nullptr, "SetOperationMode"}, | ||||||
|  |         {20101, nullptr, "SaveSystemReportWithUser"}, | ||||||
|  |         {30100, nullptr, "ClearStorage"}, | ||||||
|  |         {40100, nullptr, "IsUserAgreementCheckEnabled"}, | ||||||
|  |         {40101, nullptr, "SetUserAgreementCheckEnabled"}, | ||||||
|  |         {90100, nullptr, "GetStorageUsage"}, | ||||||
|  |         {90200, nullptr, "GetStatistics"}, | ||||||
|  |         {90201, nullptr, "GetThroughputHistory"}, | ||||||
|  |         {90300, nullptr, "GetLastUploadError"}, | ||||||
|  |     }; | ||||||
|  |     RegisterHandlers(functions); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void PlayReport::SaveReportWithUser(Kernel::HLERequestContext& ctx) { | ||||||
|  |     // TODO(ogniK): Do we want to add play report?
 | ||||||
|  |     NGLOG_WARNING(Service_PREPO, "(STUBBED) called"); | ||||||
|  | 
 | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 2}; | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||||
|  |     std::make_shared<PlayReport>("prepo:a")->InstallAsService(service_manager); | ||||||
|  |     std::make_shared<PlayReport>("prepo:m")->InstallAsService(service_manager); | ||||||
|  |     std::make_shared<PlayReport>("prepo:s")->InstallAsService(service_manager); | ||||||
|  |     std::make_shared<PlayReport>("prepo:u")->InstallAsService(service_manager); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace Service::PlayReport
 | ||||||
							
								
								
									
										23
									
								
								src/core/hle/service/prepo/prepo.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/core/hle/service/prepo/prepo.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | ||||||
|  | // Copyright 2018 yuzu emulator team
 | ||||||
|  | // Licensed under GPLv2 or any later version
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #include <memory> | ||||||
|  | #include <string> | ||||||
|  | #include "core/hle/kernel/event.h" | ||||||
|  | #include "core/hle/service/service.h" | ||||||
|  | 
 | ||||||
|  | namespace Service::PlayReport { | ||||||
|  | 
 | ||||||
|  | class PlayReport final : public ServiceFramework<PlayReport> { | ||||||
|  | public: | ||||||
|  |     explicit PlayReport(const char* name); | ||||||
|  |     ~PlayReport() = default; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     void SaveReportWithUser(Kernel::HLERequestContext& ctx); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void InstallInterfaces(SM::ServiceManager& service_manager); | ||||||
|  | 
 | ||||||
|  | } // namespace Service::PlayReport
 | ||||||
|  | @ -29,7 +29,8 @@ | ||||||
| #include "core/hle/service/nifm/nifm.h" | #include "core/hle/service/nifm/nifm.h" | ||||||
| #include "core/hle/service/ns/ns.h" | #include "core/hle/service/ns/ns.h" | ||||||
| #include "core/hle/service/nvdrv/nvdrv.h" | #include "core/hle/service/nvdrv/nvdrv.h" | ||||||
| #include "core/hle/service/pctl/module.h" | #include "core/hle/service/pctl/pctl.h" | ||||||
|  | #include "core/hle/service/prepo/prepo.h" | ||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
| #include "core/hle/service/set/settings.h" | #include "core/hle/service/set/settings.h" | ||||||
| #include "core/hle/service/sm/controller.h" | #include "core/hle/service/sm/controller.h" | ||||||
|  | @ -192,6 +193,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm) { | ||||||
|     NS::InstallInterfaces(*sm); |     NS::InstallInterfaces(*sm); | ||||||
|     Nvidia::InstallInterfaces(*sm); |     Nvidia::InstallInterfaces(*sm); | ||||||
|     PCTL::InstallInterfaces(*sm); |     PCTL::InstallInterfaces(*sm); | ||||||
|  |     PlayReport::InstallInterfaces(*sm); | ||||||
|     Sockets::InstallInterfaces(*sm); |     Sockets::InstallInterfaces(*sm); | ||||||
|     SPL::InstallInterfaces(*sm); |     SPL::InstallInterfaces(*sm); | ||||||
|     SSL::InstallInterfaces(*sm); |     SSL::InstallInterfaces(*sm); | ||||||
|  |  | ||||||
|  | @ -96,12 +96,22 @@ SSL::SSL() : ServiceFramework("ssl") { | ||||||
|         {2, nullptr, "GetCertificates"}, |         {2, nullptr, "GetCertificates"}, | ||||||
|         {3, nullptr, "GetCertificateBufSize"}, |         {3, nullptr, "GetCertificateBufSize"}, | ||||||
|         {4, nullptr, "DebugIoctl"}, |         {4, nullptr, "DebugIoctl"}, | ||||||
|         {5, nullptr, "SetInterfaceVersion"}, |         {5, &SSL::SetInterfaceVersion, "SetInterfaceVersion"}, | ||||||
|         {6, nullptr, "FlushSessionCache"}, |         {6, nullptr, "FlushSessionCache"}, | ||||||
|     }; |     }; | ||||||
|     RegisterHandlers(functions); |     RegisterHandlers(functions); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void SSL::SetInterfaceVersion(Kernel::HLERequestContext& ctx) { | ||||||
|  |     NGLOG_WARNING(Service_SSL, "(STUBBED) called"); | ||||||
|  |     IPC::RequestParser rp{ctx}; | ||||||
|  |     u32 unk1 = rp.Pop<u32>(); // Probably minor/major?
 | ||||||
|  |     u32 unk2 = rp.Pop<u32>(); // TODO(ogniK): Figure out what this does
 | ||||||
|  | 
 | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 2}; | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void InstallInterfaces(SM::ServiceManager& service_manager) { | void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||||
|     std::make_shared<SSL>()->InstallAsService(service_manager); |     std::make_shared<SSL>()->InstallAsService(service_manager); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -15,6 +15,7 @@ public: | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     void CreateContext(Kernel::HLERequestContext& ctx); |     void CreateContext(Kernel::HLERequestContext& ctx); | ||||||
|  |     void SetInterfaceVersion(Kernel::HLERequestContext& ctx); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /// Registers all SSL services with the specified service manager.
 | /// Registers all SSL services with the specified service manager.
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bunnei
						bunnei