summaryrefslogtreecommitdiff
path: root/src/core/hle/svc.cpp
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2017-06-23 22:34:02 -0700
committerGravatar GitHub2017-06-23 22:34:02 -0700
commitcf15b651ed475adcd53c72edd83e8b80f1f5fbee (patch)
treed4f4be2c9ed527b9f4df3a74e686a2722e5e05be /src/core/hle/svc.cpp
parentMerge pull request #2798 from yuriks/svc-create-session (diff)
parentKernel: Implement AcceptSession SVC (diff)
downloadyuzu-cf15b651ed475adcd53c72edd83e8b80f1f5fbee.tar.gz
yuzu-cf15b651ed475adcd53c72edd83e8b80f1f5fbee.tar.xz
yuzu-cf15b651ed475adcd53c72edd83e8b80f1f5fbee.zip
Merge pull request #2801 from yuriks/session-svcs
Implement CreateSessionToPort and AcceptSession; fix CreatePort
Diffstat (limited to 'src/core/hle/svc.cpp')
-rw-r--r--src/core/hle/svc.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp
index f459b1314..c05401143 100644
--- a/src/core/hle/svc.cpp
+++ b/src/core/hle/svc.cpp
@@ -947,6 +947,17 @@ static ResultCode CreatePort(Kernel::Handle* server_port, Kernel::Handle* client
947 return RESULT_SUCCESS; 947 return RESULT_SUCCESS;
948} 948}
949 949
950static ResultCode CreateSessionToPort(Handle* out_client_session, Handle client_port_handle) {
951 using Kernel::ClientPort;
952 SharedPtr<ClientPort> client_port = Kernel::g_handle_table.Get<ClientPort>(client_port_handle);
953 if (client_port == nullptr)
954 return ERR_INVALID_HANDLE;
955
956 CASCADE_RESULT(auto session, client_port->Connect());
957 CASCADE_RESULT(*out_client_session, Kernel::g_handle_table.Create(std::move(session)));
958 return RESULT_SUCCESS;
959}
960
950static ResultCode CreateSession(Handle* server_session, Handle* client_session) { 961static ResultCode CreateSession(Handle* server_session, Handle* client_session) {
951 auto sessions = Kernel::ServerSession::CreateSessionPair(); 962 auto sessions = Kernel::ServerSession::CreateSessionPair();
952 963
@@ -960,6 +971,17 @@ static ResultCode CreateSession(Handle* server_session, Handle* client_session)
960 return RESULT_SUCCESS; 971 return RESULT_SUCCESS;
961} 972}
962 973
974static ResultCode AcceptSession(Handle* out_server_session, Handle server_port_handle) {
975 using Kernel::ServerPort;
976 SharedPtr<ServerPort> server_port = Kernel::g_handle_table.Get<ServerPort>(server_port_handle);
977 if (server_port == nullptr)
978 return ERR_INVALID_HANDLE;
979
980 CASCADE_RESULT(auto session, server_port->Accept());
981 CASCADE_RESULT(*out_server_session, Kernel::g_handle_table.Create(std::move(session)));
982 return RESULT_SUCCESS;
983}
984
963static ResultCode GetSystemInfo(s64* out, u32 type, s32 param) { 985static ResultCode GetSystemInfo(s64* out, u32 type, s32 param) {
964 using Kernel::MemoryRegion; 986 using Kernel::MemoryRegion;
965 987
@@ -1134,9 +1156,9 @@ static const FunctionDef SVC_Table[] = {
1134 {0x45, nullptr, "Unknown"}, 1156 {0x45, nullptr, "Unknown"},
1135 {0x46, nullptr, "Unknown"}, 1157 {0x46, nullptr, "Unknown"},
1136 {0x47, HLE::Wrap<CreatePort>, "CreatePort"}, 1158 {0x47, HLE::Wrap<CreatePort>, "CreatePort"},
1137 {0x48, nullptr, "CreateSessionToPort"}, 1159 {0x48, HLE::Wrap<CreateSessionToPort>, "CreateSessionToPort"},
1138 {0x49, HLE::Wrap<CreateSession>, "CreateSession"}, 1160 {0x49, HLE::Wrap<CreateSession>, "CreateSession"},
1139 {0x4A, nullptr, "AcceptSession"}, 1161 {0x4A, HLE::Wrap<AcceptSession>, "AcceptSession"},
1140 {0x4B, nullptr, "ReplyAndReceive1"}, 1162 {0x4B, nullptr, "ReplyAndReceive1"},
1141 {0x4C, nullptr, "ReplyAndReceive2"}, 1163 {0x4C, nullptr, "ReplyAndReceive2"},
1142 {0x4D, nullptr, "ReplyAndReceive3"}, 1164 {0x4D, nullptr, "ReplyAndReceive3"},