summaryrefslogtreecommitdiff
path: root/src/core/hle/service/service.cpp
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2017-06-09 05:23:13 -0700
committerGravatar Yuri Kunde Schlesner2017-06-11 13:10:21 -0700
commit8cb65fe65a48988d40dd3ca2c4f673629a275b4b (patch)
treeca8b48aa3ec080602cb69efb9726bfc25e02a9ea /src/core/hle/service/service.cpp
parentService/sm: Convert srv: to use IPC helpers (diff)
downloadyuzu-8cb65fe65a48988d40dd3ca2c4f673629a275b4b.tar.gz
yuzu-8cb65fe65a48988d40dd3ca2c4f673629a275b4b.tar.xz
yuzu-8cb65fe65a48988d40dd3ca2c4f673629a275b4b.zip
Kernel: Basic support for IPC translation for HLE services
Diffstat (limited to 'src/core/hle/service/service.cpp')
-rw-r--r--src/core/hle/service/service.cpp17
1 files changed, 5 insertions, 12 deletions
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index 35582b0ff..791a65c19 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -9,6 +9,7 @@
9#include "common/string_util.h" 9#include "common/string_util.h"
10#include "core/hle/ipc.h" 10#include "core/hle/ipc.h"
11#include "core/hle/kernel/client_port.h" 11#include "core/hle/kernel/client_port.h"
12#include "core/hle/kernel/process.h"
12#include "core/hle/kernel/server_port.h" 13#include "core/hle/kernel/server_port.h"
13#include "core/hle/kernel/server_session.h" 14#include "core/hle/kernel/server_session.h"
14#include "core/hle/service/ac/ac.h" 15#include "core/hle/service/ac/ac.h"
@@ -172,24 +173,16 @@ void ServiceFrameworkBase::HandleSyncRequest(SharedPtr<ServerSession> server_ses
172 173
173 // TODO(yuriks): The kernel should be the one handling this as part of translation after 174 // TODO(yuriks): The kernel should be the one handling this as part of translation after
174 // everything else is migrated 175 // everything else is migrated
175 IPC::Header request_header{cmd_buf[0]};
176 size_t request_size =
177 1 + request_header.normal_params_size + request_header.translate_params_size;
178 ASSERT(request_size <= IPC::COMMAND_BUFFER_LENGTH); // TODO(yuriks): Return error
179
180 Kernel::HLERequestContext context; 176 Kernel::HLERequestContext context;
181 std::copy_n(cmd_buf, request_size, context.cmd_buf.begin());
182 context.session = std::move(server_session); 177 context.session = std::move(server_session);
178 context.PopulateFromIncomingCommandBuffer(cmd_buf, *Kernel::g_current_process,
179 Kernel::g_handle_table);
183 180
184 LOG_TRACE(Service, "%s", 181 LOG_TRACE(Service, "%s",
185 MakeFunctionString(info->name, GetServiceName().c_str(), cmd_buf).c_str()); 182 MakeFunctionString(info->name, GetServiceName().c_str(), cmd_buf).c_str());
186 handler_invoker(this, info->handler_callback, context); 183 handler_invoker(this, info->handler_callback, context);
187 184 context.WriteToOutgoingCommandBuffer(cmd_buf, *Kernel::g_current_process,
188 IPC::Header response_header{context.cmd_buf[0]}; 185 Kernel::g_handle_table);
189 size_t response_size =
190 1 + response_header.normal_params_size + response_header.translate_params_size;
191 ASSERT(response_size <= IPC::COMMAND_BUFFER_LENGTH);
192 std::copy_n(context.cmd_buf.begin(), response_size, cmd_buf);
193} 186}
194 187
195//////////////////////////////////////////////////////////////////////////////////////////////////// 188////////////////////////////////////////////////////////////////////////////////////////////////////