mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	hid: Implement IAppletResource::GetSharedMemoryHandle.
This commit is contained in:
		
							parent
							
								
									979483c7dd
								
							
						
					
					
						commit
						f4a3d28224
					
				| @ -1,19 +1,77 @@ | |||||||
| // Copyright 2015 Citra Emulator Project
 | // Copyright 2018 yuzu emulator team
 | ||||||
| // Licensed under GPLv2 or any later version
 | // Licensed under GPLv2 or any later version
 | ||||||
| // Refer to the license.txt file included.
 | // Refer to the license.txt file included.
 | ||||||
| 
 | 
 | ||||||
| #include "common/logging/log.h" | #include "common/logging/log.h" | ||||||
|  | #include "core/hle/ipc_helpers.h" | ||||||
|  | #include "core/hle/kernel/client_port.h" | ||||||
|  | #include "core/hle/kernel/client_session.h" | ||||||
|  | #include "core/hle/kernel/shared_memory.h" | ||||||
| #include "core/hle/service/hid/hid.h" | #include "core/hle/service/hid/hid.h" | ||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
| 
 | 
 | ||||||
| namespace Service { | namespace Service { | ||||||
| namespace HID { | namespace HID { | ||||||
| 
 | 
 | ||||||
| void Init() {} | class IAppletResource final : public ServiceFramework<IAppletResource> { | ||||||
|  | public: | ||||||
|  |     IAppletResource() : ServiceFramework("IAppletResource") { | ||||||
|  |         static const FunctionInfo functions[] = { | ||||||
|  |             {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"}, | ||||||
|  |         }; | ||||||
|  |         RegisterHandlers(functions); | ||||||
| 
 | 
 | ||||||
| void Shutdown() {} |         shared_mem = Kernel::SharedMemory::Create( | ||||||
|  |             nullptr, 0x40000, Kernel::MemoryPermission::ReadWrite, Kernel::MemoryPermission::Read, | ||||||
|  |             0, Kernel::MemoryRegion::BASE, "HID:SharedMemory"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) { | ||||||
|  |         IPC::RequestBuilder rb{ctx, 2, 1}; | ||||||
|  |         rb.Push(RESULT_SUCCESS); | ||||||
|  |         rb.PushCopyObjects(shared_mem); | ||||||
|  |         LOG_DEBUG(Service, "called"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Handle to shared memory region designated to HID service
 | ||||||
|  |     Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class Hid final : public ServiceFramework<Hid> { | ||||||
|  | public: | ||||||
|  |     Hid() : ServiceFramework("hid") { | ||||||
|  |         static const FunctionInfo functions[] = { | ||||||
|  |             {0x00000000, &Hid::CreateAppletResource, "CreateAppletResource"}, | ||||||
|  |         }; | ||||||
|  |         RegisterHandlers(functions); | ||||||
|  |     } | ||||||
|  |     ~Hid() = default; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     void CreateAppletResource(Kernel::HLERequestContext& ctx) { | ||||||
|  |         auto client_port = std::make_shared<IAppletResource>()->CreatePort(); | ||||||
|  |         auto session = client_port->Connect(); | ||||||
|  |         if (session.Succeeded()) { | ||||||
|  |             LOG_DEBUG(Service, "called, initialized IAppletResource -> session=%u", | ||||||
|  |                       (*session)->GetObjectId()); | ||||||
|  |             IPC::RequestBuilder rb{ctx, 2, 0, 1}; | ||||||
|  |             rb.Push(RESULT_SUCCESS); | ||||||
|  |             rb.PushMoveObjects(std::move(session).Unwrap()); | ||||||
|  |             registered_loggers.emplace_back(std::move(client_port)); | ||||||
|  |         } else { | ||||||
|  |             UNIMPLEMENTED(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     std::vector<Kernel::SharedPtr<Kernel::ClientPort>> registered_loggers; | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| void ReloadInputDevices() {} | void ReloadInputDevices() {} | ||||||
| 
 | 
 | ||||||
|  | void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||||
|  |     std::make_shared<Hid>()->InstallAsService(service_manager); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace HID
 | } // namespace HID
 | ||||||
| } // namespace Service
 | } // namespace Service
 | ||||||
|  | |||||||
| @ -1,20 +1,19 @@ | |||||||
| // Copyright 2015 Citra Emulator Project
 | // Copyright 2018 yuzu emulator team
 | ||||||
| // Licensed under GPLv2 or any later version
 | // Licensed under GPLv2 or any later version
 | ||||||
| // Refer to the license.txt file included.
 | // Refer to the license.txt file included.
 | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include "core/hle/service/service.h" | ||||||
|  | 
 | ||||||
| namespace Service { | namespace Service { | ||||||
| namespace HID { | namespace HID { | ||||||
| 
 | 
 | ||||||
| /// Initialize HID service
 |  | ||||||
| void Init(); |  | ||||||
| 
 |  | ||||||
| /// Shutdown HID service
 |  | ||||||
| void Shutdown(); |  | ||||||
| 
 |  | ||||||
| /// Reload input devices. Used when input configuration changed
 | /// Reload input devices. Used when input configuration changed
 | ||||||
| void ReloadInputDevices(); | void ReloadInputDevices(); | ||||||
| 
 | 
 | ||||||
|  | /// Registers all HID services with the specified service manager.
 | ||||||
|  | void InstallInterfaces(SM::ServiceManager& service_manager); | ||||||
|  | 
 | ||||||
| } // namespace HID
 | } // namespace HID
 | ||||||
| } // namespace Service
 | } // namespace Service
 | ||||||
|  | |||||||
| @ -164,20 +164,17 @@ void Init() { | |||||||
|     AM::InstallInterfaces(*SM::g_service_manager); |     AM::InstallInterfaces(*SM::g_service_manager); | ||||||
|     AOC::InstallInterfaces(*SM::g_service_manager); |     AOC::InstallInterfaces(*SM::g_service_manager); | ||||||
|     APM::InstallInterfaces(*SM::g_service_manager); |     APM::InstallInterfaces(*SM::g_service_manager); | ||||||
|  |     HID::InstallInterfaces(*SM::g_service_manager); | ||||||
|     LM::InstallInterfaces(*SM::g_service_manager); |     LM::InstallInterfaces(*SM::g_service_manager); | ||||||
|     NVDRV::InstallInterfaces(*SM::g_service_manager); |     NVDRV::InstallInterfaces(*SM::g_service_manager); | ||||||
|     PCTL::InstallInterfaces(*SM::g_service_manager); |     PCTL::InstallInterfaces(*SM::g_service_manager); | ||||||
|     VI::InstallInterfaces(*SM::g_service_manager); |     VI::InstallInterfaces(*SM::g_service_manager); | ||||||
| 
 | 
 | ||||||
|     HID::Init(); |  | ||||||
| 
 |  | ||||||
|     LOG_DEBUG(Service, "initialized OK"); |     LOG_DEBUG(Service, "initialized OK"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Shutdown ServiceManager
 | /// Shutdown ServiceManager
 | ||||||
| void Shutdown() { | void Shutdown() { | ||||||
|     HID::Shutdown(); |  | ||||||
| 
 |  | ||||||
|     SM::g_service_manager = nullptr; |     SM::g_service_manager = nullptr; | ||||||
|     g_kernel_named_ports.clear(); |     g_kernel_named_ports.clear(); | ||||||
|     LOG_DEBUG(Service, "shutdown OK"); |     LOG_DEBUG(Service, "shutdown OK"); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei