summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-01-14 21:24:50 -0500
committerGravatar bunnei2018-01-14 21:45:06 -0500
commitf4a3d282246406d44a391aafd8d494ff68669cfa (patch)
treeae3cc59843498e5e5d5f11a16311929b7a0c5979 /src
parentMerge pull request #10 from Andrix44/mpwarnings (diff)
downloadyuzu-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.cpp64
-rw-r--r--src/core/hle/service/hid/hid.h13
-rw-r--r--src/core/hle/service/service.cpp5
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
9namespace Service { 13namespace Service {
10namespace HID { 14namespace HID {
11 15
12void Init() {} 16class IAppletResource final : public ServiceFramework<IAppletResource> {
17public:
18 IAppletResource() : ServiceFramework("IAppletResource") {
19 static const FunctionInfo functions[] = {
20 {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"},
21 };
22 RegisterHandlers(functions);
13 23
14void 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
29private:
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
41class Hid final : public ServiceFramework<Hid> {
42public:
43 Hid() : ServiceFramework("hid") {
44 static const FunctionInfo functions[] = {
45 {0x00000000, &Hid::CreateAppletResource, "CreateAppletResource"},
46 };
47 RegisterHandlers(functions);
48 }
49 ~Hid() = default;
50
51private:
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
16void ReloadInputDevices() {} 70void ReloadInputDevices() {}
17 71
72void 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
7namespace Service { 9namespace Service {
8namespace HID { 10namespace HID {
9 11
10/// Initialize HID service
11void Init();
12
13/// Shutdown HID service
14void Shutdown();
15
16/// Reload input devices. Used when input configuration changed 12/// Reload input devices. Used when input configuration changed
17void ReloadInputDevices(); 13void ReloadInputDevices();
18 14
15/// Registers all HID services with the specified service manager.
16void 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
178void Shutdown() { 177void 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");