diff options
Diffstat (limited to 'src/core/hle/svc.cpp')
| -rw-r--r-- | src/core/hle/svc.cpp | 40 |
1 files changed, 29 insertions, 11 deletions
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 |