Merge pull request #3906 from NarcolepticK/cecd-migrate-framework
service/cecd: Migrate to ServiceFramework
This commit is contained in:
		| @@ -3,64 +3,61 @@ | ||||
| // 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.PushEnum(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,13 +4,13 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Service { | ||||
|  | ||||
| class Interface; | ||||
|  | ||||
| namespace CECD { | ||||
|  | ||||
| enum class CecStateAbbreviated { | ||||
| enum class CecStateAbbreviated : u32 { | ||||
|     CEC_STATE_ABBREV_IDLE = 1,      ///< Corresponds to CEC_STATE_IDLE | ||||
|     CEC_STATE_ABBREV_NOT_LOCAL = 2, ///< Corresponds to CEC_STATEs *FINISH*, *POST, and OVER_BOSS | ||||
|     CEC_STATE_ABBREV_SCANNING = 3,  ///< Corresponds to CEC_STATE_SCANNING | ||||
| @@ -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(); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Weiyi Wang
					Weiyi Wang