diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 48 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc_wrap.h | 13 |
2 files changed, 58 insertions, 3 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 812b32005..e6c77f9db 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -35,7 +35,6 @@ | |||
| 35 | #include "core/hle/lock.h" | 35 | #include "core/hle/lock.h" |
| 36 | #include "core/hle/result.h" | 36 | #include "core/hle/result.h" |
| 37 | #include "core/hle/service/service.h" | 37 | #include "core/hle/service/service.h" |
| 38 | #include "core/settings.h" | ||
| 39 | 38 | ||
| 40 | namespace Kernel { | 39 | namespace Kernel { |
| 41 | namespace { | 40 | namespace { |
| @@ -1598,6 +1597,34 @@ static ResultCode CreateSharedMemory(Handle* handle, u64 size, u32 local_permiss | |||
| 1598 | return RESULT_SUCCESS; | 1597 | return RESULT_SUCCESS; |
| 1599 | } | 1598 | } |
| 1600 | 1599 | ||
| 1600 | static ResultCode CreateEvent(Handle* write_handle, Handle* read_handle) { | ||
| 1601 | LOG_DEBUG(Kernel_SVC, "called"); | ||
| 1602 | |||
| 1603 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 1604 | const auto [readable_event, writable_event] = | ||
| 1605 | WritableEvent::CreateEventPair(kernel, ResetType::Sticky, "CreateEvent"); | ||
| 1606 | |||
| 1607 | HandleTable& handle_table = kernel.CurrentProcess()->GetHandleTable(); | ||
| 1608 | |||
| 1609 | const auto write_create_result = handle_table.Create(writable_event); | ||
| 1610 | if (write_create_result.Failed()) { | ||
| 1611 | return write_create_result.Code(); | ||
| 1612 | } | ||
| 1613 | *write_handle = *write_create_result; | ||
| 1614 | |||
| 1615 | const auto read_create_result = handle_table.Create(readable_event); | ||
| 1616 | if (read_create_result.Failed()) { | ||
| 1617 | handle_table.Close(*write_create_result); | ||
| 1618 | return read_create_result.Code(); | ||
| 1619 | } | ||
| 1620 | *read_handle = *read_create_result; | ||
| 1621 | |||
| 1622 | LOG_DEBUG(Kernel_SVC, | ||
| 1623 | "successful. Writable event handle=0x{:08X}, Readable event handle=0x{:08X}", | ||
| 1624 | *write_create_result, *read_create_result); | ||
| 1625 | return RESULT_SUCCESS; | ||
| 1626 | } | ||
| 1627 | |||
| 1601 | static ResultCode ClearEvent(Handle handle) { | 1628 | static ResultCode ClearEvent(Handle handle) { |
| 1602 | LOG_TRACE(Kernel_SVC, "called, event=0x{:08X}", handle); | 1629 | LOG_TRACE(Kernel_SVC, "called, event=0x{:08X}", handle); |
| 1603 | 1630 | ||
| @@ -1619,6 +1646,21 @@ static ResultCode ClearEvent(Handle handle) { | |||
| 1619 | return ERR_INVALID_HANDLE; | 1646 | return ERR_INVALID_HANDLE; |
| 1620 | } | 1647 | } |
| 1621 | 1648 | ||
| 1649 | static ResultCode SignalEvent(Handle handle) { | ||
| 1650 | LOG_DEBUG(Kernel_SVC, "called. Handle=0x{:08X}", handle); | ||
| 1651 | |||
| 1652 | HandleTable& handle_table = Core::CurrentProcess()->GetHandleTable(); | ||
| 1653 | auto writable_event = handle_table.Get<WritableEvent>(handle); | ||
| 1654 | |||
| 1655 | if (!writable_event) { | ||
| 1656 | LOG_ERROR(Kernel_SVC, "Non-existent writable event handle used (0x{:08X})", handle); | ||
| 1657 | return ERR_INVALID_HANDLE; | ||
| 1658 | } | ||
| 1659 | |||
| 1660 | writable_event->Signal(); | ||
| 1661 | return RESULT_SUCCESS; | ||
| 1662 | } | ||
| 1663 | |||
| 1622 | static ResultCode GetProcessInfo(u64* out, Handle process_handle, u32 type) { | 1664 | static ResultCode GetProcessInfo(u64* out, Handle process_handle, u32 type) { |
| 1623 | LOG_DEBUG(Kernel_SVC, "called, handle=0x{:08X}, type=0x{:X}", process_handle, type); | 1665 | LOG_DEBUG(Kernel_SVC, "called, handle=0x{:08X}, type=0x{:X}", process_handle, type); |
| 1624 | 1666 | ||
| @@ -1754,7 +1796,7 @@ static const FunctionDef SVC_Table[] = { | |||
| 1754 | {0x0E, SvcWrap<GetThreadCoreMask>, "GetThreadCoreMask"}, | 1796 | {0x0E, SvcWrap<GetThreadCoreMask>, "GetThreadCoreMask"}, |
| 1755 | {0x0F, SvcWrap<SetThreadCoreMask>, "SetThreadCoreMask"}, | 1797 | {0x0F, SvcWrap<SetThreadCoreMask>, "SetThreadCoreMask"}, |
| 1756 | {0x10, SvcWrap<GetCurrentProcessorNumber>, "GetCurrentProcessorNumber"}, | 1798 | {0x10, SvcWrap<GetCurrentProcessorNumber>, "GetCurrentProcessorNumber"}, |
| 1757 | {0x11, nullptr, "SignalEvent"}, | 1799 | {0x11, SvcWrap<SignalEvent>, "SignalEvent"}, |
| 1758 | {0x12, SvcWrap<ClearEvent>, "ClearEvent"}, | 1800 | {0x12, SvcWrap<ClearEvent>, "ClearEvent"}, |
| 1759 | {0x13, SvcWrap<MapSharedMemory>, "MapSharedMemory"}, | 1801 | {0x13, SvcWrap<MapSharedMemory>, "MapSharedMemory"}, |
| 1760 | {0x14, SvcWrap<UnmapSharedMemory>, "UnmapSharedMemory"}, | 1802 | {0x14, SvcWrap<UnmapSharedMemory>, "UnmapSharedMemory"}, |
| @@ -1806,7 +1848,7 @@ static const FunctionDef SVC_Table[] = { | |||
| 1806 | {0x42, nullptr, "ReplyAndReceiveLight"}, | 1848 | {0x42, nullptr, "ReplyAndReceiveLight"}, |
| 1807 | {0x43, nullptr, "ReplyAndReceive"}, | 1849 | {0x43, nullptr, "ReplyAndReceive"}, |
| 1808 | {0x44, nullptr, "ReplyAndReceiveWithUserBuffer"}, | 1850 | {0x44, nullptr, "ReplyAndReceiveWithUserBuffer"}, |
| 1809 | {0x45, nullptr, "CreateEvent"}, | 1851 | {0x45, SvcWrap<CreateEvent>, "CreateEvent"}, |
| 1810 | {0x46, nullptr, "Unknown"}, | 1852 | {0x46, nullptr, "Unknown"}, |
| 1811 | {0x47, nullptr, "Unknown"}, | 1853 | {0x47, nullptr, "Unknown"}, |
| 1812 | {0x48, nullptr, "MapPhysicalMemoryUnsafe"}, | 1854 | {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; |