vi: rewrite IApplicationRootService, IManagerRootService, ISystemRootService
This commit is contained in:
		| @@ -969,6 +969,8 @@ add_library(core STATIC | ||||
|     hle/service/vi/manager_display_service.h | ||||
|     hle/service/vi/manager_root_service.cpp | ||||
|     hle/service/vi/manager_root_service.h | ||||
|     hle/service/vi/service_creator.cpp | ||||
|     hle/service/vi/service_creator.h | ||||
|     hle/service/vi/system_display_service.cpp | ||||
|     hle/service/vi/system_display_service.h | ||||
|     hle/service/vi/system_root_service.cpp | ||||
|   | ||||
| @@ -1,19 +1,22 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| #include "core/hle/service/cmif_serialization.h" | ||||
| #include "core/hle/service/vi/application_display_service.h" | ||||
| #include "core/hle/service/vi/application_root_service.h" | ||||
| #include "core/hle/service/vi/service_creator.h" | ||||
| #include "core/hle/service/vi/vi.h" | ||||
| #include "core/hle/service/vi/vi_types.h" | ||||
|  | ||||
| namespace Service::VI { | ||||
|  | ||||
| IApplicationRootService::IApplicationRootService( | ||||
|     Core::System& system_, Nvnflinger::Nvnflinger& nv_flinger_, | ||||
|     Nvnflinger::HosBinderDriverServer& hos_binder_driver_server_) | ||||
|     : ServiceFramework{system_, "vi:u"}, nv_flinger{nv_flinger_}, | ||||
|       hos_binder_driver_server{hos_binder_driver_server_} { | ||||
|     Core::System& system_, Nvnflinger::Nvnflinger& nvnflinger, | ||||
|     Nvnflinger::HosBinderDriverServer& hos_binder_driver_server) | ||||
|     : ServiceFramework{system_, "vi:u"}, m_nvnflinger{nvnflinger}, m_hos_binder_driver_server{ | ||||
|                                                                        hos_binder_driver_server} { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, &IApplicationRootService::GetDisplayService, "GetDisplayService"}, | ||||
|         {0, C<&IApplicationRootService::GetDisplayService>, "GetDisplayService"}, | ||||
|         {1, nullptr, "GetDisplayServiceWithProxyNameExchange"}, | ||||
|     }; | ||||
|     RegisterHandlers(functions); | ||||
| @@ -21,11 +24,11 @@ IApplicationRootService::IApplicationRootService( | ||||
|  | ||||
| IApplicationRootService::~IApplicationRootService() = default; | ||||
|  | ||||
| void IApplicationRootService::GetDisplayService(HLERequestContext& ctx) { | ||||
| Result IApplicationRootService::GetDisplayService( | ||||
|     Out<SharedPointer<IApplicationDisplayService>> out_application_display_service, Policy policy) { | ||||
|     LOG_DEBUG(Service_VI, "called"); | ||||
|  | ||||
|     detail::GetDisplayServiceImpl(ctx, system, nv_flinger, hos_binder_driver_server, | ||||
|                                   Permission::User); | ||||
|     R_RETURN(GetApplicationDisplayService(out_application_display_service, system, m_nvnflinger, | ||||
|                                           m_hos_binder_driver_server, Permission::User, policy)); | ||||
| } | ||||
|  | ||||
| } // namespace Service::VI | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/service/cmif_types.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Core { | ||||
| @@ -16,17 +17,23 @@ class Nvnflinger; | ||||
|  | ||||
| namespace Service::VI { | ||||
|  | ||||
| class IApplicationDisplayService; | ||||
| enum class Policy : u32; | ||||
|  | ||||
| class IApplicationRootService final : public ServiceFramework<IApplicationRootService> { | ||||
| public: | ||||
|     explicit IApplicationRootService(Core::System& system_, Nvnflinger::Nvnflinger& nv_flinger_, | ||||
|                                      Nvnflinger::HosBinderDriverServer& hos_binder_driver_server_); | ||||
|     explicit IApplicationRootService(Core::System& system_, Nvnflinger::Nvnflinger& nvnflinger, | ||||
|                                      Nvnflinger::HosBinderDriverServer& hos_binder_driver_server); | ||||
|     ~IApplicationRootService() override; | ||||
|  | ||||
| private: | ||||
|     void GetDisplayService(HLERequestContext& ctx); | ||||
|     Result GetDisplayService( | ||||
|         Out<SharedPointer<IApplicationDisplayService>> out_application_display_service, | ||||
|         Policy policy); | ||||
|  | ||||
|     Nvnflinger::Nvnflinger& nv_flinger; | ||||
|     Nvnflinger::HosBinderDriverServer& hos_binder_driver_server; | ||||
| private: | ||||
|     Nvnflinger::Nvnflinger& m_nvnflinger; | ||||
|     Nvnflinger::HosBinderDriverServer& m_hos_binder_driver_server; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::VI | ||||
|   | ||||
| @@ -1,19 +1,22 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| #include "core/hle/service/cmif_serialization.h" | ||||
| #include "core/hle/service/vi/application_display_service.h" | ||||
| #include "core/hle/service/vi/manager_root_service.h" | ||||
| #include "core/hle/service/vi/service_creator.h" | ||||
| #include "core/hle/service/vi/vi.h" | ||||
| #include "core/hle/service/vi/vi_types.h" | ||||
|  | ||||
| namespace Service::VI { | ||||
|  | ||||
| IManagerRootService::IManagerRootService( | ||||
|     Core::System& system_, Nvnflinger::Nvnflinger& nv_flinger_, | ||||
|     Nvnflinger::HosBinderDriverServer& hos_binder_driver_server_) | ||||
|     : ServiceFramework{system_, "vi:m"}, nv_flinger{nv_flinger_}, | ||||
|       hos_binder_driver_server{hos_binder_driver_server_} { | ||||
|     Core::System& system_, Nvnflinger::Nvnflinger& nvnflinger, | ||||
|     Nvnflinger::HosBinderDriverServer& hos_binder_driver_server) | ||||
|     : ServiceFramework{system_, "vi:m"}, m_nvnflinger{nvnflinger}, m_hos_binder_driver_server{ | ||||
|                                                                        hos_binder_driver_server} { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {2, &IManagerRootService::GetDisplayService, "GetDisplayService"}, | ||||
|         {2, C<&IManagerRootService::GetDisplayService>, "GetDisplayService"}, | ||||
|         {3, nullptr, "GetDisplayServiceWithProxyNameExchange"}, | ||||
|         {100, nullptr, "PrepareFatal"}, | ||||
|         {101, nullptr, "ShowFatal"}, | ||||
| @@ -25,11 +28,11 @@ IManagerRootService::IManagerRootService( | ||||
|  | ||||
| IManagerRootService::~IManagerRootService() = default; | ||||
|  | ||||
| void IManagerRootService::GetDisplayService(HLERequestContext& ctx) { | ||||
| Result IManagerRootService::GetDisplayService( | ||||
|     Out<SharedPointer<IApplicationDisplayService>> out_application_display_service, Policy policy) { | ||||
|     LOG_DEBUG(Service_VI, "called"); | ||||
|  | ||||
|     detail::GetDisplayServiceImpl(ctx, system, nv_flinger, hos_binder_driver_server, | ||||
|                                   Permission::Manager); | ||||
|     R_RETURN(GetApplicationDisplayService(out_application_display_service, system, m_nvnflinger, | ||||
|                                           m_hos_binder_driver_server, Permission::Manager, policy)); | ||||
| } | ||||
|  | ||||
| } // namespace Service::VI | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/service/cmif_types.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Core { | ||||
| @@ -16,17 +17,22 @@ class Nvnflinger; | ||||
|  | ||||
| namespace Service::VI { | ||||
|  | ||||
| class IApplicationDisplayService; | ||||
| enum class Policy : u32; | ||||
|  | ||||
| class IManagerRootService final : public ServiceFramework<IManagerRootService> { | ||||
| public: | ||||
|     explicit IManagerRootService(Core::System& system_, Nvnflinger::Nvnflinger& nv_flinger_, | ||||
|                                  Nvnflinger::HosBinderDriverServer& hos_binder_driver_server_); | ||||
|     explicit IManagerRootService(Core::System& system_, Nvnflinger::Nvnflinger& nvnflinger, | ||||
|                                  Nvnflinger::HosBinderDriverServer& hos_binder_driver_server); | ||||
|     ~IManagerRootService() override; | ||||
|  | ||||
| private: | ||||
|     void GetDisplayService(HLERequestContext& ctx); | ||||
|     Result GetDisplayService( | ||||
|         Out<SharedPointer<IApplicationDisplayService>> out_application_display_service, | ||||
|         Policy policy); | ||||
|  | ||||
|     Nvnflinger::Nvnflinger& nv_flinger; | ||||
|     Nvnflinger::HosBinderDriverServer& hos_binder_driver_server; | ||||
|     Nvnflinger::Nvnflinger& m_nvnflinger; | ||||
|     Nvnflinger::HosBinderDriverServer& m_hos_binder_driver_server; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::VI | ||||
|   | ||||
							
								
								
									
										39
									
								
								src/core/hle/service/vi/service_creator.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								src/core/hle/service/vi/service_creator.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| #include "core/hle/service/vi/application_display_service.h" | ||||
| #include "core/hle/service/vi/service_creator.h" | ||||
| #include "core/hle/service/vi/vi_results.h" | ||||
| #include "core/hle/service/vi/vi_types.h" | ||||
|  | ||||
| namespace Service::VI { | ||||
|  | ||||
| static bool IsValidServiceAccess(Permission permission, Policy policy) { | ||||
|     if (permission == Permission::User) { | ||||
|         return policy == Policy::User; | ||||
|     } | ||||
|  | ||||
|     if (permission == Permission::System || permission == Permission::Manager) { | ||||
|         return policy == Policy::User || policy == Policy::Compositor; | ||||
|     } | ||||
|  | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| Result GetApplicationDisplayService( | ||||
|     std::shared_ptr<IApplicationDisplayService>* out_application_display_service, | ||||
|     Core::System& system, Nvnflinger::Nvnflinger& nvnflinger, | ||||
|     Nvnflinger::HosBinderDriverServer& hos_binder_driver_server, Permission permission, | ||||
|     Policy policy) { | ||||
|  | ||||
|     if (!IsValidServiceAccess(permission, policy)) { | ||||
|         LOG_ERROR(Service_VI, "Permission denied for policy {}", policy); | ||||
|         R_THROW(ResultPermissionDenied); | ||||
|     } | ||||
|  | ||||
|     *out_application_display_service = | ||||
|         std::make_shared<IApplicationDisplayService>(system, nvnflinger, hos_binder_driver_server); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| } // namespace Service::VI | ||||
							
								
								
									
										33
									
								
								src/core/hle/service/vi/service_creator.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/core/hle/service/vi/service_creator.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <memory> | ||||
|  | ||||
| #include "common/common_types.h" | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::Nvnflinger { | ||||
| class HosBinderDriverServer; | ||||
| class Nvnflinger; | ||||
| } // namespace Service::Nvnflinger | ||||
|  | ||||
| union Result; | ||||
|  | ||||
| namespace Service::VI { | ||||
|  | ||||
| class IApplicationDisplayService; | ||||
| enum class Permission; | ||||
| enum class Policy : u32; | ||||
|  | ||||
| Result GetApplicationDisplayService( | ||||
|     std::shared_ptr<IApplicationDisplayService>* out_application_display_service, | ||||
|     Core::System& system, Nvnflinger::Nvnflinger& nvnflinger, | ||||
|     Nvnflinger::HosBinderDriverServer& hos_binder_driver_server, Permission permission, | ||||
|     Policy policy); | ||||
|  | ||||
| } // namespace Service::VI | ||||
| @@ -1,18 +1,21 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| #include "core/hle/service/cmif_serialization.h" | ||||
| #include "core/hle/service/vi/application_display_service.h" | ||||
| #include "core/hle/service/vi/service_creator.h" | ||||
| #include "core/hle/service/vi/system_root_service.h" | ||||
| #include "core/hle/service/vi/vi.h" | ||||
| #include "core/hle/service/vi/vi_types.h" | ||||
|  | ||||
| namespace Service::VI { | ||||
|  | ||||
| ISystemRootService::ISystemRootService(Core::System& system_, Nvnflinger::Nvnflinger& nv_flinger_, | ||||
|                                        Nvnflinger::HosBinderDriverServer& hos_binder_driver_server_) | ||||
|     : ServiceFramework{system_, "vi:s"}, nv_flinger{nv_flinger_}, | ||||
|       hos_binder_driver_server{hos_binder_driver_server_} { | ||||
| ISystemRootService::ISystemRootService(Core::System& system_, Nvnflinger::Nvnflinger& nvnflinger, | ||||
|                                        Nvnflinger::HosBinderDriverServer& hos_binder_driver_server) | ||||
|     : ServiceFramework{system_, "vi:s"}, m_nvnflinger{nvnflinger}, m_hos_binder_driver_server{ | ||||
|                                                                        hos_binder_driver_server} { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {1, &ISystemRootService::GetDisplayService, "GetDisplayService"}, | ||||
|         {1, C<&ISystemRootService::GetDisplayService>, "GetDisplayService"}, | ||||
|         {3, nullptr, "GetDisplayServiceWithProxyNameExchange"}, | ||||
|     }; | ||||
|     RegisterHandlers(functions); | ||||
| @@ -20,11 +23,11 @@ ISystemRootService::ISystemRootService(Core::System& system_, Nvnflinger::Nvnfli | ||||
|  | ||||
| ISystemRootService::~ISystemRootService() = default; | ||||
|  | ||||
| void ISystemRootService::GetDisplayService(HLERequestContext& ctx) { | ||||
| Result ISystemRootService::GetDisplayService( | ||||
|     Out<SharedPointer<IApplicationDisplayService>> out_application_display_service, Policy policy) { | ||||
|     LOG_DEBUG(Service_VI, "called"); | ||||
|  | ||||
|     detail::GetDisplayServiceImpl(ctx, system, nv_flinger, hos_binder_driver_server, | ||||
|                                   Permission::System); | ||||
|     R_RETURN(GetApplicationDisplayService(out_application_display_service, system, m_nvnflinger, | ||||
|                                           m_hos_binder_driver_server, Permission::System, policy)); | ||||
| } | ||||
|  | ||||
| } // namespace Service::VI | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/service/cmif_types.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Core { | ||||
| @@ -16,17 +17,22 @@ class Nvnflinger; | ||||
|  | ||||
| namespace Service::VI { | ||||
|  | ||||
| class IApplicationDisplayService; | ||||
| enum class Policy : u32; | ||||
|  | ||||
| class ISystemRootService final : public ServiceFramework<ISystemRootService> { | ||||
| public: | ||||
|     explicit ISystemRootService(Core::System& system_, Nvnflinger::Nvnflinger& nv_flinger_, | ||||
|                                 Nvnflinger::HosBinderDriverServer& hos_binder_driver_server_); | ||||
|     explicit ISystemRootService(Core::System& system_, Nvnflinger::Nvnflinger& nvnflinger, | ||||
|                                 Nvnflinger::HosBinderDriverServer& hos_binder_driver_server); | ||||
|     ~ISystemRootService() override; | ||||
|  | ||||
| private: | ||||
|     void GetDisplayService(HLERequestContext& ctx); | ||||
|     Result GetDisplayService( | ||||
|         Out<SharedPointer<IApplicationDisplayService>> out_application_display_service, | ||||
|         Policy policy); | ||||
|  | ||||
|     Nvnflinger::Nvnflinger& nv_flinger; | ||||
|     Nvnflinger::HosBinderDriverServer& hos_binder_driver_server; | ||||
|     Nvnflinger::Nvnflinger& m_nvnflinger; | ||||
|     Nvnflinger::HosBinderDriverServer& m_hos_binder_driver_server; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::VI | ||||
|   | ||||
| @@ -1,49 +1,15 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| #include "core/hle/service/ipc_helpers.h" | ||||
| #include "core/hle/service/server_manager.h" | ||||
| #include "core/hle/service/vi/application_display_service.h" | ||||
| #include "core/hle/service/vi/application_root_service.h" | ||||
| #include "core/hle/service/vi/manager_root_service.h" | ||||
| #include "core/hle/service/vi/system_root_service.h" | ||||
| #include "core/hle/service/vi/vi.h" | ||||
| #include "core/hle/service/vi/vi_results.h" | ||||
| #include "core/hle/service/vi/vi_types.h" | ||||
|  | ||||
| namespace Service::VI { | ||||
|  | ||||
| static bool IsValidServiceAccess(Permission permission, Policy policy) { | ||||
|     if (permission == Permission::User) { | ||||
|         return policy == Policy::User; | ||||
|     } | ||||
|  | ||||
|     if (permission == Permission::System || permission == Permission::Manager) { | ||||
|         return policy == Policy::User || policy == Policy::Compositor; | ||||
|     } | ||||
|  | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void detail::GetDisplayServiceImpl(HLERequestContext& ctx, Core::System& system, | ||||
|                                    Nvnflinger::Nvnflinger& nvnflinger, | ||||
|                                    Nvnflinger::HosBinderDriverServer& hos_binder_driver_server, | ||||
|                                    Permission permission) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto policy = rp.PopEnum<Policy>(); | ||||
|  | ||||
|     if (!IsValidServiceAccess(permission, policy)) { | ||||
|         LOG_ERROR(Service_VI, "Permission denied for policy {}", policy); | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(ResultPermissionDenied); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|     rb.Push(ResultSuccess); | ||||
|     rb.PushIpcInterface<IApplicationDisplayService>(system, nvnflinger, hos_binder_driver_server); | ||||
| } | ||||
|  | ||||
| void LoopProcess(Core::System& system, Nvnflinger::Nvnflinger& nvnflinger, | ||||
|                  Nvnflinger::HosBinderDriverServer& hos_binder_driver_server) { | ||||
|     auto server_manager = std::make_unique<ServerManager>(system); | ||||
|   | ||||
| @@ -7,10 +7,6 @@ namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service { | ||||
| class HLERequestContext; | ||||
| } | ||||
|  | ||||
| namespace Service::Nvnflinger { | ||||
| class HosBinderDriverServer; | ||||
| class Nvnflinger; | ||||
| @@ -18,15 +14,6 @@ class Nvnflinger; | ||||
|  | ||||
| namespace Service::VI { | ||||
|  | ||||
| enum class Permission; | ||||
|  | ||||
| namespace detail { | ||||
| void GetDisplayServiceImpl(HLERequestContext& ctx, Core::System& system, | ||||
|                            Nvnflinger::Nvnflinger& nv_flinger, | ||||
|                            Nvnflinger::HosBinderDriverServer& hos_binder_driver_server, | ||||
|                            Permission permission); | ||||
| } // namespace detail | ||||
|  | ||||
| void LoopProcess(Core::System& system, Nvnflinger::Nvnflinger& nvnflinger, | ||||
|                  Nvnflinger::HosBinderDriverServer& hos_binder_driver_server); | ||||
|  | ||||
|   | ||||
| @@ -23,7 +23,7 @@ enum class Permission { | ||||
|  | ||||
| /// A policy type that may be requested via GetDisplayService and | ||||
| /// GetDisplayServiceWithProxyNameExchange | ||||
| enum class Policy { | ||||
| enum class Policy : u32 { | ||||
|     User, | ||||
|     Compositor, | ||||
| }; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Liam
					Liam