summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Lioncash2018-12-04 15:11:18 -0500
committerGravatar Lioncash2018-12-04 15:47:55 -0500
commit2a1f59b3017d6937138bfeacd9c04339f7d1526d (patch)
treedfff027340afbdd1d44498c02936528c1036e401 /src/core
parentMerge pull request #1845 from lioncash/nro (diff)
downloadyuzu-2a1f59b3017d6937138bfeacd9c04339f7d1526d.tar.gz
yuzu-2a1f59b3017d6937138bfeacd9c04339f7d1526d.tar.xz
yuzu-2a1f59b3017d6937138bfeacd9c04339f7d1526d.zip
kernel/svc: Implement svcCreateEvent()
svcCreateEvent operates by creating both a readable and writable event and then attempts to add both to the current process' handle table. If adding either of the events to the handle table fails, then the relevant error from the handle table is returned. If adding the readable event after the writable event to the table fails, then the writable event is removed from the handle table and the relevant error from the handle table is returned. Note that since we do not currently test resource limits, we don't check the resource limit table yet.
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;