diff options
| author | 2015-01-11 03:43:29 -0200 | |
|---|---|---|
| committer | 2015-01-30 11:47:04 -0200 | |
| commit | 4bb33dfc30768c536d3f0ffb980464b1ab2d25d9 (patch) | |
| tree | 09f772e5283ef1302f1b29d30f3f0150dd690bf0 /src/core/hle/service | |
| parent | Common: Fix SCOPE_EXIT to actually create unique identifiers. (diff) | |
| download | yuzu-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.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/service/gsp_gpu.cpp | 16 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 6 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid_user.cpp | 4 |
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 { | |||
| 26 | static const VAddr SHARED_FONT_VADDR = 0x18000000; | 26 | static 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 |
| 29 | static Handle shared_font_mem = 0; | 29 | static Kernel::SharedPtr<Kernel::SharedMemory> shared_font_mem; |
| 30 | 30 | ||
| 31 | static Handle lock_handle = 0; | 31 | static Handle lock_handle = 0; |
| 32 | static Handle notification_event_handle = 0; ///< APT notification event handle | 32 | static 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; | |||
| 23 | namespace GSP_GPU { | 23 | namespace GSP_GPU { |
| 24 | 24 | ||
| 25 | Handle g_interrupt_event = 0; ///< Handle to event triggered when GSP interrupt has been signalled | 25 | Handle g_interrupt_event = 0; ///< Handle to event triggered when GSP interrupt has been signalled |
| 26 | Handle g_shared_memory = 0; ///< Handle to GSP shared memorys | 26 | Kernel::SharedPtr<Kernel::SharedMemory> g_shared_memory; ///< GSP shared memoryings |
| 27 | u32 g_thread_id = 1; ///< Thread index into interrupt relay queue, 1 is arbitrary | 27 | u32 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 |
| 30 | static inline u8* GetCommandBuffer(u32 thread_id) { | 30 | static 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 |
| 45 | static inline InterruptRelayQueue* GetInterruptRelayQueue(u32 thread_id) { | 45 | static 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 @@ | |||
| 12 | namespace Service { | 12 | namespace Service { |
| 13 | namespace HID { | 13 | namespace HID { |
| 14 | 14 | ||
| 15 | Handle g_shared_mem = 0; | 15 | Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem = nullptr; |
| 16 | 16 | ||
| 17 | Handle g_event_pad_or_touch_1 = 0; | 17 | Handle g_event_pad_or_touch_1 = 0; |
| 18 | Handle g_event_pad_or_touch_2 = 0; | 18 | Handle 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 | */ |
| 32 | static inline PadData* GetPadData() { | 32 | static 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 | ||
| 122 | void HIDInit() { | 122 | void 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 | ||
| 12 | namespace Kernel { | ||
| 13 | class SharedMemory; | ||
| 14 | } | ||
| 15 | |||
| 12 | namespace Service { | 16 | namespace Service { |
| 13 | namespace HID { | 17 | namespace 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 |
| 16 | extern Handle g_shared_mem; | 20 | extern Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem; |
| 17 | 21 | ||
| 18 | // Event handles | 22 | // Event handles |
| 19 | extern Handle g_event_pad_or_touch_1; | 23 | extern 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; |