mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	service/cecd: Migrate to ServiceFramework
This commit is contained in:
		
							parent
							
								
									4564fc5baa
								
							
						
					
					
						commit
						363d6fdb89
					
				
					 9 changed files with 148 additions and 140 deletions
				
			
		|  | @ -3,64 +3,62 @@ | |||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/ipc.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/handle_table.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/result.h" | ||||
| #include "core/hle/service/cecd/cecd.h" | ||||
| #include "core/hle/service/cecd/cecd_ndm.h" | ||||
| #include "core/hle/service/cecd/cecd_s.h" | ||||
| #include "core/hle/service/cecd/cecd_u.h" | ||||
| #include "core/hle/service/service.h" | ||||
| 
 | ||||
| 
 | ||||
| namespace Service { | ||||
| namespace CECD { | ||||
| 
 | ||||
| static Kernel::SharedPtr<Kernel::Event> cecinfo_event; | ||||
| static Kernel::SharedPtr<Kernel::Event> change_state_event; | ||||
| void Module::Interface::GetCecStateAbbreviated(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp(ctx, 0x0E, 0, 0); | ||||
| 
 | ||||
| void GetCecStateAbbreviated(Service::Interface* self) { | ||||
|     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||
| 
 | ||||
|     cmd_buff[1] = RESULT_SUCCESS.raw; // No error
 | ||||
|     cmd_buff[2] = static_cast<u32>(CecStateAbbreviated::CEC_STATE_ABBREV_IDLE); | ||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.Push<u32>(static_cast<u32>(CecStateAbbreviated::CEC_STATE_ABBREV_IDLE)); | ||||
| 
 | ||||
|     LOG_WARNING(Service_CECD, "(STUBBED) called"); | ||||
| } | ||||
| 
 | ||||
| void GetCecInfoEventHandle(Service::Interface* self) { | ||||
|     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||
| void Module::Interface::GetCecInfoEventHandle(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp(ctx, 0x0F, 0, 0); | ||||
| 
 | ||||
|     cmd_buff[1] = RESULT_SUCCESS.raw;                                    // No error
 | ||||
|     cmd_buff[3] = Kernel::g_handle_table.Create(cecinfo_event).Unwrap(); // Event handle
 | ||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushCopyObjects(cecd->cecinfo_event); | ||||
| 
 | ||||
|     LOG_WARNING(Service_CECD, "(STUBBED) called"); | ||||
| } | ||||
| 
 | ||||
| void GetChangeStateEventHandle(Service::Interface* self) { | ||||
|     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||
| void Module::Interface::GetChangeStateEventHandle(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp(ctx, 0x10, 0, 0); | ||||
| 
 | ||||
|     cmd_buff[1] = RESULT_SUCCESS.raw;                                         // No error
 | ||||
|     cmd_buff[3] = Kernel::g_handle_table.Create(change_state_event).Unwrap(); // Event handle
 | ||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushCopyObjects(cecd->change_state_event); | ||||
| 
 | ||||
|     LOG_WARNING(Service_CECD, "(STUBBED) called"); | ||||
| } | ||||
| 
 | ||||
| void Init() { | ||||
|     AddService(new CECD_NDM); | ||||
|     AddService(new CECD_S); | ||||
|     AddService(new CECD_U); | ||||
| Module::Interface::Interface(std::shared_ptr<Module> cecd, const char* name, u32 max_session) | ||||
|     : ServiceFramework(name, max_session), cecd(std::move(cecd)) {} | ||||
| 
 | ||||
|     cecinfo_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "CECD::cecinfo_event"); | ||||
|     change_state_event = | ||||
|         Kernel::Event::Create(Kernel::ResetType::OneShot, "CECD::change_state_event"); | ||||
| Module::Module() { | ||||
|     using namespace Kernel; | ||||
|     cecinfo_event = Event::Create(Kernel::ResetType::OneShot, "CECD::cecinfo_event"); | ||||
|     change_state_event = Event::Create(Kernel::ResetType::OneShot, "CECD::change_state_event"); | ||||
| } | ||||
| 
 | ||||
| void Shutdown() { | ||||
|     cecinfo_event = nullptr; | ||||
|     change_state_event = nullptr; | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||
|     auto cecd = std::make_shared<Module>(); | ||||
|     std::make_shared<CECD_NDM>(cecd)->InstallAsService(service_manager); | ||||
|     std::make_shared<CECD_S>(cecd)->InstallAsService(service_manager); | ||||
|     std::make_shared<CECD_U>(cecd)->InstallAsService(service_manager); | ||||
| } | ||||
| 
 | ||||
| } // namespace CECD
 | ||||
| 
 | ||||
| } // namespace Service
 | ||||
|  |  | |||
|  | @ -4,10 +4,10 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/service/service.h" | ||||
| 
 | ||||
| namespace Service { | ||||
| 
 | ||||
| class Interface; | ||||
| 
 | ||||
| namespace CECD { | ||||
| 
 | ||||
| enum class CecStateAbbreviated { | ||||
|  | @ -20,41 +20,58 @@ enum class CecStateAbbreviated { | |||
|                                 /// OVER_BOSS and those listed here
 | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * GetCecStateAbbreviated service function | ||||
|  *  Inputs: | ||||
|  *      0: 0x000E0000 | ||||
|  *  Outputs: | ||||
|  *      1: ResultCode | ||||
|  *      2: CecStateAbbreviated | ||||
|  */ | ||||
| void GetCecStateAbbreviated(Service::Interface* self); | ||||
| class Module final { | ||||
| public: | ||||
|     Module(); | ||||
|     ~Module() = default; | ||||
| 
 | ||||
| /**
 | ||||
|  * GetCecInfoEventHandle service function | ||||
|  *  Inputs: | ||||
|  *      0: 0x000F0000 | ||||
|  *  Outputs: | ||||
|  *      1: ResultCode | ||||
|  *      3: Event Handle | ||||
|  */ | ||||
| void GetCecInfoEventHandle(Service::Interface* self); | ||||
|     class Interface : public ServiceFramework<Interface> { | ||||
|     public: | ||||
|         Interface(std::shared_ptr<Module> cecd, const char* name, u32 max_session); | ||||
|         ~Interface() = default; | ||||
| 
 | ||||
| /**
 | ||||
|  * GetChangeStateEventHandle service function | ||||
|  *  Inputs: | ||||
|  *      0: 0x00100000 | ||||
|  *  Outputs: | ||||
|  *      1: ResultCode | ||||
|  *      3: Event Handle | ||||
|  */ | ||||
| void GetChangeStateEventHandle(Service::Interface* self); | ||||
|     protected: | ||||
|         /**
 | ||||
|          * GetCecStateAbbreviated service function | ||||
|          *  Inputs: | ||||
|          *      0: 0x000E0000 | ||||
|          *  Outputs: | ||||
|          *      1: ResultCode | ||||
|          *      2: CecStateAbbreviated | ||||
|          */ | ||||
|         void GetCecStateAbbreviated(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|         /**
 | ||||
|          * GetCecInfoEventHandle service function | ||||
|          *  Inputs: | ||||
|          *      0: 0x000F0000 | ||||
|          *  Outputs: | ||||
|          *      1: ResultCode | ||||
|          *      3: Event Handle | ||||
|          */ | ||||
|         void GetCecInfoEventHandle(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|         /**
 | ||||
|          * GetChangeStateEventHandle service function | ||||
|          *  Inputs: | ||||
|          *      0: 0x00100000 | ||||
|          *  Outputs: | ||||
|          *      1: ResultCode | ||||
|          *      3: Event Handle | ||||
|          */ | ||||
|         void GetChangeStateEventHandle(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     private: | ||||
|         std::shared_ptr<Module> cecd; | ||||
|     }; | ||||
| 
 | ||||
| private: | ||||
|     Kernel::SharedPtr<Kernel::Event> cecinfo_event; | ||||
|     Kernel::SharedPtr<Kernel::Event> change_state_event; | ||||
| }; | ||||
| 
 | ||||
| /// Initialize CECD service(s)
 | ||||
| void Init(); | ||||
| 
 | ||||
| /// Shutdown CECD service(s)
 | ||||
| void Shutdown(); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager); | ||||
| 
 | ||||
| } // namespace CECD
 | ||||
| } // namespace Service
 | ||||
|  |  | |||
|  | @ -2,21 +2,23 @@ | |||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include "core/hle/service/cecd/cecd.h" | ||||
| #include "core/hle/service/cecd/cecd_ndm.h" | ||||
| 
 | ||||
| namespace Service { | ||||
| namespace CECD { | ||||
| 
 | ||||
| static const Interface::FunctionInfo FunctionTable[] = { | ||||
|     {0x00010000, nullptr, "Initialize"}, | ||||
|     {0x00020000, nullptr, "Deinitialize"}, | ||||
|     {0x00030000, nullptr, "ResumeDaemon"}, | ||||
|     {0x00040040, nullptr, "SuspendDaemon"}, | ||||
| }; | ||||
| CECD_NDM::CECD_NDM(std::shared_ptr<Module> cecd) | ||||
|     : Module::Interface(std::move(cecd), "cecd:ndm", DefaultMaxSessions) { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         // clang-format off
 | ||||
|         {0x00010000, nullptr, "Initialize"}, | ||||
|         {0x00020000, nullptr, "Deinitialize"}, | ||||
|         {0x00030000, nullptr, "ResumeDaemon"}, | ||||
|         {0x00040040, nullptr, "SuspendDaemon"}, | ||||
|         // clang-format on
 | ||||
|     }; | ||||
| 
 | ||||
| CECD_NDM::CECD_NDM() { | ||||
|     Register(FunctionTable); | ||||
|     RegisterHandlers(functions); | ||||
| } | ||||
| 
 | ||||
| } // namespace CECD
 | ||||
|  |  | |||
|  | @ -4,18 +4,14 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "core/hle/service/service.h" | ||||
| #include "core/hle/service/cecd/cecd.h" | ||||
| 
 | ||||
| namespace Service { | ||||
| namespace CECD { | ||||
| 
 | ||||
| class CECD_NDM : public Interface { | ||||
| class CECD_NDM final : public Module::Interface { | ||||
| public: | ||||
|     CECD_NDM(); | ||||
| 
 | ||||
|     std::string GetPortName() const override { | ||||
|         return "cecd:ndm"; | ||||
|     } | ||||
|     explicit CECD_NDM(std::shared_ptr<Module> cecd); | ||||
| }; | ||||
| 
 | ||||
| } // namespace CECD
 | ||||
|  |  | |||
|  | @ -2,34 +2,36 @@ | |||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include "core/hle/service/cecd/cecd.h" | ||||
| #include "core/hle/service/cecd/cecd_s.h" | ||||
| 
 | ||||
| namespace Service { | ||||
| namespace CECD { | ||||
| 
 | ||||
| static const Interface::FunctionInfo FunctionTable[] = { | ||||
|     // cecd:u shared commands
 | ||||
|     {0x000100C2, nullptr, "OpenRawFile"}, | ||||
|     {0x00020042, nullptr, "ReadRawFile"}, | ||||
|     {0x00030104, nullptr, "ReadMessage"}, | ||||
|     {0x00040106, nullptr, "ReadMessageWithHMAC"}, | ||||
|     {0x00050042, nullptr, "WriteRawFile"}, | ||||
|     {0x00060104, nullptr, "WriteMessage"}, | ||||
|     {0x00070106, nullptr, "WriteMessageWithHMAC"}, | ||||
|     {0x00080102, nullptr, "Delete"}, | ||||
|     {0x000A00C4, nullptr, "GetSystemInfo"}, | ||||
|     {0x000B0040, nullptr, "RunCommand"}, | ||||
|     {0x000C0040, nullptr, "RunCommandAlt"}, | ||||
|     {0x000E0000, GetCecStateAbbreviated, "GetCecStateAbbreviated"}, | ||||
|     {0x000F0000, GetCecInfoEventHandle, "GetCecInfoEventHandle"}, | ||||
|     {0x00100000, GetChangeStateEventHandle, "GetChangeStateEventHandle"}, | ||||
|     {0x00110104, nullptr, "OpenAndWrite"}, | ||||
|     {0x00120104, nullptr, "OpenAndRead"}, | ||||
| }; | ||||
| CECD_S::CECD_S(std::shared_ptr<Module> cecd) | ||||
|     : Module::Interface(std::move(cecd), "cecd:s", DefaultMaxSessions) { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         // cecd:u shared commands
 | ||||
|         // clang-format off
 | ||||
|         {0x000100C2, nullptr, "OpenRawFile"}, | ||||
|         {0x00020042, nullptr, "ReadRawFile"}, | ||||
|         {0x00030104, nullptr, "ReadMessage"}, | ||||
|         {0x00040106, nullptr, "ReadMessageWithHMAC"}, | ||||
|         {0x00050042, nullptr, "WriteRawFile"}, | ||||
|         {0x00060104, nullptr, "WriteMessage"}, | ||||
|         {0x00070106, nullptr, "WriteMessageWithHMAC"}, | ||||
|         {0x00080102, nullptr, "Delete"}, | ||||
|         {0x000A00C4, nullptr, "GetSystemInfo"}, | ||||
|         {0x000B0040, nullptr, "RunCommand"}, | ||||
|         {0x000C0040, nullptr, "RunCommandAlt"}, | ||||
|         {0x000E0000, &CECD_S::GetCecStateAbbreviated, "GetCecStateAbbreviated"}, | ||||
|         {0x000F0000, &CECD_S::GetCecInfoEventHandle, "GetCecInfoEventHandle"}, | ||||
|         {0x00100000, &CECD_S::GetChangeStateEventHandle, "GetChangeStateEventHandle"}, | ||||
|         {0x00110104, nullptr, "OpenAndWrite"}, | ||||
|         {0x00120104, nullptr, "OpenAndRead"}, | ||||
|         // clang-format on
 | ||||
|     }; | ||||
| 
 | ||||
| CECD_S::CECD_S() { | ||||
|     Register(FunctionTable); | ||||
|     RegisterHandlers(functions); | ||||
| } | ||||
| 
 | ||||
| } // namespace CECD
 | ||||
|  |  | |||
|  | @ -4,18 +4,14 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "core/hle/service/service.h" | ||||
| #include "core/hle/service/cecd/cecd.h" | ||||
| 
 | ||||
| namespace Service { | ||||
| namespace CECD { | ||||
| 
 | ||||
| class CECD_S : public Interface { | ||||
| class CECD_S final : public Module::Interface { | ||||
| public: | ||||
|     CECD_S(); | ||||
| 
 | ||||
|     std::string GetPortName() const override { | ||||
|         return "cecd:s"; | ||||
|     } | ||||
|     explicit CECD_S(std::shared_ptr<Module> cecd); | ||||
| }; | ||||
| 
 | ||||
| } // namespace CECD
 | ||||
|  |  | |||
|  | @ -2,34 +2,36 @@ | |||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include "core/hle/service/cecd/cecd.h" | ||||
| #include "core/hle/service/cecd/cecd_u.h" | ||||
| 
 | ||||
| namespace Service { | ||||
| namespace CECD { | ||||
| 
 | ||||
| static const Interface::FunctionInfo FunctionTable[] = { | ||||
|     // cecd:u shared commands
 | ||||
|     {0x000100C2, nullptr, "OpenRawFile"}, | ||||
|     {0x00020042, nullptr, "ReadRawFile"}, | ||||
|     {0x00030104, nullptr, "ReadMessage"}, | ||||
|     {0x00040106, nullptr, "ReadMessageWithHMAC"}, | ||||
|     {0x00050042, nullptr, "WriteRawFile"}, | ||||
|     {0x00060104, nullptr, "WriteMessage"}, | ||||
|     {0x00070106, nullptr, "WriteMessageWithHMAC"}, | ||||
|     {0x00080102, nullptr, "Delete"}, | ||||
|     {0x000A00C4, nullptr, "GetSystemInfo"}, | ||||
|     {0x000B0040, nullptr, "RunCommand"}, | ||||
|     {0x000C0040, nullptr, "RunCommandAlt"}, | ||||
|     {0x000E0000, GetCecStateAbbreviated, "GetCecStateAbbreviated"}, | ||||
|     {0x000F0000, GetCecInfoEventHandle, "GetCecInfoEventHandle"}, | ||||
|     {0x00100000, GetChangeStateEventHandle, "GetChangeStateEventHandle"}, | ||||
|     {0x00110104, nullptr, "OpenAndWrite"}, | ||||
|     {0x00120104, nullptr, "OpenAndRead"}, | ||||
| }; | ||||
| CECD_U::CECD_U(std::shared_ptr<Module> cecd) | ||||
|     : Module::Interface(std::move(cecd), "cecd:u", DefaultMaxSessions) { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         // cecd:u shared commands
 | ||||
|         // clang-format off
 | ||||
|         {0x000100C2, nullptr, "OpenRawFile"}, | ||||
|         {0x00020042, nullptr, "ReadRawFile"}, | ||||
|         {0x00030104, nullptr, "ReadMessage"}, | ||||
|         {0x00040106, nullptr, "ReadMessageWithHMAC"}, | ||||
|         {0x00050042, nullptr, "WriteRawFile"}, | ||||
|         {0x00060104, nullptr, "WriteMessage"}, | ||||
|         {0x00070106, nullptr, "WriteMessageWithHMAC"}, | ||||
|         {0x00080102, nullptr, "Delete"}, | ||||
|         {0x000A00C4, nullptr, "GetSystemInfo"}, | ||||
|         {0x000B0040, nullptr, "RunCommand"}, | ||||
|         {0x000C0040, nullptr, "RunCommandAlt"}, | ||||
|         {0x000E0000, &CECD_U::GetCecStateAbbreviated, "GetCecStateAbbreviated"}, | ||||
|         {0x000F0000, &CECD_U::GetCecInfoEventHandle, "GetCecInfoEventHandle"}, | ||||
|         {0x00100000, &CECD_U::GetChangeStateEventHandle, "GetChangeStateEventHandle"}, | ||||
|         {0x00110104, nullptr, "OpenAndWrite"}, | ||||
|         {0x00120104, nullptr, "OpenAndRead"}, | ||||
|         // clang-format on
 | ||||
|     }; | ||||
| 
 | ||||
| CECD_U::CECD_U() { | ||||
|     Register(FunctionTable); | ||||
|     RegisterHandlers(functions); | ||||
| } | ||||
| 
 | ||||
| } // namespace CECD
 | ||||
|  |  | |||
|  | @ -4,18 +4,14 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "core/hle/service/service.h" | ||||
| #include "core/hle/service/cecd/cecd.h" | ||||
| 
 | ||||
| namespace Service { | ||||
| namespace CECD { | ||||
| 
 | ||||
| class CECD_U : public Interface { | ||||
| class CECD_U final : public Module::Interface { | ||||
| public: | ||||
|     CECD_U(); | ||||
| 
 | ||||
|     std::string GetPortName() const override { | ||||
|         return "cecd:u"; | ||||
|     } | ||||
|     explicit CECD_U(std::shared_ptr<Module> cecd); | ||||
| }; | ||||
| 
 | ||||
| } // namespace CECD
 | ||||
|  |  | |||
|  | @ -239,7 +239,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm) { | |||
|     APT::InstallInterfaces(*sm); | ||||
|     BOSS::Init(); | ||||
|     CAM::InstallInterfaces(*sm); | ||||
|     CECD::Init(); | ||||
|     CECD::InstallInterfaces(*sm); | ||||
|     CFG::InstallInterfaces(*sm); | ||||
|     DLP::InstallInterfaces(*sm); | ||||
|     FRD::InstallInterfaces(*sm); | ||||
|  | @ -268,7 +268,6 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm) { | |||
| 
 | ||||
| /// Shutdown ServiceManager
 | ||||
| void Shutdown() { | ||||
|     CECD::Shutdown(); | ||||
|     BOSS::Shutdown(); | ||||
|     FS::ArchiveShutdown(); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue