summaryrefslogtreecommitdiff
path: root/src/core/hle/service
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2015-01-11 03:43:29 -0200
committerGravatar Yuri Kunde Schlesner2015-01-30 11:47:04 -0200
commit4bb33dfc30768c536d3f0ffb980464b1ab2d25d9 (patch)
tree09f772e5283ef1302f1b29d30f3f0150dd690bf0 /src/core/hle/service
parentCommon: Fix SCOPE_EXIT to actually create unique identifiers. (diff)
downloadyuzu-4bb33dfc30768c536d3f0ffb980464b1ab2d25d9.tar.gz
yuzu-4bb33dfc30768c536d3f0ffb980464b1ab2d25d9.tar.xz
yuzu-4bb33dfc30768c536d3f0ffb980464b1ab2d25d9.zip
Kernel: Convert SharedMemory to not use Handles
Diffstat (limited to 'src/core/hle/service')
-rw-r--r--src/core/hle/service/apt_u.cpp8
-rw-r--r--src/core/hle/service/gsp_gpu.cpp16
-rw-r--r--src/core/hle/service/hid/hid.cpp6
-rw-r--r--src/core/hle/service/hid/hid.h6
-rw-r--r--src/core/hle/service/hid/hid_user.cpp4
5 files changed, 24 insertions, 16 deletions
diff --git a/src/core/hle/service/apt_u.cpp b/src/core/hle/service/apt_u.cpp
index 001b0d183..1f6b148e8 100644
--- a/src/core/hle/service/apt_u.cpp
+++ b/src/core/hle/service/apt_u.cpp
@@ -26,7 +26,7 @@ namespace APT_U {
26static const VAddr SHARED_FONT_VADDR = 0x18000000; 26static const VAddr SHARED_FONT_VADDR = 0x18000000;
27 27
28/// Handle to shared memory region designated to for shared system font 28/// Handle to shared memory region designated to for shared system font
29static Handle shared_font_mem = 0; 29static Kernel::SharedPtr<Kernel::SharedMemory> shared_font_mem;
30 30
31static Handle lock_handle = 0; 31static Handle lock_handle = 0;
32static Handle notification_event_handle = 0; ///< APT notification event handle 32static Handle notification_event_handle = 0; ///< APT notification event handle
@@ -354,7 +354,7 @@ void GetSharedFont(Service::Interface* self) {
354 cmd_buff[0] = 0x00440082; 354 cmd_buff[0] = 0x00440082;
355 cmd_buff[1] = RESULT_SUCCESS.raw; // No error 355 cmd_buff[1] = RESULT_SUCCESS.raw; // No error
356 cmd_buff[2] = SHARED_FONT_VADDR; 356 cmd_buff[2] = SHARED_FONT_VADDR;
357 cmd_buff[4] = shared_font_mem; 357 cmd_buff[4] = Kernel::g_handle_table.Create(shared_font_mem).MoveFrom();
358 } else { 358 } else {
359 cmd_buff[1] = -1; // Generic error (not really possible to verify this on hardware) 359 cmd_buff[1] = -1; // Generic error (not really possible to verify this on hardware)
360 LOG_ERROR(Kernel_SVC, "called, but %s has not been loaded!", SHARED_FONT); 360 LOG_ERROR(Kernel_SVC, "called, but %s has not been loaded!", SHARED_FONT);
@@ -514,10 +514,10 @@ Interface::Interface() {
514 file.ReadBytes(shared_font.data(), (size_t)file.GetSize()); 514 file.ReadBytes(shared_font.data(), (size_t)file.GetSize());
515 515
516 // Create shared font memory object 516 // Create shared font memory object
517 shared_font_mem = Kernel::CreateSharedMemory("APT_U:shared_font_mem"); 517 shared_font_mem = Kernel::SharedMemory::Create("APT_U:shared_font_mem").MoveFrom();
518 } else { 518 } else {
519 LOG_WARNING(Service_APT, "Unable to load shared font: %s", filepath.c_str()); 519 LOG_WARNING(Service_APT, "Unable to load shared font: %s", filepath.c_str());
520 shared_font_mem = 0; 520 shared_font_mem = nullptr;
521 } 521 }
522 522
523 lock_handle = 0; 523 lock_handle = 0;
diff --git a/src/core/hle/service/gsp_gpu.cpp b/src/core/hle/service/gsp_gpu.cpp
index 4ca2b9bd0..1be2438c8 100644
--- a/src/core/hle/service/gsp_gpu.cpp
+++ b/src/core/hle/service/gsp_gpu.cpp
@@ -23,12 +23,12 @@ GraphicsDebugger g_debugger;
23namespace GSP_GPU { 23namespace GSP_GPU {
24 24
25Handle g_interrupt_event = 0; ///< Handle to event triggered when GSP interrupt has been signalled 25Handle g_interrupt_event = 0; ///< Handle to event triggered when GSP interrupt has been signalled
26Handle g_shared_memory = 0; ///< Handle to GSP shared memorys 26Kernel::SharedPtr<Kernel::SharedMemory> g_shared_memory; ///< GSP shared memoryings
27u32 g_thread_id = 1; ///< Thread index into interrupt relay queue, 1 is arbitrary 27u32 g_thread_id = 1; ///< Thread index into interrupt relay queue, 1 is arbitrary
28 28
29/// Gets a pointer to a thread command buffer in GSP shared memory 29/// Gets a pointer to a thread command buffer in GSP shared memory
30static inline u8* GetCommandBuffer(u32 thread_id) { 30static inline u8* GetCommandBuffer(u32 thread_id) {
31 ResultVal<u8*> ptr = Kernel::GetSharedMemoryPointer(g_shared_memory, 0x800 + (thread_id * sizeof(CommandBuffer))); 31 ResultVal<u8*> ptr = g_shared_memory->GetPointer(0x800 + (thread_id * sizeof(CommandBuffer)));
32 return ptr.ValueOr(nullptr); 32 return ptr.ValueOr(nullptr);
33} 33}
34 34
@@ -37,13 +37,13 @@ static inline FrameBufferUpdate* GetFrameBufferInfo(u32 thread_id, u32 screen_in
37 37
38 // For each thread there are two FrameBufferUpdate fields 38 // For each thread there are two FrameBufferUpdate fields
39 u32 offset = 0x200 + (2 * thread_id + screen_index) * sizeof(FrameBufferUpdate); 39 u32 offset = 0x200 + (2 * thread_id + screen_index) * sizeof(FrameBufferUpdate);
40 ResultVal<u8*> ptr = Kernel::GetSharedMemoryPointer(g_shared_memory, offset); 40 ResultVal<u8*> ptr = g_shared_memory->GetPointer(offset);
41 return reinterpret_cast<FrameBufferUpdate*>(ptr.ValueOr(nullptr)); 41 return reinterpret_cast<FrameBufferUpdate*>(ptr.ValueOr(nullptr));
42} 42}
43 43
44/// Gets a pointer to the interrupt relay queue for a given thread index 44/// Gets a pointer to the interrupt relay queue for a given thread index
45static inline InterruptRelayQueue* GetInterruptRelayQueue(u32 thread_id) { 45static inline InterruptRelayQueue* GetInterruptRelayQueue(u32 thread_id) {
46 ResultVal<u8*> ptr = Kernel::GetSharedMemoryPointer(g_shared_memory, sizeof(InterruptRelayQueue) * thread_id); 46 ResultVal<u8*> ptr = g_shared_memory->GetPointer(sizeof(InterruptRelayQueue) * thread_id);
47 return reinterpret_cast<InterruptRelayQueue*>(ptr.ValueOr(nullptr)); 47 return reinterpret_cast<InterruptRelayQueue*>(ptr.ValueOr(nullptr));
48} 48}
49 49
@@ -182,13 +182,15 @@ static void RegisterInterruptRelayQueue(Service::Interface* self) {
182 u32* cmd_buff = Kernel::GetCommandBuffer(); 182 u32* cmd_buff = Kernel::GetCommandBuffer();
183 u32 flags = cmd_buff[1]; 183 u32 flags = cmd_buff[1];
184 g_interrupt_event = cmd_buff[3]; 184 g_interrupt_event = cmd_buff[3];
185 g_shared_memory = Kernel::CreateSharedMemory("GSPSharedMem"); 185 g_shared_memory = Kernel::SharedMemory::Create("GSPSharedMem").MoveFrom();
186 186
187 _assert_msg_(GSP, (g_interrupt_event != 0), "handle is not valid!"); 187 _assert_msg_(GSP, (g_interrupt_event != 0), "handle is not valid!");
188 188
189 Handle shmem_handle = Kernel::g_handle_table.Create(g_shared_memory).MoveFrom();
190
189 cmd_buff[1] = 0x2A07; // Value verified by 3dmoo team, purpose unknown, but needed for GSP init 191 cmd_buff[1] = 0x2A07; // Value verified by 3dmoo team, purpose unknown, but needed for GSP init
190 cmd_buff[2] = g_thread_id++; // Thread ID 192 cmd_buff[2] = g_thread_id++; // Thread ID
191 cmd_buff[4] = g_shared_memory; // GSP shared memory 193 cmd_buff[4] = shmem_handle; // GSP shared memory
192 194
193 Kernel::SignalEvent(g_interrupt_event); // TODO(bunnei): Is this correct? 195 Kernel::SignalEvent(g_interrupt_event); // TODO(bunnei): Is this correct?
194} 196}
@@ -204,7 +206,7 @@ void SignalInterrupt(InterruptId interrupt_id) {
204 LOG_WARNING(Service_GSP, "cannot synchronize until GSP event has been created!"); 206 LOG_WARNING(Service_GSP, "cannot synchronize until GSP event has been created!");
205 return; 207 return;
206 } 208 }
207 if (0 == g_shared_memory) { 209 if (nullptr == g_shared_memory) {
208 LOG_WARNING(Service_GSP, "cannot synchronize until GSP shared memory has been created!"); 210 LOG_WARNING(Service_GSP, "cannot synchronize until GSP shared memory has been created!");
209 return; 211 return;
210 } 212 }
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 5abcb2596..ee2ba7e01 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -12,7 +12,7 @@
12namespace Service { 12namespace Service {
13namespace HID { 13namespace HID {
14 14
15Handle g_shared_mem = 0; 15Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem = nullptr;
16 16
17Handle g_event_pad_or_touch_1 = 0; 17Handle g_event_pad_or_touch_1 = 0;
18Handle g_event_pad_or_touch_2 = 0; 18Handle g_event_pad_or_touch_2 = 0;
@@ -30,7 +30,7 @@ static s16 next_circle_y = 0;
30 * Gets a pointer to the PadData structure inside HID shared memory 30 * Gets a pointer to the PadData structure inside HID shared memory
31 */ 31 */
32static inline PadData* GetPadData() { 32static inline PadData* GetPadData() {
33 return reinterpret_cast<PadData*>(Kernel::GetSharedMemoryPointer(g_shared_mem, 0).ValueOr(nullptr)); 33 return reinterpret_cast<PadData*>(g_shared_mem->GetPointer().ValueOr(nullptr));
34} 34}
35 35
36/** 36/**
@@ -120,7 +120,7 @@ void PadUpdateComplete() {
120} 120}
121 121
122void HIDInit() { 122void HIDInit() {
123 g_shared_mem = Kernel::CreateSharedMemory("HID:SharedMem"); // Create shared memory object 123 g_shared_mem = Kernel::SharedMemory::Create("HID:SharedMem").MoveFrom();
124 124
125 // Create event handles 125 // Create event handles
126 g_event_pad_or_touch_1 = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventPadOrTouch1"); 126 g_event_pad_or_touch_1 = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventPadOrTouch1");
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index 73cdaa527..5e6236647 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -9,11 +9,15 @@
9#include "core/hle/kernel/kernel.h" 9#include "core/hle/kernel/kernel.h"
10#include "common/bit_field.h" 10#include "common/bit_field.h"
11 11
12namespace Kernel {
13 class SharedMemory;
14}
15
12namespace Service { 16namespace Service {
13namespace HID { 17namespace HID {
14 18
15// Handle to shared memory region designated to HID_User service 19// Handle to shared memory region designated to HID_User service
16extern Handle g_shared_mem; 20extern Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem;
17 21
18// Event handles 22// Event handles
19extern Handle g_event_pad_or_touch_1; 23extern Handle g_event_pad_or_touch_1;
diff --git a/src/core/hle/service/hid/hid_user.cpp b/src/core/hle/service/hid/hid_user.cpp
index 3a6275707..c167927ea 100644
--- a/src/core/hle/service/hid/hid_user.cpp
+++ b/src/core/hle/service/hid/hid_user.cpp
@@ -5,6 +5,7 @@
5#include "common/log.h" 5#include "common/log.h"
6 6
7#include "core/hle/hle.h" 7#include "core/hle/hle.h"
8#include "core/hle/kernel/shared_memory.h"
8#include "core/hle/service/hid/hid.h" 9#include "core/hle/service/hid/hid.h"
9#include "hid_user.h" 10#include "hid_user.h"
10 11
@@ -46,7 +47,8 @@ void GetIPCHandles(Service::Interface* self) {
46 u32* cmd_buff = Kernel::GetCommandBuffer(); 47 u32* cmd_buff = Kernel::GetCommandBuffer();
47 48
48 cmd_buff[1] = 0; // No error 49 cmd_buff[1] = 0; // No error
49 cmd_buff[3] = Service::HID::g_shared_mem; 50 // TODO(yuriks): Return error from SendSyncRequest is this fails (part of IPC marshalling)
51 cmd_buff[3] = Kernel::g_handle_table.Create(Service::HID::g_shared_mem).MoveFrom();
50 cmd_buff[4] = Service::HID::g_event_pad_or_touch_1; 52 cmd_buff[4] = Service::HID::g_event_pad_or_touch_1;
51 cmd_buff[5] = Service::HID::g_event_pad_or_touch_2; 53 cmd_buff[5] = Service::HID::g_event_pad_or_touch_2;
52 cmd_buff[6] = Service::HID::g_event_accelerometer; 54 cmd_buff[6] = Service::HID::g_event_accelerometer;