From f4a3d282246406d44a391aafd8d494ff68669cfa Mon Sep 17 00:00:00 2001 From: bunnei Date: Sun, 14 Jan 2018 21:24:50 -0500 Subject: [PATCH] hid: Implement IAppletResource::GetSharedMemoryHandle. --- src/core/hle/service/hid/hid.cpp | 64 ++++++++++++++++++++++++++++++-- src/core/hle/service/hid/hid.h | 13 +++---- src/core/hle/service/service.cpp | 5 +-- 3 files changed, 68 insertions(+), 14 deletions(-) diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index f838713a31..db77a445ae 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -1,19 +1,77 @@ -// Copyright 2015 Citra Emulator Project +// Copyright 2018 yuzu emulator team // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #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/service.h" namespace Service { namespace HID { -void Init() {} +class IAppletResource final : public ServiceFramework { +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 shared_mem; +}; + +class Hid final : public ServiceFramework { +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()->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> registered_loggers; +}; void ReloadInputDevices() {} +void InstallInterfaces(SM::ServiceManager& service_manager) { + std::make_shared()->InstallAsService(service_manager); +} + } // namespace HID } // namespace Service diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index a1d227dfef..f7621f62d1 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h @@ -1,20 +1,19 @@ -// Copyright 2015 Citra Emulator Project +// Copyright 2018 yuzu emulator team // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once +#include "core/hle/service/service.h" + namespace Service { namespace HID { -/// Initialize HID service -void Init(); - -/// Shutdown HID service -void Shutdown(); - /// Reload input devices. Used when input configuration changed void ReloadInputDevices(); +/// Registers all HID services with the specified service manager. +void InstallInterfaces(SM::ServiceManager& service_manager); + } // namespace HID } // namespace Service diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index b82df6f351..0ecc0eb16b 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -164,20 +164,17 @@ void Init() { AM::InstallInterfaces(*SM::g_service_manager); AOC::InstallInterfaces(*SM::g_service_manager); APM::InstallInterfaces(*SM::g_service_manager); + HID::InstallInterfaces(*SM::g_service_manager); LM::InstallInterfaces(*SM::g_service_manager); NVDRV::InstallInterfaces(*SM::g_service_manager); PCTL::InstallInterfaces(*SM::g_service_manager); VI::InstallInterfaces(*SM::g_service_manager); - HID::Init(); - LOG_DEBUG(Service, "initialized OK"); } /// Shutdown ServiceManager void Shutdown() { - HID::Shutdown(); - SM::g_service_manager = nullptr; g_kernel_named_ports.clear(); LOG_DEBUG(Service, "shutdown OK");