summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/kernel/svc.cpp30
-rw-r--r--src/core/hle/kernel/svc_wrap.h13
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
1601static 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
1601static ResultCode ClearEvent(Handle handle) { 1629static 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
62template <ResultCode func(u32*, u32*)>
63void SvcWrap() {
64 u32 param_1 = 0;
65 u32 param_2 = 0;
66 const u32 retval = func(&param_1, &param_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
62template <ResultCode func(u32*, u64)> 75template <ResultCode func(u32*, u64)>
63void SvcWrap() { 76void SvcWrap() {
64 u32 param_1 = 0; 77 u32 param_1 = 0;