diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 30 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc_wrap.h | 13 |
2 files changed, 42 insertions, 1 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 812b32005..a0e3dc470 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -1598,6 +1598,34 @@ static ResultCode CreateSharedMemory(Handle* handle, u64 size, u32 local_permiss | |||
| 1598 | return RESULT_SUCCESS; | 1598 | return RESULT_SUCCESS; |
| 1599 | } | 1599 | } |
| 1600 | 1600 | ||
| 1601 | static ResultCode CreateEvent(Handle* write_handle, Handle* read_handle) { | ||
| 1602 | LOG_DEBUG(Kernel_SVC, "called"); | ||
| 1603 | |||
| 1604 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 1605 | const auto [readable_event, writable_event] = | ||
| 1606 | WritableEvent::CreateEventPair(kernel, ResetType::Sticky, "CreateEvent"); | ||
| 1607 | |||
| 1608 | HandleTable& handle_table = kernel.CurrentProcess()->GetHandleTable(); | ||
| 1609 | |||
| 1610 | const auto write_create_result = handle_table.Create(writable_event); | ||
| 1611 | if (write_create_result.Failed()) { | ||
| 1612 | return write_create_result.Code(); | ||
| 1613 | } | ||
| 1614 | *write_handle = *write_create_result; | ||
| 1615 | |||
| 1616 | const auto read_create_result = handle_table.Create(readable_event); | ||
| 1617 | if (read_create_result.Failed()) { | ||
| 1618 | handle_table.Close(*write_create_result); | ||
| 1619 | return read_create_result.Code(); | ||
| 1620 | } | ||
| 1621 | *read_handle = *read_create_result; | ||
| 1622 | |||
| 1623 | LOG_DEBUG(Kernel_SVC, | ||
| 1624 | "successful. Writable event handle=0x{:08X}, Readable event handle=0x{:08X}", | ||
| 1625 | *write_create_result, *read_create_result); | ||
| 1626 | return RESULT_SUCCESS; | ||
| 1627 | } | ||
| 1628 | |||
| 1601 | static ResultCode ClearEvent(Handle handle) { | 1629 | static ResultCode ClearEvent(Handle handle) { |
| 1602 | LOG_TRACE(Kernel_SVC, "called, event=0x{:08X}", handle); | 1630 | LOG_TRACE(Kernel_SVC, "called, event=0x{:08X}", handle); |
| 1603 | 1631 | ||
| @@ -1806,7 +1834,7 @@ static const FunctionDef SVC_Table[] = { | |||
| 1806 | {0x42, nullptr, "ReplyAndReceiveLight"}, | 1834 | {0x42, nullptr, "ReplyAndReceiveLight"}, |
| 1807 | {0x43, nullptr, "ReplyAndReceive"}, | 1835 | {0x43, nullptr, "ReplyAndReceive"}, |
| 1808 | {0x44, nullptr, "ReplyAndReceiveWithUserBuffer"}, | 1836 | {0x44, nullptr, "ReplyAndReceiveWithUserBuffer"}, |
| 1809 | {0x45, nullptr, "CreateEvent"}, | 1837 | {0x45, SvcWrap<CreateEvent>, "CreateEvent"}, |
| 1810 | {0x46, nullptr, "Unknown"}, | 1838 | {0x46, nullptr, "Unknown"}, |
| 1811 | {0x47, nullptr, "Unknown"}, | 1839 | {0x47, nullptr, "Unknown"}, |
| 1812 | {0x48, nullptr, "MapPhysicalMemoryUnsafe"}, | 1840 | {0x48, nullptr, "MapPhysicalMemoryUnsafe"}, |
diff --git a/src/core/hle/kernel/svc_wrap.h b/src/core/hle/kernel/svc_wrap.h index fa1116624..24aef46c9 100644 --- a/src/core/hle/kernel/svc_wrap.h +++ b/src/core/hle/kernel/svc_wrap.h | |||
| @@ -59,6 +59,19 @@ void SvcWrap() { | |||
| 59 | FuncReturn(retval); | 59 | FuncReturn(retval); |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | template <ResultCode func(u32*, u32*)> | ||
| 63 | void SvcWrap() { | ||
| 64 | u32 param_1 = 0; | ||
| 65 | u32 param_2 = 0; | ||
| 66 | const u32 retval = func(¶m_1, ¶m_2).raw; | ||
| 67 | |||
| 68 | auto& arm_interface = Core::CurrentArmInterface(); | ||
| 69 | arm_interface.SetReg(1, param_1); | ||
| 70 | arm_interface.SetReg(2, param_2); | ||
| 71 | |||
| 72 | FuncReturn(retval); | ||
| 73 | } | ||
| 74 | |||
| 62 | template <ResultCode func(u32*, u64)> | 75 | template <ResultCode func(u32*, u64)> |
| 63 | void SvcWrap() { | 76 | void SvcWrap() { |
| 64 | u32 param_1 = 0; | 77 | u32 param_1 = 0; |