diff options
| author | 2015-01-23 03:11:25 -0200 | |
|---|---|---|
| committer | 2015-01-30 11:49:43 -0200 | |
| commit | d52d85993683a6948285801ab54d51c79c98afba (patch) | |
| tree | 98b4d084c26198ad4bb8a0d8fd84f1a411a32ff6 /src | |
| parent | Kernel: Convert Timer to (mostly) not use Handles (diff) | |
| download | yuzu-d52d85993683a6948285801ab54d51c79c98afba.tar.gz yuzu-d52d85993683a6948285801ab54d51c79c98afba.tar.xz yuzu-d52d85993683a6948285801ab54d51c79c98afba.zip | |
Kernel: Convert Event to not use Handles
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/event.cpp | 83 | ||||
| -rw-r--r-- | src/core/hle/kernel/event.h | 51 | ||||
| -rw-r--r-- | src/core/hle/service/apt_u.cpp | 26 | ||||
| -rw-r--r-- | src/core/hle/service/dsp_dsp.cpp | 26 | ||||
| -rw-r--r-- | src/core/hle/service/gsp_gpu.cpp | 19 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 28 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 11 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid_user.cpp | 11 | ||||
| -rw-r--r-- | src/core/hle/service/srv.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/svc.cpp | 40 |
10 files changed, 151 insertions, 152 deletions
diff --git a/src/core/hle/kernel/event.cpp b/src/core/hle/kernel/event.cpp index 74df47a05..d9ad40c6a 100644 --- a/src/core/hle/kernel/event.cpp +++ b/src/core/hle/kernel/event.cpp | |||
| @@ -14,78 +14,37 @@ | |||
| 14 | 14 | ||
| 15 | namespace Kernel { | 15 | namespace Kernel { |
| 16 | 16 | ||
| 17 | class Event : public WaitObject { | 17 | ResultVal<SharedPtr<Event>> Event::Create(ResetType reset_type, std::string name) { |
| 18 | public: | 18 | SharedPtr<Event> evt(new Event); |
| 19 | std::string GetTypeName() const override { return "Event"; } | 19 | // TOOD(yuriks): Don't create Handle (see Thread::Create()) |
| 20 | std::string GetName() const override { return name; } | 20 | CASCADE_RESULT(auto unused, Kernel::g_handle_table.Create(evt)); |
| 21 | |||
| 22 | static const HandleType HANDLE_TYPE = HandleType::Event; | ||
| 23 | HandleType GetHandleType() const override { return HANDLE_TYPE; } | ||
| 24 | |||
| 25 | ResetType intitial_reset_type; ///< ResetType specified at Event initialization | ||
| 26 | ResetType reset_type; ///< Current ResetType | ||
| 27 | |||
| 28 | bool signaled; ///< Whether the event has already been signaled | ||
| 29 | std::string name; ///< Name of event (optional) | ||
| 30 | |||
| 31 | bool ShouldWait() override { | ||
| 32 | return !signaled; | ||
| 33 | } | ||
| 34 | |||
| 35 | void Acquire() override { | ||
| 36 | _assert_msg_(Kernel, !ShouldWait(), "object unavailable!"); | ||
| 37 | |||
| 38 | // Release the event if it's not sticky... | ||
| 39 | if (reset_type != RESETTYPE_STICKY) | ||
| 40 | signaled = false; | ||
| 41 | } | ||
| 42 | }; | ||
| 43 | |||
| 44 | ResultCode SignalEvent(const Handle handle) { | ||
| 45 | Event* evt = g_handle_table.Get<Event>(handle).get(); | ||
| 46 | if (evt == nullptr) | ||
| 47 | return InvalidHandle(ErrorModule::Kernel); | ||
| 48 | |||
| 49 | evt->signaled = true; | ||
| 50 | evt->WakeupAllWaitingThreads(); | ||
| 51 | |||
| 52 | return RESULT_SUCCESS; | ||
| 53 | } | ||
| 54 | |||
| 55 | ResultCode ClearEvent(Handle handle) { | ||
| 56 | Event* evt = g_handle_table.Get<Event>(handle).get(); | ||
| 57 | if (evt == nullptr) | ||
| 58 | return InvalidHandle(ErrorModule::Kernel); | ||
| 59 | 21 | ||
| 60 | evt->signaled = false; | 22 | evt->signaled = false; |
| 23 | evt->reset_type = evt->intitial_reset_type = reset_type; | ||
| 24 | evt->name = std::move(name); | ||
| 61 | 25 | ||
| 62 | return RESULT_SUCCESS; | 26 | return MakeResult<SharedPtr<Event>>(evt); |
| 63 | } | 27 | } |
| 64 | 28 | ||
| 65 | /** | 29 | bool Event::ShouldWait() { |
| 66 | * Creates an event | 30 | return !signaled; |
| 67 | * @param handle Reference to handle for the newly created mutex | 31 | } |
| 68 | * @param reset_type ResetType describing how to create event | ||
| 69 | * @param name Optional name of event | ||
| 70 | * @return Newly created Event object | ||
| 71 | */ | ||
| 72 | static Event* CreateEvent(Handle& handle, const ResetType reset_type, const std::string& name) { | ||
| 73 | Event* evt = new Event; | ||
| 74 | 32 | ||
| 75 | // TOOD(yuriks): Fix error reporting | 33 | void Event::Acquire() { |
| 76 | handle = Kernel::g_handle_table.Create(evt).ValueOr(INVALID_HANDLE); | 34 | _assert_msg_(Kernel, !ShouldWait(), "object unavailable!"); |
| 77 | 35 | ||
| 78 | evt->signaled = false; | 36 | // Release the event if it's not sticky... |
| 79 | evt->reset_type = evt->intitial_reset_type = reset_type; | 37 | if (reset_type != RESETTYPE_STICKY) |
| 80 | evt->name = name; | 38 | signaled = false; |
| 39 | } | ||
| 81 | 40 | ||
| 82 | return evt; | 41 | void Event::Signal() { |
| 42 | signaled = true; | ||
| 43 | WakeupAllWaitingThreads(); | ||
| 83 | } | 44 | } |
| 84 | 45 | ||
| 85 | Handle CreateEvent(const ResetType reset_type, const std::string& name) { | 46 | void Event::Clear() { |
| 86 | Handle handle; | 47 | signaled = false; |
| 87 | Event* evt = CreateEvent(handle, reset_type, name); | ||
| 88 | return handle; | ||
| 89 | } | 48 | } |
| 90 | 49 | ||
| 91 | } // namespace | 50 | } // namespace |
diff --git a/src/core/hle/kernel/event.h b/src/core/hle/kernel/event.h index c08b12ee1..47420b157 100644 --- a/src/core/hle/kernel/event.h +++ b/src/core/hle/kernel/event.h | |||
| @@ -11,26 +11,35 @@ | |||
| 11 | 11 | ||
| 12 | namespace Kernel { | 12 | namespace Kernel { |
| 13 | 13 | ||
| 14 | /** | 14 | class Event : public WaitObject { |
| 15 | * Signals an event | 15 | public: |
| 16 | * @param handle Handle to event to signal | 16 | /** |
| 17 | * @return Result of operation, 0 on success, otherwise error code | 17 | * Creates an event |
| 18 | */ | 18 | * @param reset_type ResetType describing how to create event |
| 19 | ResultCode SignalEvent(const Handle handle); | 19 | * @param name Optional name of event |
| 20 | 20 | */ | |
| 21 | /** | 21 | static ResultVal<SharedPtr<Event>> Create(ResetType reset_type, std::string name = "Unknown"); |
| 22 | * Clears an event | 22 | |
| 23 | * @param handle Handle to event to clear | 23 | std::string GetTypeName() const override { return "Event"; } |
| 24 | * @return Result of operation, 0 on success, otherwise error code | 24 | std::string GetName() const override { return name; } |
| 25 | */ | 25 | |
| 26 | ResultCode ClearEvent(Handle handle); | 26 | static const HandleType HANDLE_TYPE = HandleType::Event; |
| 27 | 27 | HandleType GetHandleType() const override { return HANDLE_TYPE; } | |
| 28 | /** | 28 | |
| 29 | * Creates an event | 29 | ResetType intitial_reset_type; ///< ResetType specified at Event initialization |
| 30 | * @param reset_type ResetType describing how to create event | 30 | ResetType reset_type; ///< Current ResetType |
| 31 | * @param name Optional name of event | 31 | |
| 32 | * @return Handle to newly created Event object | 32 | bool signaled; ///< Whether the event has already been signaled |
| 33 | */ | 33 | std::string name; ///< Name of event (optional) |
| 34 | Handle CreateEvent(const ResetType reset_type, const std::string& name="Unknown"); | 34 | |
| 35 | bool ShouldWait() override; | ||
| 36 | void Acquire() override; | ||
| 37 | |||
| 38 | void Signal(); | ||
| 39 | void Clear(); | ||
| 40 | |||
| 41 | private: | ||
| 42 | Event() = default; | ||
| 43 | }; | ||
| 35 | 44 | ||
| 36 | } // namespace | 45 | } // namespace |
diff --git a/src/core/hle/service/apt_u.cpp b/src/core/hle/service/apt_u.cpp index 5d7a6e060..629b670ed 100644 --- a/src/core/hle/service/apt_u.cpp +++ b/src/core/hle/service/apt_u.cpp | |||
| @@ -30,8 +30,8 @@ static const VAddr SHARED_FONT_VADDR = 0x18000000; | |||
| 30 | static Kernel::SharedPtr<Kernel::SharedMemory> shared_font_mem; | 30 | static Kernel::SharedPtr<Kernel::SharedMemory> shared_font_mem; |
| 31 | 31 | ||
| 32 | static Kernel::SharedPtr<Kernel::Mutex> lock; | 32 | static Kernel::SharedPtr<Kernel::Mutex> lock; |
| 33 | static Handle notification_event_handle = 0; ///< APT notification event handle | 33 | static Kernel::SharedPtr<Kernel::Event> notification_event; ///< APT notification event |
| 34 | static Handle pause_event_handle = 0; ///< APT pause event handle | 34 | static Kernel::SharedPtr<Kernel::Event> pause_event = 0; ///< APT pause event |
| 35 | static std::vector<u8> shared_font; | 35 | static std::vector<u8> shared_font; |
| 36 | 36 | ||
| 37 | /// Signals used by APT functions | 37 | /// Signals used by APT functions |
| @@ -68,14 +68,16 @@ enum class AppID : u32 { | |||
| 68 | void Initialize(Service::Interface* self) { | 68 | void Initialize(Service::Interface* self) { |
| 69 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 69 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 70 | 70 | ||
| 71 | notification_event_handle = Kernel::CreateEvent(RESETTYPE_ONESHOT, "APT_U:Notification"); | 71 | // TODO(bunnei): Check if these are created in Initialize or on APT process startup. |
| 72 | pause_event_handle = Kernel::CreateEvent(RESETTYPE_ONESHOT, "APT_U:Pause"); | 72 | notification_event = Kernel::Event::Create(RESETTYPE_ONESHOT, "APT_U:Notification").MoveFrom(); |
| 73 | pause_event = Kernel::Event::Create(RESETTYPE_ONESHOT, "APT_U:Pause").MoveFrom(); | ||
| 73 | 74 | ||
| 74 | cmd_buff[3] = notification_event_handle; | 75 | cmd_buff[3] = Kernel::g_handle_table.Create(notification_event).MoveFrom(); |
| 75 | cmd_buff[4] = pause_event_handle; | 76 | cmd_buff[4] = Kernel::g_handle_table.Create(pause_event).MoveFrom(); |
| 76 | 77 | ||
| 77 | Kernel::ClearEvent(notification_event_handle); | 78 | // TODO(bunnei): Check if these events are cleared/signaled every time Initialize is called. |
| 78 | Kernel::SignalEvent(pause_event_handle); // Fire start event | 79 | notification_event->Clear(); |
| 80 | pause_event->Signal(); // Fire start event | ||
| 79 | 81 | ||
| 80 | _assert_msg_(KERNEL, (nullptr != lock), "Cannot initialize without lock"); | 82 | _assert_msg_(KERNEL, (nullptr != lock), "Cannot initialize without lock"); |
| 81 | lock->Release(); | 83 | lock->Release(); |
| @@ -94,7 +96,7 @@ void NotifyToWait(Service::Interface* self) { | |||
| 94 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 96 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 95 | u32 app_id = cmd_buff[1]; | 97 | u32 app_id = cmd_buff[1]; |
| 96 | // TODO(Subv): Verify this, it seems to get SWKBD and Home Menu further. | 98 | // TODO(Subv): Verify this, it seems to get SWKBD and Home Menu further. |
| 97 | Kernel::SignalEvent(pause_event_handle); | 99 | pause_event->Signal(); |
| 98 | 100 | ||
| 99 | cmd_buff[1] = RESULT_SUCCESS.raw; // No error | 101 | cmd_buff[1] = RESULT_SUCCESS.raw; // No error |
| 100 | LOG_WARNING(Service_APT, "(STUBBED) app_id=%u", app_id); | 102 | LOG_WARNING(Service_APT, "(STUBBED) app_id=%u", app_id); |
| @@ -104,10 +106,6 @@ void GetLockHandle(Service::Interface* self) { | |||
| 104 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 106 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 105 | u32 flags = cmd_buff[1]; // TODO(bunnei): Figure out the purpose of the flag field | 107 | u32 flags = cmd_buff[1]; // TODO(bunnei): Figure out the purpose of the flag field |
| 106 | 108 | ||
| 107 | if (nullptr == lock) { | ||
| 108 | // TODO(bunnei): Verify if this is created here or at application boot? | ||
| 109 | lock = Kernel::Mutex::Create(false, "APT_U:Lock").MoveFrom(); | ||
| 110 | } | ||
| 111 | cmd_buff[1] = RESULT_SUCCESS.raw; // No error | 109 | cmd_buff[1] = RESULT_SUCCESS.raw; // No error |
| 112 | 110 | ||
| 113 | // Not sure what these parameters are used for, but retail apps check that they are 0 after | 111 | // Not sure what these parameters are used for, but retail apps check that they are 0 after |
| @@ -520,7 +518,7 @@ Interface::Interface() { | |||
| 520 | shared_font_mem = nullptr; | 518 | shared_font_mem = nullptr; |
| 521 | } | 519 | } |
| 522 | 520 | ||
| 523 | lock = nullptr; | 521 | lock = Kernel::Mutex::Create(false, "APT_U:Lock").MoveFrom(); |
| 524 | 522 | ||
| 525 | Register(FunctionTable, ARRAY_SIZE(FunctionTable)); | 523 | Register(FunctionTable, ARRAY_SIZE(FunctionTable)); |
| 526 | } | 524 | } |
diff --git a/src/core/hle/service/dsp_dsp.cpp b/src/core/hle/service/dsp_dsp.cpp index d5e39ea4b..9a38be393 100644 --- a/src/core/hle/service/dsp_dsp.cpp +++ b/src/core/hle/service/dsp_dsp.cpp | |||
| @@ -13,8 +13,8 @@ | |||
| 13 | namespace DSP_DSP { | 13 | namespace DSP_DSP { |
| 14 | 14 | ||
| 15 | static u32 read_pipe_count = 0; | 15 | static u32 read_pipe_count = 0; |
| 16 | static Handle semaphore_event = 0; | 16 | static Kernel::SharedPtr<Kernel::Event> semaphore_event; |
| 17 | static Handle interrupt_event = 0; | 17 | static Kernel::SharedPtr<Kernel::Event> interrupt_event; |
| 18 | 18 | ||
| 19 | void SignalInterrupt() { | 19 | void SignalInterrupt() { |
| 20 | // TODO(bunnei): This is just a stub, it does not do anything other than signal to the emulated | 20 | // TODO(bunnei): This is just a stub, it does not do anything other than signal to the emulated |
| @@ -24,7 +24,7 @@ void SignalInterrupt() { | |||
| 24 | // DSP interrupts, and trigger them at the appropriate times. | 24 | // DSP interrupts, and trigger them at the appropriate times. |
| 25 | 25 | ||
| 26 | if (interrupt_event != 0) | 26 | if (interrupt_event != 0) |
| 27 | Kernel::SignalEvent(interrupt_event); | 27 | interrupt_event->Signal(); |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | /** | 30 | /** |
| @@ -78,8 +78,8 @@ void LoadComponent(Service::Interface* self) { | |||
| 78 | void GetSemaphoreEventHandle(Service::Interface* self) { | 78 | void GetSemaphoreEventHandle(Service::Interface* self) { |
| 79 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 79 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 80 | 80 | ||
| 81 | cmd_buff[1] = 0; // No error | 81 | cmd_buff[1] = RESULT_SUCCESS.raw; // No error |
| 82 | cmd_buff[3] = semaphore_event; // Event handle | 82 | cmd_buff[3] = Kernel::g_handle_table.Create(semaphore_event).MoveFrom(); // Event handle |
| 83 | 83 | ||
| 84 | LOG_WARNING(Service_DSP, "(STUBBED) called"); | 84 | LOG_WARNING(Service_DSP, "(STUBBED) called"); |
| 85 | } | 85 | } |
| @@ -96,9 +96,16 @@ void GetSemaphoreEventHandle(Service::Interface* self) { | |||
| 96 | void RegisterInterruptEvents(Service::Interface* self) { | 96 | void RegisterInterruptEvents(Service::Interface* self) { |
| 97 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 97 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 98 | 98 | ||
| 99 | interrupt_event = static_cast<Handle>(cmd_buff[4]); | 99 | auto evt = Kernel::g_handle_table.Get<Kernel::Event>(cmd_buff[4]); |
| 100 | if (evt != nullptr) { | ||
| 101 | interrupt_event = evt; | ||
| 102 | cmd_buff[1] = 0; // No error | ||
| 103 | } else { | ||
| 104 | LOG_ERROR(Service_DSP, "called with invalid handle=%08X", cmd_buff[4]); | ||
| 100 | 105 | ||
| 101 | cmd_buff[1] = 0; // No error | 106 | // TODO(yuriks): An error should be returned from SendSyncRequest, not in the cmdbuf |
| 107 | cmd_buff[1] = -1; | ||
| 108 | } | ||
| 102 | 109 | ||
| 103 | LOG_WARNING(Service_DSP, "(STUBBED) called"); | 110 | LOG_WARNING(Service_DSP, "(STUBBED) called"); |
| 104 | } | 111 | } |
| @@ -194,8 +201,9 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
| 194 | // Interface class | 201 | // Interface class |
| 195 | 202 | ||
| 196 | Interface::Interface() { | 203 | Interface::Interface() { |
| 197 | semaphore_event = Kernel::CreateEvent(RESETTYPE_ONESHOT, "DSP_DSP::semaphore_event"); | 204 | semaphore_event = Kernel::Event::Create(RESETTYPE_ONESHOT, |
| 198 | interrupt_event = 0; | 205 | "DSP_DSP::semaphore_event").MoveFrom(); |
| 206 | interrupt_event = nullptr; | ||
| 199 | read_pipe_count = 0; | 207 | read_pipe_count = 0; |
| 200 | 208 | ||
| 201 | Register(FunctionTable, ARRAY_SIZE(FunctionTable)); | 209 | Register(FunctionTable, ARRAY_SIZE(FunctionTable)); |
diff --git a/src/core/hle/service/gsp_gpu.cpp b/src/core/hle/service/gsp_gpu.cpp index 1be2438c8..5b91f17d2 100644 --- a/src/core/hle/service/gsp_gpu.cpp +++ b/src/core/hle/service/gsp_gpu.cpp | |||
| @@ -22,9 +22,12 @@ GraphicsDebugger g_debugger; | |||
| 22 | 22 | ||
| 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 | /// Event triggered when GSP interrupt has been signalled |
| 26 | Kernel::SharedPtr<Kernel::SharedMemory> g_shared_memory; ///< GSP shared memoryings | 26 | Kernel::SharedPtr<Kernel::Event> g_interrupt_event; |
| 27 | u32 g_thread_id = 1; ///< Thread index into interrupt relay queue, 1 is arbitrary | 27 | /// GSP shared memoryings |
| 28 | Kernel::SharedPtr<Kernel::SharedMemory> g_shared_memory; | ||
| 29 | /// Thread index into interrupt relay queue, 1 is arbitrary | ||
| 30 | u32 g_thread_id = 1; | ||
| 28 | 31 | ||
| 29 | /// Gets a pointer to a thread command buffer in GSP shared memory | 32 | /// Gets a pointer to a thread command buffer in GSP shared memory |
| 30 | static inline u8* GetCommandBuffer(u32 thread_id) { | 33 | static inline u8* GetCommandBuffer(u32 thread_id) { |
| @@ -181,10 +184,10 @@ static void FlushDataCache(Service::Interface* self) { | |||
| 181 | static void RegisterInterruptRelayQueue(Service::Interface* self) { | 184 | static void RegisterInterruptRelayQueue(Service::Interface* self) { |
| 182 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 185 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 183 | u32 flags = cmd_buff[1]; | 186 | u32 flags = cmd_buff[1]; |
| 184 | g_interrupt_event = cmd_buff[3]; | ||
| 185 | g_shared_memory = Kernel::SharedMemory::Create("GSPSharedMem").MoveFrom(); | ||
| 186 | 187 | ||
| 187 | _assert_msg_(GSP, (g_interrupt_event != 0), "handle is not valid!"); | 188 | g_interrupt_event = Kernel::g_handle_table.Get<Kernel::Event>(cmd_buff[3]); |
| 189 | _assert_msg_(GSP, (g_interrupt_event != nullptr), "handle is not valid!"); | ||
| 190 | g_shared_memory = Kernel::SharedMemory::Create("GSPSharedMem").MoveFrom(); | ||
| 188 | 191 | ||
| 189 | Handle shmem_handle = Kernel::g_handle_table.Create(g_shared_memory).MoveFrom(); | 192 | Handle shmem_handle = Kernel::g_handle_table.Create(g_shared_memory).MoveFrom(); |
| 190 | 193 | ||
| @@ -192,7 +195,7 @@ static void RegisterInterruptRelayQueue(Service::Interface* self) { | |||
| 192 | cmd_buff[2] = g_thread_id++; // Thread ID | 195 | cmd_buff[2] = g_thread_id++; // Thread ID |
| 193 | cmd_buff[4] = shmem_handle; // GSP shared memory | 196 | cmd_buff[4] = shmem_handle; // GSP shared memory |
| 194 | 197 | ||
| 195 | Kernel::SignalEvent(g_interrupt_event); // TODO(bunnei): Is this correct? | 198 | g_interrupt_event->Signal(); // TODO(bunnei): Is this correct? |
| 196 | } | 199 | } |
| 197 | 200 | ||
| 198 | /** | 201 | /** |
| @@ -234,7 +237,7 @@ void SignalInterrupt(InterruptId interrupt_id) { | |||
| 234 | info->is_dirty = false; | 237 | info->is_dirty = false; |
| 235 | } | 238 | } |
| 236 | } | 239 | } |
| 237 | Kernel::SignalEvent(g_interrupt_event); | 240 | g_interrupt_event->Signal(); |
| 238 | } | 241 | } |
| 239 | 242 | ||
| 240 | /// Executes the next GSP command | 243 | /// Executes the next GSP command |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index ee2ba7e01..835055af4 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -14,11 +14,11 @@ namespace HID { | |||
| 14 | 14 | ||
| 15 | Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem = nullptr; | 15 | Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem = nullptr; |
| 16 | 16 | ||
| 17 | Handle g_event_pad_or_touch_1 = 0; | 17 | Kernel::SharedPtr<Kernel::Event> g_event_pad_or_touch_1; |
| 18 | Handle g_event_pad_or_touch_2 = 0; | 18 | Kernel::SharedPtr<Kernel::Event> g_event_pad_or_touch_2; |
| 19 | Handle g_event_accelerometer = 0; | 19 | Kernel::SharedPtr<Kernel::Event> g_event_accelerometer; |
| 20 | Handle g_event_gyroscope = 0; | 20 | Kernel::SharedPtr<Kernel::Event> g_event_gyroscope; |
| 21 | Handle g_event_debug_pad = 0; | 21 | Kernel::SharedPtr<Kernel::Event> g_event_debug_pad; |
| 22 | 22 | ||
| 23 | // Next Pad state update information | 23 | // Next Pad state update information |
| 24 | static PadState next_state = {{0}}; | 24 | static PadState next_state = {{0}}; |
| @@ -115,19 +115,21 @@ void PadUpdateComplete() { | |||
| 115 | } | 115 | } |
| 116 | 116 | ||
| 117 | // Signal both handles when there's an update to Pad or touch | 117 | // Signal both handles when there's an update to Pad or touch |
| 118 | Kernel::SignalEvent(g_event_pad_or_touch_1); | 118 | g_event_pad_or_touch_1->Signal(); |
| 119 | Kernel::SignalEvent(g_event_pad_or_touch_2); | 119 | g_event_pad_or_touch_2->Signal(); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | void HIDInit() { | 122 | void HIDInit() { |
| 123 | g_shared_mem = Kernel::SharedMemory::Create("HID:SharedMem").MoveFrom(); | 123 | using namespace Kernel; |
| 124 | |||
| 125 | g_shared_mem = SharedMemory::Create("HID:SharedMem").MoveFrom(); | ||
| 124 | 126 | ||
| 125 | // Create event handles | 127 | // Create event handles |
| 126 | g_event_pad_or_touch_1 = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventPadOrTouch1"); | 128 | g_event_pad_or_touch_1 = Event::Create(RESETTYPE_ONESHOT, "HID:EventPadOrTouch1").MoveFrom(); |
| 127 | g_event_pad_or_touch_2 = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventPadOrTouch2"); | 129 | g_event_pad_or_touch_2 = Event::Create(RESETTYPE_ONESHOT, "HID:EventPadOrTouch2").MoveFrom(); |
| 128 | g_event_accelerometer = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventAccelerometer"); | 130 | g_event_accelerometer = Event::Create(RESETTYPE_ONESHOT, "HID:EventAccelerometer").MoveFrom(); |
| 129 | g_event_gyroscope = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventGyroscope"); | 131 | g_event_gyroscope = Event::Create(RESETTYPE_ONESHOT, "HID:EventGyroscope").MoveFrom(); |
| 130 | g_event_debug_pad = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventDebugPad"); | 132 | g_event_debug_pad = Event::Create(RESETTYPE_ONESHOT, "HID:EventDebugPad").MoveFrom(); |
| 131 | } | 133 | } |
| 132 | 134 | ||
| 133 | void HIDShutdown() { | 135 | void HIDShutdown() { |
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index 5e6236647..2116d2ca3 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | namespace Kernel { | 12 | namespace Kernel { |
| 13 | class SharedMemory; | 13 | class SharedMemory; |
| 14 | class Event; | ||
| 14 | } | 15 | } |
| 15 | 16 | ||
| 16 | namespace Service { | 17 | namespace Service { |
| @@ -20,11 +21,11 @@ namespace HID { | |||
| 20 | extern Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem; | 21 | extern Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem; |
| 21 | 22 | ||
| 22 | // Event handles | 23 | // Event handles |
| 23 | extern Handle g_event_pad_or_touch_1; | 24 | extern Kernel::SharedPtr<Kernel::Event> g_event_pad_or_touch_1; |
| 24 | extern Handle g_event_pad_or_touch_2; | 25 | extern Kernel::SharedPtr<Kernel::Event> g_event_pad_or_touch_2; |
| 25 | extern Handle g_event_accelerometer; | 26 | extern Kernel::SharedPtr<Kernel::Event> g_event_accelerometer; |
| 26 | extern Handle g_event_gyroscope; | 27 | extern Kernel::SharedPtr<Kernel::Event> g_event_gyroscope; |
| 27 | extern Handle g_event_debug_pad; | 28 | extern Kernel::SharedPtr<Kernel::Event> g_event_debug_pad; |
| 28 | 29 | ||
| 29 | /** | 30 | /** |
| 30 | * Structure of a Pad controller state. | 31 | * Structure of a Pad controller state. |
diff --git a/src/core/hle/service/hid/hid_user.cpp b/src/core/hle/service/hid/hid_user.cpp index c167927ea..5444aa5ee 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/event.h" | ||
| 8 | #include "core/hle/kernel/shared_memory.h" | 9 | #include "core/hle/kernel/shared_memory.h" |
| 9 | #include "core/hle/service/hid/hid.h" | 10 | #include "core/hle/service/hid/hid.h" |
| 10 | #include "hid_user.h" | 11 | #include "hid_user.h" |
| @@ -49,11 +50,11 @@ void GetIPCHandles(Service::Interface* self) { | |||
| 49 | cmd_buff[1] = 0; // No error | 50 | cmd_buff[1] = 0; // No error |
| 50 | // TODO(yuriks): Return error from SendSyncRequest is this fails (part of IPC marshalling) | 51 | // 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(); | 52 | cmd_buff[3] = Kernel::g_handle_table.Create(Service::HID::g_shared_mem).MoveFrom(); |
| 52 | cmd_buff[4] = Service::HID::g_event_pad_or_touch_1; | 53 | cmd_buff[4] = Kernel::g_handle_table.Create(Service::HID::g_event_pad_or_touch_1).MoveFrom(); |
| 53 | cmd_buff[5] = Service::HID::g_event_pad_or_touch_2; | 54 | cmd_buff[5] = Kernel::g_handle_table.Create(Service::HID::g_event_pad_or_touch_2).MoveFrom(); |
| 54 | cmd_buff[6] = Service::HID::g_event_accelerometer; | 55 | cmd_buff[6] = Kernel::g_handle_table.Create(Service::HID::g_event_accelerometer).MoveFrom(); |
| 55 | cmd_buff[7] = Service::HID::g_event_gyroscope; | 56 | cmd_buff[7] = Kernel::g_handle_table.Create(Service::HID::g_event_gyroscope).MoveFrom(); |
| 56 | cmd_buff[8] = Service::HID::g_event_debug_pad; | 57 | cmd_buff[8] = Kernel::g_handle_table.Create(Service::HID::g_event_debug_pad).MoveFrom(); |
| 57 | } | 58 | } |
| 58 | 59 | ||
| 59 | const Interface::FunctionInfo FunctionTable[] = { | 60 | const Interface::FunctionInfo FunctionTable[] = { |
diff --git a/src/core/hle/service/srv.cpp b/src/core/hle/service/srv.cpp index 082834cfe..aa0aac3bb 100644 --- a/src/core/hle/service/srv.cpp +++ b/src/core/hle/service/srv.cpp | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | namespace SRV { | 12 | namespace SRV { |
| 13 | 13 | ||
| 14 | static Handle g_event_handle = 0; | 14 | static Kernel::SharedPtr<Kernel::Event> event_handle; |
| 15 | 15 | ||
| 16 | static void Initialize(Service::Interface* self) { | 16 | static void Initialize(Service::Interface* self) { |
| 17 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 17 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| @@ -23,11 +23,11 @@ static void GetProcSemaphore(Service::Interface* self) { | |||
| 23 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 23 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 24 | 24 | ||
| 25 | // TODO(bunnei): Change to a semaphore once these have been implemented | 25 | // TODO(bunnei): Change to a semaphore once these have been implemented |
| 26 | g_event_handle = Kernel::CreateEvent(RESETTYPE_ONESHOT, "SRV:Event"); | 26 | event_handle = Kernel::Event::Create(RESETTYPE_ONESHOT, "SRV:Event").MoveFrom(); |
| 27 | Kernel::ClearEvent(g_event_handle); | 27 | event_handle->Clear(); |
| 28 | 28 | ||
| 29 | cmd_buff[1] = 0; // No error | 29 | cmd_buff[1] = 0; // No error |
| 30 | cmd_buff[3] = g_event_handle; | 30 | cmd_buff[3] = Kernel::g_handle_table.Create(event_handle).MoveFrom(); |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | static void GetServiceHandle(Service::Interface* self) { | 33 | static void GetServiceHandle(Service::Interface* self) { |
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp index 95403644b..0c50f0d5b 100644 --- a/src/core/hle/svc.cpp +++ b/src/core/hle/svc.cpp | |||
| @@ -447,11 +447,17 @@ static Result QueryMemory(void* info, void* out, u32 addr) { | |||
| 447 | } | 447 | } |
| 448 | 448 | ||
| 449 | /// Create an event | 449 | /// Create an event |
| 450 | static Result CreateEvent(Handle* evt, u32 reset_type) { | 450 | static Result CreateEvent(Handle* handle, u32 reset_type) { |
| 451 | *evt = Kernel::CreateEvent((ResetType)reset_type); | 451 | auto evt_res = Kernel::Event::Create(static_cast<ResetType>(reset_type)); |
| 452 | LOG_TRACE(Kernel_SVC, "called reset_type=0x%08X : created handle=0x%08X", | 452 | if (evt_res.Failed()) |
| 453 | reset_type, *evt); | 453 | return evt_res.Code().raw; |
| 454 | return 0; | 454 | auto handle_res = Kernel::g_handle_table.Create(evt_res.MoveFrom()); |
| 455 | if (handle_res.Failed()) | ||
| 456 | return handle_res.Code().raw; | ||
| 457 | *handle = handle_res.MoveFrom(); | ||
| 458 | |||
| 459 | LOG_TRACE(Kernel_SVC, "called reset_type=0x%08X : created handle=0x%08X", reset_type, *handle); | ||
| 460 | return RESULT_SUCCESS.raw; | ||
| 455 | } | 461 | } |
| 456 | 462 | ||
| 457 | /// Duplicates a kernel handle | 463 | /// Duplicates a kernel handle |
| @@ -465,16 +471,28 @@ static Result DuplicateHandle(Handle* out, Handle handle) { | |||
| 465 | } | 471 | } |
| 466 | 472 | ||
| 467 | /// Signals an event | 473 | /// Signals an event |
| 468 | static Result SignalEvent(Handle evt) { | 474 | static Result SignalEvent(Handle handle) { |
| 469 | LOG_TRACE(Kernel_SVC, "called event=0x%08X", evt); | 475 | LOG_TRACE(Kernel_SVC, "called event=0x%08X", handle); |
| 476 | |||
| 477 | auto evt = Kernel::g_handle_table.Get<Kernel::Event>(handle); | ||
| 478 | if (evt == nullptr) | ||
| 479 | return InvalidHandle(ErrorModule::Kernel).raw; | ||
| 480 | |||
| 481 | evt->Signal(); | ||
| 470 | HLE::Reschedule(__func__); | 482 | HLE::Reschedule(__func__); |
| 471 | return Kernel::SignalEvent(evt).raw; | 483 | return RESULT_SUCCESS.raw; |
| 472 | } | 484 | } |
| 473 | 485 | ||
| 474 | /// Clears an event | 486 | /// Clears an event |
| 475 | static Result ClearEvent(Handle evt) { | 487 | static Result ClearEvent(Handle handle) { |
| 476 | LOG_TRACE(Kernel_SVC, "called event=0x%08X", evt); | 488 | LOG_TRACE(Kernel_SVC, "called event=0x%08X", handle); |
| 477 | return Kernel::ClearEvent(evt).raw; | 489 | |
| 490 | auto evt = Kernel::g_handle_table.Get<Kernel::Event>(handle); | ||
| 491 | if (evt == nullptr) | ||
| 492 | return InvalidHandle(ErrorModule::Kernel).raw; | ||
| 493 | |||
| 494 | evt->Clear(); | ||
| 495 | return RESULT_SUCCESS.raw; | ||
| 478 | } | 496 | } |
| 479 | 497 | ||
| 480 | /// Creates a timer | 498 | /// Creates a timer |