diff options
| author | 2018-01-14 21:24:50 -0500 | |
|---|---|---|
| committer | 2018-01-14 21:45:06 -0500 | |
| commit | f4a3d282246406d44a391aafd8d494ff68669cfa (patch) | |
| tree | ae3cc59843498e5e5d5f11a16311929b7a0c5979 /src | |
| parent | Merge pull request #10 from Andrix44/mpwarnings (diff) | |
| download | yuzu-f4a3d282246406d44a391aafd8d494ff68669cfa.tar.gz yuzu-f4a3d282246406d44a391aafd8d494ff68669cfa.tar.xz yuzu-f4a3d282246406d44a391aafd8d494ff68669cfa.zip | |
hid: Implement IAppletResource::GetSharedMemoryHandle.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 64 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 13 | ||||
| -rw-r--r-- | 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 f838713a3..db77a445a 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -1,19 +1,77 @@ | |||
| 1 | // Copyright 2015 Citra Emulator Project | 1 | // Copyright 2018 yuzu emulator team |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "common/logging/log.h" | 5 | #include "common/logging/log.h" |
| 6 | #include "core/hle/ipc_helpers.h" | ||
| 7 | #include "core/hle/kernel/client_port.h" | ||
| 8 | #include "core/hle/kernel/client_session.h" | ||
| 9 | #include "core/hle/kernel/shared_memory.h" | ||
| 6 | #include "core/hle/service/hid/hid.h" | 10 | #include "core/hle/service/hid/hid.h" |
| 7 | #include "core/hle/service/service.h" | 11 | #include "core/hle/service/service.h" |
| 8 | 12 | ||
| 9 | namespace Service { | 13 | namespace Service { |
| 10 | namespace HID { | 14 | namespace HID { |
| 11 | 15 | ||
| 12 | void Init() {} | 16 | class IAppletResource final : public ServiceFramework<IAppletResource> { |
| 17 | public: | ||
| 18 | IAppletResource() : ServiceFramework("IAppletResource") { | ||
| 19 | static const FunctionInfo functions[] = { | ||
| 20 | {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"}, | ||
| 21 | }; | ||
| 22 | RegisterHandlers(functions); | ||
| 13 | 23 | ||
| 14 | void Shutdown() {} | 24 | shared_mem = Kernel::SharedMemory::Create( |
| 25 | nullptr, 0x40000, Kernel::MemoryPermission::ReadWrite, Kernel::MemoryPermission::Read, | ||
| 26 | 0, Kernel::MemoryRegion::BASE, "HID:SharedMemory"); | ||
| 27 | } | ||
| 28 | |||
| 29 | private: | ||
| 30 | void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) { | ||
| 31 | IPC::RequestBuilder rb{ctx, 2, 1}; | ||
| 32 | rb.Push(RESULT_SUCCESS); | ||
| 33 | rb.PushCopyObjects(shared_mem); | ||
| 34 | LOG_DEBUG(Service, "called"); | ||
| 35 | } | ||
| 36 | |||
| 37 | // Handle to shared memory region designated to HID service | ||
| 38 | Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; | ||
| 39 | }; | ||
| 40 | |||
| 41 | class Hid final : public ServiceFramework<Hid> { | ||
| 42 | public: | ||
| 43 | Hid() : ServiceFramework("hid") { | ||
| 44 | static const FunctionInfo functions[] = { | ||
| 45 | {0x00000000, &Hid::CreateAppletResource, "CreateAppletResource"}, | ||
| 46 | }; | ||
| 47 | RegisterHandlers(functions); | ||
| 48 | } | ||
| 49 | ~Hid() = default; | ||
| 50 | |||
| 51 | private: | ||
| 52 | void CreateAppletResource(Kernel::HLERequestContext& ctx) { | ||
| 53 | auto client_port = std::make_shared<IAppletResource>()->CreatePort(); | ||
| 54 | auto session = client_port->Connect(); | ||
| 55 | if (session.Succeeded()) { | ||
| 56 | LOG_DEBUG(Service, "called, initialized IAppletResource -> session=%u", | ||
| 57 | (*session)->GetObjectId()); | ||
| 58 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; | ||
| 59 | rb.Push(RESULT_SUCCESS); | ||
| 60 | rb.PushMoveObjects(std::move(session).Unwrap()); | ||
| 61 | registered_loggers.emplace_back(std::move(client_port)); | ||
| 62 | } else { | ||
| 63 | UNIMPLEMENTED(); | ||
| 64 | } | ||
| 65 | } | ||
| 66 | |||
| 67 | std::vector<Kernel::SharedPtr<Kernel::ClientPort>> registered_loggers; | ||
| 68 | }; | ||
| 15 | 69 | ||
| 16 | void ReloadInputDevices() {} | 70 | void ReloadInputDevices() {} |
| 17 | 71 | ||
| 72 | void InstallInterfaces(SM::ServiceManager& service_manager) { | ||
| 73 | std::make_shared<Hid>()->InstallAsService(service_manager); | ||
| 74 | } | ||
| 75 | |||
| 18 | } // namespace HID | 76 | } // namespace HID |
| 19 | } // namespace Service | 77 | } // namespace Service |
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index a1d227dfe..f7621f62d 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h | |||
| @@ -1,20 +1,19 @@ | |||
| 1 | // Copyright 2015 Citra Emulator Project | 1 | // Copyright 2018 yuzu emulator team |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include "core/hle/service/service.h" | ||
| 8 | |||
| 7 | namespace Service { | 9 | namespace Service { |
| 8 | namespace HID { | 10 | namespace HID { |
| 9 | 11 | ||
| 10 | /// Initialize HID service | ||
| 11 | void Init(); | ||
| 12 | |||
| 13 | /// Shutdown HID service | ||
| 14 | void Shutdown(); | ||
| 15 | |||
| 16 | /// Reload input devices. Used when input configuration changed | 12 | /// Reload input devices. Used when input configuration changed |
| 17 | void ReloadInputDevices(); | 13 | void ReloadInputDevices(); |
| 18 | 14 | ||
| 15 | /// Registers all HID services with the specified service manager. | ||
| 16 | void InstallInterfaces(SM::ServiceManager& service_manager); | ||
| 17 | |||
| 19 | } // namespace HID | 18 | } // namespace HID |
| 20 | } // namespace Service | 19 | } // namespace Service |
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index b82df6f35..0ecc0eb16 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -164,20 +164,17 @@ void Init() { | |||
| 164 | AM::InstallInterfaces(*SM::g_service_manager); | 164 | AM::InstallInterfaces(*SM::g_service_manager); |
| 165 | AOC::InstallInterfaces(*SM::g_service_manager); | 165 | AOC::InstallInterfaces(*SM::g_service_manager); |
| 166 | APM::InstallInterfaces(*SM::g_service_manager); | 166 | APM::InstallInterfaces(*SM::g_service_manager); |
| 167 | HID::InstallInterfaces(*SM::g_service_manager); | ||
| 167 | LM::InstallInterfaces(*SM::g_service_manager); | 168 | LM::InstallInterfaces(*SM::g_service_manager); |
| 168 | NVDRV::InstallInterfaces(*SM::g_service_manager); | 169 | NVDRV::InstallInterfaces(*SM::g_service_manager); |
| 169 | PCTL::InstallInterfaces(*SM::g_service_manager); | 170 | PCTL::InstallInterfaces(*SM::g_service_manager); |
| 170 | VI::InstallInterfaces(*SM::g_service_manager); | 171 | VI::InstallInterfaces(*SM::g_service_manager); |
| 171 | 172 | ||
| 172 | HID::Init(); | ||
| 173 | |||
| 174 | LOG_DEBUG(Service, "initialized OK"); | 173 | LOG_DEBUG(Service, "initialized OK"); |
| 175 | } | 174 | } |
| 176 | 175 | ||
| 177 | /// Shutdown ServiceManager | 176 | /// Shutdown ServiceManager |
| 178 | void Shutdown() { | 177 | void Shutdown() { |
| 179 | HID::Shutdown(); | ||
| 180 | |||
| 181 | SM::g_service_manager = nullptr; | 178 | SM::g_service_manager = nullptr; |
| 182 | g_kernel_named_ports.clear(); | 179 | g_kernel_named_ports.clear(); |
| 183 | LOG_DEBUG(Service, "shutdown OK"); | 180 | LOG_DEBUG(Service, "shutdown OK"); |